diff options
Diffstat (limited to 'src/main/java/org/onap/schema')
-rw-r--r-- | src/main/java/org/onap/schema/OxmModelValidator.java (renamed from src/main/java/org/onap/schema/validation/OxmModelValidator.java) | 4 | ||||
-rw-r--r-- | src/main/java/org/onap/schema/RelationshipSchema.java | 29 | ||||
-rw-r--r-- | src/main/java/org/onap/schema/RelationshipSchemaValidator.java | 325 | ||||
-rw-r--r-- | src/main/java/org/onap/schema/validation/MultiplicityValidator.java | 119 | ||||
-rw-r--r-- | src/main/java/org/onap/schema/validation/RelationshipSchemaValidator.java | 265 |
5 files changed, 327 insertions, 415 deletions
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(); - } -} |