diff options
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;
- }
-
-}
|