]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/scl/CompileValueRequest.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / scl / CompileValueRequest.java
1 package org.simantics.db.layer0.scl;\r
2 \r
3 import org.simantics.databoard.Bindings;\r
4 import org.simantics.db.ReadGraph;\r
5 import org.simantics.db.Resource;\r
6 import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
7 import org.simantics.db.common.request.IndexRoot;\r
8 import org.simantics.db.exception.DatabaseException;\r
9 import org.simantics.db.layer0.scl.CompileValueRequest.CompilationContext;\r
10 import org.simantics.db.layer0.util.RuntimeEnvironmentRequest;\r
11 import org.simantics.db.layer0.variable.Variable;\r
12 import org.simantics.layer0.Layer0;\r
13 import org.simantics.scl.compiler.elaboration.expressions.EVariable;\r
14 import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
15 import org.simantics.scl.compiler.environment.Environments;\r
16 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;\r
17 import org.simantics.scl.compiler.top.SCLExpressionCompilationException;\r
18 import org.simantics.scl.compiler.types.Type;\r
19 import org.simantics.scl.runtime.SCLContext;\r
20 import org.simantics.scl.runtime.function.Function1;\r
21 \r
22 /**\r
23  * Compiles an SCL expression that is attached to a literal\r
24  * whose parent is a component that is a part of a component type.\r
25  * \r
26  * @author Tuukka Lehtonen\r
27  */\r
28 public class CompileValueRequest extends AbstractExpressionCompilationRequest<CompilationContext, Variable> {\r
29 \r
30     public static class CompilationContext extends AbstractExpressionCompilationContext {\r
31         public CompilationContext(RuntimeEnvironment runtimeEnvironment) {\r
32             super(runtimeEnvironment);\r
33         }\r
34     }\r
35 \r
36     protected final Resource relation;\r
37     protected final Resource component;\r
38     protected final Resource literal;\r
39 \r
40     public CompileValueRequest(Resource component, Resource literal, Resource relation) {\r
41         this.relation = relation;\r
42         this.component = component;\r
43         this.literal = literal;\r
44     }\r
45 \r
46     public CompileValueRequest(ReadGraph graph, Variable context) throws DatabaseException {\r
47         this(context.getParent(graph).getRepresents(graph),\r
48                 context.getRepresents(graph),\r
49                 context.getPredicateResource(graph));\r
50     }\r
51 \r
52     public static Object compileAndEvaluate(ReadGraph graph, Variable context) throws DatabaseException {\r
53         SCLContext sclContext = SCLContext.getCurrent();\r
54         Object oldGraph = sclContext.get("graph");\r
55         try {\r
56             Function1<Variable,Object> exp = graph.syncRequest(new CompileValueRequest(graph, context),\r
57                     TransientCacheListener.<Function1<Variable,Object>>instance());\r
58             sclContext.put("graph", graph);\r
59             return exp.apply(context);\r
60         } catch (DatabaseException e) {\r
61             throw (DatabaseException)e;\r
62         } catch (Throwable t) {\r
63             throw new DatabaseException(t);\r
64         } finally {\r
65             sclContext.put("graph", oldGraph);\r
66         }\r
67     }\r
68 \r
69     @Override\r
70     protected String getExpressionText(ReadGraph graph)\r
71             throws DatabaseException {\r
72         Layer0 L0 = Layer0.getInstance(graph);\r
73         return graph.getRelatedValue(literal, L0.SCLValue_expression, Bindings.STRING);\r
74     }\r
75 \r
76     protected Resource getIndexRoot(ReadGraph graph) throws DatabaseException {\r
77         return graph.syncRequest(new IndexRoot(literal));\r
78     }\r
79 \r
80     @Override\r
81     protected Type getExpectedType(ReadGraph graph, CompilationContext context)\r
82             throws DatabaseException {\r
83         Layer0 L0 = Layer0.getInstance(graph);\r
84         String valueType = graph.getPossibleRelatedValue(relation, L0.RequiresValueType, Bindings.STRING);\r
85         if(valueType != null) {\r
86             try {\r
87                 return Environments.getType(context.runtimeEnvironment.getEnvironment(), valueType);\r
88             } catch (SCLExpressionCompilationException e) {\r
89                 e.printStackTrace();\r
90             }\r
91         }\r
92         return super.getExpectedType(graph, context);\r
93     }\r
94 \r
95     @Override\r
96     protected CompilationContext getCompilationContext(ReadGraph graph)\r
97             throws DatabaseException {\r
98         Resource indexRoot = getIndexRoot(graph);\r
99         RuntimeEnvironment runtimeEnvironment = graph.syncRequest(new RuntimeEnvironmentRequest(indexRoot));\r
100         return new CompilationContext(runtimeEnvironment);\r
101     }\r
102 \r
103     @Override\r
104     protected Type getContextVariableType() {\r
105         return VARIABLE; \r
106     }\r
107 \r
108     @Override\r
109     protected Expression getVariableAccessExpression(\r
110             ReadGraph graph,\r
111             CompilationContext context,\r
112             org.simantics.scl.compiler.elaboration.expressions.Variable contextVariable,\r
113             String name) throws DatabaseException {\r
114         if(name.equals("self"))\r
115             return new EVariable(contextVariable);\r
116         else\r
117             return null;\r
118     }\r
119 \r
120 }\r