1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.application.db;
\r
14 import java.io.IOException;
\r
16 import org.simantics.application.arguments.Arguments;
\r
17 import org.simantics.application.arguments.IArguments;
\r
18 import org.simantics.application.arguments.SimanticsArguments;
\r
19 import org.simantics.db.ServerI;
\r
20 import org.simantics.db.Session;
\r
21 import org.simantics.db.exception.DatabaseException;
\r
22 import org.simantics.db.service.LifecycleSupport;
\r
23 import org.simantics.utils.datastructures.disposable.AbstractDisposable;
\r
24 import org.simantics.utils.datastructures.disposable.IDisposable;
\r
26 public class DatabaseHandle extends AbstractDisposable implements IDatabaseHandle, IDisposable {
\r
28 private ServerI server;
\r
30 private Session session;
\r
32 @SuppressWarnings("unused")
\r
33 private final boolean deleteAtDispose;
\r
40 public static DatabaseHandle open(String[] arguments) throws Exception {
\r
41 IArguments args = Arguments.parse(arguments, SimanticsArguments.SERVER);
\r
42 if (!args.contains(SimanticsArguments.SERVER))
\r
43 throw new IllegalArgumentException("Missing " + SimanticsArguments.SERVER.getArgument() + " argument, a server is required.");
\r
45 DatabaseHandle handle = new DatabaseHandle();
\r
46 handle.init(args.get(SimanticsArguments.SERVER), false);
\r
55 public static DatabaseHandle open(String serverAddress) throws Exception {
\r
56 return new DatabaseHandle().init(serverAddress, false);
\r
60 // * @param arguments
\r
62 // * @throws Exception
\r
64 // public static DatabaseHandle open(ServerAddress address) throws Exception {
\r
65 // return DatabaseHandle.open(address.getDbid());
\r
73 public static DatabaseHandle checkout(String serverAddress) throws Exception {
\r
74 return new DatabaseHandle().init(serverAddress, true);
\r
78 // * @param arguments
\r
80 // * @throws Exception
\r
82 // public static DatabaseHandle checkout(ServerAddress address) throws Exception {
\r
83 // return new DatabaseHandle().init(address.getDbid(), true);
\r
86 private DatabaseHandle() {
\r
87 deleteAtDispose = false;
\r
92 * @param deleteAtDispose
\r
95 public DatabaseHandle(String[] arguments, boolean deleteAtDispose) throws Exception {
\r
96 this.deleteAtDispose = deleteAtDispose;
\r
98 IArguments args = Arguments.parse(arguments,
\r
99 SimanticsArguments.SERVER,
\r
100 SimanticsArguments.CHECKOUT);
\r
102 if (!args.contains(SimanticsArguments.SERVER))
\r
103 throw new IllegalArgumentException("Missing " + SimanticsArguments.SERVER.getArgument() + " argument, a server is required.");
\r
104 boolean checkout = args.contains(SimanticsArguments.CHECKOUT);
\r
106 init(args.get(SimanticsArguments.SERVER), checkout);
\r
112 * @throws Exception
\r
113 * @throws IOException
\r
115 private DatabaseHandle init(String serverAddress, boolean checkout) throws IOException, Exception {
\r
117 // Let UndoCoreManager pick a port on localhost for the working
\r
118 // copy by setting the address of the local ServerInfo to null.
\r
119 throw new UnsupportedOperationException("re-implement checkout");
\r
120 // activation = UndoCoreManager.getManager().checkout(
\r
121 // new ServerInfo("Remote Server", server),
\r
122 // new ServerInfo(UUID.randomUUID().toString()));
\r
124 // ServerAddress localServer = activation.getDescriptor().getLocal().getAddress();
\r
125 // session = DatabaseUtils.connect(localServer);
\r
127 session = DatabaseUtils.connect(serverAddress);
\r
128 // session = DatabaseUtils.connect(new ServerAddress("", 0, serverAddress));
\r
135 protected void doDispose() {
\r
136 // TODO: make this robust and safe
\r
138 if (session != null) {
\r
140 LifecycleSupport support = session.getService(LifecycleSupport.class);
\r
141 support.close(-1, false);
\r
143 } catch (DatabaseException e) {
\r
147 // if (activation != null) {
\r
149 // UndoCoreManager manager = UndoCoreManager.getManager();
\r
150 // manager.deactivate(activation, 3000, TimeUnit.MILLISECONDS);
\r
152 // if (deleteAtDispose) {
\r
153 // IServerDescriptor desc = activation.getDescriptor();
\r
154 // manager.deleteLocal(new ServerInfo[] { desc.getParent(), desc.getLocal() });
\r
156 // } catch (IOException e) {
\r
157 // } catch (InterruptedException e) {
\r
159 // activation = null;
\r
164 * @see org.simantics.application.db.IDatabaseHandle#getServer()
\r
167 public ServerI getServer() {
\r
172 * @see org.simantics.application.db.IDatabaseHandle#getSession()
\r
175 public Session getSession() {
\r