1 package org.simantics.modeling;
\r
3 import java.util.ArrayList;
\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
15 public class ComponentTypeScriptRuntimeEnvironmentRequest extends ParametrizedPrimitiveRead<EnvironmentSpecification, RuntimeEnvironment> {
\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
20 public ComponentTypeScriptRuntimeEnvironmentRequest(EnvironmentSpecification parameter) {
\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
30 public void notifyAboutUpdate() {
\r
31 createRuntimeEnvironment(graph, procedure, this);
\r
34 if(listeners == null)
\r
35 listeners = new ArrayList<UpdateListener>(2);
\r
36 listeners.add(listener);
\r
38 createRuntimeEnvironment(graph, procedure, listener);
\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
45 procedure.execute(SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment(parameter, ComponentTypeScriptRuntimeEnvironmentRequest.class.getClassLoader(), listener));
\r
47 catch (ImportFailureException e) {
\r
48 procedure.exception(e);
\r
51 context.put("graph", oldGraph);
\r