--- /dev/null
+package org.simantics.db.layer0.util;\r
+\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.request.BinaryRead;\r
+import org.simantics.db.common.request.ObjectsWithType;\r
+import org.simantics.db.common.request.ParametrizedPrimitiveRead;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.internal.SimanticsInternal;\r
+import org.simantics.db.procedure.Listener;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;\r
+import org.simantics.scl.compiler.module.repository.ImportFailureException;\r
+import org.simantics.scl.compiler.module.repository.UpdateListener;\r
+import org.simantics.scl.compiler.runtime.RuntimeEnvironment;\r
+import org.simantics.scl.osgi.SCLOsgi;\r
+import org.simantics.scl.runtime.SCLContext;\r
+\r
+/**\r
+ * Finds the runtime environment of a model or other index root.\r
+ * \r
+ * @author Hannu Niemistö\r
+ * @author Antti Villberg\r
+ */\r
+public class RuntimeEnvironmentRequest2 extends BinaryRead<Resource, Resource, RuntimeEnvironment> {\r
+\r
+ public RuntimeEnvironmentRequest2(Resource parameter, Resource parameter2) {\r
+ super(parameter, parameter2);\r
+ }\r
+ \r
+ protected void fillEnvironmentSpecification(EnvironmentSpecification environmentSpecification) {\r
+ }\r
+\r
+ static class UpdateListenerImpl implements UpdateListener {\r
+ \r
+ final EnvironmentSpecification environmentSpecification;\r
+ final Listener<RuntimeEnvironment> callback;\r
+ \r
+ UpdateListenerImpl(EnvironmentSpecification environmentSpecification, Listener<RuntimeEnvironment> callback) {\r
+ this.environmentSpecification = environmentSpecification;\r
+ this.callback = callback;\r
+ }\r
+\r
+ @Override\r
+ public void notifyAboutUpdate() {\r
+ if(callback.isDisposed()) {\r
+ return;\r
+ }\r
+ getRuntimeEnvironment(environmentSpecification, callback, this);\r
+ }\r
+\r
+ final public static void getRuntimeEnvironment(EnvironmentSpecification environmentSpecification, Listener<RuntimeEnvironment> callback, UpdateListenerImpl listener) {\r
+\r
+ try {\r
+ \r
+ SCLContext context = SCLContext.getCurrent();\r
+ \r
+ RuntimeEnvironment env;\r
+ Object graph = context.get("graph");\r
+ if(graph == null)\r
+ try {\r
+ env = SimanticsInternal.getSession().syncRequest(new Read<RuntimeEnvironment>() {\r
+ @Override\r
+ public RuntimeEnvironment perform(ReadGraph graph) throws DatabaseException {\r
+ \r
+ SCLContext sclContext = SCLContext.getCurrent();\r
+ Object oldGraph = sclContext.get("graph");\r
+ try {\r
+ sclContext.put("graph", graph);\r
+ return SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment(\r
+ environmentSpecification,\r
+ callback.getClass().getClassLoader(), listener);\r
+ } catch (ImportFailureException e) {\r
+ throw new DatabaseException(e);\r
+ } catch (Throwable t) {\r
+ throw new DatabaseException(t);\r
+ } finally {\r
+ sclContext.put("graph", oldGraph);\r
+ }\r
+ }\r
+ });\r
+ } catch (DatabaseException e) {\r
+ callback.exception(e);\r
+ return;\r
+ }\r
+ else \r
+ env = SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment(\r
+ environmentSpecification,\r
+ callback.getClass().getClassLoader(), listener);\r
+ callback.execute(env);\r
+ } catch (ImportFailureException e) {\r
+ callback.exception(new DatabaseException(e));\r
+ }\r
+\r
+ }\r
+ \r
+ }; \r
+\r
+ // This is needed to prevent garbage collection from collecting UpdateListenerImpls\r
+ // -ModuleRepository only makes a weak reference to the listener\r
+ final static Map<EnvironmentSpecification, UpdateListenerImpl> map = new HashMap<>(); \r
+ \r
+ @Override\r
+ public RuntimeEnvironment perform(ReadGraph graph)\r
+ throws DatabaseException {\r
+ final EnvironmentSpecification environmentSpecification = EnvironmentSpecification.of(\r
+ "Builtin", "",\r
+ "Prelude", "",\r
+ "Simantics/All", "");\r
+ fillEnvironmentSpecification(environmentSpecification);\r
+ \r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ Collection<Resource> sclModules = graph.syncRequest(new ObjectsWithType(parameter, L0.ConsistsOf, L0.SCLModule));\r
+ for (Resource sclModule : sclModules)\r
+ environmentSpecification.importModule(graph.getURI(sclModule), "");\r
+ \r
+ Resource mainModule = Layer0Utils.getPossibleChild(graph, parameter2, "SCLMain");\r
+ if(mainModule != null)\r
+ environmentSpecification.importModule(graph.getURI(mainModule), "");\r
+ \r
+ return graph.syncRequest(new ParametrizedPrimitiveRead<EnvironmentSpecification, RuntimeEnvironment>(environmentSpecification) {\r
+ \r
+ @Override\r
+ public void register(ReadGraph graph, Listener<RuntimeEnvironment> procedure) {\r
+\r
+ SCLContext context = SCLContext.getCurrent();\r
+ Object oldGraph = context.put("graph", graph);\r
+ try {\r
+\r
+ if(procedure.isDisposed()) {\r
+ UpdateListenerImpl.getRuntimeEnvironment(parameter, procedure, null);\r
+ } else {\r
+ UpdateListenerImpl impl = new UpdateListenerImpl(parameter, procedure);\r
+ impl.notifyAboutUpdate();\r
+ map.put(parameter, impl);\r
+ }\r
+\r
+ } finally {\r
+ context.put("graph", oldGraph);\r
+ }\r
+\r
+ }\r
+ \r
+ @Override\r
+ public void unregistered() {\r
+ map.remove(parameter);\r
+ }\r
+ \r
+ });\r
+ }\r
+ \r
+ @Override\r
+ public int hashCode() {\r
+ return 31*getClass().hashCode() + super.hashCode();\r
+ }\r
+\r
+ public static void flush() {\r
+ map.clear();\r
+ }\r
+\r
+}
\ No newline at end of file
import org.simantics.db.layer0.request.VariableRead;\r
import org.simantics.db.layer0.scl.AbstractExpressionCompilationContext;\r
import org.simantics.db.layer0.scl.AbstractExpressionCompilationRequest;\r
-import org.simantics.db.layer0.util.RuntimeEnvironmentRequest;\r
+import org.simantics.db.layer0.util.RuntimeEnvironmentRequest2;\r
import org.simantics.db.layer0.variable.Variable;\r
import org.simantics.document.server.Functions;\r
import org.simantics.document.server.bean.DataDefinition;\r
return "\\context -> " + exp;\r
}\r
\r
- protected RuntimeEnvironmentRequest getRuntimeEnvironmentRequest(Resource indexRoot) {\r
- return new RuntimeEnvironmentRequest(indexRoot) {\r
+ protected RuntimeEnvironmentRequest2 getRuntimeEnvironmentRequest(Resource componentType, Resource indexRoot) {\r
+ return new RuntimeEnvironmentRequest2(componentType, indexRoot) {\r
@Override\r
protected void fillEnvironmentSpecification(\r
EnvironmentSpecification environmentSpecification) {\r
public CompilationContext perform(ReadGraph graph) throws DatabaseException {\r
\r
Pair<Resource,Resource> parameter = getComponentTypeAndRoot(graph, variable);\r
- RuntimeEnvironment runtimeEnvironment = graph.syncRequest(getRuntimeEnvironmentRequest(parameter.second));\r
+ RuntimeEnvironment runtimeEnvironment = graph.syncRequest(getRuntimeEnvironmentRequest(parameter.first, parameter.second));\r
\r
Map<String, ComponentTypeProperty> propertyMap =\r
graph.syncRequest(new ReadComponentTypeInterfaceRequest(parameter.first, runtimeEnvironment.getEnvironment()),\r
import org.simantics.db.layer0.scl.AbstractExpressionCompilationContext;\r
import org.simantics.db.layer0.scl.AbstractExpressionCompilationRequest;\r
import org.simantics.db.layer0.util.RuntimeEnvironmentRequest;\r
+import org.simantics.db.layer0.util.RuntimeEnvironmentRequest2;\r
import org.simantics.db.layer0.variable.Variable;\r
import org.simantics.document.server.request.ServerSCLValueRequest.CompilationContext;\r
import org.simantics.layer0.Layer0;\r
return graph.getRelatedValue(literal, L0.SCLValue_expression, Bindings.STRING);\r
}\r
\r
- protected RuntimeEnvironmentRequest getRuntimeEnvironmentRequest(Resource indexRoot) {\r
- return new RuntimeEnvironmentRequest(indexRoot) {\r
+ protected RuntimeEnvironmentRequest2 getRuntimeEnvironmentRequest(Resource componentType, Resource indexRoot) {\r
+ return new RuntimeEnvironmentRequest2(componentType, indexRoot) {\r
@Override\r
protected void fillEnvironmentSpecification(\r
EnvironmentSpecification environmentSpecification) {\r
@Override\r
public CompilationContext perform(ReadGraph graph)\r
throws DatabaseException {\r
- RuntimeEnvironment runtimeEnvironment = graph.syncRequest(getRuntimeEnvironmentRequest(parameter.second));\r
+ RuntimeEnvironment runtimeEnvironment = graph.syncRequest(getRuntimeEnvironmentRequest(parameter.first, parameter.second));\r
Map<String, ComponentTypeProperty> propertyMap =\r
graph.syncRequest(new ReadComponentTypeInterfaceRequest(parameter.first, runtimeEnvironment.getEnvironment()),\r
TransientCacheListener.<Map<String, ComponentTypeProperty>>instance());\r