]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph.profile/src/org/simantics/scenegraph/profile/impl/MappedPropertyStyleEvaluator.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scenegraph.profile / src / org / simantics / scenegraph / profile / impl / MappedPropertyStyleEvaluator.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.scenegraph.profile.impl;\r
13 \r
14 import java.util.Collection;\r
15 import java.util.HashMap;\r
16 import java.util.LinkedList;\r
17 import java.util.Stack;\r
18 \r
19 import org.simantics.basicexpression.analysis.DepthFirstAdapter;\r
20 import org.simantics.basicexpression.node.AAddressValue;\r
21 import org.simantics.basicexpression.node.AConstantValue;\r
22 import org.simantics.basicexpression.node.ADivMultiplicative;\r
23 import org.simantics.basicexpression.node.AFunctionPrimary;\r
24 import org.simantics.basicexpression.node.AMultMultiplicative;\r
25 import org.simantics.basicexpression.node.APlusExpression;\r
26 import org.simantics.basicexpression.node.ARangeValue;\r
27 import org.simantics.basicexpression.node.ASequenceArgList;\r
28 import org.simantics.basicexpression.node.ASingleArgList;\r
29 import org.simantics.basicexpression.node.AStringValue;\r
30 import org.simantics.basicexpression.node.AVariablePrimary;\r
31 import org.simantics.basicexpression.node.PArgList;\r
32 import org.simantics.db.ReadGraph;\r
33 import org.simantics.db.Resource;\r
34 import org.simantics.db.exception.DatabaseException;\r
35 import org.simantics.db.layer0.adapter.Valuations;\r
36 import org.simantics.layer0.Layer0;\r
37 import org.simantics.scl.reflection.OntologyVersions;\r
38 \r
39 public class MappedPropertyStyleEvaluator extends DepthFirstAdapter\r
40 {\r
41 \r
42     public static class ApplicationException extends Exception {\r
43 \r
44         private static final long serialVersionUID = 1L;\r
45 \r
46         public ApplicationException(String message) {\r
47             super(message);\r
48         }\r
49 \r
50     }\r
51 \r
52     public interface Function {\r
53         Object evaluate(Collection<Object> args) throws ApplicationException;\r
54     }\r
55 \r
56     final ReadGraph graph;\r
57     final Layer0 b;\r
58     final Resource component;\r
59 \r
60     public MappedPropertyStyleEvaluator(ReadGraph graph, Resource element) throws DatabaseException {\r
61         this.graph = graph;\r
62         b = Layer0.getInstance(graph);\r
63         String uri = OntologyVersions.getInstance().currentVersion("http://www.simantics.org/Modeling-0.0/ElementToComponent");\r
64         Resource toComponent = graph.getResource(uri);\r
65         component = graph.getPossibleObject(element, toComponent);\r
66     }\r
67 \r
68 \r
69     Stack<Object> stack = new Stack<Object>();\r
70     HashMap<String, Function> builtins = new HashMap<String, Function>();\r
71 \r
72     public Object getResult() {\r
73         if (stack.isEmpty())\r
74             return null;\r
75         return stack.pop();\r
76     }\r
77 \r
78     @Override\r
79     public void outAConstantValue(AConstantValue node)\r
80     {\r
81 //        System.out.println("eval constant " + node);\r
82         stack.push(Double.valueOf(node.toString()));\r
83     }\r
84 \r
85     @Override\r
86     public void outAStringValue(AStringValue node)\r
87     {\r
88 //        System.out.println("eval string " + node.toString());\r
89         String value = node.toString();\r
90         stack.push(value.substring(1, value.length()-2).trim());\r
91     }\r
92 \r
93     @Override\r
94     public void outAVariablePrimary(AVariablePrimary node)\r
95     {\r
96 \r
97         try {\r
98 \r
99             Valuations vs = graph.adapt(component, Valuations.class);\r
100             if(vs == null) {\r
101                 stack.push("No Variables for mapped component.");\r
102                 return;\r
103             }\r
104             Resource valueResource = vs.getValue(graph, null, "BaseRealization", node.toString().trim());\r
105             if(valueResource == null) {\r
106                 stack.push("Invalid value identifier based on  '" + node.toString().trim() + "'");\r
107                 return;\r
108             }\r
109 \r
110             Object value = graph.getValue(valueResource);\r
111             stack.push(value);\r
112 \r
113         } catch (DatabaseException e) {\r
114 \r
115             stack.push(e.toString());\r
116 \r
117         }\r
118 \r
119     }\r
120 \r
121     @Override\r
122     public void outAAddressValue(AAddressValue node)\r
123     {\r
124         stack.push('&' + node.getRange().toString());\r
125     }\r
126 \r
127     @Override\r
128     public void outARangeValue(ARangeValue node)\r
129     {\r
130     }\r
131 \r
132     private double extractValue(Object o) {\r
133         if(o instanceof Number) {\r
134             return ((Number)o).doubleValue();\r
135         } else if (o instanceof String) {\r
136             return Double.valueOf((String)o);\r
137         } else {\r
138             return Double.NaN;\r
139         }\r
140     }\r
141 \r
142     @Override\r
143     public void outAPlusExpression(APlusExpression node)\r
144     {\r
145 \r
146         Object o2 = stack.pop();\r
147         Object o1 = stack.pop();\r
148 \r
149 //      System.out.println("plus " + o1 + " " + o2);\r
150 \r
151         if(o1 instanceof String) {\r
152             stack.push(o1.toString() + o2.toString());\r
153         } else {\r
154             double d1 = extractValue(o1);\r
155             double d2 = extractValue(o2);\r
156             stack.push(d1+d2);\r
157         }\r
158 \r
159 \r
160     }\r
161 \r
162     @Override\r
163     public void outAMultMultiplicative(AMultMultiplicative node)\r
164     {\r
165         Object o1 = stack.pop();\r
166         Object o2 = stack.pop();\r
167         double d1 = extractValue(o1);\r
168         double d2 = extractValue(o2);\r
169         stack.push(d1*d2);\r
170 //        System.out.println("mult " + d1 + " " + d2);\r
171     }\r
172 \r
173     @Override\r
174     public void outADivMultiplicative(ADivMultiplicative node)\r
175     {\r
176         Object o2 = stack.pop();\r
177         Object o1 = stack.pop();\r
178         System.out.println("div " + o1 + " " + o2);\r
179         double d1 = extractValue(o1);\r
180         double d2 = extractValue(o2);\r
181         stack.push(d1/d2);\r
182 //        System.out.println("div " + d1 + " " + d2);\r
183     }\r
184 \r
185     int countArguments(PArgList args) {\r
186         if(args == null) return 0;\r
187         if(args instanceof ASingleArgList) return 1;\r
188         ASequenceArgList seq = (ASequenceArgList)args;\r
189         return 1 + countArguments(seq.getArgList());\r
190     }\r
191 \r
192     @Override\r
193     public void outAFunctionPrimary(AFunctionPrimary node)\r
194     {\r
195         String functionName = node.getFunc().getText().replace("(", "");\r
196         //System.out.println(hashCode() + " eval " + functionName);\r
197 \r
198         Function function = builtins.get(functionName);\r
199         if(function != null) {\r
200 \r
201             // TODO: fixme\r
202             LinkedList<Object> args = new LinkedList<Object>();\r
203             int argc = countArguments(node.getArgList());\r
204             //System.out.println(hashCode() + "Function takes " + args + " arguments stack has " + Arrays.toString(stack.toArray()));\r
205             for(int i=0;i<argc;i++) {\r
206                 args.addFirst(stack.pop());\r
207             }\r
208 \r
209             try {\r
210                 Object result = function.evaluate(args);\r
211                 stack.push(result);\r
212             } catch (ApplicationException e) {\r
213                 e.printStackTrace();\r
214                 stack.push(null);\r
215             }\r
216 \r
217 \r
218             return;\r
219 \r
220         }\r
221 \r
222     }\r
223 \r
224 }\r
225 \r