1 package org.simantics.modeling.scl;
\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.common.request.ResourceRead;
\r
9 import org.simantics.db.exception.DatabaseException;
\r
10 import org.simantics.db.layer0.scl.AbstractExpressionCompilationContext;
\r
11 import org.simantics.db.layer0.scl.AbstractExpressionCompilationRequest;
\r
12 import org.simantics.db.layer0.util.RuntimeEnvironmentRequest;
\r
13 import org.simantics.db.layer0.variable.Variable;
\r
14 import org.simantics.layer0.Layer0;
\r
15 import org.simantics.modeling.ComponentTypeSubstructure;
\r
16 import org.simantics.modeling.scl.CompileSCLMonitorRequest.CompilationContext;
\r
17 import org.simantics.scl.compiler.common.names.Name;
\r
18 import org.simantics.scl.compiler.constants.StringConstant;
\r
19 import org.simantics.scl.compiler.elaboration.expressions.EApply;
\r
20 import org.simantics.scl.compiler.elaboration.expressions.EConstant;
\r
21 import org.simantics.scl.compiler.elaboration.expressions.ELiteral;
\r
22 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
\r
23 import org.simantics.scl.compiler.elaboration.expressions.Expression;
\r
24 import org.simantics.scl.compiler.environment.Environment;
\r
25 import org.simantics.scl.compiler.environment.Environments;
\r
26 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;
\r
27 import org.simantics.scl.compiler.top.SCLExpressionCompilationException;
\r
28 import org.simantics.scl.compiler.types.Type;
\r
29 import org.simantics.scl.runtime.SCLContext;
\r
30 import org.simantics.scl.runtime.function.Function1;
\r
31 import org.simantics.utils.datastructures.Pair;
\r
34 public class CompileSCLMonitorRequest extends AbstractExpressionCompilationRequest<CompilationContext, Variable> {
\r
36 protected static Name BROWSE = Name.create("Simantics/Variables", "browse");
\r
37 protected static Name VALUE = Name.create("Simantics/Variables", "value");
\r
39 private final Resource componentType;
\r
40 private final Resource literal;
\r
41 private final Resource relation;
\r
43 public static class CompilationContext extends AbstractExpressionCompilationContext {
\r
44 public final ComponentTypeSubstructure substructure;
\r
46 public CompilationContext(RuntimeEnvironment runtimeEnvironment,
\r
47 ComponentTypeSubstructure substructure) {
\r
48 super(runtimeEnvironment);
\r
49 this.substructure = substructure;
\r
53 private CompileSCLMonitorRequest(Resource componentType, Resource literal, Resource relation) {
\r
54 this.componentType = componentType;
\r
55 this.literal = literal;
\r
56 this.relation = relation;
\r
59 public CompileSCLMonitorRequest(ReadGraph graph, Variable context)
\r
60 throws DatabaseException {
\r
61 this(context.getParent(graph).getType(graph),
\r
62 context.getRepresents(graph),
\r
63 context.getPredicateResource(graph));
\r
66 public static Object compileAndEvaluate(ReadGraph graph, Variable context) throws DatabaseException {
\r
67 SCLContext sclContext = SCLContext.getCurrent();
\r
68 Object oldGraph = sclContext.get("graph");
\r
70 Function1<Variable,Object> exp = graph.syncRequest(new CompileSCLMonitorRequest(graph, context),
\r
71 TransientCacheListener.<Function1<Variable,Object>>instance());
\r
72 sclContext.put("graph", graph);
\r
73 return exp.apply(context.getParent(graph));
\r
74 } catch (DatabaseException e) {
\r
75 e.printStackTrace();
\r
76 throw (DatabaseException)e;
\r
77 } catch (Throwable t) {
\r
78 t.printStackTrace();
\r
79 throw new DatabaseException(t);
\r
81 sclContext.put("graph", oldGraph);
\r
86 protected String getExpressionText(ReadGraph graph)
\r
87 throws DatabaseException {
\r
88 Layer0 L0 = Layer0.getInstance(graph);
\r
89 return graph.getRelatedValue(literal, L0.SCLValue_expression, Bindings.STRING);
\r
93 protected Type getExpectedType(ReadGraph graph, CompilationContext context)
\r
94 throws DatabaseException {
\r
95 Layer0 L0 = Layer0.getInstance(graph);
\r
96 String valueType = graph.getPossibleRelatedValue(relation, L0.RequiresValueType, Bindings.STRING);
\r
97 if(valueType != null) {
\r
99 return Environments.getType(context.runtimeEnvironment.getEnvironment(), valueType);
\r
100 } catch (SCLExpressionCompilationException e) {
\r
101 e.printStackTrace();
\r
104 return super.getExpectedType(graph, context);
\r
108 protected CompilationContext getCompilationContext(ReadGraph graph)
\r
109 throws DatabaseException {
\r
110 return graph.syncRequest(new ResourceRead<CompilationContext>(componentType) {
\r
112 public CompilationContext perform(ReadGraph graph)
\r
113 throws DatabaseException {
\r
114 Resource indexRoot = graph.syncRequest(new IndexRoot(resource));
\r
115 RuntimeEnvironment runtimeEnvironment = graph.syncRequest(new RuntimeEnvironmentRequest(indexRoot));
\r
116 return new CompilationContext(runtimeEnvironment, ComponentTypeSubstructure.forType(graph, resource));
\r
122 protected Type getContextVariableType() {
\r
127 protected Expression getVariableAccessExpression(
\r
129 CompilationContext context,
\r
130 org.simantics.scl.compiler.elaboration.expressions.Variable contextVariable,
\r
131 String name) throws DatabaseException {
\r
132 Pair<String,Type> entry = context.substructure.possibleTypedRVI(name);
\r
135 Environment environment = context.runtimeEnvironment.getEnvironment();
\r
136 Expression propertyVariable = new EApply(
\r
137 new EConstant(environment.getValue(BROWSE)),
\r
138 new EVariable(contextVariable),
\r
139 new ELiteral(new StringConstant(entry.first))
\r
141 return makeTypeFlexible(environment, new EApply(
\r
142 new EConstant(environment.getValue(VALUE), entry.second),
\r
148 public int hashCode() {
\r
149 return 31*(31*getClass().hashCode() + literal.hashCode()) + componentType.hashCode();
\r
153 public boolean equals(Object obj) {
\r
156 if(obj == null || obj.getClass() != getClass())
\r
158 CompileSCLMonitorRequest other = (CompileSCLMonitorRequest)obj;
\r
159 return literal.equals(other.literal) && componentType.equals(other.componentType);
\r