--- /dev/null
+package org.simantics.structural2.scl;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.scl.runtime.SCLContext;\r
+import org.simantics.scl.runtime.function.Function1;\r
+\r
+public class CompileProceduralExpressionValueRequest extends AbstractCompileStructuralValueRequest {\r
+ \r
+ protected final String expression;\r
+ protected final Resource componentType;\r
+ protected final Resource indexRoot;\r
+ \r
+ public CompileProceduralExpressionValueRequest(String expression, Resource componentType, Resource relation, Resource indexRoot) {\r
+ super(relation);\r
+ this.expression = expression;\r
+ this.componentType = componentType;\r
+ this.indexRoot = indexRoot;\r
+ }\r
+ \r
+ public CompileProceduralExpressionValueRequest(ReadGraph graph, String expression, Variable context) throws DatabaseException {\r
+ this(expression, context.getParent(graph).getType(graph),\r
+ context.getPredicateResource(graph),\r
+ context.getIndexRoot(graph));\r
+ }\r
+ \r
+ public static Object compileAndEvaluate(ReadGraph graph, String expression, Variable context) throws DatabaseException {\r
+ SCLContext sclContext = SCLContext.getCurrent();\r
+ Object oldGraph = sclContext.get("graph");\r
+ try {\r
+ Function1<Variable,Object> exp = graph.syncRequest(new CompileProceduralExpressionValueRequest(graph, expression, context),\r
+ TransientCacheListener.<Function1<Variable,Object>>instance());\r
+ sclContext.put("graph", graph);\r
+ return exp.apply(context);\r
+ } catch (DatabaseException e) {\r
+ throw (DatabaseException)e;\r
+ } catch (Throwable t) {\r
+ throw new DatabaseException(t);\r
+ } finally {\r
+ sclContext.put("graph", oldGraph);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ protected String getExpressionText(ReadGraph graph) throws DatabaseException {\r
+ return expression;\r
+ }\r
+\r
+ @Override\r
+ protected Resource getIndexRoot(ReadGraph graph) throws DatabaseException {\r
+ return indexRoot;\r
+ }\r
+\r
+ @Override\r
+ protected Resource getComponentType(ReadGraph graph) throws DatabaseException {\r
+ return componentType;\r
+ }\r
+\r
+}\r