1 package org.simantics.db.layer0.genericrelation;
\r
3 import java.io.IOException;
\r
4 import java.util.ArrayList;
\r
5 import java.util.Map;
\r
6 import java.util.TreeMap;
\r
8 import org.simantics.databoard.Databoard;
\r
9 import org.simantics.databoard.annotations.Arguments;
\r
10 import org.simantics.databoard.annotations.Union;
\r
11 import org.simantics.databoard.binding.Binding;
\r
12 import org.simantics.databoard.binding.error.BindingConstructionException;
\r
13 import org.simantics.databoard.serialization.SerializationException;
\r
14 import org.simantics.databoard.serialization.Serializer;
\r
15 import org.simantics.databoard.serialization.SerializerConstructionException;
\r
16 import org.simantics.db.Metadata;
\r
17 import org.simantics.db.ReadGraph;
\r
18 import org.simantics.db.Resource;
\r
19 import org.simantics.db.Session;
\r
20 import org.simantics.db.common.utils.NameUtils;
\r
21 import org.simantics.db.exception.DatabaseException;
\r
22 import org.simantics.layer0.Layer0;
\r
24 public class DependencyChanges implements Metadata {
\r
26 public final @Arguments({Resource.class, Change[].class}) TreeMap<Resource, Change[]> modelChanges;
\r
27 public final boolean hasUnresolved;
\r
29 public DependencyChanges(TreeMap<Resource, Change[]> modelChanges, boolean hasUnresolved) {
\r
30 this.modelChanges = modelChanges;
\r
31 this.hasUnresolved = hasUnresolved;
\r
34 public DependencyChanges(Map<Resource, ArrayList<Change>> _modelChanges, boolean hasUnresolved) {
\r
35 this(new TreeMap<Resource, Change[]>(), hasUnresolved);
\r
36 for(Map.Entry<Resource, ArrayList<Change>> entry : _modelChanges.entrySet()) {
\r
37 ArrayList<Change> value = entry.getValue();
\r
38 modelChanges.put(entry.getKey(), value.toArray(new Change[value.size()]));
\r
42 public static enum ChangeType {
\r
43 LINK_CHANGE, COMPONENT_ADDITION, COMPONENT_REMOVAL,
\r
44 COMPONENT_MODIFICATION
\r
47 @Union({LinkChange.class,
\r
48 ComponentAddition.class,
\r
49 ComponentRemoval.class,
\r
50 ComponentModification.class})
\r
51 public static interface Change {
\r
52 ChangeType getType();
\r
53 String toString(ReadGraph graph) throws DatabaseException;
\r
56 public static class LinkChange implements Change {
\r
57 public final Resource component;
\r
58 public LinkChange(Resource component) {
\r
59 this.component = component;
\r
62 public ChangeType getType() {
\r
63 return ChangeType.LINK_CHANGE;
\r
66 public String toString(ReadGraph graph) throws DatabaseException {
\r
67 return "LinkChange[" + NameUtils.getSafeName(graph, component, true) + "]";
\r
71 public static class ComponentAddition implements Change {
\r
72 public final Resource component;
\r
73 public final Resource parent;
\r
74 public ComponentAddition(Resource component, Resource parent) {
\r
75 this.component = component;
\r
76 this.parent = parent;
\r
79 public ChangeType getType() {
\r
80 return ChangeType.COMPONENT_ADDITION;
\r
83 public String toString() {
\r
84 return "ComponentAddition[" + component + "]";
\r
86 public boolean isValid(ReadGraph graph) throws DatabaseException {
\r
87 return graph.hasStatement(component, Layer0.getInstance(graph).PartOf, parent);
\r
90 public String toString(ReadGraph graph) throws DatabaseException {
\r
91 return "ComponentAddition[" + NameUtils.getSafeName(graph, component, true) + "]";
\r
95 public static class ComponentRemoval implements Change {
\r
96 public final Resource component;
\r
97 public final Resource parent;
\r
98 public ComponentRemoval(Resource component, Resource parent) {
\r
99 this.component = component;
\r
100 this.parent = parent;
\r
103 public ChangeType getType() {
\r
104 return ChangeType.COMPONENT_REMOVAL;
\r
106 public boolean isValid(ReadGraph graph) throws DatabaseException {
\r
107 return !graph.hasStatement(component, Layer0.getInstance(graph).PartOf, parent);
\r
110 public String toString(ReadGraph graph) throws DatabaseException {
\r
111 return "ComponentRemoval[component=" + NameUtils.getSafeName(graph, component, true) + ", parent=" + NameUtils.getSafeName(graph, parent, true) + "]";
\r
115 public static class ComponentModification implements Change {
\r
116 public final Resource component;
\r
117 public ComponentModification(Resource component) {
\r
118 this.component = component;
\r
121 public ChangeType getType() {
\r
122 return ChangeType.COMPONENT_MODIFICATION;
\r
125 public String toString(ReadGraph graph) throws DatabaseException {
\r
126 return "ComponentModification[" + NameUtils.getSafeName(graph, component, true) + "]";
\r
130 public Change[] get(Resource model) {
\r
131 return modelChanges.get(model);
\r
134 public Map<Resource, Change[]> get() {
\r
135 return modelChanges;
\r
139 public byte[] serialise(Session session) {
\r
141 Databoard databoard = session.getService( Databoard.class );
\r
142 Binding binding = databoard.getBinding( DependencyChanges.class );
\r
143 Serializer serializer = databoard.getSerializer( binding );
\r
144 return serializer.serialize(this);
\r
145 } catch (SerializationException e) {
\r
146 e.printStackTrace();
\r
147 } catch (IOException e) {
\r
148 // TODO Auto-generated catch block
\r
149 e.printStackTrace();
\r
150 } catch (SerializerConstructionException e) {
\r
151 // TODO Auto-generated catch block
\r
152 e.printStackTrace();
\r
153 } catch (BindingConstructionException e) {
\r
154 // TODO Auto-generated catch block
\r
155 e.printStackTrace();
\r
157 return new byte[0];
\r
160 public static DependencyChanges deserialise(Session session, byte[] input) {
\r
162 Databoard databoard = session.getService( Databoard.class );
\r
163 Binding binding = databoard.getBinding( DependencyChanges.class );
\r
164 Serializer serializer = databoard.getSerializer( binding );
\r
165 return (DependencyChanges) serializer.deserialize(input);
\r
166 } catch (SerializationException e) {
\r
167 e.printStackTrace();
\r
168 } catch (IOException e) {
\r
169 e.printStackTrace();
\r
170 } catch (SerializerConstructionException e) {
\r
171 e.printStackTrace();
\r
172 } catch (BindingConstructionException e) {
\r
173 e.printStackTrace();
\r
178 public boolean isEmpty() {
\r
179 return modelChanges.isEmpty() && !hasUnresolved;
\r