Improve test coverage
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / servlets / RepresentationUtils.java
index 1a3b988..707f898 100644 (file)
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-
 package org.openecomp.sdc.be.servlets;
 
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter.SerializeExceptFilter;
+import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
+import com.google.common.collect.ImmutableMap;
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -27,40 +37,33 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
-import org.openecomp.sdc.be.datatypes.elements.InterfaceOperationDataDefinition;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
 import org.openecomp.sdc.be.model.ArtifactDefinition;
 import org.openecomp.sdc.be.model.InterfaceDefinition;
-import org.openecomp.sdc.be.model.Operation;
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
 import org.openecomp.sdc.common.api.Constants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.annotation.JsonFilter;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter.SerializeExceptFilter;
-import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
-import com.google.common.collect.ImmutableMap;
-import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
+import org.openecomp.sdc.common.log.wrappers.Logger;
 
 public class RepresentationUtils {
 
-    private static final Logger log = LoggerFactory.getLogger(RepresentationUtils.class);
+    private static final Logger log = Logger.getLogger(RepresentationUtils.class);
+    private static final String EMPTY = "empty";
+    private static final String REMOVE_IS_EMPTY_FROM_COLLECTIONS_FILTER = "removeIsEmptyFromCollections";
+    private static final ImmutableMap<Class<?>, Class<?>> IS_EMPTY_FILTER_MIXIN = ImmutableMap.<Class<?>, Class<?>>builder()
+        .put(Collection.class, IsEmptyFilterMixIn.class).put(List.class, IsEmptyFilterMixIn.class).put(Set.class, IsEmptyFilterMixIn.class)
+        .put(HashMap.class, IsEmptyFilterMixIn.class).put(ArrayList.class, IsEmptyFilterMixIn.class).put(HashSet.class, IsEmptyFilterMixIn.class)
+        .put(InterfaceDefinition.class, IsEmptyFilterMixIn.class).put(Resource.class, IsEmptyFilterMixIn.class)
+        .put(ToscaDataDefinition.class, IsEmptyFilterMixIn.class).build();
 
     public static ArtifactDefinition convertJsonToArtifactDefinitionForUpdate(String content, Class<ArtifactDefinition> clazz) {
-
         JsonObject jsonElement = new JsonObject();
         ArtifactDefinition resourceInfo = null;
-
         try {
             Gson gson = new Gson();
             jsonElement = gson.fromJson(content, jsonElement.getClass());
@@ -78,23 +81,15 @@ public class RepresentationUtils {
             mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
             mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
             mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
-
             resourceInfo = mapper.readValue(json, clazz);
             resourceInfo.setPayloadData(payload);
-
         } catch (Exception e) {
             BeEcompErrorManager.getInstance().logBeArtifactInformationInvalidError("Artifact Upload / Update");
             log.debug("Failed to convert the content {} to object.", content.substring(0, Math.min(50, content.length())), e);
         }
-
         return resourceInfo;
     }
 
-
-    public static class ResourceRep {
-
-    }
-
     /**
      * Build Representation of given Object
      *
@@ -109,9 +104,6 @@ public class RepresentationUtils {
         return mapper.writeValueAsString(elementToRepresent);
     }
 
-
-
-
     public static <T> T fromRepresentation(String json, Class<T> clazz) {
         ObjectMapper mapper = new ObjectMapper();
         T object = null;
@@ -123,20 +115,27 @@ public class RepresentationUtils {
         } catch (Exception e) {
             log.error("Error when parsing JSON of object of type {}", clazz.getSimpleName(), e);
         } // return null in case of exception
-
         return object;
     }
 
-
-    public static ArtifactDefinition convertJsonToArtifactDefinition(String content, Class<ArtifactDefinition> clazz) {
-
+    public static ArtifactDefinition convertJsonToArtifactDefinition(String content, Class<ArtifactDefinition> clazz, boolean validateTimeout) {
         JsonObject jsonElement = new JsonObject();
         ArtifactDefinition resourceInfo = null;
-
+        if (StringUtils.isEmpty(content)) {
+            throw new ByActionStatusComponentException(ActionStatus.MISSING_BODY);
+        }
         try {
             Gson gson = new Gson();
             jsonElement = gson.fromJson(content, jsonElement.getClass());
             JsonElement artifactGroupValue = jsonElement.get(Constants.ARTIFACT_GROUP_TYPE);
+            HashMap<String, JsonElement> elementsToValidate = new HashMap<>();
+            elementsToValidate.put(Constants.ARTIFACT_GROUP_TYPE, artifactGroupValue);
+            elementsToValidate.put(Constants.ARTIFACT_TYPE, jsonElement.get(Constants.ARTIFACT_TYPE));
+            elementsToValidate.put(Constants.ARTIFACT_LABEL, (jsonElement.get(Constants.ARTIFACT_LABEL)));
+            if (validateTimeout) {
+                elementsToValidate.put(Constants.ARTIFACT_TIMEOUT, jsonElement.get(Constants.ARTIFACT_TIMEOUT));
+            }
+            validateMandatoryProperties(elementsToValidate);
             if (artifactGroupValue != null && !artifactGroupValue.isJsonNull()) {
                 String groupValueUpper = artifactGroupValue.getAsString().toUpperCase();
                 if (!ArtifactGroupTypeEnum.getAllTypes().contains(groupValueUpper)) {
@@ -162,44 +161,42 @@ public class RepresentationUtils {
             mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
             mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
             mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
-
             resourceInfo = mapper.readValue(json, clazz);
             resourceInfo.setPayloadData(payload);
-
+        } catch (ComponentException ce) {
+            BeEcompErrorManager.getInstance().logBeArtifactInformationInvalidError("Artifact Upload / Update");
+            log.debug("Failed to convert the content {} to object.", content.substring(0, Math.min(50, content.length())), ce);
+            throw ce;
         } catch (Exception e) {
             BeEcompErrorManager.getInstance().logBeArtifactInformationInvalidError("Artifact Upload / Update");
             log.debug("Failed to convert the content {} to object.", content.substring(0, Math.min(50, content.length())), e);
         }
-
         return resourceInfo;
     }
 
+    private static void validateMandatoryProperties(HashMap<String, JsonElement> elementsByName) {
+        elementsByName.forEach((name, element) -> {
+            if (element == null) {
+                throw new ByActionStatusComponentException(ActionStatus.MISSING_MANDATORY_PROPERTY, name);
+            }
+            if (element.isJsonNull()) {
+                throw new ByActionStatusComponentException(ActionStatus.MANDATORY_PROPERTY_MISSING_VALUE, name);
+            }
+        });
+    }
+
     public static <T> Object toFilteredRepresentation(T elementToRepresent) throws IOException {
         ObjectMapper mapper = new ObjectMapper();
         mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
         mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
         mapper.setMixIns(IS_EMPTY_FILTER_MIXIN);
-        return mapper.writer(new SimpleFilterProvider().addFilter(REMOVE_IS_EMPTY_FROM_COLLECTIONS_FILTER,
-            SerializeExceptFilter.serializeAllExcept(EMPTY))).writeValueAsString(elementToRepresent);
+        return mapper
+            .writer(new SimpleFilterProvider().addFilter(REMOVE_IS_EMPTY_FROM_COLLECTIONS_FILTER, SerializeExceptFilter.serializeAllExcept(EMPTY)))
+            .writeValueAsString(elementToRepresent);
     }
 
     @JsonFilter(REMOVE_IS_EMPTY_FROM_COLLECTIONS_FILTER)
-    private static class IsEmptyFilterMixIn {}
-
-    private static final String EMPTY = "empty";
-    private static final String REMOVE_IS_EMPTY_FROM_COLLECTIONS_FILTER = "removeIsEmptyFromCollections";
-    private static final ImmutableMap<Class<?>,Class<?>> IS_EMPTY_FILTER_MIXIN =
-        ImmutableMap.<Class<?>,Class<?>>builder()
-            .put(Collection.class,IsEmptyFilterMixIn.class)
-            .put(List.class,IsEmptyFilterMixIn.class)
-            .put(Set.class,IsEmptyFilterMixIn.class)
-            .put(HashMap.class,IsEmptyFilterMixIn.class)
-            .put(ArrayList.class,IsEmptyFilterMixIn.class)
-            .put(HashSet.class,IsEmptyFilterMixIn.class)
-            .put(InterfaceDefinition.class,IsEmptyFilterMixIn.class)
-            .put(Operation.class,IsEmptyFilterMixIn.class)
-            .put(Resource.class,IsEmptyFilterMixIn.class)
-            .put(ToscaDataDefinition.class,IsEmptyFilterMixIn.class)
-            .put(InterfaceOperationDataDefinition.class,IsEmptyFilterMixIn.class).build();
+    private static class IsEmptyFilterMixIn {
 
+    }
 }