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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package fi.vtt.simantics.procore.internal;
\r
14 import java.io.IOException;
\r
15 import java.nio.file.Path;
\r
16 import java.util.concurrent.ConcurrentHashMap;
\r
18 import org.simantics.db.Database;
\r
19 import org.simantics.db.Session;
\r
20 import org.simantics.db.SessionErrorHandler;
\r
21 import org.simantics.db.SessionManager;
\r
22 import org.simantics.db.SessionReference;
\r
23 import org.simantics.db.authentication.UserAuthenticationAgent;
\r
24 import org.simantics.db.common.utils.Logger;
\r
25 import org.simantics.db.event.SessionEvent;
\r
26 import org.simantics.db.event.SessionListener;
\r
27 import org.simantics.db.exception.DatabaseException;
\r
28 import org.simantics.db.server.DatabaseManager;
\r
29 import org.simantics.db.service.LifecycleSupport;
\r
31 import fi.vtt.simantics.procore.ProCoreSessionReference;
\r
33 class SessionManagerImpl implements SessionManager {
\r
34 private ConcurrentHashMap<SessionImplSocket, SessionImplSocket> sessionMap = new ConcurrentHashMap<SessionImplSocket, SessionImplSocket>();
\r
35 private ListenerList<SessionListener> sessionListeners = new ListenerList<SessionListener>(SessionListener.class);
\r
36 private SessionErrorHandler errorHandler;
\r
37 private Database database;
\r
39 SessionManagerImpl() throws IOException {
\r
44 sessionListeners = null;
\r
48 public void addSessionListener(SessionListener listener) {
\r
49 sessionListeners.add(listener);
\r
53 public Session createSession(SessionReference sessionReference, UserAuthenticationAgent authAgent)
\r
54 throws DatabaseException, IOException {
\r
55 if (!(sessionReference instanceof ProCoreSessionReference))
\r
56 throw new DatabaseException("Illegal argument. ProCoreSessionReference needed for creation of corresponding session. ref=" + sessionReference);
\r
57 SessionImplDb sessionImpl = new SessionImplDb(this, authAgent);
\r
60 ProCoreSessionReference pcsr = (ProCoreSessionReference)sessionReference;
\r
61 Path dbFolder = pcsr.serverReference.dbFolder;
\r
62 database = DatabaseManager.getDatabase(dbFolder);
\r
63 Database.Session dbSession = database.newSession(sessionImpl);
\r
64 sessionImpl.connect(sessionReference, dbSession);
\r
65 sessionMap.put(sessionImpl, sessionImpl);
\r
66 fireSessionOpened(sessionImpl);
\r
68 } catch (IOException e) {
\r
71 } catch (Throwable e) {
\r
72 Logger.defaultLogError("Connection failed. See exception for details.", e);
\r
74 fireSessionClosed(sessionImpl, e);
\r
75 sessionMap.remove(sessionImpl);
\r
77 } catch (Throwable t) {
\r
79 throw new DatabaseException(e);
\r
81 if (!ok && null != sessionImpl)
\r
82 sessionImpl.getService(LifecycleSupport.class).close();
\r
88 public void removeSessionListener(SessionListener listener) {
\r
89 sessionListeners.remove(listener);
\r
92 private void fireSessionOpened(SessionImplSocket session) {
\r
93 SessionEvent se = new SessionEvent(session, null);
\r
94 for (SessionListener listener : sessionListeners.getListeners()) {
\r
95 listener.sessionOpened(se);
\r
99 private void fireSessionClosed(SessionImplSocket session, Throwable cause) {
\r
100 SessionEvent se = new SessionEvent(session, cause);
\r
101 for (SessionListener listener : sessionListeners.getListeners()) {
\r
102 listener.sessionClosed(se);
\r
107 public void shutdown(Session s, Throwable cause) {
\r
108 SessionImplSocket sis = sessionMap.get(s);
\r
112 fireSessionClosed(sis, cause);
\r
114 sessionMap.remove(s);
\r
119 public SessionErrorHandler getErrorHandler() {
\r
120 return errorHandler;
\r
124 public void setErrorHandler(SessionErrorHandler errorHandler) {
\r
125 this.errorHandler = errorHandler;
\r
129 public Database getDatabase() {
\r