]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentTypeScriptRuntimeEnvironmentRequest.java
Merge commit 'd7afa23'
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / ComponentTypeScriptRuntimeEnvironmentRequest.java
1 package org.simantics.modeling;\r
2 \r
3 import java.util.ArrayList;\r
4 \r
5 import org.simantics.db.ReadGraph;\r
6 import org.simantics.db.common.request.ParametrizedPrimitiveRead;\r
7 import org.simantics.db.procedure.Listener;\r
8 import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;\r
9 import org.simantics.scl.compiler.module.repository.ImportFailureException;\r
10 import org.simantics.scl.compiler.module.repository.UpdateListener;\r
11 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;\r
12 import org.simantics.scl.osgi.SCLOsgi;\r
13 import org.simantics.scl.runtime.SCLContext;\r
14 \r
15 public class ComponentTypeScriptRuntimeEnvironmentRequest extends ParametrizedPrimitiveRead<EnvironmentSpecification, RuntimeEnvironment> {\r
16 \r
17     // This array list is only needed to keep strong references to update listeners preventing their garbage collection.\r
18     ArrayList<UpdateListener> listeners;\r
19     \r
20     public ComponentTypeScriptRuntimeEnvironmentRequest(EnvironmentSpecification parameter) {\r
21         super(parameter);\r
22     }\r
23 \r
24     @Override\r
25     public void register(ReadGraph graph, Listener<RuntimeEnvironment> procedure) {\r
26         UpdateListener listener = null;\r
27         if(!procedure.isDisposed()) {\r
28             listener = new UpdateListener() {\r
29                 @Override\r
30                 public void notifyAboutUpdate() {\r
31                     createRuntimeEnvironment(graph, procedure, this);\r
32                 }\r
33             };\r
34             if(listeners == null)\r
35                 listeners = new ArrayList<UpdateListener>(2);\r
36             listeners.add(listener);\r
37         }\r
38         createRuntimeEnvironment(graph, procedure, listener);\r
39     }\r
40     \r
41     private void createRuntimeEnvironment(ReadGraph graph, Listener<RuntimeEnvironment> procedure, UpdateListener listener) {\r
42         SCLContext context = SCLContext.getCurrent();\r
43         Object oldGraph = context.put("graph", graph);\r
44         try {\r
45             procedure.execute(SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment(parameter, ComponentTypeScriptRuntimeEnvironmentRequest.class.getClassLoader(), listener));\r
46         }\r
47         catch (ImportFailureException e) {\r
48             procedure.exception(e);\r
49         }\r
50         finally {\r
51             context.put("graph", oldGraph);\r
52         }\r
53     }\r
54 \r
55 }\r