]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/DependencyChanges.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / genericrelation / DependencyChanges.java
diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/DependencyChanges.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/DependencyChanges.java
new file mode 100644 (file)
index 0000000..2f0d2d5
--- /dev/null
@@ -0,0 +1,182 @@
+package org.simantics.db.layer0.genericrelation;\r
+\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Map;\r
+import java.util.TreeMap;\r
+\r
+import org.simantics.databoard.Databoard;\r
+import org.simantics.databoard.annotations.Arguments;\r
+import org.simantics.databoard.annotations.Union;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.binding.error.BindingConstructionException;\r
+import org.simantics.databoard.serialization.SerializationException;\r
+import org.simantics.databoard.serialization.Serializer;\r
+import org.simantics.databoard.serialization.SerializerConstructionException;\r
+import org.simantics.db.Metadata;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.layer0.Layer0;\r
+\r
+public class DependencyChanges implements Metadata {\r
+    \r
+    public final @Arguments({Resource.class, Change[].class}) TreeMap<Resource, Change[]> modelChanges;\r
+    public final boolean hasUnresolved;\r
+    \r
+    public DependencyChanges(TreeMap<Resource, Change[]> modelChanges, boolean hasUnresolved) {\r
+        this.modelChanges = modelChanges;\r
+        this.hasUnresolved = hasUnresolved;\r
+    }        \r
+    \r
+    public DependencyChanges(Map<Resource, ArrayList<Change>> _modelChanges, boolean hasUnresolved) {\r
+        this(new TreeMap<Resource, Change[]>(), hasUnresolved);\r
+        for(Map.Entry<Resource, ArrayList<Change>> entry : _modelChanges.entrySet()) {\r
+            ArrayList<Change> value = entry.getValue();\r
+            modelChanges.put(entry.getKey(), value.toArray(new Change[value.size()]));\r
+        }\r
+    }\r
+    \r
+    public static enum ChangeType {\r
+        LINK_CHANGE, COMPONENT_ADDITION, COMPONENT_REMOVAL,\r
+        COMPONENT_MODIFICATION\r
+    }\r
+        \r
+    @Union({LinkChange.class,\r
+       ComponentAddition.class, \r
+        ComponentRemoval.class, \r
+        ComponentModification.class})\r
+    public static interface Change {\r
+        ChangeType getType();\r
+        String toString(ReadGraph graph) throws DatabaseException;\r
+    }\r
+    \r
+    public static class LinkChange implements Change {\r
+        public final Resource component;\r
+        public LinkChange(Resource component) {\r
+            this.component = component;\r
+        }\r
+        @Override\r
+        public ChangeType getType() {\r
+            return ChangeType.LINK_CHANGE;\r
+        }\r
+        @Override\r
+        public String toString(ReadGraph graph) throws DatabaseException {\r
+               return "LinkChange[" + NameUtils.getSafeName(graph, component, true) + "]";\r
+        }\r
+    }\r
+\r
+    public static class ComponentAddition implements Change {\r
+        public final Resource component;\r
+        public final Resource parent;\r
+        public ComponentAddition(Resource component, Resource parent) {\r
+            this.component = component;\r
+            this.parent = parent;\r
+        }\r
+        @Override\r
+        public ChangeType getType() {\r
+            return ChangeType.COMPONENT_ADDITION;\r
+        }\r
+        @Override\r
+        public String toString() {\r
+               return "ComponentAddition[" + component + "]";\r
+        }\r
+        public boolean isValid(ReadGraph graph) throws DatabaseException {\r
+               return graph.hasStatement(component, Layer0.getInstance(graph).PartOf, parent);\r
+        }\r
+        @Override\r
+        public String toString(ReadGraph graph) throws DatabaseException {\r
+               return "ComponentAddition[" + NameUtils.getSafeName(graph, component, true) + "]";\r
+        }\r
+    }\r
+    \r
+    public static class ComponentRemoval implements Change {\r
+        public final Resource component;\r
+        public final Resource parent;\r
+        public ComponentRemoval(Resource component, Resource parent) {        \r
+            this.component = component;\r
+            this.parent = parent;\r
+        }\r
+        @Override\r
+        public ChangeType getType() {\r
+            return ChangeType.COMPONENT_REMOVAL;\r
+        }\r
+        public boolean isValid(ReadGraph graph) throws DatabaseException {\r
+               return !graph.hasStatement(component, Layer0.getInstance(graph).PartOf, parent);\r
+        }\r
+        @Override\r
+        public String toString(ReadGraph graph) throws DatabaseException {\r
+               return "ComponentRemoval[component=" + NameUtils.getSafeName(graph, component, true) + ", parent=" + NameUtils.getSafeName(graph, parent, true) + "]";\r
+        }\r
+    }\r
+    \r
+    public static class ComponentModification implements Change {\r
+        public final Resource component;\r
+        public ComponentModification(Resource component) {\r
+            this.component = component;\r
+        }\r
+        @Override\r
+        public ChangeType getType() {\r
+            return ChangeType.COMPONENT_MODIFICATION;\r
+        }\r
+        @Override\r
+        public String toString(ReadGraph graph) throws DatabaseException {\r
+               return "ComponentModification[" + NameUtils.getSafeName(graph, component, true) + "]";\r
+        }\r
+    }\r
+        \r
+    public Change[] get(Resource model) {\r
+        return modelChanges.get(model);\r
+    }\r
+    \r
+    public Map<Resource, Change[]> get() {\r
+       return modelChanges;\r
+    }\r
+            \r
+    @Override\r
+    public byte[] serialise(Session session) {\r
+        try {\r
+               Databoard databoard = session.getService( Databoard.class );\r
+               Binding binding = databoard.getBinding( DependencyChanges.class );\r
+               Serializer serializer = databoard.getSerializer( binding );\r
+            return serializer.serialize(this);\r
+        } catch (SerializationException e) {\r
+            e.printStackTrace();\r
+        } catch (IOException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
+               } catch (SerializerConstructionException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
+               } catch (BindingConstructionException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
+               }\r
+        return new byte[0];\r
+    }\r
+    \r
+    public static DependencyChanges deserialise(Session session, byte[] input) {\r
+        try {\r
+               Databoard databoard = session.getService( Databoard.class );\r
+               Binding binding = databoard.getBinding( DependencyChanges.class );\r
+               Serializer serializer = databoard.getSerializer( binding );\r
+            return (DependencyChanges) serializer.deserialize(input); \r
+        } catch (SerializationException e) {\r
+            e.printStackTrace();\r
+        } catch (IOException e) {\r
+            e.printStackTrace();\r
+        } catch (SerializerConstructionException e) {\r
+                       e.printStackTrace();\r
+               } catch (BindingConstructionException e) {\r
+                       e.printStackTrace();\r
+               }\r
+        return null;\r
+    }\r
+    \r
+    public boolean isEmpty() {\r
+       return modelChanges.isEmpty() && !hasUnresolved;\r
+    }\r
+    \r
+}\r