Merge "Use diamond op in place of type spec"
[so.git] / bpmn / MSOCommonBPMN / src / main / java / org / onap / so / bpmn / common / resource / InstanceResourceList.java
index b50ecda..3a4df68 100644 (file)
  */
 package org.onap.so.bpmn.common.resource;
 
+import com.google.common.reflect.TypeToken;
 import com.google.gson.Gson;
+import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import org.onap.so.bpmn.core.domain.GroupResource;
-import org.onap.so.bpmn.core.domain.Resource;
-import org.onap.so.bpmn.core.domain.ResourceType;
+import java.lang.reflect.Type;
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.so.bpmn.core.domain.GroupResource;
+import org.onap.so.bpmn.core.domain.Resource;
+import org.onap.so.bpmn.core.domain.VnfResource;
 
 public class InstanceResourceList {
 
-    private static List<Map<String, List<GroupResource>>> convertUUIReqTOStd(final String uuiRequest,
-            List<Resource> seqResourceList) {
+    private InstanceResourceList() {
+        throw new IllegalStateException("Utility class");
+    }
 
-        List<Map<String, List<GroupResource>>> normalizedList = new ArrayList<>();
+    // this method returns key from resource input
+    // e.g. {\"sdwansite_emails\" : \"[sdwansiteresource_list(PK), INDEX, sdwansite_emails]|default\",
+    // ....}
+    // it will return sdwansiteresource_list
+    private static String getPrimaryKey(Resource resource) {
+        String resourceInput = "";
+        if (resource instanceof VnfResource) {
+            resourceInput = ((VnfResource) resource).getResourceInput();
+        } else if (resource instanceof GroupResource) {
+            resourceInput = ((GroupResource) resource).getVnfcs().get(0).getResourceInput();
+        }
 
         Gson gson = new Gson();
-        JsonObject servJsonObject = gson.fromJson(uuiRequest, JsonObject.class);
+        Type type = new TypeToken<Map<String, String>>() {}.getType();
+        Map<String, String> map = gson.fromJson(resourceInput, type);
+
+        if (map != null) {
+            Optional<String> pkOpt = map.values().stream().filter(e -> e.contains("[")).map(e -> e.replace("[", ""))
+                    .map(e -> e.split(",")[0]).findFirst();
 
+            return pkOpt.isPresent() ? pkOpt.get() : "";
+        } else {
+            return "";
+        }
+    }
+
+
+    public static List<Resource> getInstanceResourceList(final VnfResource vnfResource, final String uuiRequest) {
+        List<Resource> sequencedResourceList = new ArrayList<>();
+        Gson gson = new Gson();
+        JsonObject servJsonObject = gson.fromJson(uuiRequest, JsonObject.class);
         JsonObject reqInputJsonObj = servJsonObject.getAsJsonObject("service").getAsJsonObject("parameters")
                 .getAsJsonObject("requestInputs");
 
-        // iterate all node in requestInputs
-        Iterator<Map.Entry<String, JsonElement>> iterator = reqInputJsonObj.entrySet().iterator();
-
-        while (iterator.hasNext()) { // iterate all <vf>_list
-            Map.Entry<String, JsonElement> entry = iterator.next();
-
-            // truncate "_list" from key and keep only the <VF_NAME>
-            String key = entry.getKey().substring(0, entry.getKey().indexOf("_list"));
-
-            // all the element represent VF will contain "<VF_NAME>_list".
-            if (key.contains("_list")) {
-                // this will return list of vf of same type
-                // e.g. vf_list [{vf1}, {vf2}]
-                Iterator<JsonElement> vfsIterator = entry.getValue().getAsJsonArray().iterator();
-
-                while (vfsIterator.hasNext()) { // iterate all [] inside vf_list
-                    JsonObject vfObject = vfsIterator.next().getAsJsonObject();
-                    List<GroupResource> tmpGrpsHolder = new ArrayList<>();
-
-                    // iterate vfObject to get groups(vfc)
-                    // currently each vfc represented by one group.
-                    Iterator<Map.Entry<String, JsonElement>> vfIterator = vfObject.entrySet().iterator();
-                    while (vfIterator.hasNext()) { // iterate all property inside a VF
-                        Map.Entry<String, JsonElement> vfEntry = vfIterator.next();
-
-                        // property name for vfc input will always carry "<VFC_NAME>_list"
-                        if (vfEntry.getKey().contains("_list")) {
-                            // truncate "_list" from key and keep only the <VFC_NAME>
-                            String vfcName = vfEntry.getKey().substring(0, vfEntry.getKey().indexOf("_list"));
-                            GroupResource grpRes = getGroupResource(vfcName, seqResourceList);
-                            // A <vfc>_list can contain more than one vfc of same type
-                            Iterator<JsonElement> vfcsIterator = vfEntry.getValue().getAsJsonArray().iterator();
-
-                            while (vfcsIterator.hasNext()) { // iterate all the vfcs inside <vfc>_list
-                                tmpGrpsHolder.add(grpRes);
-                            }
-                        }
+        String pk = getPrimaryKey(vnfResource);
+        // if pk is not empty that means it can contain list of VNF
+        if (!pk.isEmpty()) {
+            JsonElement vfNode = reqInputJsonObj.get(pk);
+            if (vfNode.isJsonArray()) {
+                // multiple instance of VNF
+                JsonArray vfNodeList = vfNode.getAsJsonArray();
+                for (JsonElement vf : vfNodeList) {
+                    JsonObject vfObj = vf.getAsJsonObject();
+
+                    // Add VF first before adding groups
+                    sequencedResourceList.add(vnfResource);
+                    List<Resource> sequencedGroupResourceList = getGroupResourceInstanceList(vnfResource, vfObj);
+                    if (!sequencedGroupResourceList.isEmpty()) {
+                        sequencedResourceList.addAll(sequencedGroupResourceList);
                     }
-                    List<GroupResource> seqGrpResourceList = seqGrpResource(tmpGrpsHolder, seqResourceList);
-                    HashMap<String, List<GroupResource>> entryNormList = new HashMap<>();
-                    entryNormList.put(key, seqGrpResourceList);
-                    normalizedList.add(entryNormList);
                 }
             }
+        } else {
+            // if pk is empty that means it has only one VNF Node
+            // Add VF first before adding groups
+            sequencedResourceList.add(vnfResource);
+            // check the groups for this VNF and add into resource list
+            List<Resource> sequencedGroupResourceList = getGroupResourceInstanceList(vnfResource, reqInputJsonObj);
+            if (!sequencedGroupResourceList.isEmpty()) {
+                sequencedResourceList.addAll(sequencedGroupResourceList);
+            }
         }
 
-        return normalizedList;
-    }
-
-    private static List<GroupResource> seqGrpResource(List<GroupResource> grpResources, List<Resource> resourceList) {
-        List<GroupResource> seqGrpResList = new ArrayList<>();
-        for (Resource r : resourceList) {
-            if (r.getResourceType() != ResourceType.GROUP) {
-                continue;
-            }
-            for (GroupResource g : grpResources) {
-                if (r.getModelInfo().getModelName().equalsIgnoreCase(g.getModelInfo().getModelName())) {
-                    seqGrpResList.add(g);
-                }
-            }
+        // In negative case consider only VNF resource only
+        if (sequencedResourceList.isEmpty()) {
+            sequencedResourceList.add(vnfResource);
         }
-        return seqGrpResList;
-    }
 
-    private static GroupResource getGroupResource(String vfcName, List<Resource> seqRessourceList) {
-        for (Resource r : seqRessourceList) {
-            if (r.getResourceType() == ResourceType.GROUP) {
-                // Currently only once vnfc is added to group
-                return ((GroupResource) r).getVnfcs().get(0).getModelInfo().getModelName().contains(vfcName)
-                        ? (GroupResource) r
-                        : null;
-            }
+        // check if the resource contains vf-module
+        if (vnfResource != null && vnfResource.getVfModules() != null) {
+            sequencedResourceList.addAll(vnfResource.getVfModules());
         }
-        return null;
+
+        return sequencedResourceList;
     }
 
-    private static List<Resource> convertToInstanceResourceList(List<Map<String, List<GroupResource>>> normalizedReq,
-            List<Resource> seqResourceList) {
-        List<Resource> flatResourceList = new ArrayList<>();
-        for (Resource r : seqResourceList) {
-            if (r.getResourceType() == ResourceType.VNF) {
-                for (Map<String, List<GroupResource>> entry : normalizedReq) {
-                    if (r.getModelInfo().getModelName().equalsIgnoreCase(entry.keySet().iterator().next())) {
-                        flatResourceList.add(r);
-                        flatResourceList.addAll(entry.get(entry.keySet().iterator().next()));
+    private static List<Resource> getGroupResourceInstanceList(VnfResource vnfResource, JsonObject vfObj) {
+        List<Resource> sequencedResourceList = new ArrayList<>();
+        if (vnfResource.getGroupOrder() != null && !StringUtils.isEmpty(vnfResource.getGroupOrder())) {
+            String[] grpSequence = vnfResource.getGroupOrder().split(",");
+            for (String grpType : grpSequence) {
+                for (GroupResource gResource : vnfResource.getGroups()) {
+                    if (StringUtils.containsIgnoreCase(gResource.getModelInfo().getModelName(), grpType)) {
+                        // check the number of group instances from UUI to be added
+                        String sk = getPrimaryKey(gResource);
+
+                        // if sk is empty that means it is not list type
+                        // only one group / vnfc to be considered
+                        if (sk.isEmpty()) {
+                            sequencedResourceList.add(gResource);
+                        } else {
+                            // check the number of list size of VNFC of a group
+                            JsonElement vfcNode = vfObj.get(sk);
+                            if (vfcNode.isJsonArray()) {
+                                JsonArray vfcList = vfcNode.getAsJsonArray();
+                                for (JsonElement vfc : vfcList) {
+                                    sequencedResourceList.add(gResource);
+                                }
+                            } else {
+                                // consider only one vnfc/group if not an array
+                                sequencedResourceList.add(gResource);
+                            }
+                        }
+
                     }
                 }
             }
         }
-        return flatResourceList;
-    }
-
-    public static List<Resource> getInstanceResourceList(final List<Resource> seqResourceList,
-            final String uuiRequest) {
-
-        // this will convert UUI request to normalized form
-        List<Map<String, List<GroupResource>>> normalizedReq = convertUUIReqTOStd(uuiRequest, seqResourceList);
-
-        // now UUI json req is normalized to
-        // [
-        // { VFB1 : [GrpA1, GrA2, GrB1]},
-        // { VFB2 : [GrpA1, GrB1]},
-        // { VFA1 : [GrpC1]}
-        // ]
-        // now sequence according to VF order (Group is already sequenced).
-        // After sequence it will look like :
-        // [
-        // { VFA1 : [GrpA1, GrA2, GrB1]},
-        // { VFA2 : [GrpA1, GrB1]},
-        // { VFB1 : [GrpC1]}
-        // ]
-        return convertToInstanceResourceList(normalizedReq, seqResourceList);
+        return sequencedResourceList;
     }
 }