]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.interop.update/src/org/simantics/interop/update/model/UpdateOp.java
Allow UpdateOps to describe parent resource
[simantics/interop.git] / org.simantics.interop.update / src / org / simantics / interop / update / model / UpdateOp.java
index 50954ec1ffca968cc3e06a6dfbd1b09a59e4765e..2bd3718f6a39cc96d5741611e8cb85f3b5f59771 100644 (file)
@@ -2,12 +2,15 @@ package  org.simantics.interop.update.model;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
+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.DatabaseException;
 import org.simantics.interop.test.GraphChanges;
+import org.simantics.layer0.Layer0;
 
 /**
  * Base class for update operations (adding and deleting objects)  
@@ -37,17 +40,37 @@ public abstract class UpdateOp {
                return parentOps;
        }
        
+       public <T extends UpdateOp> Collection<T> getParentOpsWithClass(Class<T> cls) {
+               List<T> ops = new ArrayList<T>(parentOps.size());
+               for (UpdateOp op : parentOps)
+                       if (cls.isAssignableFrom(op.getClass()))
+                               ops.add((T)op);
+               return ops;
+       }
+       
        public Collection<UpdateOp> getSubOps() {
                return subOps;
        }
        
+       public <T extends UpdateOp> Collection<T> getSubOpsWithClass(Class<T> cls) {
+               List<T> ops = new ArrayList<T>(subOps.size());
+               for (UpdateOp op : subOps)
+                       if (cls.isAssignableFrom(op.getClass()))
+                               ops.add((T)op);
+               return ops;
+       }
+       
        public void addParentOp(UpdateOp op) {
                assert (!op.equals(this));
+               if (parentOps.contains(op))
+                       return;
                parentOps.add(op);
        }
        
        public void addSubOp(UpdateOp op) {
                assert (!op.equals(this));
+               if (subOps.contains(op))
+                       return;
                subOps.add(op);
        }
        
@@ -195,6 +218,12 @@ public abstract class UpdateOp {
         */
        public abstract Resource getCreatedResource();
        
+       public Resource getParentResource(ReadGraph g) throws DatabaseException {
+               Layer0 l0 = Layer0.getInstance(g);
+               return g.getPossibleObject(getResource(), l0.PartOf);
+       }
+
+       
        @Override
     public String toString() {
         String s = this.getClass().getSimpleName();