1 package org.simantics.db.layer0.variable;
\r
3 import java.util.Map;
\r
5 import org.simantics.databoard.Bindings;
\r
6 import org.simantics.databoard.binding.Binding;
\r
7 import org.simantics.databoard.type.Datatype;
\r
8 import org.simantics.db.ReadGraph;
\r
9 import org.simantics.db.Resource;
\r
10 import org.simantics.db.Statement;
\r
11 import org.simantics.db.WriteGraph;
\r
12 import org.simantics.db.common.request.EnumerationMap;
\r
13 import org.simantics.db.exception.DatabaseException;
\r
14 import org.simantics.layer0.Layer0;
\r
16 public class StandardVariableModifier implements VariableModifier {
\r
18 final private static Binding datatype_binging = Bindings.getBindingUnchecked(Datatype.class);
\r
19 final public static StandardVariableModifier INSTANCE = new StandardVariableModifier();
\r
22 public String isValid(Object newValue) {
\r
27 public String isValid(Object newValue, Binding binding) {
\r
32 public void modify(WriteGraph graph, Variable variable, Object value) throws DatabaseException {
\r
33 modify(graph, variable, value, null);
\r
36 boolean isEnumeration(ReadGraph graph, Resource literal) throws DatabaseException {
\r
38 Layer0 L0 = Layer0.getInstance(graph);
\r
39 Resource parent = graph.getPossibleObject(literal, L0.PartOf);
\r
40 if(parent == null) return false;
\r
41 return graph.hasStatement(parent, L0.Enumeration);
\r
46 public void modify(WriteGraph graph, Variable variable, Object value, Binding binding) throws DatabaseException {
\r
48 Variable parent = variable.getParent(graph);
\r
49 Resource container = parent.getPossibleRepresents(graph);
\r
50 if(container == null) return;
\r
52 Resource property = variable.getPossiblePredicateResource(graph);
\r
53 if(property == null) return;
\r
55 // Variable parent = variable.getPossiblePropertyValue(graph, Variables.PARENT);
\r
56 // Variable predicate = variable.getPossiblePropertyValue(graph, Variables.PREDICATE);
\r
58 // Resource container = parent.getPossiblePropertyValue(graph, Variables.REPRESENTS);
\r
59 // if(container == null) return;
\r
60 // Resource property = predicate.getPossiblePropertyValue(graph, Variables.REPRESENTS);
\r
61 // if(property == null) return;
\r
63 Statement object = graph.getPossibleStatement(container, property);
\r
64 if(object == null) return;
\r
66 Resource objectResource = object.getObject();
\r
67 if(isEnumeration(graph, objectResource)) {
\r
69 Layer0 L0 = Layer0.getInstance(graph);
\r
70 Resource type = graph.getSingleObject(objectResource, L0.PartOf);
\r
72 Map<String, Resource> enumMap = graph.syncRequest(new EnumerationMap(type));
\r
73 Resource newLiteral = enumMap.get(value);
\r
74 graph.deny(container, property, objectResource);
\r
75 graph.claim(container, property, newLiteral);
\r
80 if(object.isAsserted(container)) {
\r
82 Layer0 L0 = Layer0.getInstance(graph);
\r
83 Resource type = graph.getPossibleType(objectResource, L0.Literal);
\r
85 Statement dt = graph.getPossibleStatement(objectResource, L0.HasDataType);
\r
86 Datatype custom = dt.isAsserted(objectResource) ? null : (Datatype)graph.getValue(dt.getObject(), datatype_binging);
\r
88 objectResource = graph.newResource();
\r
89 graph.claim(objectResource, L0.InstanceOf, null, type);
\r
90 graph.claim(container, property, objectResource);
\r
91 if(custom != null) {
\r
92 graph.addLiteral(objectResource, L0.HasDataType, L0.HasDataType_Inverse, L0.DataType, custom, datatype_binging);
\r
96 // Resource usesUnit = graph.getPossibleResource("http://flowbat.fi/Flowbat-0.1/UsesDatatype");
\r
97 // if(usesUnit != null) {
\r
98 // String unit = graph.getPossibleRelatedValue(oldObject, usesUnit, Bindings.STRING);
\r
99 // if(unit != null) {
\r
100 // graph.claimLiteral(objectResource, usesUnit, unit, Bindings.STRING);
\r
102 // Resource isDefault = graph.getResource("http://flowbat.fi/Flowbat-0.1/IsDefault");
\r
103 // Resource isUndefined = graph.getResource("http://flowbat.fi/Flowbat-0.1/IsUndefined");
\r
104 // graph.claimLiteral(objectResource, isDefault, false, Bindings.BOOLEAN);
\r
105 // graph.claimLiteral(objectResource, isUndefined, false, Bindings.BOOLEAN);
\r
109 graph.claimValue(objectResource, value, binding);
\r