--- /dev/null
+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