--- /dev/null
+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