--- /dev/null
+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