]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.structural2/src/org/simantics/structural2/variables/StandardProdeduralPropertyVariable.java
Non-constant external value configuration via procedural UCs.
[simantics/platform.git] / bundles / org.simantics.structural2 / src / org / simantics / structural2 / variables / StandardProdeduralPropertyVariable.java
diff --git a/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/StandardProdeduralPropertyVariable.java b/bundles/org.simantics.structural2/src/org/simantics/structural2/variables/StandardProdeduralPropertyVariable.java
new file mode 100644 (file)
index 0000000..a277f51
--- /dev/null
@@ -0,0 +1,71 @@
+package org.simantics.structural2.variables;
+
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.adapter.AdaptException;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.databoard.type.Datatype;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.variable.StandardAssertedGraphPropertyVariable;
+import org.simantics.db.layer0.variable.ValueAccessor;
+import org.simantics.db.layer0.variable.Variable;
+
+public class StandardProdeduralPropertyVariable extends StandardAssertedGraphPropertyVariable {
+
+       private Object defaultValue;
+
+       public StandardProdeduralPropertyVariable(ReadGraph graph,
+                       StandardProceduralChildVariable parent,
+                       StandardAssertedGraphPropertyVariable assertedVariable, Object value) throws DatabaseException {
+               super(graph, parent, assertedVariable.node, assertedVariable.parentResource, assertedVariable.property.predicate, assertedVariable.object);
+               
+               this.defaultValue = value;
+       }
+       
+       @Override
+       protected ValueAccessor getValueAccessor(ReadGraph graph) throws DatabaseException {
+               final ValueAccessor valueAccessor = super.getValueAccessor(graph);
+               return new ValueAccessor() {
+                       @Override
+                       public void setValue(WriteGraph graph, Variable context, Object value, Binding binding) throws DatabaseException {
+                               valueAccessor.setValue(graph, context, value, binding);
+                       }
+                       
+                       @Override
+                       public void setValue(WriteGraph graph, Variable context, Object value) throws DatabaseException {
+                               valueAccessor.setValue(graph, context, value);
+                       }
+                       
+                       @Override
+                       public Object getValue(ReadGraph graph, Variable context, Binding binding) throws DatabaseException {
+                               if (node != null) {
+                                       return valueAccessor.getValue(graph, context, binding);
+                               } else {
+                                       if (binding.isInstance(defaultValue))
+                                               return defaultValue;
+                                       else
+                                               try {
+                                                       return Bindings.adapt(defaultValue, Bindings.OBJECT, binding);
+                                               } catch (AdaptException e) {
+                                                       throw new DatabaseException("Failed to adapt object " + defaultValue + " to " + binding);
+                                               }
+                               }
+                       }
+                       
+                       @Override
+                       public Object getValue(ReadGraph graph, Variable context) throws DatabaseException {
+                               if (node != null) {
+                                       return valueAccessor.getValue(graph, context);
+                               } else {
+                                       return defaultValue;
+                               }
+                       }
+                       
+                       @Override
+                       public Datatype getDatatype(ReadGraph graph, Variable context) throws DatabaseException {
+                               return valueAccessor.getDatatype(graph, context);
+                       }
+               };
+       }
+}