]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.application/src/org/simantics/application/db/DatabaseHandle.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.application / src / org / simantics / application / db / DatabaseHandle.java
diff --git a/bundles/org.simantics.application/src/org/simantics/application/db/DatabaseHandle.java b/bundles/org.simantics.application/src/org/simantics/application/db/DatabaseHandle.java
new file mode 100644 (file)
index 0000000..f81a7b8
--- /dev/null
@@ -0,0 +1,179 @@
+/*******************************************************************************\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