]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/validation/ValidationUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / validation / ValidationUtils.java
diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/validation/ValidationUtils.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/validation/ValidationUtils.java
new file mode 100644 (file)
index 0000000..b5ea246
--- /dev/null
@@ -0,0 +1,81 @@
+package org.simantics.db.layer0.validation;\r
+\r
+import gnu.trove.set.hash.THashSet;\r
+\r
+import java.util.Collections;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.simantics.db.Issue;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.utils.Functions;\r
+import org.simantics.db.common.utils.Logger;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.SubgraphExtent.ExtentStatus;\r
+import org.simantics.db.layer0.util.DomainProcessor3;\r
+import org.simantics.db.layer0.util.ModelTransferableGraphSourceRequest;\r
+import org.simantics.layer0.Layer0;\r
+\r
+public class ValidationUtils {\r
+\r
+    /**\r
+     * Performs L0.Constraint validations for the specified resource and puts\r
+     * the resulting issues in the specified {@link Issue} set. If the specified\r
+     * issue set is <code>null</code>, a new set will be created and returned.\r
+     * Otherwise the method function will return the same set as its return\r
+     * value.\r
+     * \r
+     * @param graph\r
+     *            database read access handle\r
+     * @param r\r
+     *            resource to validate against ontology-defined constraints\r
+     * @param result\r
+     *            a set for the resulting issues or <code>null</code> to\r
+     *            allocate a new set if necessary\r
+     * @return the discovered set of issues in <code>r</code>\r
+     * @throws DatabaseException\r
+     */\r
+    public static Set<Issue> validateConstraints(ReadGraph graph, Resource r, Set<Issue> result) throws DatabaseException {\r
+        Layer0 L0 = Layer0.getInstance(graph);\r
+\r
+        for (Resource constraint : graph.syncRequest(new GetConstraints(r))) {\r
+            try {\r
+                Resource function = graph.getSingleObject(constraint, L0.Constraint_Validator);\r
+                @SuppressWarnings("unchecked")\r
+                List<Issue> issues = (List<Issue>)Functions.exec(graph, function, graph, r);\r
+                if (issues != null && !issues.isEmpty()) {\r
+                    if (result == null)\r
+                        result = new THashSet<Issue>();\r
+                    result.addAll(issues);\r
+                }\r
+            } catch (Throwable t) {\r
+                Logger.defaultLogError(t);\r
+            }\r
+        }\r
+\r
+        return result != null ? result : Collections.<Issue>emptySet();\r
+    }\r
+\r
+    public static Set<Issue> validateConstraints(ReadGraph graph, Resource r) throws DatabaseException {\r
+        return validateConstraints(graph, r, null);\r
+    }\r
+\r
+    public static Set<Issue> validateConstraintsForDomain(ReadGraph graph, Resource r) throws DatabaseException {\r
+        Set<Issue> result = null;\r
+\r
+        DomainProcessor3 dp = ModelTransferableGraphSourceRequest.getDomainOnly(graph, null, r);\r
+        for(Map.Entry<Resource,ExtentStatus> status : dp.getStatus().entrySet()) {\r
+            if(ExtentStatus.INTERNAL.equals(status.getValue())) {\r
+                Resource rr = status.getKey();\r
+                Set<Issue> issues = validateConstraints(graph, rr, result);\r
+                if (!issues.isEmpty())\r
+                    result = issues;\r
+            }\r
+        }\r
+\r
+        return result != null ? result : Collections.<Issue>emptySet();\r
+    }\r
+\r
+}\r