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.db.Issue;
\r
9 import org.simantics.db.ReadGraph;
\r
10 import org.simantics.db.Resource;
\r
11 import org.simantics.db.common.procedure.adapter.TransientCacheListener;
\r
12 import org.simantics.db.common.request.ResourceRead2;
\r
13 import org.simantics.db.common.request.ResourceRead3;
\r
14 import org.simantics.db.common.utils.Functions;
\r
15 import org.simantics.db.common.utils.NameUtils;
\r
16 import org.simantics.db.exception.DatabaseException;
\r
17 import org.simantics.issues.ontology.IssueResource;
\r
18 import org.simantics.layer0.Layer0;
\r
19 import org.slf4j.Logger;
\r
20 import org.slf4j.LoggerFactory;
\r
22 public class DependencyIssueValidator2 extends ResourceRead3<Boolean> {
\r
23 private static final Logger LOGGER = LoggerFactory.getLogger(DependencyIssueValidator2.class);
\r
25 public static final boolean DEBUG = false;
\r
27 public DependencyIssueValidator2(Resource resource, Resource model, Resource source) {
\r
28 super(resource, model, source);
\r
31 static class DependencyIssueDescriptions extends ResourceRead2<Set<Issue>> {
\r
33 public DependencyIssueDescriptions(Resource source, Resource context0) {
\r
34 super(source, context0);
\r
38 public Set<Issue> perform(ReadGraph graph) throws DatabaseException {
\r
39 HashSet<Issue> result = new HashSet<Issue>();
\r
40 for(Resource issue : graph.syncRequest(new ManagedIssues(resource))) {
\r
41 Issue desc = graph.sync(new StandardIssueDescription(issue));
\r
42 if(desc == null) continue;
\r
43 if(resource2.equals(desc.getMainContext())) result.add(desc);
\r
50 static class Contexts extends ResourceRead2<Set<Issue>> {
\r
52 public Contexts(Resource source, Resource resource) {
\r
53 super(source, resource);
\r
57 public Set<Issue> perform(ReadGraph graph) throws DatabaseException {
\r
59 Layer0 L0 = Layer0.getInstance(graph);
\r
60 IssueResource IR = IssueResource.getInstance(graph);
\r
62 Resource constraint = graph.getSingleObject(resource, IR.Sources_DependencyTracker_HasConstraint);
\r
63 Resource function = graph.getSingleObject(constraint, L0.Constraint_Validator);
\r
65 @SuppressWarnings("unchecked")
\r
66 Set<Issue> contexts = new HashSet<Issue>((List<Issue>)Functions.exec(graph, function, graph, resource2));
\r
67 if(DEBUG) System.err.println("Validator found: " + contexts.size() + " issues (" + contexts + ")");
\r
69 } catch (DatabaseException e) {
\r
70 LOGGER.error("Reading a constraint validator failed", e);
\r
71 return Collections.emptySet();
\r
77 public String toString() {
\r
78 return "DependencyIssueValidators2$Contexts[resource=" + resource2 + " source=" + resource + "]";
\r
84 public Boolean perform(ReadGraph graph) throws DatabaseException {
\r
86 if(DEBUG) System.err.println("Running DependencyValidator for " + NameUtils.getSafeName(graph, resource) + " " + NameUtils.getSafeName(graph, resource3));
\r
88 Set<Issue> existing = graph.syncRequest(new DependencyIssueDescriptions(resource3, resource), TransientCacheListener.<Set<Issue>>instance());
\r
90 if(DEBUG) System.err.println("Existing: " + existing.size() + " issues (" + existing + ")");
\r
92 // Removed resources do not have issues
\r
93 if(!graph.hasStatement(resource)) {
\r
94 if(DEBUG) System.err.println("No statements");
\r
95 return existing.isEmpty();
\r
98 Set<Issue> contexts = graph.syncRequest(new Contexts(resource3, resource), TransientCacheListener.<Set<Issue>>instance());
\r
100 if(DEBUG) System.err.println("Current: " + contexts.size() + " issues (" + contexts + ")");
\r
102 return existing.equals(contexts);
\r