diff options
Diffstat (limited to 'src/main')
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); + } +} |