Apply multiplicity Rule upon Edge creation
[aai/gizmo.git] / src / main / java / org / onap / crud / service / CrudGraphDataService.java
index 5b1c2dd..2888ace 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.crud.service;
 
 
 import java.util.HashMap;
+import java.util.List;
 import javax.ws.rs.core.EntityTag;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.onap.aai.restclient.client.OperationResult;
@@ -30,9 +31,12 @@ import org.onap.crud.entity.Edge;
 import org.onap.crud.entity.Vertex;
 import org.onap.crud.exception.CrudException;
 import org.onap.crud.parser.CrudResponseBuilder;
+import org.onap.crud.parser.EdgePayload;
+import org.onap.crud.parser.VertexPayload;
+import org.onap.crud.parser.util.EdgePayloadUtil;
 import org.onap.crud.util.CrudServiceUtil;
-import org.onap.schema.OxmModelValidator;
-import org.onap.schema.RelationshipSchemaValidator;
+import org.onap.schema.validation.OxmModelValidator;
+import org.onap.schema.validation.RelationshipSchemaValidator;
 
 
 public class CrudGraphDataService extends AbstractGraphDataService {
@@ -70,7 +74,17 @@ public class CrudGraphDataService extends AbstractGraphDataService {
   @Override
   public ImmutablePair<EntityTag, String> addEdge(String version, String type, EdgePayload payload)
             throws CrudException {
-    Edge edge = RelationshipSchemaValidator.validateIncomingAddPayload(version, type, payload);
+    // load source and target vertex relationships for validation
+    List<Edge> sourceVertexEdges =
+             EdgePayloadUtil.filterEdgesByRelatedVertexAndType(EdgePayloadUtil.getVertexNodeType(payload.getSource()), type,
+                          daoForGet.getVertexEdges(EdgePayloadUtil.getVertexNodeId(payload.getSource()), null));
+
+    List<Edge> targetVertexEdges =
+              EdgePayloadUtil.filterEdgesByRelatedVertexAndType(EdgePayloadUtil.getVertexNodeType(payload.getTarget()), type,
+                          daoForGet.getVertexEdges(EdgePayloadUtil.getVertexNodeId(payload.getTarget()), null));
+
+    Edge edge = RelationshipSchemaValidator.validateIncomingAddPayload(version, type, payload, sourceVertexEdges, targetVertexEdges);
+
     return addEdge(version, edge);
   }
 
@@ -133,7 +147,20 @@ public class CrudGraphDataService extends AbstractGraphDataService {
   @Override
   public ImmutablePair<EntityTag, String> updateEdge(String version, String id, String type, EdgePayload payload)
             throws CrudException {
-    Edge validatedEdge = getValidatedEdge(version, id, type, payload);
+    OperationResult edgeResult = dao.getEdge(id, type, new HashMap<String, String>());
+    Edge edge = Edge.fromJson(edgeResult.getResult());
+
+    // load source and target vertex relationships for validation
+    List<Edge> sourceVertexEdges =
+             EdgePayloadUtil.filterEdgesByRelatedVertexAndType(EdgePayloadUtil.getVertexNodeType(payload.getSource()), type,
+                          daoForGet.getVertexEdges(EdgePayloadUtil.getVertexNodeId(payload.getSource()), null));
+
+    List<Edge> targetVertexEdges =
+              EdgePayloadUtil.filterEdgesByRelatedVertexAndType(EdgePayloadUtil.getVertexNodeType(payload.getTarget()), type,
+                          daoForGet.getVertexEdges(EdgePayloadUtil.getVertexNodeId(payload.getTarget()), null));
+
+    Edge validatedEdge = RelationshipSchemaValidator.validateIncomingUpdatePayload(edge, version, payload, type, sourceVertexEdges, targetVertexEdges);
+
     return updateEdge(version, validatedEdge);
   }
 
@@ -152,11 +179,6 @@ public class CrudGraphDataService extends AbstractGraphDataService {
       .buildUpsertEdgeResponse(RelationshipSchemaValidator.validateOutgoingPayload(version, updatedEdge), version);
   }
 
-  private Edge getValidatedEdge(String version, String id, String type, EdgePayload payload) throws CrudException {
-      OperationResult operationResult = dao.getEdge(id, type, new HashMap<String, String>());
-    return RelationshipSchemaValidator.validateIncomingUpdatePayload(Edge.fromJson(operationResult.getResult()), version, payload);
-  }
-
   @Override
   public ImmutablePair<EntityTag, String> patchEdge(String version, String id, String type, EdgePayload payload)
             throws CrudException {