X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Fschema%2FOxmModelValidator.java;h=e691fd7ae3f0c5e9053f06c72831f8e0494704e8;hb=0c40bcde9facc109ceb8dabb91156df2b4fb4129;hp=d23804cb83fcb39014072a1e19346cbf1f990a3d;hpb=94cbd3286b5fdd2f3f8fa3325835e713d71aac73;p=aai%2Fgizmo.git diff --git a/src/main/java/org/onap/schema/OxmModelValidator.java b/src/main/java/org/onap/schema/OxmModelValidator.java index d23804c..e691fd7 100644 --- a/src/main/java/org/onap/schema/OxmModelValidator.java +++ b/src/main/java/org/onap/schema/OxmModelValidator.java @@ -1,16 +1,15 @@ /** * ============LICENSE_START======================================================= - * Gizmo + * org.onap.aai * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. - * Copyright © 2017 Amdocs - * All rights reserved. + * 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 + * 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, @@ -18,34 +17,41 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.schema; -import com.google.common.base.CaseFormat; -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; - +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import javax.ws.rs.core.Response.Status; import org.eclipse.persistence.dynamic.DynamicType; import org.eclipse.persistence.internal.helper.DatabaseField; import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext; import org.eclipse.persistence.mappings.DatabaseMapping; import org.eclipse.persistence.oxm.XMLField; -import org.onap.aaiutils.oxm.OxmModelLoader; +import org.onap.aai.cl.api.Logger; +import org.onap.aai.cl.eelf.LoggerFactory; import org.onap.crud.entity.Vertex; 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 java.util.HashMap; -import java.util.Map; -import java.util.Set; -import javax.ws.rs.core.Response.Status; +import com.google.common.base.CaseFormat; +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; public class OxmModelValidator { + private static Logger logger = LoggerFactory.getInstance().getLogger(OxmModelValidator.class.getName()); + private static final String OXM_LOAD_ERROR = "Error loading oxm model"; + public enum Metadata { - NODE_TYPE("aai-node-type"), URI("aai-uri"), CREATED_TS("aai-created-ts"), SOT("source-of-truth"), LAST_MOD_SOT( - "last-mod-source-of-truth"); + NODE_TYPE("aai-node-type"), + URI("aai-uri"), + CREATED_TS("aai-created-ts"), + UPDATED_TS("aai-last-mod-ts"), + SOT("source-of-truth"), + LAST_MOD_SOT("last-mod-source-of-truth"); private final String propName; @@ -79,16 +85,26 @@ public class OxmModelValidator { Map result = new HashMap(); if (jaxbContext == null) { - throw new CrudException("", Status.NOT_FOUND); + logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, OXM_LOAD_ERROR + ": " + version); + throw new CrudException(OXM_LOAD_ERROR + ": " + version, Status.NOT_FOUND); } - final DynamicType modelObjectType = jaxbContext.getDynamicType( - CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, type))); + final DynamicType modelObjectType = OxmModelLoader.getDynamicTypeForVersion(version, type); + final DynamicType reservedObjectType = jaxbContext.getDynamicType("ReservedPropNames"); for (String key : filter.keySet()) { + if ((key == CrudServiceConstants.CRD_RESERVED_VERSION ) || key == CrudServiceConstants.CRD_RESERVED_NODE_TYPE ) { + result.put ( key, filter.get ( key ) ); + continue; + } String keyJavaName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, key); - if (modelObjectType.getDescriptor().getMappingForAttributeName(keyJavaName) != null) { + DatabaseMapping mapping = modelObjectType.getDescriptor().getMappingForAttributeName(keyJavaName); + + // Try both the model for the specified type and the reserved properties for our key + if (mapping == null) { + mapping = reservedObjectType.getDescriptor().getMappingForAttributeName(keyJavaName); + } + if (mapping != null) { try { - DatabaseMapping mapping = modelObjectType.getDescriptor().getMappingForAttributeName(keyJavaName); Object value = CrudServiceUtil.validateFieldType(filter.get(key), mapping.getField().getType()); result.put(key, value); } catch (Exception ex) { @@ -108,20 +124,23 @@ public class OxmModelValidator { DynamicJAXBContext jaxbContext = null; try { jaxbContext = OxmModelLoader.getContextForVersion(version); + } catch (CrudException ce) { + throw new CrudException(ce.getMessage(), ce.getHttpStatus()); } catch (Exception e) { throw new CrudException(e); } if (jaxbContext == null) { - throw new CrudException("", Status.NOT_FOUND); + logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, OXM_LOAD_ERROR + ": " + version); + throw new CrudException(OXM_LOAD_ERROR + ": " + version, Status.NOT_FOUND); } // Determine if the Object part is a collection type in the model // definition - final DynamicType modelObjectType = jaxbContext.getDynamicType( - CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, type))); + final DynamicType modelObjectType = OxmModelLoader.getDynamicTypeForVersion(version, type); if (modelObjectType == null) { - throw new CrudException("", Status.NOT_FOUND); + logger.error(CrudServiceMsgs.INVALID_OXM_FILE, "Object of collection type not found: " + type); + throw new CrudException("Object of collection type not found: " + type, Status.NOT_FOUND); } if (modelObjectType.getDescriptor().getMappings().size() == 1 @@ -130,9 +149,9 @@ public class OxmModelValidator { childJavaObjectName = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, childJavaObjectName); final DynamicType childObjectType = jaxbContext.getDynamicType(childJavaObjectName); if (childObjectType == null) { - // Should not happen as child object is defined in oxm model - // itself - throw new CrudException("", Status.NOT_FOUND); + // Should not happen as child object is defined in oxm model itself + logger.error(CrudServiceMsgs.INVALID_OXM_FILE, "Child Object Type for Java Object not found: " + childJavaObjectName); + throw new CrudException("Child Object Type for Java Object not found: " + childJavaObjectName, Status.NOT_FOUND); } return childObjectType.getDescriptor().getTableName(); } else { @@ -147,10 +166,8 @@ public class OxmModelValidator { try { type = resolveCollectionType(version, type); DynamicJAXBContext jaxbContext = OxmModelLoader.getContextForVersion(version); - String modelObjectClass = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, - CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, type)); - final DynamicType modelObjectType = jaxbContext.getDynamicType(modelObjectClass); + final DynamicType modelObjectType = OxmModelLoader.getDynamicTypeForVersion(version, type); final DynamicType reservedType = jaxbContext.getDynamicType("ReservedPropNames"); Set> payloadEntriesSet = properties.getAsJsonObject().entrySet(); @@ -219,6 +236,8 @@ public class OxmModelValidator { } return modelVertexBuilder.build(); + } catch (CrudException ce) { + throw new CrudException(ce.getMessage(), ce.getHttpStatus()); } catch (Exception e) { throw new CrudException(e.getMessage(), Status.BAD_REQUEST); } @@ -226,14 +245,11 @@ public class OxmModelValidator { public static Vertex validateIncomingPatchPayload(String id, String version, String type, JsonElement properties, Vertex existingVertex) throws CrudException { - try { type = resolveCollectionType(version, type); DynamicJAXBContext jaxbContext = OxmModelLoader.getContextForVersion(version); - String modelObjectClass = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, - CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, type)); - - final DynamicType modelObjectType = jaxbContext.getDynamicType(modelObjectClass); + + final DynamicType modelObjectType = OxmModelLoader.getDynamicTypeForVersion(version, type); final DynamicType reservedType = jaxbContext.getDynamicType("ReservedPropNames"); Set> payloadEntriesSet = properties.getAsJsonObject().entrySet(); @@ -276,14 +292,12 @@ public class OxmModelValidator { Object value = CrudServiceUtil.validateFieldType(entry.getValue().getAsString(), field.getType()); existingVertex.getProperties().put(entry.getKey(), value); } - } return existingVertex; } catch (Exception e) { throw new CrudException(e.getMessage(), Status.BAD_REQUEST); } - } private static DatabaseField getDatabaseField(String fieldName, DynamicType modelObjectType) { @@ -302,25 +316,27 @@ public class OxmModelValidator { } public static Vertex validateOutgoingPayload(String version, Vertex vertex) { - Vertex.Builder modelVertexBuilder = new Vertex.Builder(vertex.getType()).id(vertex.getId().get()); try { DynamicJAXBContext jaxbContext = OxmModelLoader.getContextForVersion(version); - String modelObjectClass = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, - CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, - vertex.getProperties().get(Metadata.NODE_TYPE.propertyName()) != null - ? vertex.getProperties().get(Metadata.NODE_TYPE.propertyName()).toString() : vertex.getType())); - final DynamicType modelObjectType = jaxbContext.getDynamicType(modelObjectClass); + + final DynamicType modelObjectType = OxmModelLoader.getDynamicTypeForVersion(version, + vertex.getProperties().get(Metadata.NODE_TYPE.propertyName()) != null + ? vertex.getProperties().get(Metadata.NODE_TYPE.propertyName()).toString() + : vertex.getType()); + final DynamicType reservedObjectType = jaxbContext.getDynamicType("ReservedPropNames"); for (String key : vertex.getProperties().keySet()) { DatabaseField field = getDatabaseField(key, modelObjectType); + if (field == null) { + field = getDatabaseField(key, reservedObjectType); + } if (field != null) { - if (!Metadata.isProperty(key)) { - modelVertexBuilder.property(key, vertex.getProperties().get(key)); - } + modelVertexBuilder.property(key, vertex.getProperties().get(key)); } } + return modelVertexBuilder.build(); } catch (Exception ex) { return vertex;