]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.structural2/src/org/simantics/structural2/scl/CompileProceduralExpressionValueRequest.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.structural2 / src / org / simantics / structural2 / scl / CompileProceduralExpressionValueRequest.java
1 package org.simantics.structural2.scl;\r
2 \r
3 import org.simantics.db.ReadGraph;\r
4 import org.simantics.db.Resource;\r
5 import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
6 import org.simantics.db.exception.DatabaseException;\r
7 import org.simantics.db.layer0.variable.Variable;\r
8 import org.simantics.scl.runtime.SCLContext;\r
9 import org.simantics.scl.runtime.function.Function1;\r
10 \r
11 public class CompileProceduralExpressionValueRequest extends AbstractCompileStructuralValueRequest {\r
12     \r
13     protected final String expression;\r
14     protected final Resource componentType;\r
15     protected final Resource indexRoot;\r
16     \r
17     public CompileProceduralExpressionValueRequest(String expression, Resource componentType, Resource relation, Resource indexRoot) {\r
18         super(relation);\r
19         this.expression = expression;\r
20         this.componentType = componentType;\r
21         this.indexRoot = indexRoot;\r
22     }\r
23     \r
24     public CompileProceduralExpressionValueRequest(ReadGraph graph, String expression, Variable context) throws DatabaseException {\r
25         this(expression, context.getParent(graph).getType(graph),\r
26                 context.getPredicateResource(graph),\r
27                 context.getIndexRoot(graph));\r
28     }\r
29     \r
30     public static Object compileAndEvaluate(ReadGraph graph, String expression, Variable context) throws DatabaseException {\r
31         SCLContext sclContext = SCLContext.getCurrent();\r
32         Object oldGraph = sclContext.get("graph");\r
33         try {\r
34             Function1<Variable,Object> exp = graph.syncRequest(new CompileProceduralExpressionValueRequest(graph, expression, context),\r
35                     TransientCacheListener.<Function1<Variable,Object>>instance());\r
36             sclContext.put("graph", graph);\r
37             return exp.apply(context);\r
38         } catch (DatabaseException e) {\r
39             throw (DatabaseException)e;\r
40         } catch (Throwable t) {\r
41             throw new DatabaseException(t);\r
42         } finally {\r
43             sclContext.put("graph", oldGraph);\r
44         }\r
45     }\r
46     \r
47     @Override\r
48     protected String getExpressionText(ReadGraph graph) throws DatabaseException {\r
49         return expression;\r
50     }\r
51 \r
52     @Override\r
53     protected Resource getIndexRoot(ReadGraph graph) throws DatabaseException {\r
54         return indexRoot;\r
55     }\r
56 \r
57     @Override\r
58     protected Resource getComponentType(ReadGraph graph) throws DatabaseException {\r
59         return componentType;\r
60     }\r
61 \r
62 }\r