1 package org.simantics.acorn;
3 import java.nio.file.Path;
4 import java.util.concurrent.ConcurrentHashMap;
6 import org.simantics.db.Database;
7 import org.simantics.db.Session;
8 import org.simantics.db.SessionErrorHandler;
9 import org.simantics.db.SessionManager;
10 import org.simantics.db.SessionReference;
11 import org.simantics.db.authentication.UserAuthenticationAgent;
12 import org.simantics.db.common.utils.Logger;
13 import org.simantics.db.event.SessionEvent;
14 import org.simantics.db.event.SessionListener;
15 import org.simantics.db.exception.DatabaseException;
16 import org.simantics.db.service.LifecycleSupport;
17 import org.simantics.utils.datastructures.ListenerList;
19 import fi.vtt.simantics.procore.internal.SessionImplDb;
20 import fi.vtt.simantics.procore.internal.SessionImplSocket;
22 public class AcornSessionManagerImpl implements SessionManager {
24 private static AcornSessionManagerImpl INSTANCE;
26 private ConcurrentHashMap<SessionImplSocket, SessionImplSocket> sessionMap = new ConcurrentHashMap<SessionImplSocket, SessionImplSocket>();
27 private ListenerList<SessionListener> sessionListeners = new ListenerList<SessionListener>(SessionListener.class);
28 private SessionErrorHandler errorHandler;
30 private Database database;
32 private AcornSessionManagerImpl() {}
36 sessionListeners = null;
40 public void addSessionListener(SessionListener listener) {
41 sessionListeners.add(listener);
45 public Session createSession(SessionReference sessionReference, UserAuthenticationAgent authAgent)
46 throws DatabaseException {
47 SessionImplDb sessionImpl = new SessionImplDb(this, authAgent);
50 Path dbFolder = sessionReference.getServerReference().getDBFolder();
51 database = AcornDatabaseManager.getDatabase(dbFolder);
52 Database.Session dbSession = database.newSession(sessionImpl);
53 sessionImpl.connect(sessionReference, dbSession);
54 sessionMap.put(sessionImpl, sessionImpl);
55 fireSessionOpened(sessionImpl);
57 } catch (Throwable e) {
58 Logger.defaultLogError("Connection failed. See exception for details.", e);
60 fireSessionClosed(sessionImpl, e);
61 sessionMap.remove(sessionImpl);
63 } catch (Throwable t) {
65 throw new DatabaseException(e);
67 if (!ok && null != sessionImpl)
68 sessionImpl.getService(LifecycleSupport.class).close();
74 public void removeSessionListener(SessionListener listener) {
75 sessionListeners.remove(listener);
78 private void fireSessionOpened(SessionImplSocket session) {
79 SessionEvent se = new SessionEvent(session, null);
80 for (SessionListener listener : sessionListeners.getListeners()) {
81 listener.sessionOpened(se);
85 private void fireSessionClosed(SessionImplSocket session, Throwable cause) {
86 SessionEvent se = new SessionEvent(session, cause);
87 for (SessionListener listener : sessionListeners.getListeners()) {
88 listener.sessionClosed(se);
93 public void shutdown(Session s, Throwable cause) {
94 SessionImplSocket sis = sessionMap.get(s);
98 fireSessionClosed(sis, cause);
100 sessionMap.remove(s);
105 public SessionErrorHandler getErrorHandler() {
110 public void setErrorHandler(SessionErrorHandler errorHandler) {
111 this.errorHandler = errorHandler;
114 public synchronized static AcornSessionManagerImpl getInstance() {
115 if (INSTANCE == null)
116 INSTANCE = new AcornSessionManagerImpl();
121 public Database getDatabase() {