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