X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.simulator.toolkit.db%2Fsrc%2Forg%2Fsimantics%2Fsimulator%2Ftoolkit%2Fdb%2FStandardSessionManager.java;fp=bundles%2Forg.simantics.simulator.toolkit.db%2Fsrc%2Forg%2Fsimantics%2Fsimulator%2Ftoolkit%2Fdb%2FStandardSessionManager.java;h=62389597a9916ea0509608592ee0bf72f83d740d;hp=0000000000000000000000000000000000000000;hb=14a4f7a9d486fba5be815e511fb2a497fca4eb70;hpb=751ee12501d220832b672dd433655a4d65806fd9 diff --git a/bundles/org.simantics.simulator.toolkit.db/src/org/simantics/simulator/toolkit/db/StandardSessionManager.java b/bundles/org.simantics.simulator.toolkit.db/src/org/simantics/simulator/toolkit/db/StandardSessionManager.java new file mode 100644 index 000000000..62389597a --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit.db/src/org/simantics/simulator/toolkit/db/StandardSessionManager.java @@ -0,0 +1,124 @@ +package org.simantics.simulator.toolkit.db; + +import java.util.Collection; +import java.util.concurrent.ConcurrentHashMap; + +import org.simantics.db.ReadGraph; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.ParametrizedPrimitiveRead; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.NodeSupport; +import org.simantics.db.procedure.Listener; +import org.simantics.simulator.toolkit.StandardNodeManagerSupport; +import org.simantics.simulator.toolkit.StandardRealm; + +public abstract class StandardSessionManager> { + + private ConcurrentHashMap>> realmListeners = new ConcurrentHashMap<>(); + private ConcurrentHashMap> REALMS = new ConcurrentHashMap<>(); + private ConcurrentHashMap> SUPPORTS = new ConcurrentHashMap<>(); + + // Accessing Realms should be done over ParametrizedPrimitveRead for the + // case if a realm is destroyed and new one is created with the same id than + // the previously deleted one for the listeners to get discarded and new + // registered + private class RealmRequest extends ParametrizedPrimitiveRead> { + + public RealmRequest(String parameter) { + super(parameter); + } + + @Override + public void register(ReadGraph graph, Listener> procedure) { + StandardRealm realm = REALMS.get(parameter); + if (realm == null) { + try { + realm = createRealmInner(graph, parameter); + } catch (DatabaseException e) { + e.printStackTrace(); + } + } + + if(procedure.isDisposed()) { + procedure.execute(realm); + return; + } + + Listener> existing = getOrDisposeListener(parameter); + assert(existing == null); + realmListeners.put(parameter, procedure); + procedure.execute(realm); + } + + private StandardRealm createRealmInner(ReadGraph graph, String id) throws DatabaseException { + Engine engine = createEngine(graph, id); + StandardRealm realm = createRealm(engine, id); + modifyRealms(id, realm); + return realm; + } + } + + protected StandardSessionManager() { + } + + private Listener> getOrDisposeListener(String key) { + Listener> listener = realmListeners.get(key); + if(listener != null) { + if(listener.isDisposed()) { + realmListeners.remove(key); + } else { + return listener; + } + } + return null; + } + + private void modifyRealms(String key, StandardRealm realm) { + if(realm != null) { + REALMS.put(key, realm); + } else { + StandardRealm removedRealm = REALMS.remove(key); + if (removedRealm != null) + removedRealm.close(); + } + Listener> listener = getOrDisposeListener(key); + if(listener != null) { + listener.execute(realm); + } + } + + public NodeSupport getOrCreateNodeSupport(ReadGraph graph, String id) throws DatabaseException { + synchronized(SUPPORTS) { + NodeSupport result = SUPPORTS.get(id); + if(result == null) { + StandardRealm realm = getOrCreateRealm(graph, id); + result = new NodeSupport(realm.getNodeManager()); + SUPPORTS.put(id, result); + } + return result; + } + } + + public StandardRealm getOrCreateRealm(ReadGraph graph, String id) throws DatabaseException { + synchronized(REALMS) { + return graph.syncRequest(new RealmRequest(id)); + } + } + + protected abstract Engine createEngine(ReadGraph graph, String id) throws DatabaseException; + protected abstract StandardRealm createRealm(Engine engine, String id); + + public void removeRealm(WriteGraph graph, String id) throws DatabaseException { + modifyRealms(id, null); + // remove listeners from this realm + realmListeners.remove(id); + // if node support has been created remove it as well + NodeSupport support = SUPPORTS.remove(id); + if (support != null) + support.dispose(); + } + + public Collection getRealms() { + return REALMS.keySet(); + } +}