1 package org.simantics.selectionview;
\r
3 import java.io.IOException;
\r
5 import org.simantics.common.format.Formatter;
\r
6 import org.simantics.databoard.Bindings;
\r
7 import org.simantics.databoard.Datatypes;
\r
8 import org.simantics.databoard.adapter.AdaptException;
\r
9 import org.simantics.databoard.binding.Binding;
\r
10 import org.simantics.databoard.binding.NumberBinding;
\r
11 import org.simantics.databoard.binding.StringBinding;
\r
12 import org.simantics.databoard.binding.error.BindingConstructionException;
\r
13 import org.simantics.databoard.binding.error.BindingException;
\r
14 import org.simantics.databoard.binding.mutable.MutableStringBinding;
\r
15 import org.simantics.databoard.parser.DataValuePrinter;
\r
16 import org.simantics.databoard.parser.repository.DataTypeSyntaxError;
\r
17 import org.simantics.databoard.parser.repository.DataValueRepository;
\r
18 import org.simantics.databoard.primitives.MutableString;
\r
19 import org.simantics.databoard.type.Datatype;
\r
20 import org.simantics.databoard.util.ObjectUtils;
\r
21 import org.simantics.db.ReadGraph;
\r
22 import org.simantics.db.Resource;
\r
23 import org.simantics.db.WriteGraph;
\r
24 import org.simantics.db.common.CommentMetadata;
\r
25 import org.simantics.db.common.adaption.SimpleContextualAdapter;
\r
26 import org.simantics.db.exception.DatabaseException;
\r
27 import org.simantics.db.layer0.util.Layer0Utils;
\r
28 import org.simantics.db.layer0.variable.ModelledVariablePropertyDescriptor;
\r
29 import org.simantics.db.layer0.variable.StandardGraphPropertyVariable;
\r
30 import org.simantics.db.layer0.variable.Variable;
\r
31 import org.simantics.db.layer0.variable.Variables;
\r
32 import org.simantics.layer0.Layer0;
\r
33 import org.simantics.modeling.ModelingResources;
\r
35 public class DisplayValueVariableAdapter extends SimpleContextualAdapter<Variable, ModelledVariablePropertyDescriptor> {
\r
39 public DisplayValueVariableAdapter() {
\r
40 key = SelectionViewResources.URIs.HasDisplayValue;
\r
43 public DisplayValueVariableAdapter(String key) {
\r
47 class Impl extends StandardGraphPropertyVariable {
\r
49 private Datatype datatype;
\r
51 public Impl(ReadGraph graph, Variable parent, Resource parentResource, Datatype datatype) throws DatabaseException {
\r
52 super(graph, parent, null, parentResource, graph.getResource(key));
\r
53 this.datatype = datatype;
\r
56 @SuppressWarnings("unchecked")
\r
58 public <T> T getValue(ReadGraph graph) throws DatabaseException {
\r
59 return (T)standardGetDisplayValue1(graph, this);
\r
62 @SuppressWarnings("unchecked")
\r
64 public <T> T getValue(ReadGraph graph, Binding binding) throws DatabaseException {
\r
65 return (T)standardGetDisplayValue2(graph, this, binding);
\r
69 public Datatype getDatatype(ReadGraph graph) throws DatabaseException {
\r
74 public void setValue(WriteGraph graph, Object value) throws DatabaseException {
\r
75 standardSetDisplayValue2(graph, this, value);
\r
80 public void setValue(WriteGraph graph, Object _value, Binding _binding) throws DatabaseException {
\r
81 standardSetDisplayValue3(graph, this, _value, _binding);
\r
86 public static boolean isPrimitive(Datatype dt) {
\r
87 if(Datatypes.STRING.equals(dt)) return true;
\r
91 private static String possibleExpression(ReadGraph graph, Variable variable) throws DatabaseException {
\r
93 Layer0 L0 = Layer0.getInstance(graph);
\r
94 ModelingResources MOD = ModelingResources.getInstance(graph);
\r
95 Resource object = variable.getPossibleRepresents(graph);
\r
96 if(object != null && graph.isInstanceOf(object, MOD.SCLValue)) {
\r
97 String expression = graph.getPossibleRelatedValue(object, L0.SCLValue_expression);
\r
98 if (expression != null)
\r
99 return "=" + expression;
\r
106 public Variable adapt(ReadGraph graph, Resource source, ModelledVariablePropertyDescriptor context) throws DatabaseException {
\r
108 // String value = getDisplayValue(graph, context.getVariable());
\r
109 return new Impl(graph, context.getVariable(), context.getSubject(), Datatypes.STRING);
\r
113 public static Object standardGetDisplayValue1(ReadGraph graph, Variable property_) throws DatabaseException {
\r
115 Variable property = property_.getParent(graph);
\r
117 String expression = possibleExpression(graph, property);
\r
118 if(expression != null) return expression;
\r
120 Object value = property.getValue(graph);
\r
122 Resource formatter = property.getPossiblePropertyValue(graph, Variables.FORMATTER);
\r
123 if(formatter != null) {
\r
124 Formatter fmt = graph.adaptContextual(formatter, property, Variable.class, Formatter.class);
\r
125 value = fmt.format(value);
\r
128 Datatype dt = property.getPossibleDatatype(graph);
\r
130 if(!isPrimitive(dt)) {
\r
131 Binding binding = Bindings.getBinding(dt);
\r
133 value = DataValuePrinter.writeValueSingleLine(binding, value);
\r
134 } catch (IOException e) {
\r
135 e.printStackTrace();
\r
136 } catch (BindingException e) {
\r
137 e.printStackTrace();
\r
144 return value != null ? value.toString() : "null";
\r
148 public static Object standardGetDisplayValue2(ReadGraph graph, Variable property, Binding binding) throws DatabaseException {
\r
151 return Bindings.adapt(standardGetDisplayValue1(graph, property), Bindings.STRING, binding);
\r
152 } catch (AdaptException e) {
\r
153 throw new DatabaseException(e);
\r
158 public static void standardSetDisplayValue2(WriteGraph graph, Variable property_, Object _value) throws DatabaseException {
\r
161 Binding binding = Bindings.getBinding(_value.getClass());
\r
162 standardSetDisplayValue3(graph, property_, _value, binding);
\r
163 } catch (BindingConstructionException e) {
\r
164 throw new DatabaseException(e);
\r
169 public static void standardSetDisplayValue3(WriteGraph graph, Variable property_, Object _value, Binding binding_) throws DatabaseException {
\r
173 Variable parent = property_.getParent(graph);
\r
175 if(!(_value instanceof String)) throw new DatabaseException("setValue for HasDisplayValue only accepts String (got " + _value.getClass().getSimpleName() + ")");
\r
177 String text = (String)_value;
\r
178 if(text.startsWith("=")) {
\r
179 Layer0Utils.setExpression(graph, parent, text, ModelingResources.getInstance(graph).SCLValue);
\r
183 String parsedLabel = (String)_value;
\r
184 Object value = parsedLabel;
\r
186 Datatype type = parent.getPossibleDatatype(graph);
\r
187 if (type != null) {
\r
189 Binding binding = Bindings.getBinding(type);
\r
191 if (binding instanceof StringBinding) {
\r
193 if (binding instanceof MutableStringBinding)
\r
194 value = new MutableString(parsedLabel);
\r
196 value = parsedLabel;
\r
200 if (binding instanceof NumberBinding) {
\r
201 parsedLabel = parsedLabel.replace(",", ".");
\r
204 value = binding.parseValue(parsedLabel, new DataValueRepository());
\r
207 //System.out.println("VariableWrite " + ObjectUtils.toString(value));
\r
208 parent.setValue(graph, value, binding);
\r
212 parent.setValue(graph, value);
\r
217 // Add a comment to metadata.
\r
218 CommentMetadata cm = graph.getMetadata(CommentMetadata.class);
\r
219 graph.addMetadata(cm.add("Set value " + ObjectUtils.toString(value)));
\r
221 } catch (DataTypeSyntaxError e) {
\r
222 throw new DatabaseException(e);
\r
223 } catch (BindingException e) {
\r
224 throw new DatabaseException(e);
\r
229 public static Datatype standardGetDisplayValueDatatype(ReadGraph graph, Variable property_) throws DatabaseException {
\r
230 return Datatypes.STRING;
\r