]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.issues.common/src/org/simantics/issues/common/DependencyIssueValidator2.java b/bundles/org.simantics.issues.common/src/org/simantics/issues/common/DependencyIssueValidator2.java
new file mode 100644 (file)
index 0000000..7c6cdec
--- /dev/null
@@ -0,0 +1,104 @@
+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