summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/onap/crud/dao/champ/ChampDao.java10
-rw-r--r--src/main/java/org/onap/crud/entity/Vertex.java3
-rw-r--r--src/main/java/org/onap/crud/event/response/GraphEventResponseHandler.java4
-rw-r--r--src/main/java/org/onap/crud/parser/CrudResponseBuilder.java3
-rw-r--r--src/main/java/org/onap/crud/parser/util/EdgePayloadUtil.java145
-rw-r--r--src/main/java/org/onap/crud/service/AbstractGraphDataService.java35
-rw-r--r--src/main/java/org/onap/crud/service/BulkPayload.java (renamed from src/main/java/org/onap/crud/parser/BulkPayload.java)2
-rw-r--r--src/main/java/org/onap/crud/service/CrudAsyncGraphDataService.java6
-rw-r--r--src/main/java/org/onap/crud/service/CrudGraphDataService.java38
-rw-r--r--src/main/java/org/onap/crud/service/CrudRestService.java3
-rw-r--r--src/main/java/org/onap/crud/service/EdgePayload.java (renamed from src/main/java/org/onap/crud/parser/EdgePayload.java)2
-rw-r--r--src/main/java/org/onap/crud/service/VertexPayload.java (renamed from src/main/java/org/onap/crud/parser/VertexPayload.java)2
-rw-r--r--src/main/java/org/onap/crud/util/CrudServiceUtil.java8
-rw-r--r--src/main/java/org/onap/schema/OxmModelValidator.java (renamed from src/main/java/org/onap/schema/validation/OxmModelValidator.java)4
-rw-r--r--src/main/java/org/onap/schema/RelationshipSchema.java29
-rw-r--r--src/main/java/org/onap/schema/RelationshipSchemaValidator.java325
-rw-r--r--src/main/java/org/onap/schema/validation/MultiplicityValidator.java119
-rw-r--r--src/main/java/org/onap/schema/validation/RelationshipSchemaValidator.java265
-rw-r--r--src/test/java/org/onap/crud/parser/util/EdgePayloadUtilTest.java110
-rw-r--r--src/test/java/org/onap/crud/service/BulkPayloadTest.java2
-rw-r--r--src/test/java/org/onap/crud/service/CrudRestServiceTest.java21
-rw-r--r--src/test/java/org/onap/crud/service/VertexPayloadTest.java1
-rw-r--r--src/test/java/org/onap/crud/util/CrudServiceUtilTest.java2
-rw-r--r--src/test/java/org/onap/schema/EdgeRulesLoaderTest.java2
-rw-r--r--src/test/java/org/onap/schema/RelationshipSchemaValidatorTest.java12
-rw-r--r--src/test/java/org/onap/schema/validation/MultiplicityValidatorTest.java161
26 files changed, 373 insertions, 941 deletions
diff --git a/src/main/java/org/onap/crud/dao/champ/ChampDao.java b/src/main/java/org/onap/crud/dao/champ/ChampDao.java
index 0a9adc4..554b9fa 100644
--- a/src/main/java/org/onap/crud/dao/champ/ChampDao.java
+++ b/src/main/java/org/onap/crud/dao/champ/ChampDao.java
@@ -183,7 +183,7 @@ public class ChampDao implements GraphDao {
@Override
public OperationResult getVertices(String type, Map<String, Object> filter, Set<String> properties, String version) throws CrudException {
- filter.put(org.onap.schema.validation.OxmModelValidator.Metadata.NODE_TYPE.propertyName(), type);
+ filter.put(org.onap.schema.OxmModelValidator.Metadata.NODE_TYPE.propertyName(), type);
List<NameValuePair> queryParams = convertToNameValuePair(filter);
queryParams.addAll(convertToNameValuePair("properties", properties));
@@ -252,7 +252,7 @@ public class ChampDao implements GraphDao {
// Add the aai_node_type so that AAI can read the data created by gizmo
// TODO: This probably shouldn't be here
- properties.put(org.onap.schema.validation.OxmModelValidator.Metadata.NODE_TYPE.propertyName(), type);
+ properties.put(org.onap.schema.OxmModelValidator.Metadata.NODE_TYPE.propertyName(), type);
Vertex.Builder insertVertexBuilder = new Vertex.Builder(type);
properties.forEach(insertVertexBuilder::property);
@@ -276,7 +276,7 @@ public class ChampDao implements GraphDao {
// Add the aai_node_type so that AAI can read the data created by gizmo
// TODO: This probably shouldn't be here
- properties.put(org.onap.schema.validation.OxmModelValidator.Metadata.NODE_TYPE.propertyName(), type);
+ properties.put(org.onap.schema.OxmModelValidator.Metadata.NODE_TYPE.propertyName(), type);
Vertex.Builder insertVertexBuilder = new Vertex.Builder(type);
insertVertexBuilder.id(id);
@@ -424,7 +424,7 @@ public class ChampDao implements GraphDao {
// Add the aai_node_type so that AAI can read the data created by gizmo
// TODO: This probably shouldn't be here
- properties.put(org.onap.schema.validation.OxmModelValidator.Metadata.NODE_TYPE.propertyName(), type);
+ properties.put(org.onap.schema.OxmModelValidator.Metadata.NODE_TYPE.propertyName(), type);
Vertex.Builder insertVertexBuilder = new Vertex.Builder(type);
properties.forEach(insertVertexBuilder::property);
@@ -473,7 +473,7 @@ public class ChampDao implements GraphDao {
// Add the aai_node_type so that AAI can read the data created by gizmo
// TODO: This probably shouldn't be here
- properties.put(org.onap.schema.validation.OxmModelValidator.Metadata.NODE_TYPE.propertyName(), type);
+ properties.put(org.onap.schema.OxmModelValidator.Metadata.NODE_TYPE.propertyName(), type);
Vertex.Builder insertVertexBuilder = new Vertex.Builder(type);
insertVertexBuilder.id(id);
diff --git a/src/main/java/org/onap/crud/entity/Vertex.java b/src/main/java/org/onap/crud/entity/Vertex.java
index a70253e..a5bda17 100644
--- a/src/main/java/org/onap/crud/entity/Vertex.java
+++ b/src/main/java/org/onap/crud/entity/Vertex.java
@@ -34,7 +34,8 @@ import org.json.JSONObject;
import org.onap.crud.exception.CrudException;
import org.onap.crud.util.CrudServiceUtil;
import org.onap.schema.OxmModelLoader;
-import org.onap.schema.validation.OxmModelValidator;
+import org.onap.schema.OxmModelValidator;
+
import com.google.common.base.CaseFormat;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
diff --git a/src/main/java/org/onap/crud/event/response/GraphEventResponseHandler.java b/src/main/java/org/onap/crud/event/response/GraphEventResponseHandler.java
index 83be4bc..19e92ae 100644
--- a/src/main/java/org/onap/crud/event/response/GraphEventResponseHandler.java
+++ b/src/main/java/org/onap/crud/event/response/GraphEventResponseHandler.java
@@ -29,8 +29,8 @@ import org.onap.crud.event.envelope.GraphEventEnvelope;
import org.onap.crud.exception.CrudException;
import org.onap.crud.logging.CrudServiceMsgs;
import org.onap.crud.parser.CrudResponseBuilder;
-import org.onap.schema.validation.OxmModelValidator;
-import org.onap.schema.validation.RelationshipSchemaValidator;
+import org.onap.schema.OxmModelValidator;
+import org.onap.schema.RelationshipSchemaValidator;
/**
* Reads event responses, logs and generates exceptions if errors are found.
diff --git a/src/main/java/org/onap/crud/parser/CrudResponseBuilder.java b/src/main/java/org/onap/crud/parser/CrudResponseBuilder.java
index 29d8824..18b50ef 100644
--- a/src/main/java/org/onap/crud/parser/CrudResponseBuilder.java
+++ b/src/main/java/org/onap/crud/parser/CrudResponseBuilder.java
@@ -27,6 +27,9 @@ import java.util.Map;
import org.onap.crud.entity.Edge;
import org.onap.crud.entity.Vertex;
import org.onap.crud.exception.CrudException;
+import org.onap.crud.service.BulkPayload;
+import org.onap.crud.service.EdgePayload;
+import org.onap.crud.service.VertexPayload;
import org.onap.schema.EdgeRulesLoader;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
diff --git a/src/main/java/org/onap/crud/parser/util/EdgePayloadUtil.java b/src/main/java/org/onap/crud/parser/util/EdgePayloadUtil.java
deleted file mode 100644
index 0f72625..0000000
--- a/src/main/java/org/onap/crud/parser/util/EdgePayloadUtil.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 Amdocs
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.onap.crud.parser.util;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import javax.ws.rs.core.Response.Status;
-import org.onap.crud.entity.Edge;
-import org.onap.crud.entity.Vertex;
-import org.onap.crud.exception.CrudException;
-
-/**
- * Utility Class to extract data from the Edge Payload
- */
-public class EdgePayloadUtil {
-
- private static final Pattern URL_MATCHER = Pattern.compile("services/inventory/(.*)/(.*)/(.*)");
-
- private static Matcher getVertexMatcher(String vertex) throws CrudException {
- Matcher matcher = URL_MATCHER.matcher(vertex);
- if (!matcher.matches()) {
- throw new CrudException("Invalid Source/Target Urls", Status.BAD_REQUEST);
- }
- return matcher;
- }
-
- /**
- * Returns the node type from a vertex on the edge payload
- *
- * @param vertex
- * @return
- * @throws CrudException
- */
- public static String getVertexNodeType(String vertex) throws CrudException {
- return getVertexMatcher(vertex).group(2);
- }
-
- /**
- * Returns the node id from a vertex on the edge payload
- *
- * @param vertex
- * @return
- * @throws CrudException
- */
- public static String getVertexNodeId(String vertex) throws CrudException {
- return getVertexMatcher(vertex).group(3);
- }
-
- /**
- * Generates a key based on the edge payload content
- *
- * @param source
- * @param target
- * @param type
- * @return
- * @throws CrudException
- */
- public static String generateEdgeKey(String source, String target, String type) throws CrudException {
- return getVertexNodeType(source) + ":" + getVertexNodeType(target) + ":" + type;
- }
-
- /**
- * Returns an Edge Builder object from the payload properties
- *
- * @param source
- * @param target
- * @param type
- * @return
- * @throws CrudException
- */
- public static Edge.Builder getBuilderFromEdgePayload(String source, String target, String type) throws CrudException {
- Edge.Builder edgeBuilder = new Edge.Builder(type);
-
- edgeBuilder.source(new Vertex.Builder(getVertexNodeType(source)).id(getVertexNodeId(source)).build());
- edgeBuilder.target(new Vertex.Builder(getVertexNodeType(target)).id(getVertexNodeId(target)).build());
-
- return edgeBuilder;
- }
-
- /**
- * Returns an Edge Builder object from an Edge object properties
- *
- * @param edge
- * @return
- */
- public static Edge.Builder getBuilderFromEdge(Edge edge) {
- Edge.Builder edgeBuilder = new Edge.Builder(edge.getType()).id(edge.getId().get());
-
- edgeBuilder
- .source(new Vertex.Builder(edge.getSource().getType()).id(edge.getSource().getId().get()).build());
- edgeBuilder
- .target(new Vertex.Builder(edge.getTarget().getType()).id(edge.getTarget().getId().get()).build());
-
- return edgeBuilder;
- }
-
- /**
- * Filter Edges by its source/target vertex type and the edge type
- *
- * @param sourceTargetType the new Edge source/target type
- * @param type
- * @param edges
- * @return List<Edge>
- */
- public static List<Edge> filterEdgesByRelatedVertexAndType(String sourceTargetType, String type, List<Edge> edges) {
- List<Edge> filteredEdges = new ArrayList<>();
- if (edges != null) {
- for (Edge edge : edges) {
- if (doesEdgeTypeMatch(edge, type) && doesEdgeSourceTargetTypeMatch(edge, sourceTargetType)) {
- filteredEdges.add(edge);
- }
- }
- }
- return filteredEdges;
- }
-
- private static boolean doesEdgeTypeMatch(Edge edge, String type) {
- return edge.getType() != null && edge.getType().equals(type);
- }
-
- private static boolean doesEdgeSourceTargetTypeMatch(Edge edge, String sourceTargetType) {
- return (edge.getSource().getType() != null && edge.getSource().getType().equals(sourceTargetType))
- || ((edge.getTarget().getType() != null && edge.getTarget().getType().equals(sourceTargetType)));
- }
-}
diff --git a/src/main/java/org/onap/crud/service/AbstractGraphDataService.java b/src/main/java/org/onap/crud/service/AbstractGraphDataService.java
index 14ea242..8225adf 100644
--- a/src/main/java/org/onap/crud/service/AbstractGraphDataService.java
+++ b/src/main/java/org/onap/crud/service/AbstractGraphDataService.java
@@ -41,14 +41,10 @@ import org.onap.crud.dao.champ.ChampVertexSerializer;
import org.onap.crud.entity.Edge;
import org.onap.crud.entity.Vertex;
import org.onap.crud.exception.CrudException;
-import org.onap.crud.parser.BulkPayload;
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.validation.OxmModelValidator;
-import org.onap.schema.validation.RelationshipSchemaValidator;
+import org.onap.schema.OxmModelValidator;
+import org.onap.schema.RelationshipSchemaValidator;
public abstract class AbstractGraphDataService {
protected GraphDao daoForGet;
@@ -230,22 +226,14 @@ public abstract class AbstractGraphDataService {
edgePayload
.setTarget("services/inventory/" + version + "/" + target.getType() + "/" + target.getId().get());
}
-
+
// If the type isn't set, resolve it based on on the sourece and target vertex types
if (edgePayload.getType() == null || edgePayload.getType().isEmpty()) {
edgePayload.setType(CrudServiceUtil.determineEdgeType(edgePayload, version));
}
- List<Edge> sourceVertexEdges =
- EdgePayloadUtil.filterEdgesByRelatedVertexAndType(EdgePayloadUtil.getVertexNodeType(edgePayload.getSource()), edgePayload.getType(),
- dao.getVertexEdges(EdgePayloadUtil.getVertexNodeId(edgePayload.getSource()), null, txId));
-
- List<Edge> targetVertexEdges =
- EdgePayloadUtil.filterEdgesByRelatedVertexAndType(EdgePayloadUtil.getVertexNodeType(edgePayload.getTarget()), edgePayload.getType(),
- dao.getVertexEdges(EdgePayloadUtil.getVertexNodeId(edgePayload.getTarget()), null, txId));
-
- validatedEdge = RelationshipSchemaValidator.validateIncomingAddPayload(version, edgePayload.getType(), edgePayload, sourceVertexEdges,
- targetVertexEdges);
+ validatedEdge = RelationshipSchemaValidator.validateIncomingAddPayload(version, edgePayload.getType(),edgePayload);
+
persistedEdge = addBulkEdge(validatedEdge, version, txId);
} else if (opr.getValue().getAsString().equalsIgnoreCase("modify")) {
Edge edge = dao.getEdge(edgePayload.getId(), txId);
@@ -255,17 +243,8 @@ public abstract class AbstractGraphDataService {
edgePayload.setType(edge.getType());
}
- // load source and target vertex relationships for validation
- List<Edge> sourceVertexEdges =
- EdgePayloadUtil.filterEdgesByRelatedVertexAndType(EdgePayloadUtil.getVertexNodeType(edgePayload.getSource()), edgePayload.getType(),
- dao.getVertexEdges(EdgePayloadUtil.getVertexNodeId(edgePayload.getSource()), null, txId));
-
- List<Edge> targetVertexEdges =
- EdgePayloadUtil.filterEdgesByRelatedVertexAndType(EdgePayloadUtil.getVertexNodeType(edgePayload.getTarget()), edgePayload.getType(),
- dao.getVertexEdges(EdgePayloadUtil.getVertexNodeId(edgePayload.getTarget()), null, txId));
-
-
- validatedEdge = RelationshipSchemaValidator.validateIncomingUpdatePayload(edge, version, edgePayload, edgePayload.getType(), sourceVertexEdges, targetVertexEdges);
+ validatedEdge = RelationshipSchemaValidator.validateIncomingUpdatePayload(edge, version, edgePayload);
+
persistedEdge = updateBulkEdge(validatedEdge, version, txId);
} else {
if (edgePayload.getId() == null) {
diff --git a/src/main/java/org/onap/crud/parser/BulkPayload.java b/src/main/java/org/onap/crud/service/BulkPayload.java
index 33e9a2e..8dc99c4 100644
--- a/src/main/java/org/onap/crud/parser/BulkPayload.java
+++ b/src/main/java/org/onap/crud/service/BulkPayload.java
@@ -18,7 +18,7 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-package org.onap.crud.parser;
+package org.onap.crud.service;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
diff --git a/src/main/java/org/onap/crud/service/CrudAsyncGraphDataService.java b/src/main/java/org/onap/crud/service/CrudAsyncGraphDataService.java
index 8d147eb..14ba7f2 100644
--- a/src/main/java/org/onap/crud/service/CrudAsyncGraphDataService.java
+++ b/src/main/java/org/onap/crud/service/CrudAsyncGraphDataService.java
@@ -56,13 +56,11 @@ import org.onap.crud.event.envelope.GraphEventEnvelope;
import org.onap.crud.event.response.GraphEventResponseHandler;
import org.onap.crud.exception.CrudException;
import org.onap.crud.logging.CrudServiceMsgs;
-import org.onap.crud.parser.EdgePayload;
-import org.onap.crud.parser.VertexPayload;
import org.onap.crud.util.CrudProperties;
import org.onap.crud.util.CrudServiceConstants;
import org.onap.crud.util.etag.EtagGenerator;
-import org.onap.schema.validation.OxmModelValidator;
-import org.onap.schema.validation.RelationshipSchemaValidator;
+import org.onap.schema.OxmModelValidator;
+import org.onap.schema.RelationshipSchemaValidator;
public class CrudAsyncGraphDataService extends AbstractGraphDataService {
diff --git a/src/main/java/org/onap/crud/service/CrudGraphDataService.java b/src/main/java/org/onap/crud/service/CrudGraphDataService.java
index ae2d294..034b0bf 100644
--- a/src/main/java/org/onap/crud/service/CrudGraphDataService.java
+++ b/src/main/java/org/onap/crud/service/CrudGraphDataService.java
@@ -31,12 +31,9 @@ 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.validation.OxmModelValidator;
-import org.onap.schema.validation.RelationshipSchemaValidator;
+import org.onap.schema.OxmModelValidator;
+import org.onap.schema.RelationshipSchemaValidator;
public class CrudGraphDataService extends AbstractGraphDataService {
@@ -74,16 +71,8 @@ public class CrudGraphDataService extends AbstractGraphDataService {
@Override
public ImmutablePair<EntityTag, String> addEdge(String version, String type, EdgePayload payload)
throws CrudException {
- // 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, null));
-
- List<Edge> targetVertexEdges =
- EdgePayloadUtil.filterEdgesByRelatedVertexAndType(EdgePayloadUtil.getVertexNodeType(payload.getTarget()), type,
- daoForGet.getVertexEdges(EdgePayloadUtil.getVertexNodeId(payload.getTarget()), null, null));
-
- Edge edge = RelationshipSchemaValidator.validateIncomingAddPayload(version, type, payload, sourceVertexEdges, targetVertexEdges);
+
+ Edge edge = RelationshipSchemaValidator.validateIncomingAddPayload(version, type, payload);
return addEdge(version, edge);
}
@@ -147,19 +136,7 @@ public class CrudGraphDataService extends AbstractGraphDataService {
@Override
public ImmutablePair<EntityTag, String> updateEdge(String version, String id, String type, EdgePayload payload)
throws CrudException {
- 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, null));
-
- List<Edge> targetVertexEdges =
- EdgePayloadUtil.filterEdgesByRelatedVertexAndType(EdgePayloadUtil.getVertexNodeType(payload.getTarget()), type,
- daoForGet.getVertexEdges(EdgePayloadUtil.getVertexNodeId(payload.getTarget()), null, null));
-
- Edge validatedEdge = RelationshipSchemaValidator.validateIncomingUpdatePayload(edge, version, payload, type, sourceVertexEdges, targetVertexEdges);
+ Edge validatedEdge = getValidatedEdge(version, id, type, payload);
return updateEdge(version, validatedEdge);
}
@@ -179,6 +156,11 @@ 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 {
diff --git a/src/main/java/org/onap/crud/service/CrudRestService.java b/src/main/java/org/onap/crud/service/CrudRestService.java
index 025f3d2..734c4d5 100644
--- a/src/main/java/org/onap/crud/service/CrudRestService.java
+++ b/src/main/java/org/onap/crud/service/CrudRestService.java
@@ -56,9 +56,6 @@ import org.onap.aaiauth.auth.Auth;
import org.onap.crud.exception.CrudException;
import org.onap.crud.logging.CrudServiceMsgs;
import org.onap.crud.logging.LoggingUtil;
-import org.onap.crud.parser.BulkPayload;
-import org.onap.crud.parser.EdgePayload;
-import org.onap.crud.parser.VertexPayload;
import org.onap.crud.util.CrudProperties;
import org.onap.crud.util.CrudServiceConstants;
import org.onap.crud.util.CrudServiceUtil;
diff --git a/src/main/java/org/onap/crud/parser/EdgePayload.java b/src/main/java/org/onap/crud/service/EdgePayload.java
index a1499db..a670b54 100644
--- a/src/main/java/org/onap/crud/parser/EdgePayload.java
+++ b/src/main/java/org/onap/crud/service/EdgePayload.java
@@ -18,7 +18,7 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-package org.onap.crud.parser;
+package org.onap.crud.service;
import javax.ws.rs.core.Response.Status;
import org.onap.crud.exception.CrudException;
diff --git a/src/main/java/org/onap/crud/parser/VertexPayload.java b/src/main/java/org/onap/crud/service/VertexPayload.java
index b5ff345..172d03b 100644
--- a/src/main/java/org/onap/crud/parser/VertexPayload.java
+++ b/src/main/java/org/onap/crud/service/VertexPayload.java
@@ -18,7 +18,7 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-package org.onap.crud.parser;
+package org.onap.crud.service;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/org/onap/crud/util/CrudServiceUtil.java b/src/main/java/org/onap/crud/util/CrudServiceUtil.java
index 2441776..64a822c 100644
--- a/src/main/java/org/onap/crud/util/CrudServiceUtil.java
+++ b/src/main/java/org/onap/crud/util/CrudServiceUtil.java
@@ -33,10 +33,10 @@ import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response.Status;
import org.onap.crud.exception.CrudException;
-import org.onap.crud.parser.EdgePayload;
-import org.onap.crud.parser.util.EdgePayloadUtil;
+import org.onap.crud.service.EdgePayload;
import org.onap.schema.EdgeRulesLoader;
import org.onap.schema.RelationshipSchema;
+import org.onap.schema.RelationshipSchemaValidator;
public class CrudServiceUtil {
@@ -138,8 +138,8 @@ public class CrudServiceUtil {
throw new CrudException("Source/Target not specified", Status.BAD_REQUEST);
}
- Set<String> edgeTypes = schema.getValidRelationTypes(EdgePayloadUtil.getVertexNodeType(payload.getSource()),
- EdgePayloadUtil.getVertexNodeType(payload.getTarget()));
+ Set<String> edgeTypes = schema.getValidRelationTypes(RelationshipSchemaValidator.vertexTypeFromUri(payload.getSource()),
+ RelationshipSchemaValidator.vertexTypeFromUri(payload.getTarget()));
if (edgeTypes.size() == 0) {
throw new CrudException("No valid relationship types from " + payload.getSource() + " to " + payload.getTarget(), Status.BAD_REQUEST);
diff --git a/src/main/java/org/onap/schema/validation/OxmModelValidator.java b/src/main/java/org/onap/schema/OxmModelValidator.java
index 9da835e..e691fd7 100644
--- a/src/main/java/org/onap/schema/validation/OxmModelValidator.java
+++ b/src/main/java/org/onap/schema/OxmModelValidator.java
@@ -18,7 +18,7 @@
* limitations under the License.
* ============LICENSE_END=========================================================
*/
-package org.onap.schema.validation;
+package org.onap.schema;
import java.util.HashMap;
import java.util.Map;
@@ -36,7 +36,7 @@ import org.onap.crud.exception.CrudException;
import org.onap.crud.logging.CrudServiceMsgs;
import org.onap.crud.util.CrudServiceConstants;
import org.onap.crud.util.CrudServiceUtil;
-import org.onap.schema.OxmModelLoader;
+
import com.google.common.base.CaseFormat;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
diff --git a/src/main/java/org/onap/schema/RelationshipSchema.java b/src/main/java/org/onap/schema/RelationshipSchema.java
index 0cf419e..47b5b99 100644
--- a/src/main/java/org/onap/schema/RelationshipSchema.java
+++ b/src/main/java/org/onap/schema/RelationshipSchema.java
@@ -36,11 +36,7 @@ import com.google.common.collect.Multimap;
public class RelationshipSchema {
- public static final String SCHEMA_SOURCE_NODE_TYPE = "from";
- public static final String SCHEMA_TARGET_NODE_TYPE = "to";
public static final String SCHEMA_RELATIONSHIP_TYPE = "label";
- public static final String SCHEMA_MULTIPLICITY_TYPE = "multiplicity";
- public static final String SCHEMA_RULES_ARRAY = "rules";
private Map<String, Map<String, Class<?>>> relations = new HashMap<>();
/**
@@ -48,8 +44,6 @@ public class RelationshipSchema {
*/
private Map<String, Map<String, Class<?>>> relationTypes = new HashMap<>();
- private Map<String, EdgeRule> relationshipRules = new HashMap<>();
-
// A map storing the list of valid edge types for a source/target pair
private Map<String, Set<String>> edgeTypesForNodePair = new HashMap<>();
@@ -60,8 +54,6 @@ public class RelationshipSchema {
// hold the true values of the edge rules by key - convert to java 8
for (EdgeRule rule : rules.values()) {
- String key = buildRelation(rule.getFrom(), rule.getTo(), rule.getLabel());
- relationshipRules.put(key, rule);
String nodePairKey = buildNodePairKey(rule.getFrom(), rule.getTo());
if (edgeTypesForNodePair.get(nodePairKey) == null) {
@@ -93,27 +85,6 @@ public class RelationshipSchema {
return this.relations.get(key);
}
- /**
- * Extract the multiplicity type from the Edge rules
- *
- * @param key
- * @return
- * @throws CrudException
- */
- public String lookupRelationMultiplicity(String key) throws CrudException {
- EdgeRule edgeRule = relationshipRules.get(key);
-
- if (edgeRule == null) {
- throw new CrudException("Invalid source/target/relationship type: " + key, Status.BAD_REQUEST);
- }
-
- if (edgeRule.getMultiplicityRule() != null) {
- return edgeRule.getMultiplicityRule().toString();
- }
-
- return null;
- }
-
public Map<String, Class<?>> lookupRelationType(String type) {
return this.relationTypes.get(type);
}
diff --git a/src/main/java/org/onap/schema/RelationshipSchemaValidator.java b/src/main/java/org/onap/schema/RelationshipSchemaValidator.java
new file mode 100644
index 0000000..4f24071
--- /dev/null
+++ b/src/main/java/org/onap/schema/RelationshipSchemaValidator.java
@@ -0,0 +1,325 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017-2018 Amdocs
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.schema;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.ws.rs.core.Response.Status;
+
+import org.onap.crud.entity.Edge;
+import org.onap.crud.entity.Vertex;
+import org.onap.crud.exception.CrudException;
+import org.onap.crud.service.EdgePayload;
+import org.onap.crud.util.CrudServiceUtil;
+import org.onap.schema.OxmModelValidator.Metadata;
+import org.radeox.util.logging.Logger;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonNull;
+
+public class RelationshipSchemaValidator {
+
+ public static final String SOURCE_NODE = "source";
+ public static final String TARGET_NODE = "target";
+
+ final static Pattern urlPattern = Pattern.compile("services/inventory/(.*)/(.*)/(.*)");
+
+ public static Map<String, Object> resolveCollectionfilter(String version, String type,Map<String, String> filter) throws CrudException {
+ RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
+ if (schema == null) {
+ throw new CrudException("", Status.NOT_FOUND);
+ }
+
+ Map<String, Class<?>> props = schema.lookupRelationType(type);
+ Map<String, Object> result = new HashMap<String, Object>();
+
+ for (String key : filter.keySet()) {
+
+ if (props.containsKey(key)) {
+ try {
+ Object value = CrudServiceUtil.validateFieldType(filter.get(key), props.get(key));
+ result.put(key, value);
+ } catch (Exception ex) {
+ // Skip any exceptions thrown while validating the filter key value
+ continue;
+ }
+ }
+ }
+ return result;
+ }
+
+ public static void validateType(String version, String type) throws CrudException {
+ RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
+ if (!schema.isValidType(type)) {
+ throw new CrudException("Invalid " + RelationshipSchema.SCHEMA_RELATIONSHIP_TYPE
+ + ": " + type,
+ Status.BAD_REQUEST);
+ }
+
+ }
+
+ public static Edge validateIncomingAddPayload(String version, String type, Vertex sourceNode, Vertex targetNode, JsonElement properties) throws CrudException {
+ EdgePayload payload = new EdgePayload();
+ payload.setSource("services/inventory/" + version + "/" + sourceNode.getType() + "/" + sourceNode.getId().get());
+ payload.setTarget("services/inventory/" + version + "/" + targetNode.getType() + "/" + targetNode.getId().get());
+ payload.setType(type);
+ payload.setProperties(properties);
+
+ return validateIncomingAddPayload(version, type, payload);
+ }
+
+ public static Edge validateIncomingAddPayload(String version, String type, EdgePayload payload)
+ throws CrudException {
+ RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
+
+ try {
+ if (payload.getSource() == null || payload.getTarget() == null) {
+ throw new CrudException("Source/Target not specified", Status.BAD_REQUEST);
+ }
+
+ Matcher sourceMatcher = urlPattern.matcher(payload.getSource());
+ Matcher targetMatcher = urlPattern.matcher(payload.getTarget());
+
+ if (!sourceMatcher.matches() || !targetMatcher.matches()) {
+ throw new CrudException("Invalid Source/Target Urls", Status.BAD_REQUEST);
+ }
+
+ // create key based on source:target:relationshipType
+ String sourceNodeType = sourceMatcher.group(2);
+ String targetNodeType = targetMatcher.group(2);
+
+ String sourceNodeId = sourceMatcher.group(3);
+ String targetNodeId = targetMatcher.group(3);
+
+ String key = sourceNodeType + ":" + targetNodeType + ":" + type;
+
+ // find the validate the key from the schema
+ Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
+
+ if (schemaObject == null) {
+ throw new CrudException("Invalid source/target/relationship type: " + key, Status.BAD_REQUEST);
+ }
+
+ Edge.Builder modelEdgeBuilder = new Edge.Builder(type);
+
+ modelEdgeBuilder.source(new Vertex.Builder(sourceNodeType).id(sourceNodeId).build());
+ modelEdgeBuilder.target(new Vertex.Builder(targetNodeType).id(targetNodeId).build());
+
+ // validate it properties
+ validateEdgeProps(modelEdgeBuilder, payload.getProperties(), schemaObject);
+
+ return modelEdgeBuilder.build();
+ } catch (Exception ex) {
+ throw new CrudException(ex.getMessage(), Status.BAD_REQUEST);
+ }
+ }
+
+ public static Edge validateIncomingPatchPayload(Edge edge, String version, EdgePayload payload)
+ throws CrudException {
+ RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
+
+ try {
+ if (payload.getSource() != null) {
+ Matcher sourceMatcher = urlPattern.matcher(payload.getSource());
+
+ if (!sourceMatcher.matches()) {
+ throw new CrudException("Invalid Source Urls", Status.BAD_REQUEST);
+ }
+ String sourceNodeId = sourceMatcher.group(3);
+ if (!sourceNodeId.equals(edge.getSource().getId().get())) {
+ throw new CrudException("Source can't be updated", Status.BAD_REQUEST);
+ }
+ }
+
+ if (payload.getTarget() != null) {
+ Matcher targetMatcher = urlPattern.matcher(payload.getTarget());
+
+ if (!targetMatcher.matches()) {
+ throw new CrudException("Invalid Target Urls", Status.BAD_REQUEST);
+ }
+ String sourceNodeId = targetMatcher.group(3);
+ if (!sourceNodeId.equals(edge.getTarget().getId().get())) {
+ throw new CrudException("Target can't be updated", Status.BAD_REQUEST);
+ }
+ }
+
+ // Remove the timestamp properties from the existing edge, as these should be managed by Champ.
+ Map<String,Object> existingProps = edge.getProperties();
+
+ if (existingProps.containsKey(Metadata.CREATED_TS.propertyName())) {
+ existingProps.remove(Metadata.CREATED_TS.propertyName());
+ }
+ if (existingProps.containsKey(Metadata.UPDATED_TS.propertyName())) {
+ existingProps.remove(Metadata.UPDATED_TS.propertyName());
+ }
+
+ // create key based on source:target:relationshipType
+ String key = edge.getSource().getType() + ":" + edge.getTarget().getType()
+ + ":" + edge.getType();
+
+ // find the validate the key from the schema
+ Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
+
+ if (schemaObject == null) {
+ Logger.warn("key :" + key
+ + " not found in relationship schema . Skipping the schema validation");
+ return edge;
+ }
+
+ Set<Map.Entry<String, JsonElement>> entries = payload.getProperties().getAsJsonObject().entrySet();
+
+ for (Map.Entry<String, JsonElement> entry : entries) {
+ if (!schemaObject.containsKey(entry.getKey())) {
+ throw new CrudException("Invalid property: " + entry.getKey(), Status.BAD_REQUEST);
+ } else if (entry.getValue() instanceof JsonNull && edge.getProperties().containsKey(entry.getKey())) {
+ edge.getProperties().remove(entry.getKey());
+ } else if (!(entry.getValue() instanceof JsonNull)) {
+ Object value = CrudServiceUtil.validateFieldType(entry.getValue().getAsString(), schemaObject.get(entry.getKey()));
+ edge.getProperties().put(entry.getKey(), value);
+ }
+ }
+
+ return edge;
+ } catch (Exception ex) {
+ throw new CrudException(ex.getMessage(), Status.BAD_REQUEST);
+ }
+ }
+
+
+ public static Edge validateIncomingUpdatePayload(Edge edge, String version, Vertex sourceNode, Vertex targetNode, JsonElement properties)
+ throws CrudException {
+ EdgePayload payload = new EdgePayload();
+ payload.setSource("services/inventory/" + version + "/" + sourceNode.getType() + "/" + sourceNode.getId().get());
+ payload.setTarget("services/inventory/" + version + "/" + targetNode.getType() + "/" + targetNode.getId().get());
+ payload.setType(edge.getType());
+ payload.setProperties(properties);
+ return validateIncomingUpdatePayload(edge, version, payload);
+ }
+
+ public static Edge validateIncomingUpdatePayload(Edge edge, String version, EdgePayload payload)
+ throws CrudException {
+ RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
+
+ try {
+ if (payload.getSource() != null) {
+ Matcher sourceMatcher = urlPattern.matcher(payload.getSource());
+
+ if (!sourceMatcher.matches()) {
+ throw new CrudException("Invalid Source Urls", Status.BAD_REQUEST);
+ }
+ String sourceNodeId = sourceMatcher.group(3);
+ if (!sourceNodeId.equals(edge.getSource().getId().get())) {
+ throw new CrudException("Source can't be updated", Status.BAD_REQUEST);
+ }
+ }
+
+ if (payload.getTarget() != null) {
+ Matcher targetMatcher = urlPattern.matcher(payload.getTarget());
+
+ if (!targetMatcher.matches()) {
+ throw new CrudException("Invalid Target Urls", Status.BAD_REQUEST);
+ }
+ String sourceNodeId = targetMatcher.group(3);
+ if (!sourceNodeId.equals(edge.getTarget().getId().get())) {
+ throw new CrudException("Target can't be updated", Status.BAD_REQUEST);
+ }
+ }
+
+ // create key based on source:target:relationshipType
+ String key = edge.getSource().getType() + ":" + edge.getTarget().getType()
+ + ":" + edge.getType();
+
+ // find the validate the key from the schema
+ Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
+
+ if (schemaObject == null) {
+ Logger.warn("key :" + key
+ + " not found in relationship schema . Skipping the schema validation");
+ return edge;
+ }
+
+ Edge.Builder updatedEdgeBuilder = new Edge.Builder(edge.getType()).id(edge.getId().get());
+
+ updatedEdgeBuilder.source(new Vertex.Builder(edge.getSource().getType()).id(edge.getSource().getId().get()).build());
+ updatedEdgeBuilder.target(new Vertex.Builder(edge.getTarget().getType()).id(edge.getTarget().getId().get()).build());
+
+ validateEdgeProps(updatedEdgeBuilder, payload.getProperties(), schemaObject);
+
+ return updatedEdgeBuilder.build();
+ } catch (Exception ex) {
+ throw new CrudException(ex.getMessage(), Status.BAD_REQUEST);
+ }
+ }
+
+
+ private static void validateEdgeProps(Edge.Builder builder, JsonElement props, Map<String, Class<?>> schemaObject) throws CrudException {
+ Set<Map.Entry<String, JsonElement>> entries = props.getAsJsonObject().entrySet();
+
+ for (Map.Entry<String, JsonElement> entry : entries) {
+ if (!schemaObject.containsKey(entry.getKey())) {
+ throw new CrudException("Invalid property: " + entry.getKey(), Status.BAD_REQUEST);
+ } else {
+ Object value = CrudServiceUtil.validateFieldType(entry.getValue().getAsString(),
+ schemaObject.get(entry.getKey()));
+ builder.property(entry.getKey(), value);
+ }
+ }
+ }
+
+ public static Edge validateOutgoingPayload(String version, Edge edge) throws CrudException {
+ Edge.Builder modelEdgeBuilder = new Edge.Builder(edge.getType()).id(edge.getId()
+ .get()).source(edge.getSource())
+ .target(edge.getTarget());
+
+ RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
+
+ String key = edge.getSource().getType() + ":" + edge.getTarget().getType()
+ + ":" + edge.getType();
+ Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
+
+ if (schemaObject == null || schemaObject.isEmpty()) {
+ return edge;
+ }
+
+ for (String prop : edge.getProperties().keySet()) {
+ if (schemaObject.containsKey(prop)) {
+ modelEdgeBuilder.property(prop, edge.getProperties().get(prop));
+ }
+
+ }
+ return modelEdgeBuilder.build();
+ }
+
+ public static String vertexTypeFromUri(String uri) throws CrudException {
+
+ Matcher matcher = urlPattern.matcher(uri);
+
+ if (!matcher.matches()) {
+ throw new CrudException("Invalid Source/Target Urls", Status.BAD_REQUEST);
+ }
+
+ return matcher.group(2);
+ }
+}
diff --git a/src/main/java/org/onap/schema/validation/MultiplicityValidator.java b/src/main/java/org/onap/schema/validation/MultiplicityValidator.java
deleted file mode 100644
index 1c1075c..0000000
--- a/src/main/java/org/onap/schema/validation/MultiplicityValidator.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 Amdocs
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.onap.schema.validation;
-
-import java.util.List;
-import javax.ws.rs.core.Response.Status;
-import org.onap.crud.entity.Edge;
-import org.onap.crud.exception.CrudException;
-import org.onap.crud.parser.EdgePayload;
-import org.onap.crud.parser.util.EdgePayloadUtil;
-import org.onap.schema.EdgeRulesLoader;
-import org.onap.schema.RelationshipSchema;
-
-/**
- * Validator to enforce multiplicity rules on the creation of a new Edge
- *
- */
-public class MultiplicityValidator {
-
- public enum MultiplicityType {
- MANY2ONE("Many2One"), MANY2MANY("Many2Many"), ONE2MANY("One2Many"), ONE2ONE("One2One");
-
- private final String value;
-
- MultiplicityType(String value) {
- this.value = value;
- }
-
- public String getValue() {
- return value;
- }
- }
-
- /**
- * Validates the Edge payload's source and target vertices against multiplicity rule
- *
- * @param payload
- * @param edgesForSourceVertex
- * @param edgesForTargetVertex
- * @param type
- * @param version
- * @throws CrudException
- */
- public static void validatePayloadMultiplicity(EdgePayload payload, List<Edge> edgesForSourceVertex,
- List<Edge> edgesForTargetVertex, String type, String version)
- throws CrudException {
- RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
- // find the validate the key from the schema
- String key = EdgePayloadUtil.generateEdgeKey(payload.getSource(), payload.getTarget(), type);
-
- // get the multiplicity rule for the relationships
- String multiplicityTypeValue = schema.lookupRelationMultiplicity(key);
- if (multiplicityTypeValue != null) {
- MultiplicityType multiplicityType = MultiplicityType.valueOf(multiplicityTypeValue.toUpperCase());
-
- boolean isVertexValidForMultiplicityType =
- isVertexValidForMultiplicityType(edgesForSourceVertex, edgesForTargetVertex, multiplicityType);
-
- if (!isVertexValidForMultiplicityType) {
- throw new CrudException(
- multiplicityType.toString() + " multiplicity rule broken for Edge:" + key,
- Status.BAD_REQUEST);
- }
- }
- }
-
- /**
- * Compare vertex existing relationships to ensure its not in breach of multiplicity rules
- *
- * @param edgesForVertex
- * @param multiplicityType
- * @return
- */
- public static Boolean isVertexValidForMultiplicityType(List<Edge> edgesForSourceVertex,
- List<Edge> edgesForTargetVertex,
- MultiplicityType multiplicityType) {
-
- switch (multiplicityType) {
- case MANY2MANY:
- return true;
- case MANY2ONE:
- if (edgesForSourceVertex != null && !edgesForSourceVertex.isEmpty()) {
- return false;
- }
- break;
- case ONE2MANY:
- if (edgesForTargetVertex != null && !edgesForTargetVertex.isEmpty()) {
- return false;
- }
- break;
- case ONE2ONE:
- if ((edgesForSourceVertex != null && !edgesForSourceVertex.isEmpty())
- || (edgesForTargetVertex != null && !edgesForTargetVertex.isEmpty())) {
- return false;
- }
- break;
- }
- return true;
- }
-
-} \ No newline at end of file
diff --git a/src/main/java/org/onap/schema/validation/RelationshipSchemaValidator.java b/src/main/java/org/onap/schema/validation/RelationshipSchemaValidator.java
deleted file mode 100644
index f2717d5..0000000
--- a/src/main/java/org/onap/schema/validation/RelationshipSchemaValidator.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 Amdocs
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.onap.schema.validation;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import javax.ws.rs.core.Response.Status;
-import org.onap.crud.entity.Edge;
-import org.onap.crud.entity.Vertex;
-import org.onap.crud.exception.CrudException;
-import org.onap.crud.parser.EdgePayload;
-import org.onap.crud.parser.util.EdgePayloadUtil;
-import org.onap.crud.util.CrudServiceUtil;
-import org.onap.schema.EdgeRulesLoader;
-import org.onap.schema.RelationshipSchema;
-import org.onap.schema.validation.OxmModelValidator.Metadata;
-import org.radeox.util.logging.Logger;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonNull;
-
-public class RelationshipSchemaValidator {
-
- private static final String SOURCE_LABEL = "Source";
- private static final String TARGET_LABEL = "Target";
-
- public static Map<String, Object> resolveCollectionfilter(String version, String type, Map<String, String> filter) throws CrudException {
- RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
- if (schema == null) {
- throw new CrudException("", Status.NOT_FOUND);
- }
-
- Map<String, Class<?>> props = schema.lookupRelationType(type);
- Map<String, Object> result = new HashMap<String, Object>();
-
- for (String key : filter.keySet()) {
-
- if (props.containsKey(key)) {
- try {
- Object value = CrudServiceUtil.validateFieldType(filter.get(key), props.get(key));
- result.put(key, value);
- } catch (Exception ex) {
- // Skip any exceptions thrown while validating the filter key value
- continue;
- }
- }
- }
- return result;
- }
-
- public static void validateType(String version, String type) throws CrudException {
- RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
- if (!schema.isValidType(type)) {
- throw new CrudException("Invalid " + RelationshipSchema.SCHEMA_RELATIONSHIP_TYPE
- + ": " + type,
- Status.BAD_REQUEST);
- }
-
- }
-
- public static Edge validateIncomingAddPayload(String version, String type, EdgePayload payload,
- List<Edge> sourceVertexEdges, List<Edge> targetVertexEdges) throws CrudException {
-
- //perform standard validation
- Edge edge = validateIncomingAddPayload(version, type, payload);
-
- // validate payload using multiplicity edge rules
- MultiplicityValidator.validatePayloadMultiplicity(payload, sourceVertexEdges, targetVertexEdges, type, version);
-
- return edge;
- }
-
- public static Edge validateIncomingAddPayload(String version, String type, EdgePayload payload)
- throws CrudException {
- RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
-
- try {
- if (payload.getSource() == null || payload.getTarget() == null) {
- throw new CrudException("Source/Target not specified", Status.BAD_REQUEST);
- }
-
- String key = EdgePayloadUtil.generateEdgeKey(payload.getSource(), payload.getTarget(), type);
-
- // find the validate the key from the schema
- Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
-
- if (schemaObject == null) {
- throw new CrudException("Invalid source/target/relationship type: " + key, Status.BAD_REQUEST);
- }
-
- Edge.Builder modelEdgeBuilder = EdgePayloadUtil.getBuilderFromEdgePayload(payload.getSource(), payload.getTarget(), type);
-
- // validate it properties
- validateEdgeProps(modelEdgeBuilder, payload.getProperties(), schemaObject);
-
- return modelEdgeBuilder.build();
- } catch (Exception ex) {
- throw new CrudException(ex.getMessage(), Status.BAD_REQUEST);
- }
- }
-
- public static Edge validateIncomingPatchPayload(Edge edge, String version, EdgePayload payload)
- throws CrudException {
- RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
-
- try {
- validateEdgeVertexMatchesPayload(edge.getSource(), payload.getSource(), SOURCE_LABEL);
- validateEdgeVertexMatchesPayload(edge.getTarget(), payload.getTarget(), TARGET_LABEL);
-
- // Remove the timestamp properties from the existing edge, as these should be managed by Champ.
- Map<String,Object> existingProps = edge.getProperties();
-
- if (existingProps.containsKey(Metadata.CREATED_TS.propertyName())) {
- existingProps.remove(Metadata.CREATED_TS.propertyName());
- }
- if (existingProps.containsKey(Metadata.UPDATED_TS.propertyName())) {
- existingProps.remove(Metadata.UPDATED_TS.propertyName());
- }
-
- // create key based on source:target:relationshipType
- String key = edge.getSource().getType() + ":" + edge.getTarget().getType()
- + ":" + edge.getType();
-
- // find the validate the key from the schema
- Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
-
- if (schemaObject == null) {
- Logger.warn("key :" + key
- + " not found in relationship schema . Skipping the schema validation");
- return edge;
- }
-
- validateEdgePropertiesFromPayload(edge, payload, schemaObject);
-
- return edge;
- } catch (Exception ex) {
- throw new CrudException(ex.getMessage(), Status.BAD_REQUEST);
- }
- }
-
- private static void validateEdgePropertiesFromPayload(Edge edge, EdgePayload payload, Map<String, Class<?>> schemaObject) throws CrudException {
- Set<Map.Entry<String, JsonElement>> entries = payload.getProperties().getAsJsonObject().entrySet();
- for (Map.Entry<String, JsonElement> entry : entries) {
-
- if (!schemaObject.containsKey(entry.getKey())) {
- throw new CrudException("Invalid property: " + entry.getKey(), Status.BAD_REQUEST);
- } else if (entry.getValue() instanceof JsonNull && edge.getProperties().containsKey(entry.getKey())) {
- edge.getProperties().remove(entry.getKey());
- } else if (!(entry.getValue() instanceof JsonNull)) {
- Object value = CrudServiceUtil.validateFieldType(entry.getValue().getAsString(), schemaObject.get(entry.getKey()));
- edge.getProperties().put(entry.getKey(), value);
- }
- }
- }
-
-
- public static Edge validateIncomingUpdatePayload(Edge edge, String version, EdgePayload payload, String type,
- List<Edge> sourceVertexEdges, List<Edge> targetVertexEdges) throws CrudException {
-
- //perform standard validation
- Edge validatedEdge = validateIncomingUpdatePayload(edge, version, payload);
-
- // validate payload using multiplicity edge rules
- MultiplicityValidator.validatePayloadMultiplicity(payload, sourceVertexEdges, targetVertexEdges, type, version);
-
- return validatedEdge;
- }
-
- public static Edge validateIncomingUpdatePayload(Edge edge, String version, EdgePayload payload)
- throws CrudException {
- RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
-
- try {
- validateEdgeVertexMatchesPayload(edge.getSource(), payload.getSource(), SOURCE_LABEL);
- validateEdgeVertexMatchesPayload(edge.getTarget(), payload.getTarget(), TARGET_LABEL);
-
- // create key based on source:target:relationshipType
- String key = edge.getSource().getType() + ":" + edge.getTarget().getType()
- + ":" + edge.getType();
-
- // find the validate the key from the schema
- Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
-
- if (schemaObject == null) {
- Logger.warn("key :" + key
- + " not found in relationship schema . Skipping the schema validation");
- return edge;
- }
-
- Edge.Builder updatedEdgeBuilder = EdgePayloadUtil.getBuilderFromEdge(edge);
-
- validateEdgeProps(updatedEdgeBuilder, payload.getProperties(), schemaObject);
-
- return updatedEdgeBuilder.build();
- } catch (Exception ex) {
- throw new CrudException(ex.getMessage(), Status.BAD_REQUEST);
- }
- }
-
- private static void validateEdgeVertexMatchesPayload(Vertex edgeVertex, String payloadVertex, String vertexTypeLabel) throws CrudException {
- if (payloadVertex != null) {
- String sourceNodeId = EdgePayloadUtil.getVertexNodeId(payloadVertex);
- if (!sourceNodeId.equals(edgeVertex.getId().get())) {
- throw new CrudException(vertexTypeLabel + " can't be updated", Status.BAD_REQUEST);
- }
- }
- }
-
- private static void validateEdgeProps(Edge.Builder builder, JsonElement props, Map<String, Class<?>> schemaObject) throws CrudException {
- Set<Map.Entry<String, JsonElement>> entries = props.getAsJsonObject().entrySet();
-
- for (Map.Entry<String, JsonElement> entry : entries) {
- if (!schemaObject.containsKey(entry.getKey())) {
- throw new CrudException("Invalid property: " + entry.getKey(), Status.BAD_REQUEST);
- } else {
- Object value = CrudServiceUtil.validateFieldType(entry.getValue().getAsString(),
- schemaObject.get(entry.getKey()));
- builder.property(entry.getKey(), value);
- }
- }
- }
-
- public static Edge validateOutgoingPayload(String version, Edge edge) throws CrudException {
- Edge.Builder modelEdgeBuilder = new Edge.Builder(edge.getType()).id(edge.getId()
- .get()).source(edge.getSource())
- .target(edge.getTarget());
-
- RelationshipSchema schema = EdgeRulesLoader.getSchemaForVersion(version);
-
- String key = edge.getSource().getType() + ":" + edge.getTarget().getType()
- + ":" + edge.getType();
- Map<String, Class<?>> schemaObject = schema.lookupRelation(key);
-
- if (schemaObject == null || schemaObject.isEmpty()) {
- return edge;
- }
-
- for (String prop : edge.getProperties().keySet()) {
- if (schemaObject.containsKey(prop)) {
- modelEdgeBuilder.property(prop, edge.getProperties().get(prop));
- }
-
- }
- return modelEdgeBuilder.build();
- }
-}
diff --git a/src/test/java/org/onap/crud/parser/util/EdgePayloadUtilTest.java b/src/test/java/org/onap/crud/parser/util/EdgePayloadUtilTest.java
deleted file mode 100644
index f5baae8..0000000
--- a/src/test/java/org/onap/crud/parser/util/EdgePayloadUtilTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 Amdocs
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.onap.crud.parser.util;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Assert;
-import org.junit.Test;
-import org.onap.crud.entity.Edge;
-import org.onap.crud.entity.Vertex;
-import org.onap.crud.exception.CrudException;
-
-public class EdgePayloadUtilTest {
-
- @Test
- public void testGetVertexNodeType() throws CrudException {
- Assert.assertEquals("vserver", EdgePayloadUtil
- .getVertexNodeType("services/inventory/v12/vserver/50bdab41-ad1c-4d00-952c-a0aa5d827811"));
- }
-
- @Test
- public void testGetVertexNodeId() throws CrudException {
- Assert.assertEquals("50bdab41-ad1c-4d00-952c-a0aa5d827811",
- EdgePayloadUtil.getVertexNodeId("services/inventory/v12/vserver/50bdab41-ad1c-4d00-952c-a0aa5d827811"));
- }
-
- @Test
- public void testGenerateEdgeKey() throws CrudException {
- Assert.assertEquals("vserver:pserver:tosca.relationships.HostedOn",
- EdgePayloadUtil.generateEdgeKey("services/inventory/v12/vserver/50bdab41-ad1c-4d00-952c-a0aa5d827811",
- "services/inventory/v12/pserver/1d326bc7-b985-492b-9604-0d5d1f06f908",
- "tosca.relationships.HostedOn"));
- }
-
- @Test
- public void testKeyGenerationEnforcesSourceAndTargetOrder() throws Exception {
- String generateEdgeKey1 = EdgePayloadUtil.generateEdgeKey(
- "services/inventory/v12/vserver/50bdab41-ad1c-4d00-952c-a0aa5d827811",
- "services/inventory/v12/pserver/1d326bc7-b985-492b-9604-0d5d1f06f908", "tosca.relationships.HostedOn");
-
- String generateEdgeKey2 = EdgePayloadUtil.generateEdgeKey(
- "services/inventory/v12/pserver/1d326bc7-b985-492b-9604-0d5d1f06f908",
- "services/inventory/v12/vserver/50bdab41-ad1c-4d00-952c-a0aa5d827811", "tosca.relationships.HostedOn");
-
- Assert.assertNotEquals(generateEdgeKey1, generateEdgeKey2);
- }
-
-
- @Test
- public void testGetBuilderFromEdgePayload() throws CrudException {
- Edge.Builder builder = EdgePayloadUtil.getBuilderFromEdgePayload(
- "services/inventory/v12/vserver/50bdab41-ad1c-4d00-952c-a0aa5d827811",
- "services/inventory/v12/pserver/1d326bc7-b985-492b-9604-0d5d1f06f908", "tosca.relationships.HostedOn");
-
- Edge edge = builder.build();
- Assert.assertEquals("tosca.relationships.HostedOn", edge.getType());
- Assert.assertEquals("vserver", edge.getSource().getType());
- Assert.assertEquals("50bdab41-ad1c-4d00-952c-a0aa5d827811", edge.getSource().getId().get());
- Assert.assertEquals("pserver", edge.getTarget().getType());
- Assert.assertEquals("1d326bc7-b985-492b-9604-0d5d1f06f908", edge.getTarget().getId().get());
- }
-
- @Test
- public void tesGetBuilderFromEdge() throws CrudException {
- Edge edge = createEdge("vserver", "pserver");
-
- Assert.assertNotNull(edge);
- Assert.assertNotNull(EdgePayloadUtil.getBuilderFromEdge(edge));
- }
-
- @Test
- public void testFilterEdgesByRelatedVertexAndType() throws CrudException {
- List<Edge> edges = new ArrayList<>();
- edges.add(createEdge("vserver", "pserver"));
- edges.add(createEdge("vce", "pserver"));
- edges.add(createEdge("snapshot", "pserver"));
- edges.add(createEdge("vserver", "pserver"));
-
- List<Edge> filteredEdges =
- EdgePayloadUtil.filterEdgesByRelatedVertexAndType("vserver", "tosca.relationships.HostedOn", edges);
-
- Assert.assertNotNull(filteredEdges);
- Assert.assertEquals(2, filteredEdges.size());
- }
-
- private Edge createEdge(String sourceVertexType, String targetVertexType) {
- return new Edge.Builder("tosca.relationships.HostedOn").id("test")
- .source(new Vertex.Builder(sourceVertexType).id("50bdab41-ad1c-4d00-952c-a0aa5d827811").build())
- .target(new Vertex.Builder(targetVertexType).id("1d326bc7-b985-492b-9604-0d5d1f06f908").build())
- .build();
- }
-}
diff --git a/src/test/java/org/onap/crud/service/BulkPayloadTest.java b/src/test/java/org/onap/crud/service/BulkPayloadTest.java
index 7a409ec..938e668 100644
--- a/src/test/java/org/onap/crud/service/BulkPayloadTest.java
+++ b/src/test/java/org/onap/crud/service/BulkPayloadTest.java
@@ -29,7 +29,7 @@ import java.util.Set;
import javax.ws.rs.core.Response.Status;
import org.junit.Test;
import org.onap.crud.exception.CrudException;
-import org.onap.crud.parser.BulkPayload;
+
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
diff --git a/src/test/java/org/onap/crud/service/CrudRestServiceTest.java b/src/test/java/org/onap/crud/service/CrudRestServiceTest.java
index c2106ed..04340a6 100644
--- a/src/test/java/org/onap/crud/service/CrudRestServiceTest.java
+++ b/src/test/java/org/onap/crud/service/CrudRestServiceTest.java
@@ -160,27 +160,6 @@ public class CrudRestServiceTest extends OXMModelLoaderSetup{
}
@Test
- public void testAddEdgeMultiplicityRules() throws CrudException {
- Response response;
-
- response = mockService.addEdge(postEdgePayload, "v10", "services/inventory/v10",
- new TestHeaders(), null, new TestRequest());
- Assert.assertEquals("MANY2ONE multiplicity rule broken for Edge:vserver:pserver:tosca.relationships.HostedOn",
- response.getEntity().toString());
- Assert.assertEquals(400, response.getStatus());
-
- response = mockService.addEdge(postEdgePayload, "v9", "tosca.relationships.HostedOn", "services/inventory/v9",
- new TestHeaders(), null, new TestRequest());
- Assert.assertEquals(201, response.getStatus());
-
- response = mockService.addEdge(postEdgePayload, "v8", "tosca.relationships.HostedOn", "services/inventory/v8",
- new TestHeaders(), null, new TestRequest());
- Assert.assertEquals("ONE2MANY multiplicity rule broken for Edge:vserver:pserver:tosca.relationships.HostedOn",
- response.getEntity().toString());
- Assert.assertEquals(400, response.getStatus());
- }
-
- @Test
public void testUpdateVertex() throws CrudException {
Response response;
diff --git a/src/test/java/org/onap/crud/service/VertexPayloadTest.java b/src/test/java/org/onap/crud/service/VertexPayloadTest.java
index df0656f..ba67213 100644
--- a/src/test/java/org/onap/crud/service/VertexPayloadTest.java
+++ b/src/test/java/org/onap/crud/service/VertexPayloadTest.java
@@ -25,7 +25,6 @@ import static org.junit.Assert.assertThat;
import javax.ws.rs.core.Response.Status;
import org.junit.Test;
import org.onap.crud.exception.CrudException;
-import org.onap.crud.parser.VertexPayload;
public class VertexPayloadTest {
diff --git a/src/test/java/org/onap/crud/util/CrudServiceUtilTest.java b/src/test/java/org/onap/crud/util/CrudServiceUtilTest.java
index 37cdeec..872586e 100644
--- a/src/test/java/org/onap/crud/util/CrudServiceUtilTest.java
+++ b/src/test/java/org/onap/crud/util/CrudServiceUtilTest.java
@@ -22,7 +22,7 @@ package org.onap.crud.util;
import org.junit.Assert;
import org.junit.Test;
-import org.onap.crud.parser.VertexPayload;
+import org.onap.crud.service.VertexPayload;
import org.onap.crud.service.util.TestHeaders;
import com.google.gson.JsonElement;
diff --git a/src/test/java/org/onap/schema/EdgeRulesLoaderTest.java b/src/test/java/org/onap/schema/EdgeRulesLoaderTest.java
index 8f82c58..2ad9456 100644
--- a/src/test/java/org/onap/schema/EdgeRulesLoaderTest.java
+++ b/src/test/java/org/onap/schema/EdgeRulesLoaderTest.java
@@ -29,7 +29,7 @@ import java.util.Set;
import org.junit.Test;
import org.onap.crud.exception.CrudException;
-import org.onap.crud.parser.EdgePayload;
+import org.onap.crud.service.EdgePayload;
import org.onap.crud.util.CrudServiceUtil;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
diff --git a/src/test/java/org/onap/schema/RelationshipSchemaValidatorTest.java b/src/test/java/org/onap/schema/RelationshipSchemaValidatorTest.java
index 7cc2e7f..11d42bf 100644
--- a/src/test/java/org/onap/schema/RelationshipSchemaValidatorTest.java
+++ b/src/test/java/org/onap/schema/RelationshipSchemaValidatorTest.java
@@ -27,9 +27,7 @@ import org.junit.Before;
import org.junit.Test;
import org.onap.crud.entity.Edge;
import org.onap.crud.exception.CrudException;
-import org.onap.crud.parser.EdgePayload;
-import org.onap.schema.validation.RelationshipSchemaValidator;
-
+import org.onap.crud.service.EdgePayload;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.onap.crud.OXMModelLoaderSetup;
@@ -78,7 +76,7 @@ public class RelationshipSchemaValidatorTest extends OXMModelLoaderSetup{
RelationshipSchemaValidator.validateIncomingUpdatePayload(edge, version, payload);
} catch (CrudException e) {
assertEquals(400, e.getHttpStatus().getStatusCode());
- assertThat(e.getMessage(), is("Invalid Source/Target Urls"));
+ assertThat(e.getMessage(), is("Invalid Source Urls"));
}
}
@@ -120,7 +118,7 @@ public class RelationshipSchemaValidatorTest extends OXMModelLoaderSetup{
RelationshipSchemaValidator.validateIncomingUpdatePayload(edge, version, payload);
} catch (CrudException e) {
assertEquals(400, e.getHttpStatus().getStatusCode());
- assertThat(e.getMessage(), is("Invalid Source/Target Urls"));
+ assertThat(e.getMessage(), is("Invalid Target Urls"));
}
}
@@ -191,7 +189,7 @@ public class RelationshipSchemaValidatorTest extends OXMModelLoaderSetup{
RelationshipSchemaValidator.validateIncomingPatchPayload(edge, version, payload);
} catch (CrudException e) {
assertEquals(400, e.getHttpStatus().getStatusCode());
- assertThat(e.getMessage(), is("Invalid Source/Target Urls"));
+ assertThat(e.getMessage(), is("Invalid Source Urls"));
}
}
@@ -234,7 +232,7 @@ public class RelationshipSchemaValidatorTest extends OXMModelLoaderSetup{
RelationshipSchemaValidator.validateIncomingPatchPayload(edge, version, payload);
} catch (CrudException e) {
assertEquals(400, e.getHttpStatus().getStatusCode());
- assertThat(e.getMessage(), is("Invalid Source/Target Urls"));
+ assertThat(e.getMessage(), is("Invalid Target Urls"));
}
}
diff --git a/src/test/java/org/onap/schema/validation/MultiplicityValidatorTest.java b/src/test/java/org/onap/schema/validation/MultiplicityValidatorTest.java
deleted file mode 100644
index 64cab0d..0000000
--- a/src/test/java/org/onap/schema/validation/MultiplicityValidatorTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.aai
- * ================================================================================
- * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2017-2018 Amdocs
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.onap.schema.validation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.onap.crud.entity.Edge;
-import org.onap.crud.entity.Vertex;
-import org.onap.crud.exception.CrudException;
-import org.onap.crud.parser.EdgePayload;
-import org.onap.schema.EdgeRulesLoader;
-import org.onap.schema.validation.MultiplicityValidator.MultiplicityType;
-
-import org.junit.runner.RunWith;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.onap.crud.OXMModelLoaderSetup;
-
-@RunWith(MockitoJUnitRunner.Silent.class)
-public class MultiplicityValidatorTest extends OXMModelLoaderSetup{
-
- private final String postEdgePayload = "{" + "\"type\": \"tosca.relationships.HostedOn\","
- + "\"source\": \"services/inventory/v12/vserver/50bdab41-ad1c-4d00-952c-a0aa5d827811\","
- + "\"target\": \"services/inventory/v12/pserver/1d326bc7-b985-492b-9604-0d5d1f06f908\","
- + "\"properties\": {" + "\"prevent-delete\": \"NONE\" } }";
-
- @Rule
- public ExpectedException thrown = ExpectedException.none();
-
- @Before
- public void init() {
- System.setProperty("CONFIG_HOME", "src/test/resources");
- EdgeRulesLoader.resetSchemaVersionContext();
- }
-
- @Test
- public void testValidPayloadForMultiplicityRule() throws CrudException {
- Map<String, List<Edge>> vertexMap = getEdgesForVertex(MultiplicityType.MANY2ONE, true);
- MultiplicityValidator.validatePayloadMultiplicity(EdgePayload.fromJson(postEdgePayload),
- vertexMap.get("source"), vertexMap.get("target"),
- "tosca.relationships.HostedOn", "v11");
- }
-
- @Test
- public void testInvalidPayloadForMultiplicityRule() throws CrudException {
- thrown.expect(CrudException.class);
- thrown.expectMessage("MANY2ONE multiplicity rule broken for Edge:vserver:pserver:tosca.relationships.HostedOn");
-
- Map<String, List<Edge>> vertexMap = getEdgesForVertex(MultiplicityType.MANY2ONE, false);
- MultiplicityValidator.validatePayloadMultiplicity(EdgePayload.fromJson(postEdgePayload),
- vertexMap.get("source"), vertexMap.get("target"),
- "tosca.relationships.HostedOn", "v11");
- }
-
- @Test
- public void testIsVertexValidForMultiplicityType() throws CrudException {
-
- Map<String, List<Edge>> vertexMap = getEdgesForVertex(MultiplicityType.MANY2MANY, true);
- Assert.assertTrue(MultiplicityValidator.isVertexValidForMultiplicityType(vertexMap.get("source"),
- vertexMap.get("target"), MultiplicityType.MANY2MANY));
-
- vertexMap = getEdgesForVertex(MultiplicityType.MANY2ONE, true);
- Assert.assertTrue(MultiplicityValidator.isVertexValidForMultiplicityType(
- vertexMap.get("source"), vertexMap.get("target"), MultiplicityType.MANY2ONE));
-
- vertexMap = getEdgesForVertex(MultiplicityType.ONE2MANY, true);
- Assert.assertTrue(MultiplicityValidator.isVertexValidForMultiplicityType(
- vertexMap.get("source"), vertexMap.get("target"), MultiplicityType.ONE2MANY));
-
- vertexMap = getEdgesForVertex(MultiplicityType.ONE2ONE, true);
- Assert.assertTrue(MultiplicityValidator.isVertexValidForMultiplicityType(
- vertexMap.get("source"), vertexMap.get("target"), MultiplicityType.ONE2ONE));
-
- vertexMap = getEdgesForVertex(MultiplicityType.ONE2MANY, false);
- Assert.assertFalse(MultiplicityValidator.isVertexValidForMultiplicityType(
- vertexMap.get("source"), vertexMap.get("target"), MultiplicityType.ONE2MANY));
-
- vertexMap = getEdgesForVertex(MultiplicityType.ONE2ONE, false);
- Assert.assertFalse(MultiplicityValidator.isVertexValidForMultiplicityType(
- vertexMap.get("source"), vertexMap.get("target"), MultiplicityType.ONE2ONE));
- }
-
- private Map<String, List<Edge>> getEdgesForVertex(MultiplicityType multiplicityType, boolean pass) {
-
- Map<String, List<Edge>> vertexMap = new HashMap<String, List<Edge>>();
- List<Edge> edgesForSourceVertex = new ArrayList<>();
- List<Edge> edgesForTargetVertex = new ArrayList<>();
-
- switch (multiplicityType) {
- case MANY2MANY:
- if (pass) {
- Edge edge = new Edge.Builder("type").source(new Vertex.Builder("source").build())
- .target(new Vertex.Builder("target").build()).build();
- edgesForSourceVertex.add(edge);
- edgesForTargetVertex.add(edge);
- }
- break;
- case MANY2ONE:
- if (pass) {
- Edge edge = new Edge.Builder("type").source(new Vertex.Builder("source").build())
- .target(new Vertex.Builder("target").build()).build();
- edgesForTargetVertex.add(edge);
- } else {
- Edge edge = new Edge.Builder("type").source(new Vertex.Builder("source").build())
- .target(new Vertex.Builder("target").build()).build();
- edgesForSourceVertex.add(edge);
- edgesForTargetVertex.add(edge);
- }
- break;
- case ONE2MANY:
- if (pass) {
- Edge edge = new Edge.Builder("type").source(new Vertex.Builder("source").build())
- .target(new Vertex.Builder("target").build()).build();
- edgesForSourceVertex.add(edge);
- } else {
- Edge edge = new Edge.Builder("type").source(new Vertex.Builder("source").build())
- .target(new Vertex.Builder("target").build()).build();
- edgesForSourceVertex.add(edge);
- edgesForTargetVertex.add(edge);
- }
- break;
- case ONE2ONE:
- if (!pass) {
- Edge edge = new Edge.Builder("type").source(new Vertex.Builder("source").build())
- .target(new Vertex.Builder("target").build()).build();
- edgesForSourceVertex.add(edge);
- edgesForTargetVertex.add(edge);
- }
- break;
- }
- vertexMap.put("source", edgesForSourceVertex);
- vertexMap.put("target", edgesForTargetVertex);
-
- return vertexMap;
- }
-
-}