]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/scl/CompileSCLQueryRequest.java
Added some enforcement of immutability to structural user component UI's.
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / scl / CompileSCLQueryRequest.java
1 package org.simantics.modeling.scl;\r
2 \r
3 import java.util.Map;\r
4 \r
5 import org.simantics.db.ReadGraph;\r
6 import org.simantics.db.Resource;\r
7 import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
8 import org.simantics.db.common.request.IndexRoot;\r
9 import org.simantics.db.common.request.ResourceRead2;\r
10 import org.simantics.db.exception.DatabaseException;\r
11 import org.simantics.db.layer0.util.RuntimeEnvironmentRequest;\r
12 import org.simantics.db.layer0.variable.Variable;\r
13 import org.simantics.layer0.Layer0;\r
14 import org.simantics.scl.compiler.common.names.Name;\r
15 import org.simantics.scl.compiler.elaboration.expressions.EApply;\r
16 import org.simantics.scl.compiler.elaboration.expressions.EConstant;\r
17 import org.simantics.scl.compiler.elaboration.expressions.EVariable;\r
18 import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
19 import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
20 import org.simantics.scl.compiler.environment.Environment;\r
21 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;\r
22 import org.simantics.scl.compiler.types.Type;\r
23 import org.simantics.scl.compiler.types.Types;\r
24 import org.simantics.scl.runtime.SCLContext;\r
25 import org.simantics.scl.runtime.function.Function1;\r
26 import org.simantics.structural2.scl.CompileStructuralValueRequest;\r
27 import org.simantics.structural2.scl.ComponentTypeProperty;\r
28 import org.simantics.structural2.scl.ReadComponentTypeInterfaceRequest;\r
29 \r
30 public class CompileSCLQueryRequest extends CompileStructuralValueRequest {\r
31 \r
32     public CompileSCLQueryRequest(ReadGraph graph, Variable context)\r
33             throws DatabaseException {\r
34         super(graph, context);\r
35     }\r
36 \r
37     public static Object compileAndEvaluate(ReadGraph graph, Variable context) throws DatabaseException {\r
38         SCLContext sclContext = SCLContext.getCurrent();\r
39         Object oldGraph = sclContext.get("graph");\r
40         try {\r
41             Function1<Variable,Object> exp = graph.syncRequest(new CompileSCLQueryRequest(graph, context),\r
42                     TransientCacheListener.<Function1<Variable,Object>>instance());\r
43             sclContext.put("graph", graph);\r
44             return exp.apply(context);\r
45         } catch (DatabaseException e) {\r
46             throw (DatabaseException)e;\r
47         } catch (Throwable t) {\r
48             throw new DatabaseException(t);\r
49         } finally {\r
50             sclContext.put("graph", oldGraph);\r
51         }\r
52     }\r
53 \r
54     protected static Name INPUT_VARIABLE = Name.create("Simantics/Query", "inputVariable");\r
55     protected static Name SESSION_VARIABLE = Name.create("Simantics/Query", "sessionVariable");\r
56     public static final Type VARIABLE = Types.con("Simantics/Variables", "Variable"); \r
57 \r
58     protected static Expression accessQueryVariable(Environment environment,\r
59             org.simantics.scl.compiler.elaboration.expressions.Variable contextVariable) {\r
60         SCLValue variableParentFunction = environment.getValue(VARIABLE_PARENT);\r
61         return new EApply(new EConstant(variableParentFunction), new EVariable(contextVariable));\r
62     }\r
63 \r
64     @Override\r
65     protected Expression getVariableAccessExpression(\r
66             ReadGraph graph,\r
67             CompilationContext context,\r
68             org.simantics.scl.compiler.elaboration.expressions.Variable contextVariable,\r
69             String name) throws DatabaseException {\r
70         ComponentTypeProperty property = context.propertyMap.get(name);\r
71         if(property != null) {\r
72             Environment environment = context.runtimeEnvironment.getEnvironment();\r
73             return getPropertyFlexible(environment,\r
74                         accessQueryVariable(environment, contextVariable),\r
75                     name,\r
76                     property.type);\r
77         }\r
78         else if(name.equals("input")) {\r
79             Environment environment = context.runtimeEnvironment.getEnvironment();\r
80             return new EApply(\r
81                             new EConstant(environment.getValue(INPUT_VARIABLE)),\r
82                             new EVariable(contextVariable));\r
83         }\r
84         else if(name.equals("session")) {\r
85             Environment environment = context.runtimeEnvironment.getEnvironment();\r
86             return new EApply(\r
87                             new EConstant(environment.getValue(SESSION_VARIABLE)),\r
88                             new EVariable(contextVariable));\r
89         }\r
90         else if(name.equals("self"))\r
91             return new EVariable(contextVariable);\r
92         else\r
93             return null;\r
94     }\r
95     \r
96     @Override\r
97     protected CompilationContext getCompilationContext(ReadGraph graph) throws DatabaseException {\r
98         Resource indexRoot = graph.syncRequest(new IndexRoot(literal));\r
99         return graph.syncRequest(new ResourceRead2<CompilationContext>(component, indexRoot) {\r
100             @Override\r
101             public CompilationContext perform(ReadGraph graph) throws DatabaseException {\r
102                 Layer0 L0 = Layer0.getInstance(graph);\r
103                 Resource type = graph.getPossibleType(component, L0.Entity);\r
104                 RuntimeEnvironment runtimeEnvironment = graph.syncRequest(new RuntimeEnvironmentRequest(resource2));\r
105                 Map<String, ComponentTypeProperty> propertyMap =\r
106                         graph.syncRequest(new ReadComponentTypeInterfaceRequest(type, runtimeEnvironment.getEnvironment()),\r
107                                 TransientCacheListener.<Map<String, ComponentTypeProperty>>instance());\r
108                 return new CompilationContext(runtimeEnvironment, propertyMap);\r
109             }\r
110         });\r
111     }\r
112     \r
113 }\r