aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/onap/aai/graphgraph/SchemaResource.java12
-rw-r--r--src/main/java/org/onap/aai/graphgraph/SchemaValidator.java82
-rw-r--r--src/main/java/org/onap/aai/graphgraph/dto/ValidationProblems.java20
3 files changed, 110 insertions, 4 deletions
diff --git a/src/main/java/org/onap/aai/graphgraph/SchemaResource.java b/src/main/java/org/onap/aai/graphgraph/SchemaResource.java
index 52c7510..3182681 100644
--- a/src/main/java/org/onap/aai/graphgraph/SchemaResource.java
+++ b/src/main/java/org/onap/aai/graphgraph/SchemaResource.java
@@ -23,6 +23,7 @@ import org.onap.aai.graphgraph.dto.Graph;
import org.onap.aai.graphgraph.dto.NodeName;
import org.onap.aai.graphgraph.dto.NodeProperty;
import org.onap.aai.graphgraph.dto.Property;
+import org.onap.aai.graphgraph.dto.ValidationProblems;
import org.onap.aai.graphgraph.reader.SchemaRepository;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -58,7 +59,7 @@ public class SchemaResource {
@RequestMapping("/schemas/{schema}/edges")
- public List<Property> loadedgeProperties(
+ public List<Property> loadedgeProperties (
@PathVariable("schema") String schemaName,
@RequestParam("fromNode") String fromNodeName,
@RequestParam("toNode") String toNodeName) {
@@ -67,7 +68,7 @@ public class SchemaResource {
@RequestMapping("/schemas/{schema}/graph/basic")
- public Graph loadGraph(
+ public Graph loadGraph (
@PathVariable("schema") String schemaName,
@RequestParam("node") String initialNodeName,
@RequestParam("parentHops") Integer parentHops,
@@ -82,7 +83,7 @@ public class SchemaResource {
@RequestMapping("/schemas/{schema}/graph/paths")
- public Graph loadGraphWithPaths(
+ public Graph loadGraphWithPaths (
@PathVariable("schema") String schemaName,
@RequestParam("fromNode") String fromNode,
@RequestParam("toNode") String toNode,
@@ -91,7 +92,10 @@ public class SchemaResource {
return repository.getSchemaReader(schemaName).getGraph(fromNode, toNode, edgeFilter);
}
-
+ @RequestMapping("/schemas/{schema}/validation")
+ public ValidationProblems validateSchema ( @PathVariable("schema") String schemaName) {
+ return new SchemaValidator().validate(schemaName);
+ }
}
diff --git a/src/main/java/org/onap/aai/graphgraph/SchemaValidator.java b/src/main/java/org/onap/aai/graphgraph/SchemaValidator.java
new file mode 100644
index 0000000..b67f1ad
--- /dev/null
+++ b/src/main/java/org/onap/aai/graphgraph/SchemaValidator.java
@@ -0,0 +1,82 @@
+package org.onap.aai.graphgraph;
+
+import io.vavr.Tuple;
+import io.vavr.Tuple2;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.onap.aai.graphgraph.dto.Edge;
+import org.onap.aai.graphgraph.dto.Graph;
+import org.onap.aai.graphgraph.dto.ValidationProblems;
+import org.onap.aai.graphgraph.reader.BasicSchemaReader;
+
+public class SchemaValidator {
+ private Graph edgerules;
+ private Graph oxm;
+ public ValidationProblems validate(String schemaVersion) {
+ ValidationProblems validationProblems = new ValidationProblems();
+ BasicSchemaReader schema = new BasicSchemaReader(schemaVersion);
+ oxm = schema.getGraph("all", 0, 0, 0, "Parents");
+ edgerules = schema.getGraph("all", 0, 0, 0, "Edgerules");
+
+ checkIfDanglingEdgerules(validationProblems);
+ checkIfObsoleteOxm(validationProblems);
+ return validationProblems;
+ }
+
+ /**
+ * computes nodes connected to relationship-list but not used in edgerules
+ * @param validationProblems
+ */
+ private void checkIfObsoleteOxm(ValidationProblems validationProblems) {
+ Set<String> relationshipListConnected = getAllNodesConnectedToRelationshipList();
+ Set<String> nodesInEdgerules = getEdgerulePairs().stream().flatMap(p -> Stream.of(p._1, p._2))
+ .collect(Collectors.toSet());
+ relationshipListConnected.removeAll(nodesInEdgerules);
+ relationshipListConnected.forEach(n ->
+ validationProblems.addProblem(String.format("%s is associated with relationship-list in OXM but not present in edgerules", n)));
+ }
+
+ private Set<Tuple2<String, String>> getEdgerulePairs() {
+ return edgerules.getEdges().stream()
+ .map(e -> Tuple.of(e.getSource(), e.getTarget())).collect(
+ Collectors.toSet());
+ }
+
+ /**
+ * computes edgerules which don't have the necessary connection to relationship-list in OXM
+ * @param validationProblems
+ */
+ private void checkIfDanglingEdgerules(
+ ValidationProblems validationProblems) {
+ Set<Tuple2<String, String>> edgerulePairs = getEdgerulePairs();
+ edgerulePairs.removeAll(getOxmPairs());
+ edgerulePairs.forEach( erp ->
+ validationProblems.addProblem(String.format("%s and %s are associated in edgerules but not in OXM (via relationship-list)", erp._1, erp._2)));
+ }
+
+ private Set<Tuple2<String, String>> getOxmPairs() {
+ Set<Tuple2<String, String>> pairs = new HashSet<>();
+ Set<String> inRelationshipList = getAllNodesConnectedToRelationshipList();
+
+ inRelationshipList.forEach(edge1 ->
+ inRelationshipList.forEach(edge2 -> {
+ pairs.add(Tuple.of(edge1, edge2));
+ }));
+ return pairs;
+ }
+
+ private Set<String> getAllNodesConnectedToRelationshipList() {
+ List<Edge> edges = oxm.getEdges();
+ Set<String> inRelationshipList = edges.stream().filter(e -> e.getSource().equals("relationship-list")).map(
+ Edge::getTarget).collect(
+ Collectors.toSet());
+ inRelationshipList.addAll(edges.stream().filter(e -> e.getTarget().equals("relationship-list"))
+ .map(Edge::getSource).collect(
+ Collectors.toSet()));
+ return inRelationshipList;
+ }
+}
diff --git a/src/main/java/org/onap/aai/graphgraph/dto/ValidationProblems.java b/src/main/java/org/onap/aai/graphgraph/dto/ValidationProblems.java
new file mode 100644
index 0000000..f8c3b86
--- /dev/null
+++ b/src/main/java/org/onap/aai/graphgraph/dto/ValidationProblems.java
@@ -0,0 +1,20 @@
+package org.onap.aai.graphgraph.dto;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class ValidationProblems {
+ private List<String> problems = new LinkedList<>();
+
+ public List<String> getProblems() {
+ return problems;
+ }
+
+ public void setProblems(List<String> problems) {
+ this.problems = problems;
+ }
+
+ public void addProblem(String problem) {
+ problems.add(problem);
+ }
+}