-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
+package org.simantics.modeling;
+
+import org.simantics.db.ReadGraph;
+import org.simantics.db.common.request.ParametrizedPrimitiveRead;
+import org.simantics.db.procedure.Listener;
+import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;
+import org.simantics.scl.compiler.module.repository.ImportFailureException;
+import org.simantics.scl.compiler.module.repository.UpdateListener;
+import org.simantics.scl.compiler.runtime.RuntimeEnvironment;
+import org.simantics.scl.osgi.SCLOsgi;
+import org.simantics.scl.runtime.SCLContext;
+
+public class ComponentTypeScriptRuntimeEnvironmentRequest extends ParametrizedPrimitiveRead<EnvironmentSpecification, RuntimeEnvironment> {
+ UpdateListener listener;
+
+ public ComponentTypeScriptRuntimeEnvironmentRequest(EnvironmentSpecification parameter) {
+ super(parameter);
+ }
+
+ @Override
+ public void register(ReadGraph graph, Listener<RuntimeEnvironment> procedure) {
+ if(!procedure.isDisposed() && listener == null) {
+ listener = new UpdateListener() {
+ @Override
+ public void notifyAboutUpdate() {
+ createRuntimeEnvironment(graph, procedure, this);
+ }
+ };
+ }
+ createRuntimeEnvironment(graph, procedure, listener);
+ }
+
+ @Override
+ public void unregistered() {
+ if(listener != null)
+ listener.stopListening();
+ }
+
+ private void createRuntimeEnvironment(ReadGraph graph, Listener<RuntimeEnvironment> procedure, UpdateListener listener) {
+ SCLContext context = SCLContext.getCurrent();
+ Object oldGraph = context.put("graph", graph);
+ try {
+ procedure.execute(SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment(parameter, ComponentTypeScriptRuntimeEnvironmentRequest.class.getClassLoader(), listener));
+ }
+ catch (ImportFailureException e) {
+ procedure.exception(e);
+ }
+ finally {
+ context.put("graph", oldGraph);
+ }
+ }
+
+}