]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.issues.common;\r
2 \r
3 import java.util.Collections;\r
4 import java.util.HashSet;\r
5 import java.util.Set;\r
6 \r
7 import org.simantics.db.Issue;\r
8 import org.simantics.db.Resource;\r
9 import org.simantics.db.WriteGraph;\r
10 import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
11 import org.simantics.db.common.request.WriteRequest;\r
12 import org.simantics.db.exception.DatabaseException;\r
13 import org.simantics.db.layer0.util.RemoverUtil;\r
14 import org.simantics.issues.common.DependencyIssueValidator2.Contexts;\r
15 import org.simantics.issues.common.DependencyIssueValidator2.DependencyIssueDescriptions;\r
16 import org.simantics.issues.ontology.IssueResource;\r
17 import org.simantics.layer0.Layer0;\r
18 \r
19 public class DependencyIssueSynchronizer2 extends WriteRequest {\r
20 \r
21         public static final boolean DEBUG = false;\r
22         \r
23         private Resource resource;\r
24         private Resource source;\r
25 \r
26         public DependencyIssueSynchronizer2(Resource resource, Resource source) {\r
27                 this.resource = resource;\r
28                 this.source = source;\r
29         }\r
30 \r
31         @Override\r
32         public void perform(WriteGraph graph) throws DatabaseException {\r
33 \r
34                 if(DEBUG) System.err.println("Running DependencySynchronizer for " + resource);\r
35 \r
36                 Set<Issue> existing = graph.syncRequest(new DependencyIssueDescriptions(source, resource), TransientCacheListener.<Set<Issue>>instance());\r
37                 Set<Issue> contexts = Collections.emptySet();\r
38                 \r
39                 if(graph.hasStatement(resource)) {\r
40                         contexts = graph.syncRequest(new Contexts(source, resource), TransientCacheListener.<Set<Issue>>instance());\r
41                 }\r
42                 \r
43                 if(!existing.equals(contexts)) {\r
44                 \r
45                         Set<Issue> added = new HashSet<Issue>(contexts);\r
46                         Set<Issue> removed = new HashSet<Issue>(existing);\r
47                         added.removeAll(existing);\r
48                         removed.removeAll(contexts);\r
49 \r
50                         for(Issue add : added) {\r
51                                 add.write(graph, source);\r
52                         }\r
53                         for(Issue remove : removed) {\r
54                                 Resource issue = graph.sync(new IssueByList(source, remove));\r
55                                 if (issue == null)\r
56                                         // FIXME: when can this happen and what should be done in this case?\r
57                                         continue;\r
58                                 graph.deny(issue, Layer0.getInstance(graph).PartOf);\r
59                                 graph.deny(source, IssueResource.getInstance(graph).IssueSource_Manages, issue);\r
60                                 RemoverUtil.remove(graph, issue);\r
61                         }\r
62                         \r
63                 }\r
64 \r
65         }\r
66 \r
67 }