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.equation.ext;
\r
14 import java.util.Iterator;
\r
16 import org.simantics.db.ReadGraph;
\r
17 import org.simantics.db.Resource;
\r
18 import org.simantics.db.common.utils.NameUtils;
\r
19 import org.simantics.db.common.utils.OrderedSetUtils;
\r
20 import org.simantics.db.exception.DatabaseException;
\r
21 import org.simantics.equation.EquationResources;
\r
22 import org.simantics.equation.solver.ExpressionSolver;
\r
23 import org.simantics.equation.solver.Solver;
\r
25 public class ElementExpressionSolver implements ExpressionSolver {
\r
27 private Oper sum = new Sum();
\r
28 private Oper sub = new Sub();
\r
29 private Oper mul = new Mul();
\r
30 private Oper div = new Div();
\r
33 public void evaluate(Solver solver, ReadGraph g, Resource t) throws DatabaseException {
\r
34 Iterator<Resource> it = OrderedSetUtils.iterator(g, t.get());
\r
35 double res = getNumber(solver, g, it.next());
\r
36 while (it.hasNext()) {
\r
37 Oper op = getOperator(g, it.next());
\r
38 double v = getNumber(solver, g, it.next());
\r
39 res = op.evaluate(res, v);
\r
42 solver.setValue(g.getSingleObject(t, EquationResources.equationResource.HasTarget), new double[]{res});
\r
45 private double getNumber(Solver solver, ReadGraph g, Resource number) throws DatabaseException {
\r
46 // TODO : assumes that HasVariable points to Double while it can point to any Property
\r
47 return solver.getDoubleValue(g, g.getSingleObject(number, EquationResources.equationResource.HasVariable));
\r
50 private Oper getOperator(ReadGraph g, Resource operator) throws DatabaseException {
\r
51 if (operator.get().equals(EquationResources.equationResource.Addition))
\r
53 else if (operator.get().equals(EquationResources.equationResource.Subtraction))
\r
55 else if (operator.get().equals(EquationResources.equationResource.Multiplication))
\r
57 else if (operator.get().equals(EquationResources.equationResource.Division))
\r
59 throw new RuntimeException("Unknown operation " + NameUtils.getSafeName(g, operator));
\r
63 private interface Oper {
\r
64 double evaluate(double d1, double d2);
\r
67 private class Sum implements Oper {
\r
69 public double evaluate(double d1, double d2) {
\r
74 private class Sub implements Oper {
\r
76 public double evaluate(double d1, double d2) {
\r
81 private class Mul implements Oper {
\r
83 public double evaluate(double d1, double d2) {
\r
88 private class Div implements Oper {
\r
90 public double evaluate(double d1, double d2) {
\r