]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/LifecycleSupportImpl.java
Merge commit 'b9450ae'
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / LifecycleSupportImpl.java
1 package fi.vtt.simantics.procore.internal;\r
2 \r
3 import java.util.concurrent.CopyOnWriteArrayList;\r
4 \r
5 import org.simantics.db.SessionManager;\r
6 import org.simantics.db.SessionReference;\r
7 import org.simantics.db.common.TransactionPolicyRelease;\r
8 import org.simantics.db.common.utils.Logger;\r
9 import org.simantics.db.exception.DatabaseException;\r
10 import org.simantics.db.exception.InternalException;\r
11 import org.simantics.db.exception.TimeoutException;\r
12 import org.simantics.db.impl.query.QueryProcessor;\r
13 import org.simantics.db.service.LifecycleSupport;\r
14 import org.simantics.db.service.TransactionPolicySupport;\r
15 \r
16 public class LifecycleSupportImpl implements LifecycleSupport {\r
17 \r
18     final private SessionImplSocket session;\r
19     final private CopyOnWriteArrayList<LifecycleListener> listeners = new CopyOnWriteArrayList<LifecycleListener>();\r
20 \r
21     LifecycleSupportImpl(SessionImplSocket session) {\r
22         this.session = session;\r
23     }\r
24 \r
25     @Override\r
26     public long getId() {\r
27         return session.graphSession.getSessionId();\r
28     }\r
29 \r
30     @Override\r
31     public boolean isClosing() {\r
32         return session.state.isClosing();\r
33     }\r
34 \r
35     @Override\r
36     public boolean isClosed() {\r
37         return session.state.isClosed();\r
38     }\r
39 \r
40     @Override\r
41     final public SessionReference getSessionReference() {\r
42         if (session.graphSession == null)\r
43             return null;\r
44         return session.graphSession.getSessionReference();\r
45     }\r
46 \r
47     @Override\r
48     final public SessionManager getSessionManager() {\r
49         return session.sessionManagerImpl;\r
50     }\r
51 \r
52     @Override\r
53     public void ping() throws DatabaseException {\r
54         session.graphSession.execute("");\r
55     }\r
56 \r
57     @Override\r
58     public void close()\r
59     throws DatabaseException {\r
60         GraphSession graphSession = session.graphSession;\r
61         try {\r
62             this.close(0, false);\r
63         } catch (TimeoutException e) {\r
64             this.close(-1, true);\r
65         } finally {\r
66             if (null != graphSession)\r
67                 try {\r
68                     // Graph session expects start and stop.\r
69                     // If we miss stop then server will not know that we disconnected deliberately.\r
70                     graphSession.stop();\r
71                 } catch (InternalException e) {\r
72                     Logger.defaultLogError("GraphSession.stop failed.", e);\r
73                 }\r
74         }\r
75     }\r
76     @Override\r
77     final public void close(long timeout, boolean force)\r
78     throws DatabaseException {\r
79         session.registerService(TransactionPolicySupport.class, new TransactionPolicyRelease());\r
80         State.WaitStatus status = session.state.waitClosing(timeout);\r
81         switch (status) {\r
82             case IsClosed:\r
83             case IsClosing:\r
84                 return;\r
85             case Timeout:\r
86                 if (!force)\r
87                     throw new TimeoutException("Close timeout, use force!");\r
88                 // Intentionally dropping to next case.\r
89             case CanBeClosed:\r
90                 try {\r
91                     QueryProcessor prosessor = session.getQueryProvider2();\r
92                     if (prosessor!=null) prosessor.dispose();\r
93                     session.virtualGraphServerSupport.disposeVirtualGraphs();\r
94                     session.removeTemporaryData();\r
95                     // Release the session from the manager.\r
96                     session.graphSession.close();\r
97                     session.serviceLocator.dispose(); // This will close local sessions created when registering services.\r
98                 } finally {\r
99                     session.state.close();\r
100                     session.clusterTable.dispose(); session.clusterTable = null;\r
101                     session.sessionManagerImpl.shutdown(session, null);\r
102                     session.sessionManagerImpl = null;\r
103                     session.user = null;\r
104                     session.graphSession = null;\r
105                 }\r
106                 break;\r
107             default:\r
108                 throw new DatabaseException();\r
109         }\r
110     }\r
111 \r
112     @Override\r
113     public void addListener(LifecycleListener listener) {\r
114         listeners.add(listener);\r
115     }\r
116 \r
117     @Override\r
118     public void removeListener(LifecycleListener listener) {\r
119         listeners.remove(listener);\r
120     }\r
121 \r
122     void fireListeners(LifecycleState newState) {\r
123         for(LifecycleListener listener : listeners) listener.stateChanged(newState);\r
124     }\r
125 \r
126 }\r