X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Fscl%2FSCLSessionManager.java;fp=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Fscl%2FSCLSessionManager.java;h=8572dff386cfb877e450948a3f24fd23beadc7b0;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/SCLSessionManager.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/SCLSessionManager.java new file mode 100644 index 000000000..8572dff38 --- /dev/null +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/scl/SCLSessionManager.java @@ -0,0 +1,58 @@ +package org.simantics.modeling.scl; + +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +import org.simantics.db.layer0.variable.NodeSupport; +import org.simantics.scl.compiler.commands.CommandSession; +import org.simantics.scl.osgi.SCLOsgi; +import org.simantics.scl.runtime.reporting.SCLReportingHandler; + +public class SCLSessionManager { + static ConcurrentHashMap CONNECTIONS = + new ConcurrentHashMap(); + + static ConcurrentHashMap> SUPPORTS = + new ConcurrentHashMap>(); + + public static SCLRealm sclRealmById(String id) { + // CONNECTIONS is ConcurrentHashMap so no synchronization is needed here + return CONNECTIONS.get(id); + } + + public static synchronized NodeSupport getOrCreateNodeSupport(String id) { + NodeSupport result = SUPPORTS.get(id); + if(result == null) { + SCLRealm realm = getOrCreateSCLRealm(id); + result = new NodeSupport(realm.getNodeManager()); + SUPPORTS.put(id, result); + } + return result; + } + + public static synchronized SCLRealm createRealm() { + String id = UUID.randomUUID().toString(); + return createRealm(id); + } + + public static synchronized SCLRealm getOrCreateSCLRealm(String id) { + SCLRealm session = sclRealmById(id); + if(session == null) + return createRealm(id); + else + return session; + } + + private static SCLRealm createRealm(String id) { + CommandSession connection = new CommandSession(SCLOsgi.MODULE_REPOSITORY, SCLReportingHandler.DEFAULT); + SCLRealm realm = new SCLRealm(connection, id); + CONNECTIONS.put(id, realm); + return realm; + } + + public static synchronized void removeRealm(String id) { + CONNECTIONS.remove(id); + // if node support has been created remove it as well + SUPPORTS.remove(id); + } +}