--- /dev/null
+package org.simantics.modeling;\r
+\r
+import java.util.ArrayList;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.common.request.ParametrizedPrimitiveRead;\r
+import org.simantics.db.procedure.Listener;\r
+import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;\r
+import org.simantics.scl.compiler.module.repository.ImportFailureException;\r
+import org.simantics.scl.compiler.module.repository.UpdateListener;\r
+import org.simantics.scl.compiler.runtime.RuntimeEnvironment;\r
+import org.simantics.scl.osgi.SCLOsgi;\r
+import org.simantics.scl.runtime.SCLContext;\r
+\r
+public class ComponentTypeScriptRuntimeEnvironmentRequest extends ParametrizedPrimitiveRead<EnvironmentSpecification, RuntimeEnvironment> {\r
+\r
+ // This array list is only needed to keep strong references to update listeners preventing their garbage collection.\r
+ ArrayList<UpdateListener> listeners;\r
+ \r
+ public ComponentTypeScriptRuntimeEnvironmentRequest(EnvironmentSpecification parameter) {\r
+ super(parameter);\r
+ }\r
+\r
+ @Override\r
+ public void register(ReadGraph graph, Listener<RuntimeEnvironment> procedure) {\r
+ UpdateListener listener = null;\r
+ if(!procedure.isDisposed()) {\r
+ listener = new UpdateListener() {\r
+ @Override\r
+ public void notifyAboutUpdate() {\r
+ createRuntimeEnvironment(graph, procedure, this);\r
+ }\r
+ };\r
+ if(listeners == null)\r
+ listeners = new ArrayList<UpdateListener>(2);\r
+ listeners.add(listener);\r
+ }\r
+ createRuntimeEnvironment(graph, procedure, listener);\r
+ }\r
+ \r
+ private void createRuntimeEnvironment(ReadGraph graph, Listener<RuntimeEnvironment> procedure, UpdateListener listener) {\r
+ SCLContext context = SCLContext.getCurrent();\r
+ Object oldGraph = context.put("graph", graph);\r
+ try {\r
+ procedure.execute(SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment(parameter, ComponentTypeScriptRuntimeEnvironmentRequest.class.getClassLoader(), listener));\r
+ }\r
+ catch (ImportFailureException e) {\r
+ procedure.exception(e);\r
+ }\r
+ finally {\r
+ context.put("graph", oldGraph);\r
+ }\r
+ }\r
+\r
+}\r