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