1 package org.simantics.issues.common;
\r
3 import java.util.Collections;
\r
4 import java.util.HashSet;
\r
5 import java.util.List;
\r
6 import java.util.Set;
\r
8 import org.simantics.Logger;
\r
9 import org.simantics.db.Issue;
\r
10 import org.simantics.db.ReadGraph;
\r
11 import org.simantics.db.Resource;
\r
12 import org.simantics.db.common.procedure.adapter.TransientCacheListener;
\r
13 import org.simantics.db.common.request.ResourceRead2;
\r
14 import org.simantics.db.common.request.ResourceRead3;
\r
15 import org.simantics.db.common.utils.Functions;
\r
16 import org.simantics.db.common.utils.NameUtils;
\r
17 import org.simantics.db.exception.DatabaseException;
\r
18 import org.simantics.issues.ontology.IssueResource;
\r
19 import org.simantics.layer0.Layer0;
\r
21 public class DependencyIssueValidator2 extends ResourceRead3<Boolean> {
\r
23 public static final boolean DEBUG = false;
\r
25 public DependencyIssueValidator2(Resource resource, Resource model, Resource source) {
\r
26 super(resource, model, source);
\r
29 static class DependencyIssueDescriptions extends ResourceRead2<Set<Issue>> {
\r
31 public DependencyIssueDescriptions(Resource source, Resource context0) {
\r
32 super(source, context0);
\r
36 public Set<Issue> perform(ReadGraph graph) throws DatabaseException {
\r
37 HashSet<Issue> result = new HashSet<Issue>();
\r
38 for(Resource issue : graph.syncRequest(new ManagedIssues(resource))) {
\r
39 Issue desc = graph.sync(new StandardIssueDescription(issue));
\r
40 if(desc == null) continue;
\r
41 if(resource2.equals(desc.getMainContext())) result.add(desc);
\r
48 static class Contexts extends ResourceRead2<Set<Issue>> {
\r
50 public Contexts(Resource source, Resource resource) {
\r
51 super(source, resource);
\r
55 public Set<Issue> perform(ReadGraph graph) throws DatabaseException {
\r
57 Layer0 L0 = Layer0.getInstance(graph);
\r
58 IssueResource IR = IssueResource.getInstance(graph);
\r
60 Resource constraint = graph.getSingleObject(resource, IR.Sources_DependencyTracker_HasConstraint);
\r
61 Resource function = graph.getSingleObject(constraint, L0.Constraint_Validator);
\r
63 @SuppressWarnings("unchecked")
\r
64 Set<Issue> contexts = new HashSet<Issue>((List<Issue>)Functions.exec(graph, function, graph, resource2));
\r
65 if(DEBUG) System.err.println("Validator found: " + contexts.size() + " issues (" + contexts + ")");
\r
67 } catch (DatabaseException e) {
\r
68 Logger.defaultLogError(e);
\r
69 return Collections.emptySet();
\r
75 public String toString() {
\r
76 return "DependencyIssueValidators2$Contexts[resource=" + resource2 + " source=" + resource + "]";
\r
82 public Boolean perform(ReadGraph graph) throws DatabaseException {
\r
84 if(DEBUG) System.err.println("Running DependencyValidator for " + NameUtils.getSafeName(graph, resource) + " " + NameUtils.getSafeName(graph, resource3));
\r
86 Set<Issue> existing = graph.syncRequest(new DependencyIssueDescriptions(resource3, resource), TransientCacheListener.<Set<Issue>>instance());
\r
88 if(DEBUG) System.err.println("Existing: " + existing.size() + " issues (" + existing + ")");
\r
90 // Removed resources do not have issues
\r
91 if(!graph.hasStatement(resource)) {
\r
92 if(DEBUG) System.err.println("No statements");
\r
93 return existing.isEmpty();
\r
96 Set<Issue> contexts = graph.syncRequest(new Contexts(resource3, resource), TransientCacheListener.<Set<Issue>>instance());
\r
98 if(DEBUG) System.err.println("Current: " + contexts.size() + " issues (" + contexts + ")");
\r
100 return existing.equals(contexts);
\r