X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2FComponentTypeScriptRuntimeEnvironmentRequest.java;fp=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2FComponentTypeScriptRuntimeEnvironmentRequest.java;h=d5f4365b46c7faca8c0de476f7b52ea5fcc827be;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git 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 index 000000000..d5f4365b4 --- /dev/null +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentTypeScriptRuntimeEnvironmentRequest.java @@ -0,0 +1,55 @@ +package org.simantics.modeling; + +import java.util.ArrayList; + +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 { + + // This array list is only needed to keep strong references to update listeners preventing their garbage collection. + ArrayList listeners; + + public ComponentTypeScriptRuntimeEnvironmentRequest(EnvironmentSpecification parameter) { + super(parameter); + } + + @Override + public void register(ReadGraph graph, Listener procedure) { + UpdateListener listener = null; + if(!procedure.isDisposed()) { + listener = new UpdateListener() { + @Override + public void notifyAboutUpdate() { + createRuntimeEnvironment(graph, procedure, this); + } + }; + if(listeners == null) + listeners = new ArrayList(2); + listeners.add(listener); + } + createRuntimeEnvironment(graph, procedure, listener); + } + + private void createRuntimeEnvironment(ReadGraph graph, Listener 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); + } + } + +}