]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/genericrelation/DependencyChanges.java
2f0d2d5f313007b6452cc5cc23ada9b19a9cee40
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / genericrelation / DependencyChanges.java
1 package org.simantics.db.layer0.genericrelation;\r
2 \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
7 \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
23 \r
24 public class DependencyChanges implements Metadata {\r
25     \r
26     public final @Arguments({Resource.class, Change[].class}) TreeMap<Resource, Change[]> modelChanges;\r
27     public final boolean hasUnresolved;\r
28     \r
29     public DependencyChanges(TreeMap<Resource, Change[]> modelChanges, boolean hasUnresolved) {\r
30         this.modelChanges = modelChanges;\r
31         this.hasUnresolved = hasUnresolved;\r
32     }        \r
33     \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
39         }\r
40     }\r
41     \r
42     public static enum ChangeType {\r
43         LINK_CHANGE, COMPONENT_ADDITION, COMPONENT_REMOVAL,\r
44         COMPONENT_MODIFICATION\r
45     }\r
46         \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
54     }\r
55     \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
60         }\r
61         @Override\r
62         public ChangeType getType() {\r
63             return ChangeType.LINK_CHANGE;\r
64         }\r
65         @Override\r
66         public String toString(ReadGraph graph) throws DatabaseException {\r
67                 return "LinkChange[" + NameUtils.getSafeName(graph, component, true) + "]";\r
68         }\r
69     }\r
70 \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
77         }\r
78         @Override\r
79         public ChangeType getType() {\r
80             return ChangeType.COMPONENT_ADDITION;\r
81         }\r
82         @Override\r
83         public String toString() {\r
84                 return "ComponentAddition[" + component + "]";\r
85         }\r
86         public boolean isValid(ReadGraph graph) throws DatabaseException {\r
87                 return graph.hasStatement(component, Layer0.getInstance(graph).PartOf, parent);\r
88         }\r
89         @Override\r
90         public String toString(ReadGraph graph) throws DatabaseException {\r
91                 return "ComponentAddition[" + NameUtils.getSafeName(graph, component, true) + "]";\r
92         }\r
93     }\r
94     \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
101         }\r
102         @Override\r
103         public ChangeType getType() {\r
104             return ChangeType.COMPONENT_REMOVAL;\r
105         }\r
106         public boolean isValid(ReadGraph graph) throws DatabaseException {\r
107                 return !graph.hasStatement(component, Layer0.getInstance(graph).PartOf, parent);\r
108         }\r
109         @Override\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
112         }\r
113     }\r
114     \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
119         }\r
120         @Override\r
121         public ChangeType getType() {\r
122             return ChangeType.COMPONENT_MODIFICATION;\r
123         }\r
124         @Override\r
125         public String toString(ReadGraph graph) throws DatabaseException {\r
126                 return "ComponentModification[" + NameUtils.getSafeName(graph, component, true) + "]";\r
127         }\r
128     }\r
129         \r
130     public Change[] get(Resource model) {\r
131         return modelChanges.get(model);\r
132     }\r
133     \r
134     public Map<Resource, Change[]> get() {\r
135         return modelChanges;\r
136     }\r
137             \r
138     @Override\r
139     public byte[] serialise(Session session) {\r
140         try {\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
156                 }\r
157         return new byte[0];\r
158     }\r
159     \r
160     public static DependencyChanges deserialise(Session session, byte[] input) {\r
161         try {\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
174                 }\r
175         return null;\r
176     }\r
177     \r
178     public boolean isEmpty() {\r
179         return modelChanges.isEmpty() && !hasUnresolved;\r
180     }\r
181     \r
182 }\r