]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentTypeScriptRuntimeEnvironmentRequest.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / ComponentTypeScriptRuntimeEnvironmentRequest.java
diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentTypeScriptRuntimeEnvironmentRequest.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentTypeScriptRuntimeEnvironmentRequest.java
new file mode 100644 (file)
index 0000000..d5f4365
--- /dev/null
@@ -0,0 +1,55 @@
+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