]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/VariableWriteImplied.java
Merge commit 'ad8333027322fda6b9a8a524c7a7e15a54c52f38'
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / variable / VariableWriteImplied.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.CommentMetadata;\r
35 import org.simantics.db.common.request.WriteRequest;\r
36 import org.simantics.db.exception.DatabaseException;\r
37 import org.simantics.db.layer0.util.PrimitiveValueParser;\r
38 \r
39 public class VariableWriteImplied extends WriteRequest {\r
40 \r
41     final private Variable variable;\r
42     final private String label;\r
43     final private String targetUnit;\r
44 \r
45     public VariableWriteImplied(Variable variable, String label) {\r
46         this(variable, label, null, null);\r
47     }\r
48 \r
49     public VariableWriteImplied(Variable variable, String label, VirtualGraph provider, String targetUnit) {\r
50         super(provider);\r
51         this.variable = variable;\r
52         this.label = label;\r
53         this.targetUnit = targetUnit;\r
54     }\r
55 \r
56     public static IUnitConverter converter(final String unit, final String targetUnit) {\r
57 \r
58         return new IUnitConverter() {\r
59 \r
60             @Override\r
61             public double convert(double value) {\r
62 \r
63                 if(targetUnit == null) return value;\r
64 \r
65                 if("K".equals(unit)) {\r
66                     if("C".equals(targetUnit)) value = value - 273.15;\r
67                     else if("F".equals(targetUnit)) value = (value - 273.15) * 9.0/5.0 + 32.0;\r
68                 } else if ("C".equals(unit)) {\r
69                     if("K".equals(targetUnit)) value = value + 273.15;\r
70                 } else if ("F".equals(unit)) {\r
71                     if("K".equals(targetUnit)) value = (value - 32.0) * 5.0/9.0 + 273.15;\r
72                 } else {\r
73                     try {\r
74                         value = org.simantics.databoard.Units.convert(value, unit, targetUnit);\r
75                     } catch (UnitParseException e) {\r
76                         e.printStackTrace();\r
77                     }\r
78                 }\r
79 \r
80                 return value;\r
81 \r
82             }\r
83 \r
84         };\r
85 \r
86 \r
87     }\r
88     \r
89     @Override\r
90     public void perform(WriteGraph graph) throws DatabaseException {\r
91 \r
92         try {\r
93             //System.err.println("VariableWriteImplied " + variable.getURI(graph) + " => " + label);\r
94             Datatype type = variable.getPossibleDatatype(graph);\r
95             if (type == null) {\r
96                 String uri = null;\r
97                 try {\r
98                     uri = variable.getURI(graph);\r
99                 } catch (DatabaseException e) {\r
100                 }\r
101                 throw new org.simantics.db.exception.BindingException("no datatype for variable " + variable + " (URI=" + uri + ")", null);\r
102             }\r
103 \r
104             Binding binding = Bindings.getBinding(type);\r
105 \r
106             String parsedLabel = label;\r
107             Object value = null;\r
108 \r
109             if (binding instanceof StringBinding) {\r
110                 if (binding instanceof MutableStringBinding)\r
111                     value = new MutableString(label);\r
112                 else\r
113                     value = label;\r
114             } else if (binding instanceof BooleanBinding) {\r
115                 // This parses a bit more than just "true"/"false".\r
116                 try {\r
117                     value = PrimitiveValueParser.parseBoolean(label);\r
118                 } catch (IllegalArgumentException e) {\r
119                     throw new DatabaseException(e);\r
120                 }\r
121             } else {\r
122                 if (binding instanceof NumberBinding) {\r
123                     parsedLabel = label.replace(",", ".");\r
124                 }\r
125 \r
126                 //System.out.println("VariableWrite " + parsedLabel);\r
127                 value = binding.parseValue(parsedLabel, new DataValueRepository());\r
128                 //System.out.println("VariableWrite value " + value);\r
129 \r
130                 // FIXME: this is Balas-specific\r
131                 if (targetUnit != null) {\r
132                     if (type instanceof NumberType) {\r
133                         String unit = Variables.getPossibleUnit(graph, variable);\r
134                         if (unit != null) {\r
135                             IUnitConverter converter = converter(targetUnit, unit);\r
136                             if(type instanceof FloatType) {\r
137                                 float converted = (float)converter.convert(((Number)value).floatValue());\r
138                                 value = binding.parseValue(Float.toString(converted), new DataValueRepository());\r
139                             } else if(type instanceof DoubleType) {\r
140                                 double converted = converter.convert(((Number)value).doubleValue());\r
141                                 value = binding.parseValue(Double.toString(converted), new DataValueRepository());\r
142                             } else if(type instanceof IntegerType) {\r
143                                 value = binding.parseValue(Integer.toString(((Number)value).intValue()), new DataValueRepository());\r
144                             }\r
145                         }\r
146                     }\r
147                 }\r
148             }\r
149 \r
150             //System.out.println("VariableWriteImplied " + ObjectUtils.toString(value));\r
151             variable.setValue(graph, value, binding);\r
152 \r
153             // Add a comment to metadata.\r
154             CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
155             graph.addMetadata(cm.add("Set value " + ObjectUtils.toString(value)));\r
156 \r
157         } catch (DataTypeSyntaxError e) {\r
158             throw new DatabaseException(e);\r
159         } catch (BindingException e) {\r
160             throw new DatabaseException(e);\r
161         }\r
162 \r
163     }\r
164 \r
165 }\r