1 package fi.vtt.simantics.procore.internal;
\r
3 import java.util.concurrent.CopyOnWriteArrayList;
\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
16 public class LifecycleSupportImpl implements LifecycleSupport {
\r
18 final private SessionImplSocket session;
\r
19 final private CopyOnWriteArrayList<LifecycleListener> listeners = new CopyOnWriteArrayList<LifecycleListener>();
\r
21 LifecycleSupportImpl(SessionImplSocket session) {
\r
22 this.session = session;
\r
26 public long getId() {
\r
27 return session.graphSession.getSessionId();
\r
31 public boolean isClosing() {
\r
32 return session.state.isClosing();
\r
36 public boolean isClosed() {
\r
37 return session.state.isClosed();
\r
41 final public SessionReference getSessionReference() {
\r
42 if (session.graphSession == null)
\r
44 return session.graphSession.getSessionReference();
\r
48 final public SessionManager getSessionManager() {
\r
49 return session.sessionManagerImpl;
\r
53 public void ping() throws DatabaseException {
\r
54 session.graphSession.execute("");
\r
59 throws DatabaseException {
\r
60 GraphSession graphSession = session.graphSession;
\r
62 this.close(0, false);
\r
63 } catch (TimeoutException e) {
\r
64 this.close(-1, true);
\r
66 if (null != graphSession)
\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
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
87 throw new TimeoutException("Close timeout, use force!");
\r
88 // Intentionally dropping to next case.
\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
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
108 throw new DatabaseException();
\r
113 public void addListener(LifecycleListener listener) {
\r
114 listeners.add(listener);
\r
118 public void removeListener(LifecycleListener listener) {
\r
119 listeners.remove(listener);
\r
122 void fireListeners(LifecycleState newState) {
\r
123 for(LifecycleListener listener : listeners) listener.stateChanged(newState);
\r