X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.db.layer0%2Fsrc%2Forg%2Fsimantics%2Fdb%2Flayer0%2Futil%2FRuntimeEnvironmentRequest.java;h=6fbe36854ad99bd8934bd843a094be4742496e7e;hp=23ee4fcbda01ac26de20649552b2831749e58d1d;hb=refs%2Fchanges%2F38%2F238%2F2;hpb=24e2b34260f219f0d1644ca7a138894980e25b14 diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/RuntimeEnvironmentRequest.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/RuntimeEnvironmentRequest.java index 23ee4fcbd..6fbe36854 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/RuntimeEnvironmentRequest.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/RuntimeEnvironmentRequest.java @@ -1,162 +1,162 @@ -package org.simantics.db.layer0.util; - -import java.util.HashMap; -import java.util.Map; - -import org.simantics.db.ReadGraph; -import org.simantics.db.Resource; -import org.simantics.db.common.request.ParametrizedPrimitiveRead; -import org.simantics.db.common.request.UnaryRead; -import org.simantics.db.exception.DatabaseException; -import org.simantics.db.layer0.internal.SimanticsInternal; -import org.simantics.db.procedure.Listener; -import org.simantics.db.request.Read; -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; - -/** - * Finds the runtime environment of a model or other index root. - * - * @author Hannu Niemistö - * @author Antti Villberg - */ -public class RuntimeEnvironmentRequest extends UnaryRead { - - public RuntimeEnvironmentRequest(Resource parameter) { - super(parameter); - } - - protected void fillEnvironmentSpecification(EnvironmentSpecification environmentSpecification) { - } - - static class UpdateListenerImpl implements UpdateListener { - - final EnvironmentSpecification environmentSpecification; - final Listener callback; - - UpdateListenerImpl(EnvironmentSpecification environmentSpecification, Listener callback) { - this.environmentSpecification = environmentSpecification; - this.callback = callback; - } - - @Override - public void notifyAboutUpdate() { - if(callback.isDisposed()) { - return; - } - getRuntimeEnvironment(environmentSpecification, callback, this); - } - - final public static void getRuntimeEnvironment(EnvironmentSpecification environmentSpecification, Listener callback, UpdateListenerImpl listener) { - - try { - - SCLContext context = SCLContext.getCurrent(); - - RuntimeEnvironment env; - Object graph = context.get("graph"); - if(graph == null) - try { - env = SimanticsInternal.getSession().syncRequest(new Read() { - @Override - public RuntimeEnvironment perform(ReadGraph graph) throws DatabaseException { - - SCLContext sclContext = SCLContext.getCurrent(); - Object oldGraph = sclContext.get("graph"); - try { - sclContext.put("graph", graph); - return SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment( - environmentSpecification, - callback.getClass().getClassLoader(), listener); - } catch (ImportFailureException e) { - throw new DatabaseException(e); - } catch (Throwable t) { - throw new DatabaseException(t); - } finally { - sclContext.put("graph", oldGraph); - } - } - }); - } catch (DatabaseException e) { - callback.exception(e); - return; - } - else - env = SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment( - environmentSpecification, - callback.getClass().getClassLoader(), listener); - callback.execute(env); - } catch (ImportFailureException e) { - callback.exception(new DatabaseException(e)); - } - - } - - }; - - // This is needed to prevent garbage collection from collecting UpdateListenerImpls - // -ModuleRepository only makes a weak reference to the listener - final static Map map = new HashMap(); - - @Override - public RuntimeEnvironment perform(ReadGraph graph) - throws DatabaseException { - final EnvironmentSpecification environmentSpecification = EnvironmentSpecification.of( - "Builtin", "", - "Prelude", "", - "Simantics/All", ""); - fillEnvironmentSpecification(environmentSpecification); - Resource mainModule = Layer0Utils.getPossibleChild(graph, parameter, "SCLMain"); - String mainModuleUri; - if(mainModule != null) { - mainModuleUri = graph.getURI(mainModule); - environmentSpecification.importModule(mainModuleUri, ""); - } - else - mainModuleUri = graph.getURI(parameter) + "/#"; // Add something dummy to the model uri that cannot be in a real URI - - return graph.syncRequest(new ParametrizedPrimitiveRead(mainModuleUri) { - - @Override - public void register(ReadGraph graph, Listener procedure) { - - SCLContext context = SCLContext.getCurrent(); - Object oldGraph = context.put("graph", graph); - try { - - if(procedure.isDisposed()) { - UpdateListenerImpl.getRuntimeEnvironment(environmentSpecification, procedure, null); - } else { - UpdateListenerImpl impl = new UpdateListenerImpl(environmentSpecification, procedure); - impl.notifyAboutUpdate(); - map.put(parameter, impl); - } - - } finally { - context.put("graph", oldGraph); - } - - } - - @Override - public void unregistered() { - map.remove(parameter); - } - - }); - } - - @Override - public int hashCode() { - return 31*getClass().hashCode() + super.hashCode(); - } - - public static void flush() { - map.clear(); - } - -} +package org.simantics.db.layer0.util; + +import java.util.HashMap; +import java.util.Map; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ParametrizedPrimitiveRead; +import org.simantics.db.common.request.UnaryRead; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.internal.SimanticsInternal; +import org.simantics.db.procedure.Listener; +import org.simantics.db.request.Read; +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; + +/** + * Finds the runtime environment of a model or other index root. + * + * @author Hannu Niemistö + * @author Antti Villberg + */ +public class RuntimeEnvironmentRequest extends UnaryRead { + + public RuntimeEnvironmentRequest(Resource parameter) { + super(parameter); + } + + protected void fillEnvironmentSpecification(EnvironmentSpecification environmentSpecification) { + } + + static class UpdateListenerImpl implements UpdateListener { + + final EnvironmentSpecification environmentSpecification; + final Listener callback; + + UpdateListenerImpl(EnvironmentSpecification environmentSpecification, Listener callback) { + this.environmentSpecification = environmentSpecification; + this.callback = callback; + } + + @Override + public void notifyAboutUpdate() { + if(callback.isDisposed()) { + return; + } + getRuntimeEnvironment(environmentSpecification, callback, this); + } + + final public static void getRuntimeEnvironment(EnvironmentSpecification environmentSpecification, Listener callback, UpdateListenerImpl listener) { + + try { + + SCLContext context = SCLContext.getCurrent(); + + RuntimeEnvironment env; + Object graph = context.get("graph"); + if(graph == null) + try { + env = SimanticsInternal.getSession().syncRequest(new Read() { + @Override + public RuntimeEnvironment perform(ReadGraph graph) throws DatabaseException { + + SCLContext sclContext = SCLContext.getCurrent(); + Object oldGraph = sclContext.get("graph"); + try { + sclContext.put("graph", graph); + return SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment( + environmentSpecification, + callback.getClass().getClassLoader(), listener); + } catch (ImportFailureException e) { + throw new DatabaseException(e); + } catch (Throwable t) { + throw new DatabaseException(t); + } finally { + sclContext.put("graph", oldGraph); + } + } + }); + } catch (DatabaseException e) { + callback.exception(e); + return; + } + else + env = SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment( + environmentSpecification, + callback.getClass().getClassLoader(), listener); + callback.execute(env); + } catch (ImportFailureException e) { + callback.exception(new DatabaseException(e)); + } + + } + + }; + + // This is needed to prevent garbage collection from collecting UpdateListenerImpls + // -ModuleRepository only makes a weak reference to the listener + final static Map map = new HashMap(); + + @Override + public RuntimeEnvironment perform(ReadGraph graph) + throws DatabaseException { + final EnvironmentSpecification environmentSpecification = EnvironmentSpecification.of( + "Builtin", "", + "Prelude", "", + "Simantics/All", ""); + fillEnvironmentSpecification(environmentSpecification); + Resource mainModule = Layer0Utils.getPossibleChild(graph, parameter, "SCLMain"); + String mainModuleUri; + if(mainModule != null) { + mainModuleUri = graph.getURI(mainModule); + environmentSpecification.importModule(mainModuleUri, ""); + } + else + mainModuleUri = graph.getURI(parameter) + "/#"; // Add something dummy to the model uri that cannot be in a real URI + + return graph.syncRequest(new ParametrizedPrimitiveRead(mainModuleUri) { + + @Override + public void register(ReadGraph graph, Listener procedure) { + + SCLContext context = SCLContext.getCurrent(); + Object oldGraph = context.put("graph", graph); + try { + + if(procedure.isDisposed()) { + UpdateListenerImpl.getRuntimeEnvironment(environmentSpecification, procedure, null); + } else { + UpdateListenerImpl impl = new UpdateListenerImpl(environmentSpecification, procedure); + impl.notifyAboutUpdate(); + map.put(parameter, impl); + } + + } finally { + context.put("graph", oldGraph); + } + + } + + @Override + public void unregistered() { + map.remove(parameter); + } + + }); + } + + @Override + public int hashCode() { + return 31*getClass().hashCode() + super.hashCode(); + } + + public static void flush() { + map.clear(); + } + +}