--- /dev/null
+package org.simantics.modeling.scl;\r
+\r
+import java.util.UUID;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+\r
+import org.simantics.db.layer0.variable.NodeSupport;\r
+import org.simantics.scl.compiler.commands.CommandSession;\r
+import org.simantics.scl.osgi.SCLOsgi;\r
+import org.simantics.scl.runtime.reporting.SCLReportingHandler;\r
+\r
+public class SCLSessionManager {\r
+ static ConcurrentHashMap<String, SCLRealm> CONNECTIONS =\r
+ new ConcurrentHashMap<String, SCLRealm>(); \r
+ \r
+ static ConcurrentHashMap<String, NodeSupport<String>> SUPPORTS =\r
+ new ConcurrentHashMap<String, NodeSupport<String>>(); \r
+ \r
+ public static SCLRealm sclRealmById(String id) {\r
+ // CONNECTIONS is ConcurrentHashMap so no synchronization is needed here\r
+ return CONNECTIONS.get(id);\r
+ }\r
+ \r
+ public static synchronized NodeSupport<String> getOrCreateNodeSupport(String id) {\r
+ NodeSupport<String> result = SUPPORTS.get(id);\r
+ if(result == null) {\r
+ SCLRealm realm = getOrCreateSCLRealm(id);\r
+ result = new NodeSupport<String>(realm.getNodeManager());\r
+ SUPPORTS.put(id, result);\r
+ }\r
+ return result;\r
+ }\r
+ \r
+ public static synchronized SCLRealm createRealm() {\r
+ String id = UUID.randomUUID().toString();\r
+ return createRealm(id);\r
+ }\r
+ \r
+ public static synchronized SCLRealm getOrCreateSCLRealm(String id) {\r
+ SCLRealm session = sclRealmById(id);\r
+ if(session == null)\r
+ return createRealm(id);\r
+ else\r
+ return session;\r
+ }\r
+ \r
+ private static SCLRealm createRealm(String id) {\r
+ CommandSession connection = new CommandSession(SCLOsgi.MODULE_REPOSITORY, SCLReportingHandler.DEFAULT);\r
+ SCLRealm realm = new SCLRealm(connection, id);\r
+ CONNECTIONS.put(id, realm);\r
+ return realm;\r
+ }\r
+ \r
+ public static synchronized void removeRealm(String id) {\r
+ CONNECTIONS.remove(id);\r
+ // if node support has been created remove it as well\r
+ SUPPORTS.remove(id);\r
+ }\r
+}\r