Fix occurences not deserialized properly 07/19707/2
authorvempo <vitaliy.emporopulo@amdocs.com>
Sun, 22 Oct 2017 15:07:39 +0000 (18:07 +0300)
committertali orenbach <tali.orenbach@amdocs.com>
Mon, 23 Oct 2017 07:15:50 +0000 (07:15 +0000)
add json deserializer for RequirementDefinition

Issue-Id : SDC-474
Change-Id: I734a671b02a319fc3e90239bb8b0202c898fe473
Signed-off-by: vempo <vitaliy.emporopulo@amdocs.com>
(cherry picked from commit 30e46525c1406fb3b10603606c4efcc033ee58c4)

openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/deserializers/RequirementDefinitionDeserializer.java [new file with mode: 0644]
openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/json/JsonUtil.java
openecomp-be/lib/openecomp-tosca-converter-lib/openecomp-tosca-converter-core/src/test/java/org/openecomp/core/converter/impl/ToscaConverterImplTest.java

diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/deserializers/RequirementDefinitionDeserializer.java b/openecomp-be/lib/openecomp-core-lib/openecomp-utilities-lib/src/main/java/org/openecomp/core/utilities/deserializers/RequirementDefinitionDeserializer.java
new file mode 100644 (file)
index 0000000..b341a52
--- /dev/null
@@ -0,0 +1,87 @@
+package org.openecomp.core.utilities.deserializers;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
+
+import java.lang.reflect.Type;
+import java.util.Objects;
+import java.util.Optional;
+
+public class RequirementDefinitionDeserializer implements JsonDeserializer<RequirementDefinition> {
+
+  private static final String CAPABILITY = "capability";
+  private static final String NODE = "node";
+  private static final String RELATIONSHIP = "relationship";
+  private static final String OCCURRENCES = "occurrences";
+
+  @Override
+  public RequirementDefinition deserialize(JsonElement jsonElement, Type type,
+                                           JsonDeserializationContext jsonDeserializationContext)
+      throws JsonParseException {
+
+    JsonObject jsonObject = jsonElement.getAsJsonObject();
+
+    RequirementDefinition requirementDefinition = new RequirementDefinition();
+    setRequirementValues(jsonObject, requirementDefinition);
+
+    Optional<Object[]> occurrences = handleOccurrences(jsonObject);
+    occurrences.ifPresent(requirementDefinition::setOccurrences);
+
+    return requirementDefinition;
+  }
+
+
+  private void setRequirementValues(JsonObject jsonObject,
+                                    RequirementDefinition requirementDefinition) {
+
+    JsonElement capabilityElement = jsonObject.get(CAPABILITY);
+    if (!Objects.isNull(capabilityElement)) {
+      requirementDefinition.setCapability(capabilityElement.getAsString());
+    }
+
+    JsonElement nodeElement = jsonObject.get(NODE);
+    if (!Objects.isNull(nodeElement)) {
+      requirementDefinition.setNode(nodeElement.getAsString());
+    }
+
+    JsonElement relationshipElement = jsonObject.get(RELATIONSHIP);
+    if (!Objects.isNull(relationshipElement)) {
+      requirementDefinition.setRelationship(relationshipElement.getAsString());
+    }
+  }
+
+  private Optional<Object[]> handleOccurrences(JsonObject jsonObject) {
+
+    JsonElement occurrencesElement = jsonObject.get(OCCURRENCES);
+
+    if(Objects.isNull(occurrencesElement)){
+      return Optional.empty();
+    }
+
+    JsonArray occurrences = occurrencesElement.getAsJsonArray();
+    Object[] fixedOccurrences = new Object[occurrences.size()];
+
+    for (int i = 0; i < occurrences.size(); i++) {
+      JsonElement currElement = occurrences.get(i);
+
+      // values inside occurrences array can be either String or Integer
+      if (currElement.isJsonPrimitive()) {
+        JsonPrimitive jsonPrimitive = currElement.getAsJsonPrimitive();
+
+        if (jsonPrimitive.isNumber()) {
+          fixedOccurrences[i] = jsonPrimitive.getAsNumber().intValue();
+        } else {
+          fixedOccurrences[i] = jsonPrimitive.getAsString();
+        }
+      }
+    }
+
+    return Optional.of(fixedOccurrences);
+  }
+}
index 8454bc6..c3d32df 100644 (file)
@@ -32,8 +32,10 @@ import org.everit.json.schema.ValidationException;
 import org.everit.json.schema.loader.SchemaLoader;
 import org.json.JSONObject;
 import org.openecomp.core.utilities.CommonMethods;
+import org.openecomp.core.utilities.deserializers.RequirementDefinitionDeserializer;
 import org.openecomp.sdc.logging.api.Logger;
 import org.openecomp.sdc.logging.api.LoggerFactory;
