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