]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/VariableWrite2.java
Merge commit 'ad8333027322fda6b9a8a524c7a7e15a54c52f38'
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / variable / VariableWrite2.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.db.layer0.variable;\r
13 \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
38 \r
39 /**\r
40  * @deprecated exactly the same as {@link VariableWrite}, should be removed. Not\r
41  *             used in the platform at least.\r
42  */\r
43 public class VariableWrite2 extends WriteRequest {\r
44 \r
45     final private Variable variable;\r
46     final private String label;\r
47     final private String targetUnit;\r
48 \r
49     public VariableWrite2(Variable variable, String label) {\r
50         this(variable, label, null, null);\r
51     }\r
52 \r
53     public VariableWrite2(Variable variable, String label, VirtualGraph provider, String targetUnit) {\r
54         super(provider);\r
55         this.variable = variable;\r
56         this.label = label;\r
57         this.targetUnit = targetUnit;\r
58     }\r
59 \r
60     public static IUnitConverter converter(final String unit, final String targetUnit) {\r
61 \r
62         return new IUnitConverter() {\r
63 \r
64             @Override\r
65             public double convert(double value) {\r
66 \r
67                 if(targetUnit == null) return value;\r
68 \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
76                 } else {\r
77                     try {\r
78                         value = org.simantics.databoard.Units.convert(value, unit, targetUnit);\r
79                     } catch (UnitParseException e) {\r
80                         e.printStackTrace();\r
81                     }\r
82                 }\r
83 \r
84                 return value;\r
85 \r
86             }\r
87 \r
88         };\r
89 \r
90 \r
91     }\r
92 \r
93     @Override\r
94     public void perform(WriteGraph graph) throws DatabaseException {\r
95         graph.markUndoPoint();\r
96         try {\r
97             //System.err.println("VariableWrite " + variable.getURI(graph) + " => " + label);\r
98             Datatype type = variable.getPossibleDatatype(graph);\r
99             if (type == null) {\r
100                 String uri = null;\r
101                 try {\r
102                     uri = variable.getURI(graph);\r
103                 } catch (DatabaseException e) {\r
104                 }\r
105                 throw new org.simantics.db.exception.BindingException("no datatype for variable " + variable + " (URI=" + uri + ")", null);\r
106             }\r
107 \r
108             Binding binding = Bindings.getBinding(type);\r
109 \r
110             String parsedLabel = label;\r
111             Object value = null;\r
112 \r
113             if (binding instanceof StringBinding) {\r
114                 if (binding instanceof MutableStringBinding)\r
115                     value = new MutableString(label);\r
116                 else\r
117                     value = label;\r
118             } else if (binding instanceof BooleanBinding) {\r
119                 // This parses a bit more than just "true"/"false".\r
120                 try {\r
121                     value = PrimitiveValueParser.parseBoolean(label);\r
122                 } catch (IllegalArgumentException e) {\r
123                     throw new DatabaseException(e);\r
124                 }\r
125             } else {\r
126                 if (binding instanceof NumberBinding) {\r
127                     parsedLabel = label.replace(",", ".");\r
128                 }\r
129 \r
130                 value = binding.parseValue(parsedLabel, new DataValueRepository());\r
131                 \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
146                             }\r
147                         }\r
148                     }\r
149                 }\r
150             }\r
151 \r
152             //System.out.println("VariableWrite " + ObjectUtils.toString(value));\r
153             variable.setValue(graph, value, binding);\r
154 \r
155             String[] varParts = variable.getParent(graph).getURI(graph).split("/");\r
156             String varName = varParts[varParts.length - 1];\r
157             \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
164         }\r
165 \r
166     }\r
167 \r
168 }\r