]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.objmap2/src/org/simantics/objmap/graph/rules/domain/RelatedValueAccessor.java
Use type reflection tools from databoard in objmap2.
[simantics/platform.git] / bundles / org.simantics.objmap2 / src / org / simantics / objmap / graph / rules / domain / RelatedValueAccessor.java
index 9ede881774873f5c8ba6feabe8bcec4a13f878fc..585b468e60c049217a4ec2e74db26011b6663648 100644 (file)
@@ -13,15 +13,20 @@ package org.simantics.objmap.graph.rules.domain;
 
 import java.util.Arrays;
 
 
 import java.util.Arrays;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.databoard.binding.OptionalBinding;
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
 import org.simantics.db.Statement;
 import org.simantics.db.WriteGraph;
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
 import org.simantics.db.Statement;
 import org.simantics.db.WriteGraph;
+import org.simantics.db.exception.BindingException;
 import org.simantics.db.exception.DatabaseException;
 import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.exception.DoesNotContainValueException;
+import org.simantics.db.exception.ServiceException;
 import org.simantics.layer0.Layer0;
 import org.simantics.objmap.exceptions.MappingException;
 import org.simantics.layer0.Layer0;
 import org.simantics.objmap.exceptions.MappingException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Accesses a value attached to the element by given functional relation.
 
 /**
  * Accesses a value attached to the element by given functional relation.
@@ -33,10 +38,12 @@ public class RelatedValueAccessor implements IDomainAccessor<Resource,Object> {
     
        Resource relation;
        Resource valueType;
     
        Resource relation;
        Resource valueType;
+       Binding valueBinding;
 
 
-       public RelatedValueAccessor(Resource relation, Resource valueType) {
+       public RelatedValueAccessor(Resource relation, Resource valueType, Binding valueBinding) {
                this.relation = relation;
                this.valueType = valueType;
                this.relation = relation;
                this.valueType = valueType;
+               this.valueBinding = valueBinding;
        }
 
        @Override
        }
 
        @Override
@@ -46,12 +53,12 @@ public class RelatedValueAccessor implements IDomainAccessor<Resource,Object> {
                        Resource valueResource = g.getPossibleObject(element, relation);
                        if(valueResource == null)
                                return null;
                        Resource valueResource = g.getPossibleObject(element, relation);
                        if(valueResource == null)
                                return null;
-                       return g.getValue(valueResource);
+                       return getValue(g, valueResource);
                } catch (DatabaseException e) {
                        throw new MappingException(e);
                }
        }
                } catch (DatabaseException e) {
                        throw new MappingException(e);
                }
        }
-       
+
        @Override
        public boolean set(WriteGraph g, Resource element, Object value)
                        throws MappingException {
        @Override
        public boolean set(WriteGraph g, Resource element, Object value)
                        throws MappingException {
@@ -65,7 +72,8 @@ public class RelatedValueAccessor implements IDomainAccessor<Resource,Object> {
                                g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null,
                                                valueType);
                                g.claim(element, relation, valueResource);
                                g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null,
                                                valueType);
                                g.claim(element, relation, valueResource);
-                               g.claimValue(valueResource, value);                             
+                               claimValue(g, valueResource, value);
+                               
                                return true;
                        }
                        else {
                                return true;
                        }
                        else {
@@ -77,7 +85,7 @@ public class RelatedValueAccessor implements IDomainAccessor<Resource,Object> {
                                                return false;
                                        }
                                }                               
                                                return false;
                                        }
                                }                               
-                               Object currentValue = g.getValue(valueStatement.getObject());
+                               Object currentValue = getValue(g, valueStatement.getObject());
                                if(equals(currentValue,value))
                                        return false;
                                if (!valueStatement.isAsserted(element))
                                if(equals(currentValue,value))
                                        return false;
                                if (!valueStatement.isAsserted(element))
@@ -87,7 +95,7 @@ public class RelatedValueAccessor implements IDomainAccessor<Resource,Object> {
                                        g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null,
                                                        valueType);
                                        g.claim(element, relation, valueResource);
                                        g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null,
                                                        valueType);
                                        g.claim(element, relation, valueResource);
-                                       g.claimValue(valueResource, value);
+                                       claimValue(g, valueResource, value);
                                }
                                return true;
                        }
                                }
                                return true;
                        }
@@ -96,8 +104,32 @@ public class RelatedValueAccessor implements IDomainAccessor<Resource,Object> {
                }
                
        }
                }
                
        }
+
+       private Object getValue(ReadGraph g, Resource valueResource)
+                       throws DoesNotContainValueException, BindingException, ServiceException {
+               if (valueBinding != null) {
+                       return g.getValue(valueResource, getBaseBinding(valueBinding));
+               }
+               else {
+                       return g.getValue(valueResource);
+               }
+       }
+       
+       private void claimValue(WriteGraph g, Resource valueResource, Object value) throws ServiceException {
+               if (valueBinding != null)
+                       g.claimValue(valueResource, value, getBaseBinding(valueBinding));
+               else
+                       g.claimValue(valueResource, value);
+       }
+
+       private static Binding getBaseBinding(Binding binding) {
+               return binding instanceof OptionalBinding ? ((OptionalBinding)binding).getComponentBinding() : binding;
+       }
        
        private boolean equals(Object o1, Object o2) {
        
        private boolean equals(Object o1, Object o2) {
+               if (valueBinding != null)
+                       return valueBinding.equals(o1, o2);
+               
                if (o1 instanceof boolean[])
                        Arrays.equals((boolean[])o1,(boolean[])o2);
                if (o1 instanceof int[])
                if (o1 instanceof boolean[])
                        Arrays.equals((boolean[])o1,(boolean[])o2);
                if (o1 instanceof int[])
@@ -109,7 +141,6 @@ public class RelatedValueAccessor implements IDomainAccessor<Resource,Object> {
                if (o1 instanceof byte[])
                        Arrays.equals((byte[])o1,(byte[])o2);
                return o1.equals(o2);
                if (o1 instanceof byte[])
                        Arrays.equals((byte[])o1,(byte[])o2);
                return o1.equals(o2);
-               
        }
 
 }
        }
 
 }