--- /dev/null
+package org.simantics.issues.common;\r
+\r
+import java.util.Collections;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import org.simantics.Logger;\r
+import org.simantics.db.Issue;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
+import org.simantics.db.common.request.ResourceRead2;\r
+import org.simantics.db.common.request.ResourceRead3;\r
+import org.simantics.db.common.utils.Functions;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.issues.ontology.IssueResource;\r
+import org.simantics.layer0.Layer0;\r
+\r
+public class DependencyIssueValidator2 extends ResourceRead3<Boolean> {\r
+\r
+ public static final boolean DEBUG = false;\r
+\r
+ public DependencyIssueValidator2(Resource resource, Resource model, Resource source) {\r
+ super(resource, model, source);\r
+ }\r
+\r
+ static class DependencyIssueDescriptions extends ResourceRead2<Set<Issue>> {\r
+\r
+ public DependencyIssueDescriptions(Resource source, Resource context0) {\r
+ super(source, context0);\r
+ }\r
+ \r
+ @Override\r
+ public Set<Issue> perform(ReadGraph graph) throws DatabaseException {\r
+ HashSet<Issue> result = new HashSet<Issue>();\r
+ for(Resource issue : graph.syncRequest(new ManagedIssues(resource))) {\r
+ Issue desc = graph.sync(new StandardIssueDescription(issue));\r
+ if(desc == null) continue;\r
+ if(resource2.equals(desc.getMainContext())) result.add(desc);\r
+ }\r
+ return result;\r
+ }\r
+ \r
+ }\r
+ \r
+ static class Contexts extends ResourceRead2<Set<Issue>> {\r
+\r
+ public Contexts(Resource source, Resource resource) {\r
+ super(source, resource);\r
+ }\r
+ \r
+ @Override\r
+ public Set<Issue> perform(ReadGraph graph) throws DatabaseException {\r
+ \r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ IssueResource IR = IssueResource.getInstance(graph);\r
+\r
+ Resource constraint = graph.getSingleObject(resource, IR.Sources_DependencyTracker_HasConstraint);\r
+ Resource function = graph.getSingleObject(constraint, L0.Constraint_Validator);\r
+ try {\r
+ @SuppressWarnings("unchecked")\r
+ Set<Issue> contexts = new HashSet<Issue>((List<Issue>)Functions.exec(graph, function, graph, resource2));\r
+ if(DEBUG) System.err.println("Validator found: " + contexts.size() + " issues (" + contexts + ")");\r
+ return contexts;\r
+ } catch (DatabaseException e) {\r
+ Logger.defaultLogError(e);\r
+ return Collections.emptySet();\r
+ }\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public String toString() {\r
+ return "DependencyIssueValidators2$Contexts[resource=" + resource2 + " source=" + resource + "]";\r
+ }\r
+ \r
+ }\r
+\r
+ @Override\r
+ public Boolean perform(ReadGraph graph) throws DatabaseException {\r
+ \r
+ if(DEBUG) System.err.println("Running DependencyValidator for " + NameUtils.getSafeName(graph, resource) + " " + NameUtils.getSafeName(graph, resource3));\r
+\r
+ Set<Issue> existing = graph.syncRequest(new DependencyIssueDescriptions(resource3, resource), TransientCacheListener.<Set<Issue>>instance());\r
+\r
+ if(DEBUG) System.err.println("Existing: " + existing.size() + " issues (" + existing + ")");\r
+ \r
+ // Removed resources do not have issues\r
+ if(!graph.hasStatement(resource)) {\r
+ if(DEBUG) System.err.println("No statements");\r
+ return existing.isEmpty();\r
+ }\r
+\r
+ Set<Issue> contexts = graph.syncRequest(new Contexts(resource3, resource), TransientCacheListener.<Set<Issue>>instance());\r
+\r
+ if(DEBUG) System.err.println("Current: " + contexts.size() + " issues (" + contexts + ")");\r
+ \r
+ return existing.equals(contexts);\r
+\r
+ }\r
+\r
+}
\ No newline at end of file