1 package org.simantics.modeling.utils;
\r
3 import java.util.Collections;
\r
4 import java.util.Set;
\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
25 * @author Antti Villberg
\r
26 * @author Tuukka Lehtonen
\r
28 public class OntologicalRequirementTracker {
\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
35 private DiagramResource DIA;
\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
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
51 propagate(graph, owner, rs);
\r
54 public void update(ReadGraph graph, MetadataI metadata, DependencyChanges event) throws DatabaseException {
\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
62 System.out.println("skipping change history update: isUndo=" + isUndo + ", wasHistoryUpdate=" + wasHistoryUpdate + ", skipUpdate=" + skipUpdate);
\r
67 L0 = Layer0.getInstance(graph);
\r
68 DIA = DiagramResource.getInstance(graph);
\r
69 ModelingResources MOD = ModelingResources.getInstance(graph);
\r
71 CollectionSupport cs = graph.getService(CollectionSupport.class);
\r
73 Set<Resource> work = cs.createSet();
\r
74 Set<Resource> creates = cs.createSet();
\r
75 Set<Resource> ids = cs.createSet();
\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
82 for (DependencyChanges.Change c : changes) {
\r
83 if (c instanceof ComponentModification) {
\r
84 Resource r = ((ComponentModification) c).component;
\r
86 System.out.println("ComponentModification: " + NameUtils.getURIOrSafeNameInternal(graph, r));
\r
87 propagate(graph, r, work);
\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
95 System.out.println("ComponentAddition(true): " + NameUtils.getURIOrSafeNameInternal(graph, r));
\r
98 System.out.println("ComponentAddition(false): " + NameUtils.getURIOrSafeNameInternal(graph, r));
\r
100 boolean hasGUID = graph.hasStatement(r, L0.identifier);
\r
101 if (!hasGUID && ModelingUtils.needsIdentifier(graph, r)) {
\r
104 propagate(graph, r, work);
\r
109 if (work.isEmpty())
\r
112 if (DEBUG_MODIFICATIONS) {
\r
113 for (Resource w : creates)
\r
114 System.out.println("created: " + NameUtils.getURIOrSafeNameInternal(graph, w));
\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
122 if (DEBUG_MODIFICATIONS) {
\r
123 for (Resource w : modis)
\r
124 System.out.println("modified: " + NameUtils.getURIOrSafeNameInternal(graph, w));
\r
127 if (!modis.isEmpty() || !creates.isEmpty() || !ids.isEmpty()) {
\r
128 graph.asyncRequest(new OntologicalRequirementEnforceRequest(creates, modis, ids));
\r