]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.application.db;\r
13 \r
14 import java.io.IOException;\r
15 \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
25 \r
26 public class DatabaseHandle extends AbstractDisposable implements IDatabaseHandle, IDisposable {\r
27 \r
28     private ServerI       server;\r
29 \r
30     private Session       session;\r
31 \r
32     @SuppressWarnings("unused")\r
33     private final boolean deleteAtDispose;\r
34 \r
35     /**\r
36      * @param arguments\r
37      * @return\r
38      * @throws Exception\r
39      */\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
44 \r
45         DatabaseHandle handle = new DatabaseHandle();\r
46         handle.init(args.get(SimanticsArguments.SERVER), false);\r
47         return handle;\r
48     }\r
49 \r
50     /**\r
51      * @param arguments\r
52      * @return\r
53      * @throws Exception\r
54      */\r
55     public static DatabaseHandle open(String serverAddress) throws Exception {\r
56         return new DatabaseHandle().init(serverAddress, false);\r
57     }\r
58 \r
59 //    /**\r
60 //     * @param arguments\r
61 //     * @return\r
62 //     * @throws Exception\r
63 //     */\r
64 //    public static DatabaseHandle open(ServerAddress address) throws Exception {\r
65 //        return DatabaseHandle.open(address.getDbid());\r
66 //    }\r
67 \r
68     /**\r
69      * @param arguments\r
70      * @return\r
71      * @throws Exception\r
72      */\r
73     public static DatabaseHandle checkout(String serverAddress) throws Exception {\r
74         return new DatabaseHandle().init(serverAddress, true);\r
75     }\r
76 \r
77 //    /**\r
78 //     * @param arguments\r
79 //     * @return\r
80 //     * @throws Exception\r
81 //     */\r
82 //    public static DatabaseHandle checkout(ServerAddress address) throws Exception {\r
83 //        return new DatabaseHandle().init(address.getDbid(), true);\r
84 //    }\r
85 \r
86     private DatabaseHandle() {\r
87         deleteAtDispose = false;\r
88     }\r
89 \r
90     /**\r
91      * @param arguments\r
92      * @param deleteAtDispose\r
93      * @throws Exception\r
94      */\r
95     public DatabaseHandle(String[] arguments, boolean deleteAtDispose) throws Exception {\r
96         this.deleteAtDispose = deleteAtDispose;\r
97 \r
98         IArguments args = Arguments.parse(arguments,\r
99                 SimanticsArguments.SERVER,\r
100                 SimanticsArguments.CHECKOUT);\r
101 \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
105 \r
106         init(args.get(SimanticsArguments.SERVER), checkout);\r
107     }\r
108 \r
109     /**\r
110      * @param checkout\r
111      * @return this\r
112      * @throws Exception\r
113      * @throws IOException\r
114      */\r
115     private DatabaseHandle init(String serverAddress, boolean checkout) throws IOException, Exception {\r
116         if (checkout) {\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
123 //\r
124 //            ServerAddress localServer = activation.getDescriptor().getLocal().getAddress();\r
125 //            session = DatabaseUtils.connect(localServer);\r
126         } else {\r
127             session = DatabaseUtils.connect(serverAddress);\r
128 //            session = DatabaseUtils.connect(new ServerAddress("", 0, serverAddress));\r
129         }\r
130 \r
131         return this;\r
132     }\r
133 \r
134     @Override\r
135     protected void doDispose() {\r
136         // TODO: make this robust and safe\r
137 \r
138         if (session != null) {\r
139             try {\r
140                 LifecycleSupport support = session.getService(LifecycleSupport.class);\r
141                 support.close(-1, false);\r
142                 session = null;\r
143             } catch (DatabaseException e) {\r
144             }\r
145         }\r
146 \r
147 //        if (activation != null) {\r
148 //            try {\r
149 //                UndoCoreManager manager = UndoCoreManager.getManager();\r
150 //                manager.deactivate(activation, 3000, TimeUnit.MILLISECONDS);\r
151 //\r
152 //                if (deleteAtDispose) {\r
153 //                    IServerDescriptor desc = activation.getDescriptor();\r
154 //                    manager.deleteLocal(new ServerInfo[] { desc.getParent(), desc.getLocal() });\r
155 //                }\r
156 //            } catch (IOException e) {\r
157 //            } catch (InterruptedException e) {\r
158 //            }\r
159 //            activation = null;\r
160 //        }\r
161     }\r
162 \r
163     /* (non-Javadoc)\r
164      * @see org.simantics.application.db.IDatabaseHandle#getServer()\r
165      */\r
166     @Override\r
167     public ServerI getServer() {\r
168         return server;\r
169     }\r
170 \r
171     /* (non-Javadoc)\r
172      * @see org.simantics.application.db.IDatabaseHandle#getSession()\r
173      */\r
174     @Override\r
175     public Session getSession() {\r
176         return session;\r
177     }\r
178 \r
179 }\r