+import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -51,6 +53,15 @@ import java.util.stream.Collectors;
  */
 public class JsonUtil {
   private static final Logger logger = LoggerFactory.getLogger(JsonUtil.class);
+  private static final GsonBuilder gsonBuilder;
+  private static final Gson gson;
+
+  static {
+    gsonBuilder = new GsonBuilder();
+    gsonBuilder.registerTypeAdapter(RequirementDefinition.class, new
+        RequirementDefinitionDeserializer());
+    gson = gsonBuilder.create();
+  }
 
   /**
    * Object 2 json string.
@@ -86,9 +97,7 @@ public class JsonUtil {
     T typ;
     try {
       try (Reader br = new StringReader(json)) {
-        typ = new Gson().fromJson(br, classOfT);
-      } catch (IOException exception) {
-        throw exception;
+        typ = gson.fromJson(br, classOfT);
       }
     } catch (JsonIOException | JsonSyntaxException | IOException exception) {
       throw new RuntimeException(exception);
index 4abed3e..f29ca4a 100644 (file)
@@ -1,26 +1,30 @@
 package org.openecomp.core.converter.impl;
 
 import org.apache.commons.collections.CollectionUtils;
+import org.junit.Assert;
 import org.junit.Test;
 import org.openecomp.core.converter.ToscaConverter;
 import org.openecomp.core.impl.ToscaConverterImpl;
 import org.openecomp.core.utilities.file.FileContentHandler;
 import org.openecomp.core.utilities.file.FileUtils;
+import org.openecomp.core.utilities.json.JsonUtil;
 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
+import org.openecomp.sdc.tosca.datatypes.model.NodeType;
 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
+import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
 import org.openecomp.sdc.tosca.services.ToscaExtensionYamlUtil;
 import org.openecomp.sdc.tosca.services.YamlUtil;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.nio.file.NotDirectoryException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.ListIterator;
@@ -33,7 +37,10 @@ import static org.openecomp.core.converter.datatypes.Constants.mainStName;
 
 public class ToscaConverterImplTest {
 
-  private static ToscaConverter toscaConverter = new ToscaConverterImpl();
+  private static final ToscaConverter toscaConverter = new ToscaConverterImpl();
+  private static final String VIRTUAL_LINK = "virtualLink";
+  private static final String UNBOUNDED = "UNBOUNDED";
+
   private static String inputFilesPath;
   private static String outputFilesPath;
   private static Map<String, ServiceTemplate> expectedOutserviceTemplates;
@@ -57,7 +64,72 @@ public class ToscaConverterImplTest {
     checkSTResults(expectedOutserviceTemplates, null, mainSt);
   }
 
+  @Test
+  public void testOccurrencesUpperString() {
+    Object[] occurrences = buildOccurrences("0", UNBOUNDED);
+    Assert.assertEquals(occurrences[0], 0);
+    Assert.assertEquals(occurrences[1], UNBOUNDED);
+  }
+
+  @Test
+  public void testOccurrencesAsInts() {
+    Object[] occurrences = buildOccurrences("0", "1");
+    Assert.assertEquals(occurrences[0], 0);
+    Assert.assertEquals(occurrences[1], 1);
+  }
+
+  @Test
+  public void testOccurrencesAsStrings() {
+    String test = "TEST_A";
+    Object[] occurrences = buildOccurrences(UNBOUNDED, test);
+    Assert.assertEquals(occurrences[0], UNBOUNDED);
+    Assert.assertEquals(occurrences[1], test);
+  }
+
+  @Test
+  public void testOccurrencesLowerString() {
+    Object[] occurrences = buildOccurrences(UNBOUNDED, "100");
+    Assert.assertEquals(occurrences[0], UNBOUNDED);
+    Assert.assertEquals(occurrences[1], 100);
+  }
+
+  @Test
+  public void testOccurrencesEmpty() {
+    Object[] occurrences = buildOccurrences();
+    Assert.assertEquals(occurrences.length, 0);
+  }
+
+  @Test
+  public void testOccurrencesMany() {
+    String test = "TEST_B";
+    Object[] occurrences = buildOccurrences("1", "2", test);
+    Assert.assertEquals(occurrences[0], 1);
+    Assert.assertEquals(occurrences[1], 2);
+    Assert.assertEquals(occurrences[2], test);
+  }
+
+  @Test
+  public void testDefaultOccurrences() {
+    Object[] occurrences = buildOccurrences((List<String>) null);
+    Assert.assertEquals(1, occurrences[0]);
+    Assert.assertEquals(1, occurrences[1]);
+  }
+
+  private Object[] buildOccurrences(String... bounds) {
+    return buildOccurrences(Arrays.asList(bounds));
+  }
 
+  private Object[] buildOccurrences(List<String> bounds) {
+    NodeType nodeType = JsonUtil.json2Object("{derived_from=tosca.nodes.Root, description=MME_VFC, " +
+            "properties={vendor={type=string, default=ERICSSON}, " +
+            "csarVersion={type=string, default=v1.0}, csarProvider={type=string, default=ERICSSON}, " +
+            "id={type=string, default=vMME}, version={type=string, default=v1.0}, csarType={type=string, default=NFAR}}, " +
+            "requirements=[{virtualLink={" +
+            (bounds == null ? "" : "occurrences=[" + String.join(", ", bounds) +   "], ") +
+            "capability=tosca.capabilities.network.Linkable}}]}", NodeType.class);
+    List<Map<String, RequirementDefinition>> requirements = nodeType.getRequirements();
+    return requirements.get(0).get(VIRTUAL_LINK).getOccurrences();
+  }
 
   private FileContentHandler createFileContentHandlerFromInput(String inputFilesPath)
       throws IOException {
@@ -141,10 +213,6 @@ public class ToscaConverterImplTest {
           yamlFile.close();
         } catch (IOException ignore) {
         }
-      } catch (FileNotFoundException e) {
-        throw e;
-      } catch (IOException e) {
-        throw e;
       }
     }
   }