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); } } }