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