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