--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.application.db;\r
+\r
+import java.io.IOException;\r
+\r
+import org.simantics.application.arguments.Arguments;\r
+import org.simantics.application.arguments.IArguments;\r
+import org.simantics.application.arguments.SimanticsArguments;\r
+import org.simantics.db.ServerI;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.service.LifecycleSupport;\r
+import org.simantics.utils.datastructures.disposable.AbstractDisposable;\r
+import org.simantics.utils.datastructures.disposable.IDisposable;\r
+\r
+public class DatabaseHandle extends AbstractDisposable implements IDatabaseHandle, IDisposable {\r
+\r
+ private ServerI server;\r
+\r
+ private Session session;\r
+\r
+ @SuppressWarnings("unused")\r
+ private final boolean deleteAtDispose;\r
+\r
+ /**\r
+ * @param arguments\r
+ * @return\r
+ * @throws Exception\r
+ */\r
+ public static DatabaseHandle open(String[] arguments) throws Exception {\r
+ IArguments args = Arguments.parse(arguments, SimanticsArguments.SERVER);\r
+ if (!args.contains(SimanticsArguments.SERVER))\r
+ throw new IllegalArgumentException("Missing " + SimanticsArguments.SERVER.getArgument() + " argument, a server is required.");\r
+\r
+ DatabaseHandle handle = new DatabaseHandle();\r
+ handle.init(args.get(SimanticsArguments.SERVER), false);\r
+ return handle;\r
+ }\r
+\r
+ /**\r
+ * @param arguments\r
+ * @return\r
+ * @throws Exception\r
+ */\r
+ public static DatabaseHandle open(String serverAddress) throws Exception {\r
+ return new DatabaseHandle().init(serverAddress, false);\r
+ }\r
+\r
+// /**\r
+// * @param arguments\r
+// * @return\r
+// * @throws Exception\r
+// */\r
+// public static DatabaseHandle open(ServerAddress address) throws Exception {\r
+// return DatabaseHandle.open(address.getDbid());\r
+// }\r
+\r
+ /**\r
+ * @param arguments\r
+ * @return\r
+ * @throws Exception\r
+ */\r
+ public static DatabaseHandle checkout(String serverAddress) throws Exception {\r
+ return new DatabaseHandle().init(serverAddress, true);\r
+ }\r
+\r
+// /**\r
+// * @param arguments\r
+// * @return\r
+// * @throws Exception\r
+// */\r
+// public static DatabaseHandle checkout(ServerAddress address) throws Exception {\r
+// return new DatabaseHandle().init(address.getDbid(), true);\r
+// }\r
+\r
+ private DatabaseHandle() {\r
+ deleteAtDispose = false;\r
+ }\r
+\r
+ /**\r
+ * @param arguments\r
+ * @param deleteAtDispose\r
+ * @throws Exception\r
+ */\r
+ public DatabaseHandle(String[] arguments, boolean deleteAtDispose) throws Exception {\r
+ this.deleteAtDispose = deleteAtDispose;\r
+\r
+ IArguments args = Arguments.parse(arguments,\r
+ SimanticsArguments.SERVER,\r
+ SimanticsArguments.CHECKOUT);\r
+\r
+ if (!args.contains(SimanticsArguments.SERVER))\r
+ throw new IllegalArgumentException("Missing " + SimanticsArguments.SERVER.getArgument() + " argument, a server is required.");\r
+ boolean checkout = args.contains(SimanticsArguments.CHECKOUT);\r
+\r
+ init(args.get(SimanticsArguments.SERVER), checkout);\r
+ }\r
+\r
+ /**\r
+ * @param checkout\r
+ * @return this\r
+ * @throws Exception\r
+ * @throws IOException\r
+ */\r
+ private DatabaseHandle init(String serverAddress, boolean checkout) throws IOException, Exception {\r
+ if (checkout) {\r
+ // Let UndoCoreManager pick a port on localhost for the working\r
+ // copy by setting the address of the local ServerInfo to null.\r
+ throw new UnsupportedOperationException("re-implement checkout");\r
+// activation = UndoCoreManager.getManager().checkout(\r
+// new ServerInfo("Remote Server", server),\r
+// new ServerInfo(UUID.randomUUID().toString()));\r
+//\r
+// ServerAddress localServer = activation.getDescriptor().getLocal().getAddress();\r
+// session = DatabaseUtils.connect(localServer);\r
+ } else {\r
+ session = DatabaseUtils.connect(serverAddress);\r
+// session = DatabaseUtils.connect(new ServerAddress("", 0, serverAddress));\r
+ }\r
+\r
+ return this;\r
+ }\r
+\r
+ @Override\r
+ protected void doDispose() {\r
+ // TODO: make this robust and safe\r
+\r
+ if (session != null) {\r
+ try {\r
+ LifecycleSupport support = session.getService(LifecycleSupport.class);\r
+ support.close(-1, false);\r
+ session = null;\r
+ } catch (DatabaseException e) {\r
+ }\r
+ }\r
+\r
+// if (activation != null) {\r
+// try {\r
+// UndoCoreManager manager = UndoCoreManager.getManager();\r
+// manager.deactivate(activation, 3000, TimeUnit.MILLISECONDS);\r
+//\r
+// if (deleteAtDispose) {\r
+// IServerDescriptor desc = activation.getDescriptor();\r
+// manager.deleteLocal(new ServerInfo[] { desc.getParent(), desc.getLocal() });\r
+// }\r
+// } catch (IOException e) {\r
+// } catch (InterruptedException e) {\r
+// }\r
+// activation = null;\r
+// }\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see org.simantics.application.db.IDatabaseHandle#getServer()\r
+ */\r
+ @Override\r
+ public ServerI getServer() {\r
+ return server;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see org.simantics.application.db.IDatabaseHandle#getSession()\r
+ */\r
+ @Override\r
+ public Session getSession() {\r
+ return session;\r
+ }\r
+\r
+}\r