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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.scenegraph.profile.impl;
\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
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
39 public class MappedPropertyStyleEvaluator extends DepthFirstAdapter
\r
42 public static class ApplicationException extends Exception {
\r
44 private static final long serialVersionUID = 1L;
\r
46 public ApplicationException(String message) {
\r
52 public interface Function {
\r
53 Object evaluate(Collection<Object> args) throws ApplicationException;
\r
56 final ReadGraph graph;
\r
58 final Resource component;
\r
60 public MappedPropertyStyleEvaluator(ReadGraph graph, Resource element) throws DatabaseException {
\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
69 Stack<Object> stack = new Stack<Object>();
\r
70 HashMap<String, Function> builtins = new HashMap<String, Function>();
\r
72 public Object getResult() {
\r
73 if (stack.isEmpty())
\r
79 public void outAConstantValue(AConstantValue node)
\r
81 // System.out.println("eval constant " + node);
\r
82 stack.push(Double.valueOf(node.toString()));
\r
86 public void outAStringValue(AStringValue node)
\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
94 public void outAVariablePrimary(AVariablePrimary node)
\r
99 Valuations vs = graph.adapt(component, Valuations.class);
\r
101 stack.push("No Variables for mapped component.");
\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
110 Object value = graph.getValue(valueResource);
\r
113 } catch (DatabaseException e) {
\r
115 stack.push(e.toString());
\r
122 public void outAAddressValue(AAddressValue node)
\r
124 stack.push('&' + node.getRange().toString());
\r
128 public void outARangeValue(ARangeValue node)
\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
143 public void outAPlusExpression(APlusExpression node)
\r
146 Object o2 = stack.pop();
\r
147 Object o1 = stack.pop();
\r
149 // System.out.println("plus " + o1 + " " + o2);
\r
151 if(o1 instanceof String) {
\r
152 stack.push(o1.toString() + o2.toString());
\r
154 double d1 = extractValue(o1);
\r
155 double d2 = extractValue(o2);
\r
163 public void outAMultMultiplicative(AMultMultiplicative node)
\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
170 // System.out.println("mult " + d1 + " " + d2);
\r
174 public void outADivMultiplicative(ADivMultiplicative node)
\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
182 // System.out.println("div " + d1 + " " + d2);
\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
193 public void outAFunctionPrimary(AFunctionPrimary node)
\r
195 String functionName = node.getFunc().getText().replace("(", "");
\r
196 //System.out.println(hashCode() + " eval " + functionName);
\r
198 Function function = builtins.get(functionName);
\r
199 if(function != null) {
\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
210 Object result = function.evaluate(args);
\r
211 stack.push(result);
\r
212 } catch (ApplicationException e) {
\r
213 e.printStackTrace();
\r