]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/utils/OntologicalRequirementTracker.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / utils / OntologicalRequirementTracker.java
1 package org.simantics.modeling.utils;\r
2 \r
3 import java.util.Collections;\r
4 import java.util.Set;\r
5 \r
6 import org.simantics.db.MetadataI;\r
7 import org.simantics.db.ReadGraph;\r
8 import org.simantics.db.Resource;\r
9 import org.simantics.db.common.UndoMetadata;\r
10 import org.simantics.db.common.utils.NameUtils;\r
11 import org.simantics.db.exception.DatabaseException;\r
12 import org.simantics.db.layer0.genericrelation.DependencyChanges;\r
13 import org.simantics.db.layer0.genericrelation.DependencyChanges.ComponentAddition;\r
14 import org.simantics.db.layer0.genericrelation.DependencyChanges.ComponentModification;\r
15 import org.simantics.db.layer0.util.Layer0Utils;\r
16 import org.simantics.db.service.CollectionSupport;\r
17 import org.simantics.diagram.stubs.DiagramResource;\r
18 import org.simantics.layer0.Layer0;\r
19 import org.simantics.modeling.ModelingResources;\r
20 import org.simantics.modeling.ModelingUtils;\r
21 import org.simantics.modeling.adapters.ChangeHistoryUpdated;\r
22 import org.simantics.modeling.adapters.SkipChangeHistoryUpdate;\r
23 \r
24 /**\r
25  * @author Antti Villberg\r
26  * @author Tuukka Lehtonen\r
27  */\r
28 public class OntologicalRequirementTracker {\r
29 \r
30         private static final boolean DEBUG = false;\r
31         private static final boolean DEBUG_MODIFICATIONS = false;\r
32         private static final boolean DEBUG_PROPAGATE = false;\r
33 \r
34         private Layer0                          L0;\r
35         private DiagramResource                 DIA;\r
36 \r
37         private void propagate(ReadGraph graph, Resource r, Set<Resource> rs) throws DatabaseException {\r
38                 if (!r.isPersistent()) return;\r
39                 if (!rs.add(r)) return;\r
40                 if (DEBUG_PROPAGATE)\r
41                         System.out.println("propagated to: " + NameUtils.getURIOrSafeNameInternal(graph, r));\r
42                 if (graph.isInstanceOf(r, L0.IndexRoot)) return;\r
43                 Resource owner = graph.getPossibleObject(r, L0.IsOwnedBy);\r
44                 if (owner == null)\r
45                         return;\r
46                 if (graph.isInstanceOf(r, DIA.DiagramContainer)) {\r
47                         // Diagram changes do not touch the composite - but do propagate from folder\r
48                         owner = graph.getPossibleObject(owner, L0.PartOf);\r
49                         if (owner == null) return;\r
50                 }\r
51                 propagate(graph, owner, rs);\r
52         }\r
53 \r
54         public void update(ReadGraph graph, MetadataI metadata, DependencyChanges event) throws DatabaseException {\r
55                 \r
56                 if (metadata != null) {\r
57                         boolean isUndo = metadata.getMetadata().containsKey(UndoMetadata.class.getName());\r
58                         boolean wasHistoryUpdate = metadata.getMetadata().containsKey(ChangeHistoryUpdated.class.getName());\r
59                         boolean skipUpdate = metadata.getMetadata().containsKey(SkipChangeHistoryUpdate.class.getName());\r
60                         if (isUndo || wasHistoryUpdate || skipUpdate) {\r
61                                 if (DEBUG)\r
62                                         System.out.println("skipping change history update: isUndo=" + isUndo + ", wasHistoryUpdate=" + wasHistoryUpdate + ", skipUpdate=" + skipUpdate);\r
63                                 return;\r
64                         }\r
65                 }\r
66 \r
67                 L0 = Layer0.getInstance(graph);\r
68                 DIA = DiagramResource.getInstance(graph);\r
69                 ModelingResources MOD = ModelingResources.getInstance(graph);\r
70                 \r
71                 CollectionSupport cs = graph.getService(CollectionSupport.class);\r
72 \r
73                 Set<Resource> work = cs.createSet();\r
74                 Set<Resource> creates = cs.createSet();\r
75                 Set<Resource> ids = cs.createSet();\r
76 \r
77                 for (Resource model : event.modelChanges.keySet()) {\r
78                         DependencyChanges.Change[] changes = event.modelChanges.get(model);\r
79                         if (changes == null || changes.length == 0)\r
80                                 continue;\r
81 \r
82                         for (DependencyChanges.Change c : changes) {\r
83                                 if (c instanceof ComponentModification) {\r
84                                         Resource r = ((ComponentModification) c).component;\r
85                                         if (DEBUG)\r
86                                                 System.out.println("ComponentModification: " + NameUtils.getURIOrSafeNameInternal(graph, r));\r
87                                         propagate(graph, r, work);\r
88                                 }\r
89                                 if (c instanceof ComponentAddition) {\r
90                                         Resource r = ((ComponentAddition) c).component;\r
91                                         boolean hasChangeInformation = graph.hasStatement(r, MOD.changeInformation);\r
92                                         if (!hasChangeInformation && ModelingUtils.needsModificationInfo(graph, r)) {\r
93                                                 creates.add(r);\r
94                                                 if (DEBUG)\r
95                                                         System.out.println("ComponentAddition(true): " + NameUtils.getURIOrSafeNameInternal(graph, r));\r
96                                         } else {\r
97                                                 if (DEBUG)\r
98                                                         System.out.println("ComponentAddition(false): " + NameUtils.getURIOrSafeNameInternal(graph, r));\r
99                                         }\r
100                                         boolean hasGUID = graph.hasStatement(r, L0.identifier);\r
101                                         if (!hasGUID && ModelingUtils.needsIdentifier(graph, r)) {\r
102                                                 ids.add(r);\r
103                                         }\r
104                                         propagate(graph, r, work);\r
105                                 }\r
106                         }\r
107                 }\r
108 \r
109                 if (work.isEmpty())\r
110                         return;\r
111 \r
112                 if (DEBUG_MODIFICATIONS) {\r
113                         for (Resource w : creates)\r
114                                 System.out.println("created: " + NameUtils.getURIOrSafeNameInternal(graph, w));\r
115                 }\r
116 \r
117                 Set<Resource> modis = cs.createSet();\r
118                 for (Resource r : Layer0Utils.sortByCluster(graph, work))\r
119                         if (!creates.contains(r) && ModelingUtils.needsModificationInfo(graph, r))\r
120                                 modis.add(r);\r
121 \r
122                 if (DEBUG_MODIFICATIONS) {\r
123                         for (Resource w : modis)\r
124                                 System.out.println("modified: " + NameUtils.getURIOrSafeNameInternal(graph, w));\r
125                 }\r
126 \r
127                 if (!modis.isEmpty() || !creates.isEmpty() || !ids.isEmpty()) {\r
128                         graph.asyncRequest(new OntologicalRequirementEnforceRequest(creates, modis, ids));\r
129                 }\r
130                 \r
131         }\r
132 \r
133 }\r