diff options
author | 2019-01-30 14:04:35 +0000 | |
---|---|---|
committer | 2019-01-30 15:48:22 +0000 | |
commit | 0c40bcde9facc109ceb8dabb91156df2b4fb4129 (patch) | |
tree | af3b32aa18092c7ea6bb60005a6d503448a92297 /src/main/java/org/onap/crud | |
parent | df7904cca9c67ed7ce99e1d1d1c3a2c961a61445 (diff) |
Remove Multiplicity feature
The multiplicty feature is not working properly around relantionships
and demands more investigation in order to identify the issues.
In the future we might add this back.
For reference multiplicity was added under AAI-1197
Basically reversing the commit: d10a218c76633374f083f7a2802c198e93a6abae
Issue-ID: AAI-2124
Change-Id: I5d27b950841da08b00fbb422fb13136d43f0e3bd
Signed-off-by: Sanchez, Gabriel (gs882h) <gabriel.sanchez@amdocs.com>
Diffstat (limited to 'src/main/java/org/onap/crud')
13 files changed, 38 insertions, 223 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); |