]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.structural2/src/org/simantics/structural2/scl/procedural/CompileProceduralComponentTypeRequest.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.structural2 / src / org / simantics / structural2 / scl / procedural / CompileProceduralComponentTypeRequest.java
1 package org.simantics.structural2.scl.procedural;\r
2 \r
3 import java.util.List;\r
4 \r
5 import org.simantics.databoard.Bindings;\r
6 import org.simantics.db.ReadGraph;\r
7 import org.simantics.db.Resource;\r
8 import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
9 import org.simantics.db.exception.DatabaseException;\r
10 import org.simantics.db.layer0.scl.AbstractExpressionCompilationRequest;\r
11 import org.simantics.db.layer0.variable.Variable;\r
12 import org.simantics.scl.compiler.common.names.Name;\r
13 import org.simantics.scl.compiler.constants.StringConstant;\r
14 import org.simantics.scl.compiler.elaboration.expressions.EApply;\r
15 import org.simantics.scl.compiler.elaboration.expressions.EConstant;\r
16 import org.simantics.scl.compiler.elaboration.expressions.EExternalConstant;\r
17 import org.simantics.scl.compiler.elaboration.expressions.ELiteral;\r
18 import org.simantics.scl.compiler.elaboration.expressions.EVariable;\r
19 import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
20 import org.simantics.scl.compiler.environment.Environment;\r
21 import org.simantics.scl.compiler.types.Type;\r
22 import org.simantics.scl.compiler.types.Types;\r
23 import org.simantics.scl.runtime.SCLContext;\r
24 import org.simantics.scl.runtime.function.Function1;\r
25 import org.simantics.structural.stubs.StructuralResource2;\r
26 import org.simantics.structural2.procedural.Interface;\r
27 import org.simantics.structural2.procedural.SubstructureElement;\r
28 import org.simantics.structural2.scl.ComponentTypeProperty;\r
29 \r
30 public class CompileProceduralComponentTypeRequest extends AbstractExpressionCompilationRequest<ProceduralComponentTypeCompilationContext, Variable> {\r
31 \r
32     private static final Type EXPECTED_TYPE = Types.list(Types.con("Structural/Procedural", "SubstructureElement"));\r
33     private static Name PROPERTY_VALUE = Name.create("Simantics/Variables", "propertyValue");\r
34     private static final Type CONNECTION_POINT = Types.con("Structural/Procedural", "ConnectionPoint");\r
35     \r
36     private final Resource componentType;\r
37     \r
38     public CompileProceduralComponentTypeRequest(Resource componentType) {\r
39         this.componentType = componentType;\r
40     }\r
41     \r
42     @SuppressWarnings("unchecked")\r
43     public static List<SubstructureElement> compileAndEvaluate(ReadGraph graph, Resource componentType, Variable context) throws DatabaseException {\r
44         SCLContext sclContext = SCLContext.getCurrent();\r
45         Object oldGraph = sclContext.get("graph");\r
46         try {\r
47             Function1<Variable,Object> exp = graph.syncRequest(\r
48                     new CompileProceduralComponentTypeRequest(componentType),\r
49                     TransientCacheListener.<Function1<Variable,Object>>instance());\r
50             sclContext.put("graph", graph);\r
51             return (List<SubstructureElement>)exp.apply(context);\r
52         } catch (DatabaseException e) {\r
53             throw (DatabaseException)e;\r
54         } catch (Throwable t) {\r
55             throw new DatabaseException(t);\r
56         } finally {\r
57             sclContext.put("graph", oldGraph);\r
58         }\r
59     }\r
60 \r
61     @Override\r
62     protected String getExpressionText(ReadGraph graph)\r
63             throws DatabaseException {\r
64         StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
65         return graph.getRelatedValue(componentType, STR.ProceduralComponentType_code, Bindings.STRING);\r
66     }\r
67 \r
68     @Override\r
69     protected ProceduralComponentTypeCompilationContext getCompilationContext(\r
70             ReadGraph graph) throws DatabaseException {\r
71         return graph.syncRequest(new ProceduralComponentTypeCompilationContextRequest(componentType));\r
72     }\r
73 \r
74     @Override\r
75     protected Type getContextVariableType() {\r
76         return VARIABLE;\r
77     }\r
78 \r
79     @Override\r
80     protected Expression getVariableAccessExpression(\r
81             ReadGraph graph,\r
82             ProceduralComponentTypeCompilationContext context,\r
83             org.simantics.scl.compiler.elaboration.expressions.Variable contextVariable,\r
84             String name) throws DatabaseException {\r
85         ComponentTypeProperty property = context.propertyMap.get(name);\r
86         if(property != null) {\r
87             Environment environment = context.runtimeEnvironment.getEnvironment();\r
88             return new EApply(\r
89                     new EConstant(environment.getValue(FROM_DYNAMIC), property.type),\r
90                     new EApply(\r
91                             new EConstant(environment.getValue(PROPERTY_VALUE), Types.DYNAMIC),\r
92                             new EVariable(contextVariable),\r
93                             new ELiteral(new StringConstant(name))));\r
94         }\r
95         \r
96         Resource connectionPoint = context.connectionPointMap.get(name);\r
97         if(connectionPoint != null)\r
98             return new EExternalConstant(new Interface(connectionPoint), CONNECTION_POINT);\r
99         \r
100         else if(name.equals("input"))\r
101             return new EVariable(contextVariable);\r
102         else if(name.equals("self"))\r
103             return new EVariable(contextVariable);\r
104         else\r
105             return null;\r
106     }\r
107     \r
108     public static Type getExpectedType() {\r
109         return EXPECTED_TYPE;\r
110     }\r
111     \r
112     @Override\r
113     protected boolean parseAsBlock() {\r
114         return true;\r
115     }\r
116     \r
117     @Override\r
118     public boolean equals(Object obj) {\r
119         if(obj == this)\r
120             return true;\r
121         if(obj == null || obj.getClass() != getClass())\r
122             return false;\r
123         CompileProceduralComponentTypeRequest other = (CompileProceduralComponentTypeRequest)obj;\r
124         return componentType.equals(other.componentType);\r
125     }\r
126     \r
127     @Override\r
128     public int hashCode() {\r
129         return componentType.hashCode();\r
130     }\r
131 }\r