1 package org.simantics.issues.common;
\r
3 import java.util.Collections;
\r
4 import java.util.HashSet;
\r
5 import java.util.Set;
\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
19 public class DependencyIssueSynchronizer2 extends WriteRequest {
\r
21 public static final boolean DEBUG = false;
\r
23 private Resource resource;
\r
24 private Resource source;
\r
26 public DependencyIssueSynchronizer2(Resource resource, Resource source) {
\r
27 this.resource = resource;
\r
28 this.source = source;
\r
32 public void perform(WriteGraph graph) throws DatabaseException {
\r
34 if(DEBUG) System.err.println("Running DependencySynchronizer for " + resource);
\r
36 Set<Issue> existing = graph.syncRequest(new DependencyIssueDescriptions(source, resource), TransientCacheListener.<Set<Issue>>instance());
\r
37 Set<Issue> contexts = Collections.emptySet();
\r
39 if(graph.hasStatement(resource)) {
\r
40 contexts = graph.syncRequest(new Contexts(source, resource), TransientCacheListener.<Set<Issue>>instance());
\r
43 if(!existing.equals(contexts)) {
\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
50 for(Issue add : added) {
\r
51 add.write(graph, source);
\r
53 for(Issue remove : removed) {
\r
54 Resource issue = graph.sync(new IssueByList(source, remove));
\r
56 // FIXME: when can this happen and what should be done in this case?
\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