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.db.layer0.variable;
\r
14 import org.simantics.databoard.Bindings;
\r
15 import org.simantics.databoard.binding.Binding;
\r
16 import org.simantics.databoard.binding.BooleanBinding;
\r
17 import org.simantics.databoard.binding.NumberBinding;
\r
18 import org.simantics.databoard.binding.StringBinding;
\r
19 import org.simantics.databoard.binding.error.BindingException;
\r
20 import org.simantics.databoard.binding.mutable.MutableStringBinding;
\r
21 import org.simantics.databoard.parser.repository.DataTypeSyntaxError;
\r
22 import org.simantics.databoard.parser.repository.DataValueRepository;
\r
23 import org.simantics.databoard.primitives.MutableString;
\r
24 import org.simantics.databoard.type.Datatype;
\r
25 import org.simantics.databoard.type.DoubleType;
\r
26 import org.simantics.databoard.type.FloatType;
\r
27 import org.simantics.databoard.type.IntegerType;
\r
28 import org.simantics.databoard.type.NumberType;
\r
29 import org.simantics.databoard.units.IUnitConverter;
\r
30 import org.simantics.databoard.units.internal.UnitParseException;
\r
31 import org.simantics.databoard.util.ObjectUtils;
\r
32 import org.simantics.db.VirtualGraph;
\r
33 import org.simantics.db.WriteGraph;
\r
34 import org.simantics.db.common.request.WriteRequest;
\r
35 import org.simantics.db.exception.DatabaseException;
\r
36 import org.simantics.db.layer0.util.Layer0Utils;
\r
37 import org.simantics.db.layer0.util.PrimitiveValueParser;
\r
40 * @deprecated exactly the same as {@link VariableWrite}, should be removed. Not
\r
41 * used in the platform at least.
\r
43 public class VariableWrite2 extends WriteRequest {
\r
45 final private Variable variable;
\r
46 final private String label;
\r
47 final private String targetUnit;
\r
49 public VariableWrite2(Variable variable, String label) {
\r
50 this(variable, label, null, null);
\r
53 public VariableWrite2(Variable variable, String label, VirtualGraph provider, String targetUnit) {
\r
55 this.variable = variable;
\r
57 this.targetUnit = targetUnit;
\r
60 public static IUnitConverter converter(final String unit, final String targetUnit) {
\r
62 return new IUnitConverter() {
\r
65 public double convert(double value) {
\r
67 if(targetUnit == null) return value;
\r
69 if("K".equals(unit)) {
\r
70 if("C".equals(targetUnit)) value = value - 273.15;
\r
71 else if("F".equals(targetUnit)) value = (value - 273.15) * 9.0/5.0 + 32.0;
\r
72 } else if ("C".equals(unit)) {
\r
73 if("K".equals(targetUnit)) value = value + 273.15;
\r
74 } else if ("F".equals(unit)) {
\r
75 if("K".equals(targetUnit)) value = (value - 32.0) * 5.0/9.0 + 273.15;
\r
78 value = org.simantics.databoard.Units.convert(value, unit, targetUnit);
\r
79 } catch (UnitParseException e) {
\r
80 e.printStackTrace();
\r
94 public void perform(WriteGraph graph) throws DatabaseException {
\r
95 graph.markUndoPoint();
\r
97 //System.err.println("VariableWrite " + variable.getURI(graph) + " => " + label);
\r
98 Datatype type = variable.getPossibleDatatype(graph);
\r
102 uri = variable.getURI(graph);
\r
103 } catch (DatabaseException e) {
\r
105 throw new org.simantics.db.exception.BindingException("no datatype for variable " + variable + " (URI=" + uri + ")", null);
\r
108 Binding binding = Bindings.getBinding(type);
\r
110 String parsedLabel = label;
\r
111 Object value = null;
\r
113 if (binding instanceof StringBinding) {
\r
114 if (binding instanceof MutableStringBinding)
\r
115 value = new MutableString(label);
\r
118 } else if (binding instanceof BooleanBinding) {
\r
119 // This parses a bit more than just "true"/"false".
\r
121 value = PrimitiveValueParser.parseBoolean(label);
\r
122 } catch (IllegalArgumentException e) {
\r
123 throw new DatabaseException(e);
\r
126 if (binding instanceof NumberBinding) {
\r
127 parsedLabel = label.replace(",", ".");
\r
130 value = binding.parseValue(parsedLabel, new DataValueRepository());
\r
132 // FIXME: this is Balas-specific
\r
133 if (targetUnit != null) {
\r
134 if (type instanceof NumberType) {
\r
135 String unit = Variables.getPossibleUnit(graph, variable);
\r
136 if (unit != null) {
\r
137 IUnitConverter converter = converter(targetUnit, unit);
\r
138 if(type instanceof FloatType) {
\r
139 float converted = (float)converter.convert(((Number)value).floatValue());
\r
140 value = binding.parseValue(Float.toString(converted), new DataValueRepository());
\r
141 } else if(type instanceof DoubleType) {
\r
142 double converted = converter.convert(((Number)value).doubleValue());
\r
143 value = binding.parseValue(Double.toString(converted), new DataValueRepository());
\r
144 } else if(type instanceof IntegerType) {
\r
145 value = binding.parseValue(Integer.toString(((Number)value).intValue()), new DataValueRepository());
\r
152 //System.out.println("VariableWrite " + ObjectUtils.toString(value));
\r
153 variable.setValue(graph, value, binding);
\r
155 String[] varParts = variable.getParent(graph).getURI(graph).split("/");
\r
156 String varName = varParts[varParts.length - 1];
\r
158 // Add a comment to metadata.
\r
159 Layer0Utils.addCommentMetadata(graph, "Modified variable " + varName + " to " + ObjectUtils.toString(value));
\r
160 } catch (DataTypeSyntaxError e) {
\r
161 throw new DatabaseException(e);
\r
162 } catch (BindingException e) {
\r
163 throw new DatabaseException(e);
\r