]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.interop.update/src/org/simantics/interop/update/model/AddDeleteUpdateOp.java
Process changes in smaller chunks
[simantics/interop.git] / org.simantics.interop.update / src / org / simantics / interop / update / model / AddDeleteUpdateOp.java
index e32ebd0fcac31c3efad201b453187c71aa0a4dc8..0ddbcb76c1c36e46ad4b91883bda75b1cdcda9f6 100644 (file)
@@ -18,11 +18,17 @@ import org.simantics.layer0.Layer0;
 public abstract class AddDeleteUpdateOp extends UpdateOp {
        
        protected boolean add;
+
        
        public AddDeleteUpdateOp(GraphChanges changes) {
                super(changes);
        }
        
+       public AddDeleteUpdateOp(boolean add, GraphChanges changes) {
+               super(changes);
+               this.add = add;
+       }
+       
        @Override
        public boolean isAdd() {
                return add;
@@ -34,38 +40,83 @@ public abstract class AddDeleteUpdateOp extends UpdateOp {
        }
        
        @Override
-       public boolean requiresParentOps() {
-               return add;
+       public boolean requiresOp(UpdateOp op) {
+           if (add) {
+               if (getParentOps().contains(op) && op.isAdd())
+                   return true;
+           } else {
+               if (getSubOps().contains(op) && op.isDelete())
+                return true;
+           }
+           return false;
        }
-
+       
        @Override
-       public boolean requiresSubOps() {
-               return !add;
+       public boolean selectOp(UpdateOp op, boolean select) {
+           if (select) {
+               return requiresOp(op);
+           } else {
+               return op.requiresOp(this);
+           }
        }
 
-       protected static void copyProperties(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
+       public static void copyProperties(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
                Layer0 l0 = Layer0.getInstance(g);
                for (Statement s : g.getStatements(source, l0.HasProperty)) {
                        if (s.isAsserted(source))
                                continue;
-                       Object value = g.getPossibleValue(s.getObject());
-                       System.out.println(NameUtils.getSafeName(g, s.getSubject()) + " " + NameUtils.getSafeName(g, s.getPredicate()) + " " + NameUtils.getSafeName(g, s.getObject()) + " " + value);
-                       if (value != null) {
-                               Statement valueStm = g.getPossibleStatement(destination, s.getPredicate());
-                               Resource valueResource = null;
-                               if (valueStm != null && !valueStm.isAsserted(destination))
-                                       valueResource = valueStm.getObject();
-                               if (valueResource == null) {
-                                       valueResource = g.newResource();
-                                       g.claim(valueResource, l0.InstanceOf, g.getSingleObject(s.getObject(), l0.InstanceOf));
-                                       g.claim(destination, s.getPredicate(), valueResource);
+                       if (g.isInstanceOf(s.getObject(), l0.Literal)) {
+                               Object value = g.getPossibleValue(s.getObject());
+                               //System.out.println(NameUtils.getSafeName(g, s.getSubject()) + " " + NameUtils.getSafeName(g, s.getPredicate()) + " " + NameUtils.getSafeName(g, s.getObject()) + " " + value);
+                               if (value != null) {
+                                       Statement valueStm = g.getPossibleStatement(destination, s.getPredicate());
+                                       Resource valueResource = null;
+                                       if (valueStm != null && !valueStm.isAsserted(destination))
+                                               valueResource = valueStm.getObject();
+                                       if (valueResource == null) {
+                                               valueResource = g.newResource();
+                                               g.claim(valueResource, l0.InstanceOf, g.getSingleObject(s.getObject(), l0.InstanceOf));
+                                               g.claim(destination, s.getPredicate(), valueResource);
+                                       }
+                                       g.claimValue(valueResource, value);
+                                       //g.claimLiteral(destination, s.getPredicate(), value);
+                               }
+                       } else if (g.isInstanceOf(s.getObject(), l0.SCLValue)) {
+                               Resource valueResource = g.newResource();
+                               g.claim(valueResource, l0.InstanceOf, g.getSingleObject(s.getObject(), l0.InstanceOf));
+                               g.claim(destination, s.getPredicate(), valueResource);
+                               copyProperties(g, s.getObject(), valueResource);
+                       } else {
+                               Resource type = g.getPossibleType(s.getObject(), l0.Value);
+                               if (type != null && g.hasStatement(type, l0.Enumeration, type)) {
+                                       g.deny(destination, s.getPredicate());
+                                       g.claim(destination, s.getPredicate(), s.getObject());
+                               } else {
+                                       throw new DatabaseException("Expected to copy property resource " + s.getObject());
                                }
-                               g.claimValue(valueResource, value);
-                               //g.claimLiteral(destination, s.getPredicate(), value);
                        }
                }
        }
        
+       public static void copyTags(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
+               Layer0 L0 = Layer0.getInstance(g);
+               for (Statement s : g.getStatements(source, L0.IsWeaklyRelatedTo)) {
+                       if (s.getObject().equals(source)) {
+                               g.claim(destination, s.getPredicate(), destination);
+                       }
+               }
+       }
+       
+       public static void copyTypes(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
+               Layer0 L0 = Layer0.getInstance(g);
+               for (Resource r : g.getObjects(source, L0.InstanceOf))
+                       g.claim(destination, L0.InstanceOf, r);
+               for (Resource r : g.getObjects(source, L0.Inherits))
+                       g.claim(destination, L0.Inherits, r);
+               for (Resource r : g.getObjects(source, L0.SubrelationOf))
+                       g.claim(destination, L0.SubrelationOf, r);
+       }
+       
        protected void copyIssues(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
                Layer0 l0 = Layer0.getInstance(g);
                IssueResource ir = IssueResource.getInstance(g);