Merge "Config to be able to route GET through datarouter"
[aai/gizmo.git] / src / main / java / org / onap / schema / OxmModelValidator.java
index d23804c..1607f18 100644 (file)
@@ -44,8 +44,12 @@ import javax.ws.rs.core.Response.Status;
 
 public class OxmModelValidator {
   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;
 
@@ -83,12 +87,18 @@ public class OxmModelValidator {
     }
     final DynamicType modelObjectType = jaxbContext.getDynamicType(
         CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, type)));
+    final DynamicType reservedObjectType = jaxbContext.getDynamicType("ReservedPropNames");
 
     for (String key : filter.keySet()) {
       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) {
@@ -143,7 +153,7 @@ public class OxmModelValidator {
 
   public static Vertex validateIncomingUpsertPayload(String id, String version, String type, JsonElement properties)
       throws CrudException {
-
+    
     try {
       type = resolveCollectionType(version, type);
       DynamicJAXBContext jaxbContext = OxmModelLoader.getContextForVersion(version);
@@ -226,7 +236,6 @@ 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);
@@ -276,14 +285,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) {
@@ -301,8 +308,7 @@ public class OxmModelValidator {
     return null;
   }
 
-  public static Vertex validateOutgoingPayload(String version, Vertex vertex) {
-
+  public static Vertex validateOutgoingPayload(String version, Vertex vertex) { 
     Vertex.Builder modelVertexBuilder = new Vertex.Builder(vertex.getType()).id(vertex.getId().get());
 
     try {
@@ -312,15 +318,18 @@ public class OxmModelValidator {
               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 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;