]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.issues.common/src/org/simantics/issues/common/DependencyIssueSynchronizer2.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.issues.common / src / org / simantics / issues / common / DependencyIssueSynchronizer2.java
diff --git a/bundles/org.simantics.issues.common/src/org/simantics/issues/common/DependencyIssueSynchronizer2.java b/bundles/org.simantics.issues.common/src/org/simantics/issues/common/DependencyIssueSynchronizer2.java
new file mode 100644 (file)
index 0000000..ed79321
--- /dev/null
@@ -0,0 +1,67 @@
+package org.simantics.issues.common;\r
+\r
+import java.util.Collections;\r
+import java.util.HashSet;\r
+import java.util.Set;\r
+\r
+import org.simantics.db.Issue;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.util.RemoverUtil;\r
+import org.simantics.issues.common.DependencyIssueValidator2.Contexts;\r
+import org.simantics.issues.common.DependencyIssueValidator2.DependencyIssueDescriptions;\r
+import org.simantics.issues.ontology.IssueResource;\r
+import org.simantics.layer0.Layer0;\r
+\r
+public class DependencyIssueSynchronizer2 extends WriteRequest {\r
+\r
+       public static final boolean DEBUG = false;\r
+       \r
+       private Resource resource;\r
+       private Resource source;\r
+\r
+       public DependencyIssueSynchronizer2(Resource resource, Resource source) {\r
+               this.resource = resource;\r
+               this.source = source;\r
+       }\r
+\r
+       @Override\r
+       public void perform(WriteGraph graph) throws DatabaseException {\r
+\r
+               if(DEBUG) System.err.println("Running DependencySynchronizer for " + resource);\r
+\r
+               Set<Issue> existing = graph.syncRequest(new DependencyIssueDescriptions(source, resource), TransientCacheListener.<Set<Issue>>instance());\r
+               Set<Issue> contexts = Collections.emptySet();\r
+               \r
+               if(graph.hasStatement(resource)) {\r
+                       contexts = graph.syncRequest(new Contexts(source, resource), TransientCacheListener.<Set<Issue>>instance());\r
+               }\r
+               \r
+               if(!existing.equals(contexts)) {\r
+               \r
+                       Set<Issue> added = new HashSet<Issue>(contexts);\r
+                       Set<Issue> removed = new HashSet<Issue>(existing);\r
+                       added.removeAll(existing);\r
+                       removed.removeAll(contexts);\r
+\r
+                       for(Issue add : added) {\r
+                               add.write(graph, source);\r
+                       }\r
+                       for(Issue remove : removed) {\r
+                               Resource issue = graph.sync(new IssueByList(source, remove));\r
+                               if (issue == null)\r
+                                       // FIXME: when can this happen and what should be done in this case?\r
+                                       continue;\r
+                               graph.deny(issue, Layer0.getInstance(graph).PartOf);\r
+                               graph.deny(source, IssueResource.getInstance(graph).IssueSource_Manages, issue);\r
+                               RemoverUtil.remove(graph, issue);\r
+                       }\r
+                       \r
+               }\r
+\r
+       }\r
+\r
+}
\ No newline at end of file