]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.issues.common/src/org/simantics/issues/common/DependencyIssueValidator2.java
Replace System.err and System.out with SLF4J Logging
[simantics/platform.git] / bundles / org.simantics.issues.common / src / org / simantics / issues / common / DependencyIssueValidator2.java
1 package org.simantics.issues.common;
2
3 import java.util.Collections;
4 import java.util.HashSet;
5 import java.util.List;
6 import java.util.Set;
7
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;
21
22 public class DependencyIssueValidator2 extends ResourceRead3<Boolean> {
23     private static final Logger LOGGER = LoggerFactory.getLogger(DependencyIssueValidator2.class);
24
25         public static final boolean DEBUG = false;
26
27         public DependencyIssueValidator2(Resource resource, Resource model, Resource source) {
28                 super(resource, model, source);
29         }
30
31         static class DependencyIssueDescriptions extends ResourceRead2<Set<Issue>> {
32
33                 public DependencyIssueDescriptions(Resource source, Resource context0) {
34                         super(source, context0);
35                 }
36                 
37                 @Override
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);
44                         }
45                         return result;
46                 }
47                 
48         }
49         
50         static class Contexts extends ResourceRead2<Set<Issue>> {
51
52                 public Contexts(Resource source, Resource resource) {
53                         super(source, resource);
54                 }
55                 
56                 @Override
57                 public Set<Issue> perform(ReadGraph graph) throws DatabaseException {
58                         
59                         Layer0 L0 = Layer0.getInstance(graph);
60                         IssueResource IR = IssueResource.getInstance(graph);
61
62                         Resource constraint = graph.getSingleObject(resource, IR.Sources_DependencyTracker_HasConstraint);
63                         Resource function = graph.getSingleObject(constraint, L0.Constraint_Validator);
64                         try {
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 + ")");
68                         return contexts;
69                         } catch (DatabaseException e) {
70                                 LOGGER.error("Reading a constraint validator failed", e);
71                                 return Collections.emptySet();
72                         }
73                 
74                 }
75                 
76                 @Override
77                 public String toString() {
78                         return "DependencyIssueValidators2$Contexts[resource=" + resource2 + " source=" + resource + "]";
79                 }
80                 
81         }
82
83         @Override
84         public Boolean perform(ReadGraph graph) throws DatabaseException {
85                 
86                 if(DEBUG) LOGGER.info("Running DependencyValidator for " + NameUtils.getSafeName(graph, resource) + " " +  NameUtils.getSafeName(graph, resource3));
87
88                 Set<Issue> existing = graph.syncRequest(new DependencyIssueDescriptions(resource3, resource), TransientCacheListener.<Set<Issue>>instance());
89
90         if(DEBUG) LOGGER.info("Existing: " + existing.size() + " issues (" + existing + ")");
91                 
92                 // Removed resources do not have issues
93                 if(!graph.hasStatement(resource)) {
94                 if(DEBUG) LOGGER.info("No statements");
95                         return existing.isEmpty();
96                 }
97
98         Set<Issue> contexts = graph.syncRequest(new Contexts(resource3, resource), TransientCacheListener.<Set<Issue>>instance());
99
100         if(DEBUG) LOGGER.info("Current: " + contexts.size() + " issues (" + contexts + ")");
101         
102                 return existing.equals(contexts);
103
104         }
105
106 }