Use lombok for data objects
[policy/engine.git] / POLICY-SDK-APP / src / main / java / org / onap / policy / controller / CreateDcaeMicroServiceController.java
index a40b48a..2b7974d 100644 (file)
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * ONAP Policy Engine
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * 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
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
 package org.onap.policy.controller;
 
+import com.att.research.xacml.util.XACMLProperties;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.gson.Gson;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.StringReader;
@@ -36,7 +43,6 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -48,7 +54,9 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.TreeSet;
 import java.util.UUID;
+import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
@@ -61,6 +69,15 @@ import javax.json.JsonReader;
 import javax.json.JsonValue;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import lombok.Getter;
+import lombok.Setter;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
 
 import org.apache.commons.compress.utils.IOUtils;
 import org.apache.commons.fileupload.FileItem;
@@ -78,6 +95,7 @@ import org.onap.policy.rest.adapter.PolicyRestAdapter;
 import org.onap.policy.rest.dao.CommonClassDao;
 import org.onap.policy.rest.jpa.GroupPolicyScopeList;
 import org.onap.policy.rest.jpa.MicroServiceModels;
+import org.onap.policy.rest.jpa.MicroserviceHeaderdeFaults;
 import org.onap.policy.rest.jpa.PolicyEntity;
 import org.onap.policy.rest.util.MSAttributeObject;
 import org.onap.policy.rest.util.MSModelUtils;
@@ -89,1823 +107,1654 @@ import org.springframework.http.MediaType;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.servlet.ModelAndView;
-import org.yaml.snakeyaml.Yaml;
-
-import com.att.research.xacml.util.XACMLProperties;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectWriter;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.gson.Gson;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
 
 @Controller
 @RequestMapping("/")
 public class CreateDcaeMicroServiceController extends RestrictedBaseController {
-       private static final Logger LOGGER = FlexLogger.getLogger(CreateDcaeMicroServiceController.class);
-
-       private static CommonClassDao commonClassDao;
-       
-       public static CommonClassDao getCommonClassDao() {
-               return commonClassDao;
-       }
-
-       public static void setCommonClassDao(CommonClassDao commonClassDao) {
-               CreateDcaeMicroServiceController.commonClassDao = commonClassDao;
-       }
-
-       private MicroServiceModels newModel;
-       private String newFile;
-       private String directory;
-       private List<String> modelList = new ArrayList<>();
-       private List<String> dirDependencyList = new ArrayList<>();
-       private HashMap<String,MSAttributeObject > classMap = new HashMap<>();
-       //Tosca Model related Datastructure. 
-       String referenceAttributes;
-       String attributeString;
-       String listConstraints;
-       String subAttributeString;
-       HashMap<String, Object> retmap = new HashMap<>();
-       Set<String> uniqueKeys= new HashSet<>();
-       Set<String> uniqueDataKeys= new HashSet<>();
-       StringBuilder dataListBuffer=new StringBuilder();
-       List<String> dataConstraints= new ArrayList <>();
-       Set<String> allManyTrueKeys= new HashSet <>();
-       
-       public static final String DATATYPE  = "data_types.policy.data.";
-       public static final String PROPERTIES=".properties.";
-       public static final String TYPE=".type";
-       public static final String STRING="string";
-       public static final String INTEGER="integer";
-       public static final String LIST="list";
-       public static final String DEFAULT=".default";
-       public static final String REQUIRED=".required";
-       public static final String MANYFALSE=":MANY-false";
-       
-       
-       @Autowired
-       private CreateDcaeMicroServiceController(CommonClassDao commonClassDao){
-               CreateDcaeMicroServiceController.commonClassDao = commonClassDao;
-       }
-
-       public CreateDcaeMicroServiceController(){}
-
-       protected PolicyRestAdapter policyAdapter = null;
-       private int priorityCount; 
-       private Map<String, String> attributesListRefMap =  new HashMap<>();
-       private Map<String, LinkedList<String>> arrayTextList =  new HashMap<>();
-
-       public PolicyRestAdapter setDataToPolicyRestAdapter(PolicyRestAdapter policyData, JsonNode root) {
-               
-               String jsonContent = null;
-               try{
-                       LOGGER.info("policyJSON :" + (root.get("policyJSON")).toString());
-                       
-                       String tempJson = root.get("policyJSON").toString();
-                       
-                       //---replace empty value with the value below before calling decodeContent method.
-                       String dummyValue = "*empty-value*" + UUID.randomUUID().toString();
-                       LOGGER.info("dummyValue:" + dummyValue);
-                       tempJson = StringUtils.replaceEach(tempJson, new String[]{"\"\""}, new String[]{"\""+dummyValue+"\""});
-                       ObjectMapper mapper = new ObjectMapper();
-                       JsonNode tempJsonNode = mapper.readTree(tempJson);
-                       jsonContent = decodeContent(tempJsonNode).toString();
-                       constructJson(policyData, jsonContent, dummyValue);
-               }catch(Exception e){
-                       LOGGER.error("Error while decoding microservice content", e);
-               }
-               
-               return policyData;
-       }
-       
-       private GroupPolicyScopeList getPolicyObject(String policyScope) {
-               GroupPolicyScopeList groupList= (GroupPolicyScopeList) commonClassDao.getEntityItem(GroupPolicyScopeList.class, "name", policyScope);
-               return groupList;
-       }
-       
-       private PolicyRestAdapter constructJson(PolicyRestAdapter policyAdapter, String jsonContent, String dummyValue) {
-               ObjectWriter om = new ObjectMapper().writer();
-               String json="";
-               DCAEMicroServiceObject microServiceObject = new DCAEMicroServiceObject();
-               MicroServiceModels returnModel = new MicroServiceModels();
-               microServiceObject.setTemplateVersion(XACMLProperties.getProperty(XACMLRestProperties.TemplateVersion_MS));
-               if(policyAdapter.getServiceType() !=null){
-                       microServiceObject.setService(policyAdapter.getServiceType());
-                       microServiceObject.setVersion(policyAdapter.getVersion());
-                       returnModel = getAttributeObject(microServiceObject.getService(), microServiceObject.getVersion());
-               }
-               if (returnModel.getAnnotation()==null || returnModel.getAnnotation().isEmpty()){
-                       if(policyAdapter.getUuid()!=null){
-                               microServiceObject.setUuid(policyAdapter.getUuid());
-                       }
-                       if(policyAdapter.getLocation()!=null){
-                               microServiceObject.setLocation(policyAdapter.getLocation());
-                       } 
-                       if(policyAdapter.getConfigName()!=null){
-                               microServiceObject.setConfigName(policyAdapter.getConfigName());
-                       }
-                       GroupPolicyScopeList policyScopeValue = getPolicyObject(policyAdapter.getPolicyScope());
-                       if(policyScopeValue!=null){
-                               microServiceObject.setPolicyScope(policyScopeValue.getGroupList());     
-                       }
-               }
-               
-               if(policyAdapter.getPolicyName()!=null){
-                       microServiceObject.setPolicyName(policyAdapter.getPolicyName());
-               }
-               if(policyAdapter.getPolicyDescription()!=null){
-                       microServiceObject.setDescription(policyAdapter.getPolicyDescription());
-               }
-               if (policyAdapter.getPriority()!=null){
-                       microServiceObject.setPriority(policyAdapter.getPriority());
-               }else {
-                       microServiceObject.setPriority("9999");
-               }
-               
-               if (policyAdapter.getRiskLevel()!=null){
-                       microServiceObject.setRiskLevel(policyAdapter.getRiskLevel());
-               }
-               if (policyAdapter.getRiskType()!=null){
-                       microServiceObject.setRiskType(policyAdapter.getRiskType());
-               }
-               if (policyAdapter.getGuard()!=null){
-                       microServiceObject.setGuard(policyAdapter.getGuard());
-               }
-               microServiceObject.setContent(jsonContent);
-               
-               try {
-                       json = om.writeValueAsString(microServiceObject);
-               } catch (JsonProcessingException e) {
-                       LOGGER.error("Error writing out the object", e);
-               }
-               LOGGER.info("input json: " + json);
-               LOGGER.info("input jsonContent: " + jsonContent);
-               String cleanJson = cleanUPJson(json);
-        //--- reset empty value back after called cleanUPJson method and before calling removeNullAttributes
-               String tempJson = StringUtils.replaceEach(cleanJson, new String[]{"\""+dummyValue+"\""},  new String[]{"\"\""});
-               LOGGER.info("tempJson: " + tempJson);
-               cleanJson = removeNullAttributes(tempJson);
-               policyAdapter.setJsonBody(cleanJson);
-               return policyAdapter;
-       }
-       
-       private String removeNullAttributes(String cleanJson) {
-               ObjectMapper mapper = new ObjectMapper();
-
-               try {
-                       JsonNode rootNode = mapper.readTree(cleanJson);
-                       JsonNode returnNode = mapper.readTree(cleanJson);
-                       Iterator<Map.Entry<String, JsonNode>> fieldsIterator = rootNode.fields();
-                       boolean remove = false;
-                       JsonObject removed = null;
-                       boolean contentChanged = false;
-                       while (fieldsIterator.hasNext()) {
-                               Map.Entry<String, JsonNode> field = fieldsIterator.next();
-                               final String key = field.getKey();
-                               final JsonNode value = field.getValue();
-                               if("content".equalsIgnoreCase(key)){
-                                       String contentStr = value.toString();
-                                       try(JsonReader reader = Json.createReader(new StringReader(contentStr))){
-                               JsonObject jsonContent = reader.readObject();                 
-                                                       removed = removeNull(jsonContent);
-                                                       if(!jsonContent.toString().equals(removed.toString())){
-                                                       contentChanged = true;  
-                                               }
+    private static final Logger LOGGER = FlexLogger.getLogger(CreateDcaeMicroServiceController.class);
+
+    private static CommonClassDao commonClassDao;
+
+    public static CommonClassDao getCommonClassDao() {
+        return commonClassDao;
+    }
+
+    public static void setCommonClassDao(CommonClassDao commonClassDao) {
+        CreateDcaeMicroServiceController.commonClassDao = commonClassDao;
+    }
+
+    private MicroServiceModels newModel;
+    private String newFile;
+    private String directory;
+    private List<String> modelList = new ArrayList<>();
+    private List<String> dirDependencyList = new ArrayList<>();
+    private LinkedHashMap<String, MSAttributeObject> classMap = new LinkedHashMap<>();
+    String referenceAttributes;
+    String attributeString;
+    Set<String> allManyTrueKeys = null;
+    private Map<String, String> sigRules = null;
+
+    public static final String DATATYPE = "data_types.policy.data.";
+    public static final String PROPERTIES = ".properties.";
+    public static final String TYPE = ".type";
+    public static final String STRING = "string";
+    public static final String INTEGER = "integer";
+    public static final String LIST = "list";
+    public static final String DEFAULT = ".default";
+    public static final String REQUIRED = ".required";
+    public static final String MATCHABLE = ".matchable";
+    public static final String MANYFALSE = ":MANY-false";
+    private static final Pattern PATTERN = Pattern.compile("[A][0-9]");
+    private static final String POLICYJSON = "policyJSON";
+
+    @Autowired
+    private CreateDcaeMicroServiceController(CommonClassDao commonClassDao) {
+        CreateDcaeMicroServiceController.commonClassDao = commonClassDao;
+    }
+
+    public CreateDcaeMicroServiceController() {
+        // Empty Constructor
+    }
+
+    protected PolicyRestAdapter policyAdapter = null;
+    private int priorityCount;
+    private Map<String, String> attributesListRefMap = new HashMap<>();
+    private Map<String, LinkedList<String>> arrayTextList = new HashMap<>();
+    private Map<String, String> jsonStringValues = new HashMap<>();
+
+    public PolicyRestAdapter setDataToPolicyRestAdapter(PolicyRestAdapter policyData, JsonNode root) {
+
+        String jsonContent = null;
+        try {
+            LOGGER.info("policyJSON :" + (root.get(POLICYJSON)).toString());
+
+            String tempJson = root.get(POLICYJSON).toString();
+            JSONObject policyJSON = new JSONObject(root.get(POLICYJSON).toString());
+            if (policyJSON != null) {
+                tempJson = saveOriginalJsonObject(policyJSON, jsonStringValues).toString();
+            }
+            // ---replace empty value with the value below before calling decodeContent method.
+            String dummyValue = "*empty-value*" + UUID.randomUUID().toString();
+            LOGGER.info("dummyValue:" + dummyValue);
+            tempJson =
+                    StringUtils.replaceEach(tempJson, new String[] {"\"\""}, new String[] {"\"" + dummyValue + "\""});
+            ObjectMapper mapper = new ObjectMapper();
+            JsonNode tempJsonNode = mapper.readTree(tempJson);
+            jsonContent = decodeContent(tempJsonNode).toString();
+            constructJson(policyData, jsonContent, dummyValue);
+        } catch (Exception e) {
+            LOGGER.error("Error while decoding microservice content", e);
+        }
+
+        // ----Here is the final step to reset the original value back.
+        if (policyData.getJsonBody() != null && jsonStringValues.size() > 0) {
+            String contentBody = policyData.getJsonBody();
+            JSONObject contentJson = new JSONObject(contentBody);
+            JSONObject content = contentJson.getJSONObject("content");
+            content = setOriginalJsonObject(content, jsonStringValues);
+            contentJson.put("content", content);
+            policyData.setJsonBody(contentJson.toString());
+        }
+
+        return policyData;
+    }
+
+    private JSONObject saveOriginalJsonObject(JSONObject jsonObj, Map<String, String> jsonStringValues) {
+        for (Object key : jsonObj.keySet()) {
+            String keyStr = (String) key;
+            Object keyvalue = jsonObj.get(keyStr);
+            if (keyvalue.toString().contains("{\\\"") || keyvalue.toString().contains("\\\"")) {
+                jsonStringValues.put(keyStr, keyvalue.toString());
+                // --- set default value
+                jsonObj.put(keyStr, "JSON_STRING");
+            }
+
+            // for nested objects iteration if required
+            if (keyvalue instanceof JSONObject) {
+                saveOriginalJsonObject((JSONObject) keyvalue, jsonStringValues);
+                // --- set default value
+                jsonObj.put(keyStr, "JSON_STRING");
+            }
+
+            if (keyvalue instanceof JSONArray) {
+                for (int i = 0; i < ((JSONArray) keyvalue).length(); i++) {
+                    JSONObject temp = ((JSONArray) keyvalue).getJSONObject(i);
+                    saveOriginalJsonObject(temp, jsonStringValues);
+                }
+            }
+        }
+
+        return jsonObj;
+    }
+
+    private JSONObject setOriginalJsonObject(JSONObject jsonObj, Map<String, String> jsonStringValues) {
+        for (Object key : jsonObj.keySet()) {
+            String keyStr = (String) key;
+            Object keyvalue = jsonObj.get(keyStr);
+            String originalValue = getOriginalValue(keyStr);
+            if (originalValue != null) {
+                jsonObj.put(keyStr, originalValue);
+            }
+
+            // for nested objects iteration if required
+            if (keyvalue instanceof JSONObject) {
+                setOriginalJsonObject((JSONObject) keyvalue, jsonStringValues);
+                jsonObj.put(keyStr, originalValue);
+            }
+
+            if (keyvalue instanceof JSONArray) {
+                for (int i = 0; i < ((JSONArray) keyvalue).length(); i++) {
+                    JSONObject temp = ((JSONArray) keyvalue).getJSONObject(i);
+                    setOriginalJsonObject(temp, jsonStringValues);
+                }
+            }
+        }
+
+        return jsonObj;
+    }
+
+    private GroupPolicyScopeList getPolicyObject(String policyScope) {
+        return (GroupPolicyScopeList) commonClassDao.getEntityItem(GroupPolicyScopeList.class, "name", policyScope);
+    }
+
+    private PolicyRestAdapter constructJson(PolicyRestAdapter policyAdapter, String jsonContent, String dummyValue)
+            throws IOException {
+        ObjectWriter om = new ObjectMapper().writer();
+        String json = "";
+        DCAEMicroServiceObject microServiceObject = new DCAEMicroServiceObject();
+        MicroServiceModels returnModel = new MicroServiceModels();
+        microServiceObject.setTemplateVersion(XACMLProperties.getProperty(XACMLRestProperties.TemplateVersion_MS));
+        if (policyAdapter.getServiceType() != null) {
+            microServiceObject.setService(policyAdapter.getServiceType());
+            microServiceObject.setVersion(policyAdapter.getVersion());
+            returnModel = getAttributeObject(microServiceObject.getService(), microServiceObject.getVersion());
+        }
+        if (returnModel.getAnnotation() == null || returnModel.getAnnotation().isEmpty()) {
+            if (policyAdapter.getUuid() != null) {
+                microServiceObject.setUuid(policyAdapter.getUuid());
+            }
+            if (policyAdapter.getLocation() != null) {
+                microServiceObject.setLocation(policyAdapter.getLocation());
+            }
+            if (policyAdapter.getConfigName() != null) {
+                microServiceObject.setConfigName(policyAdapter.getConfigName());
+            }
+            GroupPolicyScopeList policyScopeValue = getPolicyObject(policyAdapter.getPolicyScope());
+            if (policyScopeValue != null) {
+                microServiceObject.setPolicyScope(policyScopeValue.getGroupList());
+            }
+        }
+
+        if (policyAdapter.getPolicyName() != null) {
+            microServiceObject.setPolicyName(policyAdapter.getPolicyName());
+        }
+        if (policyAdapter.getPolicyDescription() != null) {
+            microServiceObject.setDescription(policyAdapter.getPolicyDescription());
+        }
+        if (policyAdapter.getPriority() != null) {
+            microServiceObject.setPriority(policyAdapter.getPriority());
+        } else {
+            microServiceObject.setPriority("9999");
+        }
+
+        if (policyAdapter.getRiskLevel() != null) {
+            microServiceObject.setRiskLevel(policyAdapter.getRiskLevel());
+        }
+        if (policyAdapter.getRiskType() != null) {
+            microServiceObject.setRiskType(policyAdapter.getRiskType());
+        }
+        if (policyAdapter.getGuard() != null) {
+            microServiceObject.setGuard(policyAdapter.getGuard());
+        }
+        microServiceObject.setContent(jsonContent);
+        String modelName = policyAdapter.getServiceType();
+        String versionName = policyAdapter.getVersion();
+        List<Object> triggerData = commonClassDao.getDataById(MicroServiceModels.class, "modelName:version",
+                modelName + ":" + versionName);
+        MicroServiceModels model = null;
+        boolean ruleCheck = false;
+        boolean SymptomRuleCheck = false;
+        if (!triggerData.isEmpty()) {
+            model = (MicroServiceModels) triggerData.get(0);
+            if (model.getRuleFormation() != null) {
+                microServiceObject.setUiContent(jsonContent);
+                ruleCheck = true;
+                if (model.getRuleFormation().contains("@")) {
+                    SymptomRuleCheck = true;
+                }
+            }
+        }
+        try {
+            json = om.writeValueAsString(microServiceObject);
+        } catch (JsonProcessingException e) {
+            LOGGER.error("Error writing out the object", e);
+        }
+        LOGGER.info("input json: " + json);
+        LOGGER.info("input jsonContent: " + jsonContent);
+        String cleanJson = cleanUPJson(json);
+        // --- reset empty value back after called cleanUPJson method and before calling removeNullAttributes
+        String tempJson =
+                StringUtils.replaceEach(cleanJson, new String[] {"\"" + dummyValue + "\""}, new String[] {"\"\""});
+        LOGGER.info("tempJson: " + tempJson);
+        cleanJson = removeNullAttributes(tempJson);
+        if (cleanJson.contains("\\")) {
+            cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\\"}, new String[] {""});
+        }
+        policyAdapter.setJsonBody(cleanJson);
+        // for Triggers
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode tempJsonNode = mapper.readTree(cleanJson);
+        if (ruleCheck) {
+            // JsonNode tempJsonNode = mapper.readTree(cleanJson);
+            ObjectNode finalJson = (ObjectNode) tempJsonNode;
+            JsonNode object = tempJsonNode.get("content");
+            String primaryKey1 = model.getRuleFormation();
+            String[] primaryKeyForSignatures = primaryKey1.split("@");
+            for (String primaryKeyForSignature : primaryKeyForSignatures) {
+                String primarykeyAlarm = primaryKeyForSignature.substring(0, primaryKeyForSignature.indexOf('.'));
+                JsonNode triggerSig = object.get(primarykeyAlarm);
+                sigRules = new HashMap<>();
+                String parseKey = primaryKeyForSignature.substring(primaryKeyForSignature.indexOf('.') + 1);
+                StringBuilder sb = null;
+                if (triggerSig instanceof ArrayNode) {
+                    for (int i = 0; i < triggerSig.size(); i++) {
+                        sb = new StringBuilder();
+                        parseData(triggerSig.get(i), parseKey);
+                        sb.append("(");
+                        List<?> keyList = new ArrayList<>(sigRules.keySet());
+                        for (int j = keyList.size() - 1; j >= 0; j--) {
+                            String key = (String) keyList.get(j);
+                            String jsonNode = sigRules.get(key);
+                            constructRule(sb, jsonNode, sigRules);
+                        }
+                        sb.append(")").toString();
+                        putRuletoJson(tempJsonNode, i, sb, parseKey, primarykeyAlarm);
+                        sigRules = new HashMap<>();
+                    }
+                } else {
+                    sb = new StringBuilder();
+                    parseData(triggerSig, parseKey);
+                }
+            }
+            policyAdapter.setJsonBody(finalJson.toString());
+        }
+        return policyAdapter;
+    }
+
+    private JsonNode putRuletoJson(JsonNode tmpJsonNode, int item, StringBuilder sb, String parseKey,
+            String primaryKey) {
+        JsonNode tmp = tmpJsonNode;
+        ObjectNode objectNode = (ObjectNode) tmp;
+        JsonNode jsonNode = tmpJsonNode.get("content").get(primaryKey).get(item);
+        JsonNode tempRuleJsonNode = tmpJsonNode.get("content").get(primaryKey).get(item);
+        String[] tempSt = parseKey.split("\\.");
+        for (String value : tempSt) {
+            if (value.contains("[")) {
+                if (tempRuleJsonNode instanceof ArrayNode) {
+                    JsonNode tempRuleNode = tempRuleJsonNode.get(item);
+                    ((ArrayNode) tempRuleJsonNode).removeAll();
+                    ((ArrayNode) tempRuleJsonNode).add(tempRuleNode);
+                    objectNode = (ObjectNode) tempRuleJsonNode.get(item);
+                }
+                String key = value.substring(0, value.indexOf('['));
+                objectNode.remove(key);
+                objectNode.put(key, sb.toString());
+                return tmp;
+            } else {
+                jsonNode = jsonNode.get(value);
+                if (jsonNode instanceof ArrayNode) {
+                    tempRuleJsonNode = jsonNode;
+                    jsonNode = jsonNode.get(item);
+                }
+            }
+        }
+        return tmp;
+    }
+
+    public boolean checkPattern(String patternString) {
+        return PATTERN.matcher(patternString).find();
+    }
+
+    /**
+     * Construct rule.
+     *
+     * @param sb the sb
+     * @param jsonNode the json node
+     * @param sigRules2 the sig rules 2
+     */
+    public void constructRule(StringBuilder sb, String jsonNode, Map<String, String> sigRules2) {
+        int count = 0;
+        String cleanJsonNode = jsonNode.replace("\"\"", " ");
+        cleanJsonNode = cleanJsonNode.replaceAll("\"", "");
+        cleanJsonNode = cleanJsonNode.replaceAll("\\(", "");
+        cleanJsonNode = cleanJsonNode.replaceAll("\\)", "");
+        boolean flag = false;
+        if (cleanJsonNode.contains("OR")) {
+            sb.append("(");
+            flag = true;
+        }
+        for (String rowValue : cleanJsonNode.split(" ")) {
+            if (checkPattern(rowValue)) {
+                String value = sigRules2.get(rowValue);
+                LOGGER.info("   Value is:" + value);
+                constructRule(sb, value, sigRules2);
+            } else {
+                if ((count == 0) && (!("AND").equals(rowValue)) && (!("OR").equals(rowValue))) {
+                    sb.append("(");
+                }
+                count++;
+                LOGGER.info(" " + rowValue + " ");
+                sb.append(" " + rowValue + " ");
+                if (count % 3 == 0) {
+                    sb.append(")");
+                    count = 0;
+                }
+            }
+        }
+        if (flag) {
+            sb.append(")");
+        }
+    }
+
+    /**
+     * Parses the data.
+     *
+     * @param jsonNode the json node
+     * @param string the string
+     */
+    public void parseData(JsonNode jsonNode, String string) {
+        if (string.contains(".")) {
+            String firstIndex = string.substring(0, string.indexOf('.'));
+            JsonNode signtures = jsonNode.get(firstIndex);
+            String subIndex = string.substring(firstIndex.length() + 1);
+            if (signtures instanceof ArrayNode) {
+                for (int i = 0; i < signtures.size(); i++) {
+                    parseData(signtures.get(i), subIndex);
+                }
+            } else {
+                parseData(signtures, subIndex);
+            }
+        } else {
+            if (string.contains("[")) {
+                String ruleIndex = string.substring(0, string.indexOf('['));
+                String[] keys = string.substring(string.indexOf('[') + 1, string.lastIndexOf(']')).split(",");
+                String key = "A" + Integer.valueOf(sigRules.size() + 1);
+                JsonNode node = jsonNode.get(ruleIndex);
+                StringBuilder sb = new StringBuilder("(");
+                for (int i = 0; i < keys.length; i++) {
+                    sb.append(node.get(keys[i].trim()));
+                }
+                sb.append(")");
+                sigRules.put(key, sb.toString());
+            }
+        }
+    }
+
+    public String removeNullAttributes(String cleanJson) {
+        ObjectMapper mapper = new ObjectMapper();
+
+        try {
+            JsonNode rootNode = mapper.readTree(cleanJson);
+            JsonNode returnNode = mapper.readTree(cleanJson);
+            Iterator<Map.Entry<String, JsonNode>> fieldsIterator = rootNode.fields();
+            boolean remove = false;
+            JsonObject removed = null;
+            boolean contentChanged = false;
+            while (fieldsIterator.hasNext()) {
+                Map.Entry<String, JsonNode> field = fieldsIterator.next();
+                final String key = field.getKey();
+                final JsonNode value = field.getValue();
+                if ("content".equalsIgnoreCase(key)) {
+                    String contentStr = value.toString();
+                    try (JsonReader reader = Json.createReader(new StringReader(contentStr))) {
+                        JsonObject jsonContent = reader.readObject();
+                        removed = removeNull(jsonContent);
+                        if (!jsonContent.toString().equals(removed.toString())) {
+                            contentChanged = true;
+                        }
+                    }
+
+                    if (value == null || value.isNull()) {
+                        ((ObjectNode) returnNode).remove(key);
+                        remove = true;
+                    }
+                }
+                if (remove) {
+                    cleanJson = returnNode.toString();
+                }
+                if (value == null || value.isNull()) {
+                    ((ObjectNode) returnNode).remove(key);
+                    remove = true;
+                }
+            }
+            if (remove) {
+                cleanJson = returnNode.toString();
+            }
+
+            if (contentChanged) {
+                // set modified content to cleanJson
+                JSONObject jObject = new JSONObject(cleanJson);
+                jObject.put("content", removed.toString());
+                cleanJson = cleanUPJson(jObject.toString());
+            }
+
+        } catch (IOException e) {
+            LOGGER.error("Error writing out the JsonNode", e);
+        }
+        return cleanJson;
+    }
+
+    /**
+     * To verify if it is a JSON string. If it is, then return its original value.
+     *
+     * @param key holds the values
+     * @return
+     */
+    private String getOriginalValue(String key) {
+        for (String k : jsonStringValues.keySet()) {
+            if (k.contains("@")) {
+                String[] arrOfKeys = k.split("@");
+                for (int i = 0; i < arrOfKeys.length; i++) {
+                    if (arrOfKeys[i].contains(".")) {
+                        arrOfKeys[i] = arrOfKeys[i].substring(arrOfKeys[i].indexOf(".") + 1);
+                        if (arrOfKeys[i].equals(key)) {
+                            return StringUtils.replaceEach(jsonStringValues.get(k), new String[] {"\""},
+                                    new String[] {"\\\""});
+                        }
+                    }
+                }
+            }
+            if (k.endsWith(key)) {
+                return StringUtils.replaceEach(jsonStringValues.get(k), new String[] {"\""}, new String[] {"\\\""});
+            }
+        }
+
+        return null;
+    }
+
+    public JsonArray removeNull(JsonArray array) {
+        JsonArrayBuilder builder = Json.createArrayBuilder();
+        int i = 0;
+        for (Iterator<JsonValue> it = array.iterator(); it.hasNext(); ++i) {
+            JsonValue value = it.next();
+            switch (value.getValueType()) {
+                case ARRAY:
+                    JsonArray a = removeNull(array.getJsonArray(i));
+                    if (!a.isEmpty())
+                        builder.add(a);
+                    break;
+                case OBJECT:
+                    JsonObject object = removeNull(array.getJsonObject(i));
+                    if (!object.isEmpty())
+                        builder.add(object);
+                    break;
+                case STRING:
+                    String s = array.getString(i);
+                    if (s != null && !s.isEmpty())
+                        builder.add(s);
+                    break;
+                case NUMBER:
+                    builder.add(array.getJsonNumber(i));
+                    break;
+                case TRUE:
+                case FALSE:
+                    builder.add(array.getBoolean(i));
+                    break;
+                case NULL:
+                    break;
+            }
+        }
+        return builder.build();
+    }
+
+    public JsonObject removeNull(JsonObject obj) {
+        JsonObjectBuilder builder = Json.createObjectBuilder();
+        for (Iterator<Entry<String, JsonValue>> it = obj.entrySet().iterator(); it.hasNext();) {
+            Entry<String, JsonValue> e = it.next();
+            String key = e.getKey();
+            JsonValue value = e.getValue();
+            switch (value.getValueType()) {
+                case ARRAY:
+                    JsonArray array = removeNull(obj.getJsonArray(key));
+                    if (!array.isEmpty())
+                        builder.add(key, array);
+                    break;
+                case OBJECT:
+                    JsonObject object = removeNull(obj.getJsonObject(key));
+                    if (!object.isEmpty()) {
+                        if (!jsonStringValues.isEmpty()) {
+                            String originalValue = getOriginalValue(key);
+                            if (originalValue != null) {
+                                builder.add(key, object.toString());
+                                break;
+                            }
+                        }
+                        builder.add(key, object);
+                    }
+                    break;
+                case STRING:
+                    String s = obj.getString(key);
+                    if (s != null && !s.isEmpty()) {
+                        if (!jsonStringValues.isEmpty()) {
+                            String originalValue = getOriginalValue(key);
+                            if (originalValue != null) {
+                                s = getOriginalValue(key);
+                            }
+                        }
+                        builder.add(key, s);
+                    }
+                    break;
+                case NUMBER:
+                    builder.add(key, obj.getJsonNumber(key));
+                    break;
+                case TRUE:
+                case FALSE:
+                    builder.add(key, obj.getBoolean(key));
+                    break;
+                case NULL:
+                    break;
+            }
+        }
+        return builder.build();
+    }
+
+    public String cleanUPJson(String json) {
+        String cleanJson = StringUtils.replaceEach(json, new String[] {"\\\\", "\\\\\\", "\\\\\\\\"},
+                new String[] {"\\", "\\", "\\"});
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\\\\\\"}, new String[] {"\\"});
+        cleanJson =
+                StringUtils.replaceEach(cleanJson, new String[] {"\\\\", "[[", "]]"}, new String[] {"\\", "[", "]"});
+
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\\\\\"", "\\\"", "\"[{", "}]\""},
+                new String[] {"\"", "\"", "[{", "}]"});
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\"[{", "}]\""}, new String[] {"[{", "}]"});
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\"[", "]\""}, new String[] {"[", "]"});
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\"{", "}\""}, new String[] {"{", "}"});
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\"\"\"", "\"\""}, new String[] {"\"", "\""});
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\\\""}, new String[] {""});
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\"\""}, new String[] {"\""});
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\"\\\\\\"}, new String[] {"\""});
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\\\\\\\""}, new String[] {"\""});
+        cleanJson = StringUtils.replaceEach(cleanJson, new String[] {"\"[", "]\""}, new String[] {"[", "]"});
+        return cleanJson;
+    }
+
+    public JSONObject decodeContent(JsonNode jsonNode) {
+        Iterator<JsonNode> jsonElements = jsonNode.elements();
+        Iterator<String> jsonKeys = jsonNode.fieldNames();
+        Map<String, String> element = new TreeMap<>();
+        while (jsonElements.hasNext() && jsonKeys.hasNext()) {
+            element.put(jsonKeys.next(), jsonElements.next().toString());
+        }
+        JSONObject jsonResult = new JSONObject();
+        JSONArray jsonArray = null;
+        String oldValue = null;
+        String nodeKey = null;
+        String arryKey = null;
+        Boolean isArray = false;
+        JsonNodeFactory nodeFactory = JsonNodeFactory.instance;
+        ObjectNode node = nodeFactory.objectNode();
+        String prevKey = null;
+        String presKey;
+        for (Entry<String, String> entry : element.entrySet()) {
+            String key = entry.getKey();
+            String value = entry.getValue();
+            if (key.contains(".")) {
+                presKey = key.substring(0, key.indexOf('.'));
+            } else if (key.contains("@")) {
+                presKey = key.substring(0, key.indexOf('@'));
+            } else {
+                presKey = key;
+            }
+            // first check if we are different from old.
+            LOGGER.info(key + "\n");
+            if (jsonArray != null && jsonArray.length() > 0 && key.contains("@") && !key.contains(".")
+                    && oldValue != null) {
+                if (!oldValue.equals(key.substring(0, key.indexOf('@')))) {
+                    jsonResult.put(oldValue, jsonArray);
+                    jsonArray = new JSONArray();
+                }
+            } else if (jsonArray != null && jsonArray.length() > 0 && !presKey.equals(prevKey) && oldValue != null) {
+                jsonResult.put(oldValue, jsonArray);
+                isArray = false;
+                jsonArray = new JSONArray();
+            }
+
+            prevKey = presKey;
+            //
+            if (key.contains(".")) {
+                if (nodeKey == null) {
+                    nodeKey = key.substring(0, key.indexOf('.'));
+                }
+                if (nodeKey.equals(key.substring(0, key.indexOf('.')))) {
+                    node.put(key.substring(key.indexOf('.') + 1), value);
+                } else {
+                    if (node.size() != 0) {
+                        if (nodeKey.contains("@")) {
+                            if (arryKey == null) {
+                                arryKey = nodeKey.substring(0, nodeKey.indexOf('@'));
+                            }
+                            if (nodeKey.endsWith("@0")) {
+                                isArray = true;
+                                jsonArray = new JSONArray();
+                            }
+                            if (jsonArray != null && arryKey.equals(nodeKey.substring(0, nodeKey.indexOf('@')))) {
+                                jsonArray.put(decodeContent(node));
+                            }
+                            if ((key.contains("@") && !arryKey.equals(key.substring(0, nodeKey.indexOf('@'))))
+                                    || !key.contains("@")) {
+                                jsonResult.put(arryKey, jsonArray);
+                                jsonArray = new JSONArray();
+                            }
+                            arryKey = nodeKey.substring(0, nodeKey.indexOf('@'));
+                        } else {
+                            isArray = false;
+                            jsonResult.put(nodeKey, decodeContent(node));
+                        }
+                        node = nodeFactory.objectNode();
+                    }
+                    nodeKey = key.substring(0, key.indexOf('.'));
+                    if (nodeKey.contains("@")) {
+                        arryKey = nodeKey.substring(0, nodeKey.indexOf('@'));
+                    }
+                    node.put(key.substring(key.indexOf('.') + 1), value);
+                }
+            } else {
+                if (node.size() != 0) {
+                    if (nodeKey.contains("@")) {
+                        if (arryKey == null) {
+                            arryKey = nodeKey.substring(0, nodeKey.indexOf('@'));
+                        }
+                        if (nodeKey.endsWith("@0")) {
+                            isArray = true;
+                            jsonArray = new JSONArray();
+                        }
+                        if (jsonArray != null && arryKey.equals(nodeKey.substring(0, nodeKey.indexOf('@')))) {
+                            jsonArray.put(decodeContent(node));
+                        }
+                        jsonResult.put(arryKey, jsonArray);
+                        jsonArray = new JSONArray();
+                        arryKey = nodeKey.substring(0, nodeKey.indexOf('@'));
+                    } else {
+                        isArray = false;
+                        jsonResult.put(nodeKey, decodeContent(node));
+                    }
+                    node = nodeFactory.objectNode();
+                }
+                if (key.contains("@")) {
+                    isArray = true;
+                    if (key.endsWith("@0") || jsonArray == null) {
+                        jsonArray = new JSONArray();
+                    }
+                } else if (!key.contains("@")) {
+                    isArray = false;
+                }
+                if (isArray) {
+                    if (oldValue == null) {
+                        oldValue = key.substring(0, key.indexOf('@'));
+                    }
+                    if (oldValue != prevKey) {
+                        oldValue = key.substring(0, key.indexOf('@'));
                     }
+                    if (oldValue.equals(key.substring(0, key.indexOf('@')))) {
+                        jsonArray.put(value);
+                    } else {
+                        jsonResult.put(oldValue, jsonArray);
+                        jsonArray = new JSONArray();
+                    }
+                    oldValue = key.substring(0, key.indexOf('@'));
+                } else {
+                    jsonResult.put(key, value);
+                }
+            }
+        }
+        if (node.size() > 0) {
+            if (nodeKey.contains("@")) {
+                if (jsonArray == null) {
+                    jsonArray = new JSONArray();
+                }
+                if (arryKey == null) {
+                    arryKey = nodeKey.substring(0, nodeKey.indexOf('@'));
+                }
+                jsonArray.put(decodeContent(node));
+                jsonResult.put(arryKey, jsonArray);
+                isArray = false;
+            } else {
+                jsonResult.put(nodeKey, decodeContent(node));
+            }
+        }
+        if (isArray && jsonArray.length() > 0) {
+            jsonResult.put(oldValue, jsonArray);
+        }
+        return jsonResult;
+    }
+
+    @RequestMapping(
+            value = {"/policyController/getDCAEMSTemplateData.htm"},
+            method = {org.springframework.web.bind.annotation.RequestMethod.POST})
+    public ModelAndView getDCAEMSTemplateData(HttpServletRequest request, HttpServletResponse response)
+            throws IOException {
+        // TreeSet is used to ensure that individual items appear before their containing collection.
+        allManyTrueKeys = new TreeSet<>();
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        JsonNode root = mapper.readTree(request.getReader());
+
+        String value = root.get("policyData").toString().replaceAll("^\"|\"$", "");
+        String servicename = value.split("-v")[0];
+        String version = null;
+        if (value.contains("-v")) {
+            version = value.split("-v")[1];
+        }
+        MicroServiceModels returnModel = getAttributeObject(servicename, version);
+
+        MicroserviceHeaderdeFaults returnHeaderDefauls = getHeaderDefaultsObject(value);
+        JSONObject jsonHdDefaultObj = null;
+        if (returnHeaderDefauls != null) {
+            jsonHdDefaultObj = new JSONObject();
+            jsonHdDefaultObj.put("onapName", returnHeaderDefauls.getOnapName());
+            jsonHdDefaultObj.put("guard", returnHeaderDefauls.getGuard());
+            jsonHdDefaultObj.put("riskLevel", returnHeaderDefauls.getRiskLevel());
+            jsonHdDefaultObj.put("riskType", returnHeaderDefauls.getRiskType());
+            jsonHdDefaultObj.put("priority", returnHeaderDefauls.getPriority());
+        }
+        String headDefautlsData = "";
+        if (jsonHdDefaultObj != null) {
+            headDefautlsData = jsonHdDefaultObj.toString();
+        } else {
+            headDefautlsData = "null";
+        }
+
+        // Get all keys with "MANY-true" defined in their value from subAttribute
+        Set<String> allkeys = null;
+        if (returnModel.getSub_attributes() != null && !returnModel.getSub_attributes().isEmpty()) {
+            JSONObject json = new JSONObject(returnModel.getSub_attributes());
+            getAllKeys(json);
+            allkeys = allManyTrueKeys;
+            allManyTrueKeys = new TreeSet<>();
+            LOGGER.info("allkeys : " + allkeys);
+        }
+
+        // Get element order info
+        String dataOrderInfo = returnModel.getDataOrderInfo();
+        if (dataOrderInfo != null && !dataOrderInfo.startsWith("\"")) {
+            dataOrderInfo = "\"" + dataOrderInfo + "\"";
+        }
+        LOGGER.info("dataOrderInfo : " + dataOrderInfo);
+
+        String allMnyTrueKeys = "";
+        if (allkeys != null) {
+            allMnyTrueKeys = allkeys.toString();
+        }
+
+        String jsonModel = createMicroSeriveJson(returnModel, allkeys);
+
+        JSONObject jsonObject = new JSONObject(jsonModel);
+
+        JSONObject finalJsonObject = null;
+        if (allkeys != null) {
+            Iterator<String> iter = allkeys.iterator();
+            while (iter.hasNext()) {
+                // Convert to array values for MANY-true keys
+                finalJsonObject = convertToArrayElement(jsonObject, iter.next());
+                jsonObject = finalJsonObject;
+            }
+        }
+
+        if (finalJsonObject != null) {
+            LOGGER.info(finalJsonObject.toString());
+            jsonModel = finalJsonObject.toString();
+        }
+
+        // get all properties with "MANY-true" defined in Ref_attributes
+        Set<String> manyTrueProperties = getManyTrueProperties(returnModel.getRef_attributes());
+        if (manyTrueProperties != null) {
+            JSONObject jsonObj = new JSONObject(jsonModel);
+            for (String s : manyTrueProperties) {
+                LOGGER.info(s);
+                // convert to array element for MANY-true properties
+                finalJsonObject = convertToArrayElement(jsonObj, s.trim());
+                jsonObj = finalJsonObject;
+            }
+
+            if (finalJsonObject != null) {
+                LOGGER.info(finalJsonObject.toString());
+                jsonModel = finalJsonObject.toString();
+            }
+        }
+
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application / json");
+        request.setCharacterEncoding("UTF-8");
+        List<Object> list = new ArrayList<>();
+        PrintWriter out = response.getWriter();
+        String responseString = mapper.writeValueAsString(returnModel);
+
+        JSONObject j = null;
+
+        if ("".equals(allMnyTrueKeys)) {
+            j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + ",dataOrderInfo:"
+                    + dataOrderInfo + ",headDefautlsData:" + headDefautlsData + "}");
+        } else {
+            j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + ",allManyTrueKeys: "
+                    + allMnyTrueKeys + ",dataOrderInfo:" + dataOrderInfo + ",headDefautlsData:" + headDefautlsData
+                    + "}");
+        }
+        list.add(j);
+        out.write(list.toString());
+        return null;
+    }
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    private String createMicroSeriveJson(MicroServiceModels returnModel, Set<String> allkeys) {
+        Map<String, String> attributeMap = new HashMap<>();
+        Map<String, String> refAttributeMap = new HashMap<>();
+        String attribute = returnModel.getAttributes();
+        if (attribute != null) {
+            attribute = attribute.trim();
+        }
+        String refAttribute = returnModel.getRef_attributes();
+        if (refAttribute != null) {
+            refAttribute = refAttribute.trim();
+        }
+        String enumAttribute = returnModel.getEnumValues();
+        if (enumAttribute != null) {
+            enumAttribute = enumAttribute.trim();
+        }
+        if (!StringUtils.isEmpty(attribute)) {
+            attributeMap = convert(attribute, ",");
+        }
+        if (!StringUtils.isEmpty(refAttribute)) {
+            refAttributeMap = convert(refAttribute, ",");
+        }
+
+        Gson gson = new Gson();
+
+        String subAttributes = returnModel.getSub_attributes();
+        if (subAttributes != null) {
+            subAttributes = subAttributes.trim();
+        } else {
+            subAttributes = "";
+        }
+
+        Map gsonObject = (Map) gson.fromJson(subAttributes, Object.class);
+
+        JSONObject object = new JSONObject();
+        JSONArray array = new JSONArray();
+
+        for (Entry<String, String> keySet : attributeMap.entrySet()) {
+            array = new JSONArray();
+            String value = keySet.getValue();
+            if ("true".equalsIgnoreCase(keySet.getValue().split("MANY-")[1])) {
+                array.put(value);
+                object.put(keySet.getKey().trim(), array);
+            } else {
+                object.put(keySet.getKey().trim(), value.trim());
+            }
+        }
+
+        for (Entry<String, String> keySet : refAttributeMap.entrySet()) {
+            array = new JSONArray();
+            String value = keySet.getValue().split(":")[0];
+            if (gsonObject.containsKey(value)) {
+                if ("true".equalsIgnoreCase(keySet.getValue().split("MANY-")[1])) {
+                    array.put(recursiveReference(value, gsonObject, enumAttribute));
+                    object.put(keySet.getKey().trim(), array);
+                } else {
+                    object.put(keySet.getKey().trim(), recursiveReference(value, gsonObject, enumAttribute));
+                }
+            } else {
+                if ("true".equalsIgnoreCase(keySet.getValue().split("MANY-")[1])) {
+                    array.put(value.trim());
+                    object.put(keySet.getKey().trim(), array);
+                } else {
+                    object.put(keySet.getKey().trim(), value.trim());
+                }
+            }
+        }
+
+        return object.toString();
+    }
+
+    @SuppressWarnings("unchecked")
+    private JSONObject recursiveReference(String name, Map<String, String> subAttributeMap, String enumAttribute) {
+        JSONObject object = new JSONObject();
+        Map<String, String> map;
+        Object returnClass = subAttributeMap.get(name);
+        map = (Map<String, String>) returnClass;
+        JSONArray array;
+
+        for (Entry<String, String> m : map.entrySet()) {
+            String[] splitValue = m.getValue().split(":");
+            array = new JSONArray();
+            if (subAttributeMap.containsKey(splitValue[0])) {
+                if ("true".equalsIgnoreCase(m.getValue().split("MANY-")[1])) {
+                    array.put(recursiveReference(splitValue[0], subAttributeMap, enumAttribute));
+                    object.put(m.getKey().trim(), array);
+                } else {
+                    object.put(m.getKey().trim(), recursiveReference(splitValue[0], subAttributeMap, enumAttribute));
+                }
+            } else {
+                if ("true".equalsIgnoreCase(m.getValue().split("MANY-")[1])) {
+                    array.put(splitValue[0].trim());
+                    object.put(m.getKey().trim(), array);
+                } else {
+                    object.put(m.getKey().trim(), splitValue[0].trim());
+                }
+            }
+        }
+
+        return object;
+    }
+
+    public JSONObject convertToArrayElement(JSONObject json, String keyValue) {
+        return convertToArrayElement(json, new HashSet<>(), keyValue);
+    }
+
+    private JSONObject convertToArrayElement(JSONObject json, Set<String> keys, String keyValue) {
+        for (String key : json.keySet()) {
+            Object obj = json.get(key);
+            if (key.equals(keyValue.trim())) {
+                if (!(obj instanceof JSONArray)) {
+                    JSONArray newJsonArray = new JSONArray();
+                    newJsonArray.put(obj);
+                    json.put(key, newJsonArray);
+                }
+                LOGGER.info("key : " + key);
+                LOGGER.info("obj : " + obj);
+                LOGGER.info("json.get(key) : " + json.get(key));
+                LOGGER.info("keyValue : " + keyValue);
+                keys.addAll(json.keySet());
+
+                return json;
+            }
+
+            if (obj instanceof JSONObject) {
+                convertToArrayElement(json.getJSONObject(key), keyValue);
+            }
+
+            if (obj instanceof JSONArray) {
+                convertToArrayElement(json.getJSONArray(key).getJSONObject(0), keyValue);
+            }
+        }
+
+        return json;
+    }
+
+    // call this method to get all MANY-true properties
+    public Set<String> getManyTrueProperties(String referAttributes) {
+        LOGGER.info("referAttributes : " + referAttributes);
+        Set<String> manyTrueProperties = new HashSet<>();
+
+        if (referAttributes != null) {
+            String[] referAarray = referAttributes.split(",");
+            String[] element = null;
+            for (int i = 0; i < referAarray.length; i++) {
+                element = referAarray[i].split("=");
+                if (element.length > 1 && element[1].contains("MANY-true")) {
+                    manyTrueProperties.add(element[0]);
+                }
+            }
+        }
+
+        return manyTrueProperties;
+    }
+
+    // call this method to start the recursive
+    private Set<String> getAllKeys(JSONObject json) {
+        return getAllKeys(json, new HashSet<>());
+    }
+
+    private Set<String> getAllKeys(JSONArray arr) {
+        return getAllKeys(arr, new HashSet<>());
+    }
+
+    private Set<String> getAllKeys(JSONArray arr, Set<String> keys) {
+        for (int i = 0; i < arr.length(); i++) {
+            Object obj = arr.get(i);
+            if (obj instanceof JSONObject)
+                keys.addAll(getAllKeys(arr.getJSONObject(i)));
+            if (obj instanceof JSONArray)
+                keys.addAll(getAllKeys(arr.getJSONArray(i)));
+        }
+
+        return keys;
+    }
 
-                                       if  (value==null || value.isNull()){
-                                               ((ObjectNode) returnNode).remove(key);
-                                               remove = true;
-                                       }
-                               }
-                               if (remove){
-                                       cleanJson = returnNode.toString();
-                               }
-                               if  (value==null || value.isNull()){
-                                       ((ObjectNode) returnNode).remove(key);
-                                       remove = true;
-                               }
-                       }
-                       if (remove){
-                               cleanJson = returnNode.toString();
-                       }
-                       
-                       if(contentChanged){
-                               //set modified content to cleanJson
-                               JSONObject  jObject  =  new JSONObject(cleanJson);      
-                               jObject.put("content",removed.toString());
-                               cleanJson = cleanUPJson(jObject.toString());
-                       }
-                       
-               } catch (IOException e) {
-                       LOGGER.error("Error writing out the JsonNode",e);
-               }
-               return cleanJson;
-       }
-       
-       public static JsonArray removeNull(JsonArray array) {
-           JsonArrayBuilder builder = Json.createArrayBuilder();
-           int i = 0;
-           for (Iterator<JsonValue> it = array.iterator(); it.hasNext(); ++i) {
-               JsonValue value = it.next();
-               switch (value.getValueType()) {
-               case ARRAY:
-                   JsonArray a = removeNull(array.getJsonArray(i));
-                   if (!a.isEmpty())
-                       builder.add(a);
-                   break;
-               case OBJECT:
-                   JsonObject object = removeNull(array.getJsonObject(i));
-                   if (!object.isEmpty())
-                       builder.add(object);
-                   break;
-               case STRING:
-                   String s = array.getString(i);
-                   if (s != null && !s.isEmpty())
-                       builder.add(s);
-                   break;
-               case NUMBER:
-                   builder.add(array.getJsonNumber(i));
-                   break;
-               case TRUE:
-               case FALSE:
-                   builder.add(array.getBoolean(i));
-                   break;
-               case NULL:
-                   break;
-               }
-           }
-           return builder.build();
-       }
-
-       public static JsonObject removeNull(JsonObject obj) {
-           JsonObjectBuilder builder = Json.createObjectBuilder();
-           for (Iterator<Entry<String, JsonValue>> it = obj.entrySet().iterator(); it.hasNext();) {
-               Entry<String, JsonValue> e = it.next();
-               String key = e.getKey();
-               JsonValue value = e.getValue();
-               switch (value.getValueType()) {
-               case ARRAY:
-                   JsonArray array = removeNull(obj.getJsonArray(key));
-                   if (!array.isEmpty())
-                       builder.add(key, array);
-                   break;
-               case OBJECT:
-                   JsonObject object = removeNull(obj.getJsonObject(key));
-                   if (!object.isEmpty())
-                       builder.add(key, object);
-                   break;
-               case STRING:
-                   String s = obj.getString(key);
-                   if (s != null && !s.isEmpty())
-                       builder.add(key, s);
-                   break;
-               case NUMBER:
-                   builder.add(key, obj.getJsonNumber(key));
-                   break;
-               case TRUE:
-               case FALSE:
-                   builder.add(key, obj.getBoolean(key));
-                   break;
-               case NULL:
-                   break;
-               }
-           }
-           return builder.build();
-       }
-       
-       // Second index of dot should be returned. 
-       public int stringBetweenDots(String str){
-               String stringToSearch=str;
-               String[]ss=stringToSearch.split("\\.");
-               if(ss!=null){
-                       int len= ss.length;
-                       if(len>2){
-                               uniqueKeys.add(ss[2]);
-                       }
-               }
-               
-               return uniqueKeys.size();
-       }
-       
-       public void stringBetweenDotsForDataFields(String str){
-               String stringToSearch=str;
-               String[]ss=stringToSearch.split("\\.");
-               if(ss!=null){
-                       int len= ss.length;
-
-                       if(len>2){
-                               uniqueDataKeys.add(ss[0]+"%"+ss[2]);
-                       }
-               }
-       }
-       
-       @SuppressWarnings("unchecked")
-       public Map<String, String> load(String fileName) throws IOException { 
-               File newConfiguration = new File(fileName);
-               Yaml yaml = new Yaml();
-               Map<Object, Object> yamlMap = null;
-               try(InputStream is = new FileInputStream(newConfiguration)){
-                       yamlMap = (Map<Object, Object>) yaml.load(is); 
-               } catch (FileNotFoundException e) {
-                       LOGGER.error(e);
-               }
-
-               StringBuilder sb = new StringBuilder(); 
-               Map<String, String> settings = new HashMap<>(); 
-               if (yamlMap == null) { 
-                       return settings; 
-               } 
-               List<String> path = new ArrayList <>(); 
-               serializeMap(settings, sb, path, yamlMap); 
-               return settings; 
-       } 
-
-       public Map<String, String> load(byte[] source) throws IOException { 
-               Yaml yaml = new Yaml(); 
-               @SuppressWarnings("unchecked")
-               Map<Object, Object> yamlMap = (Map<Object, Object>) yaml.load(Arrays.toString(source)); 
-               StringBuilder sb = new StringBuilder(); 
-               Map<String, String> settings = new HashMap <>(); 
-               if (yamlMap == null) { 
-                       return settings; 
-               } 
-               List<String> path = new ArrayList <>(); 
-               serializeMap(settings, sb, path, yamlMap); 
-               return settings; 
-       } 
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       private void serializeMap(Map<String, String> settings, StringBuilder sb, List<String> path, Map<Object, Object> yamlMap) { 
-               for (Map.Entry<Object, Object> entry : yamlMap.entrySet()) { 
-                       if (entry.getValue() instanceof Map) { 
-                               path.add((String) entry.getKey()); 
-                               serializeMap(settings, sb, path, (Map<Object, Object>) entry.getValue()); 
-                               path.remove(path.size() - 1); 
-                       } else if (entry.getValue() instanceof List) { 
-                               path.add((String) entry.getKey()); 
-                               serializeList(settings, sb, path, (List) entry.getValue()); 
-                               path.remove(path.size() - 1); 
-                       } else { 
-                               serializeValue(settings, sb, path, (String) entry.getKey(), entry.getValue()); 
-                       } 
-               } 
-       } 
-
-       @SuppressWarnings("unchecked")
-       private void serializeList(Map<String, String> settings, StringBuilder sb, List<String> path, List<String> yamlList) { 
-               int counter = 0; 
-               for (Object listEle : yamlList) { 
-                       if (listEle instanceof Map) { 
-                               path.add(Integer.toString(counter)); 
-                               serializeMap(settings, sb, path, (Map<Object, Object>) listEle); 
-                               path.remove(path.size() - 1); 
-                       } else if (listEle instanceof List) { 
-                               path.add(Integer.toString(counter)); 
-                               serializeList(settings, sb, path, (List<String>) listEle); 
-                               path.remove(path.size() - 1); 
-                       } else { 
-                               serializeValue(settings, sb, path, Integer.toString(counter), listEle); 
-                       } 
-                       counter++; 
-               } 
-       } 
-
-       private void serializeValue(Map<String, String> settings, StringBuilder sb, List<String> path, String name, Object value) { 
-               if (value == null) { 
-                       return; 
-               } 
-               sb.setLength(0); 
-               for (String pathEle : path) { 
-                       sb.append(pathEle).append('.'); 
-               } 
-               sb.append(name); 
-               settings.put(sb.toString(), value.toString()); 
-       } 
-    
-       void parseDataAndPolicyNodes(Map<String,String> map){
-               for(String key:map.keySet()){
-                       if(key.contains("policy.nodes.Root"))
-                       {
-                               continue;
-                       }
-                       else if(key.contains("policy.nodes")){
-                               String wordToFind = "policy.nodes.";
-                               int indexForPolicyNode=key.indexOf(wordToFind);
-                               String subNodeString= key.substring(indexForPolicyNode+13, key.length());
-
-                               stringBetweenDots(subNodeString);
-                       }
-                       else if(key.contains("policy.data")){
-                               String wordToFind="policy.data.";
-                               int indexForPolicyNode=key.indexOf(wordToFind);
-                               String subNodeString= key.substring(indexForPolicyNode+12, key.length());
-
-                               stringBetweenDotsForDataFields(subNodeString);
-                       }
-               }
-       }
-       
-       HashMap<String,String> parseDataNodes(Map<String,String> map){
-               HashMap<String,String> dataMapForJson=new HashMap <>(); 
-               for(String uniqueDataKey: uniqueDataKeys){
-                       if(uniqueDataKey.contains("%")){
-                               String[] uniqueDataKeySplit= uniqueDataKey.split("%");
-                               String findType=DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+TYPE;
-                               String typeValue=map.get(findType);
-                               LOGGER.info(typeValue);
-                               if(typeValue != null && typeValue.equalsIgnoreCase(STRING)||
-                                               typeValue.equalsIgnoreCase(INTEGER)
-                                 )
-                               {
-                                       String findDefault=DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+DEFAULT;
-                                       String defaultValue= map.get(findDefault);
-                                       LOGGER.info("defaultValue is:"+ defaultValue);
-                                       
-                                       String findRequired=DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+REQUIRED;
-                                       String requiredValue= map.get(findRequired);
-                                       LOGGER.info("requiredValue is:"+ requiredValue);
-                                       
-                                       StringBuilder attributeIndividualStringBuilder= new StringBuilder();
-                                       attributeIndividualStringBuilder.append(typeValue+":defaultValue-");
-                                       attributeIndividualStringBuilder.append(defaultValue+":required-");
-                                       attributeIndividualStringBuilder.append(requiredValue+MANYFALSE);
-                                       dataMapForJson.put(uniqueDataKey, attributeIndividualStringBuilder.toString());         
-                               }
-                               else if(typeValue != null && typeValue.equalsIgnoreCase(LIST)){
-                                       String findList= DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+".entry_schema.type";
-                                       String listValue=map.get(findList);
-                                       if(listValue!=null){
-                                               LOGGER.info("Type of list is:"+ listValue);
-                                               //Its userdefined
-                                               if(listValue.contains(".")){
-                                                       String trimValue=listValue.substring(listValue.lastIndexOf('.')+1);
-                                                       StringBuilder referenceIndividualStringBuilder= new StringBuilder();
-                                                       referenceIndividualStringBuilder.append(trimValue+":MANY-true");
-                                                       dataMapForJson.put(uniqueDataKey, referenceIndividualStringBuilder.toString());
-                                               }//Its string
-                                               else{
-                                                       StringBuilder stringListItems= new StringBuilder();
-                                                       stringListItems.append(uniqueDataKeySplit[1].toUpperCase()+":MANY-false");
-                                                       dataMapForJson.put(uniqueDataKey, stringListItems.toString());
-                                                       dataListBuffer.append(uniqueDataKeySplit[1].toUpperCase()+"=[");
-                                                       for(int i=0;i<10;i++){
-                                                               String findConstraints= DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+".entry_schema.constraints.0.valid_values."+i;
-                                                               String constraintsValue=map.get(findConstraints);
-                                                               LOGGER.info(constraintsValue);
-                                                               if(constraintsValue==null){
-                                                                       break;
-                                                               }
-                                                               else{
-                                                                       dataConstraints.add(constraintsValue);
-                                                                       dataListBuffer.append(constraintsValue+",");
-                                                               }
-                                                       }
-                                                       dataListBuffer.append("]#");
-                                                       
-                                                       LOGGER.info(dataListBuffer);
-                                               }
-                                       }
-                               }
-                               else{
-                                       String findUserDefined="data_types.policy.data."+uniqueDataKeySplit[0]+"."+"properties"+"."+uniqueDataKeySplit[1]+".type";
-                                       String userDefinedValue=map.get(findUserDefined);
-                                       String trimValue=userDefinedValue.substring(userDefinedValue.lastIndexOf('.')+1);
-                                       StringBuilder referenceIndividualStringBuilder= new StringBuilder();
-                                       referenceIndividualStringBuilder.append(trimValue+":MANY-false");
-                                       dataMapForJson.put(uniqueDataKey, referenceIndividualStringBuilder.toString());
-                                       
-                               }
-                       }
-               }
-               return dataMapForJson;
-       }
-       
-       void constructJsonForDataFields(HashMap<String,String> dataMapForJson){
-               HashMap<String,HashMap<String,String>> dataMapKey= new HashMap <>();
-               HashMap<String,String> hmSub;
-               for(Map.Entry<String, String> entry: dataMapForJson.entrySet()){
-                       String uniqueDataKey= entry.getKey();
-                       String[] uniqueDataKeySplit=uniqueDataKey.split("%");
-                       String value= dataMapForJson.get(uniqueDataKey);
-                       if(dataMapKey.containsKey(uniqueDataKeySplit[0])){
-                               hmSub = dataMapKey.get(uniqueDataKeySplit[0]);
-                               hmSub.put(uniqueDataKeySplit[1], value);
-                       }
-                       else{
-                               hmSub=new HashMap <>();
-                               hmSub.put(uniqueDataKeySplit[1], value);
-                       }
-                               
-                       dataMapKey.put(uniqueDataKeySplit[0], hmSub);
-               }
-                               
-               JSONObject mainObject= new JSONObject();
-               JSONObject json;
-               for(Map.Entry<String,HashMap<String,String>> entry: dataMapKey.entrySet()){
-                       String s=entry.getKey();
-                       json= new JSONObject();
-                       HashMap<String,String> jsonHm=dataMapKey.get(s);
-                       for(Map.Entry<String,String> entryMap:jsonHm.entrySet()){
-                               String key=entryMap.getKey();
-                               json.put(key, jsonHm.get(key));
-                       }
-                       mainObject.put(s,json);
-               }       
-               Iterator<String> keysItr = mainObject.keys();
-               while(keysItr.hasNext()) {
-                       String key = keysItr.next();
-                       String value = mainObject.get(key).toString();
-                       retmap.put(key, value);
-               }
-               
-               LOGGER.info("#############################################################################");
-               LOGGER.info(mainObject);
-               LOGGER.info("###############################################################################"); 
-       }
-       
-       
-       HashMap<String,HashMap<String,String>> parsePolicyNodes(Map<String,String> map){
-               HashMap<String,HashMap<String,String>> mapKey= new HashMap <>();
-               for(String uniqueKey: uniqueKeys){
-                       HashMap<String,String> hm;
-
-                       for(Map.Entry<String,String> entry:map.entrySet()){
-                               String key=entry.getKey();
-                               if(key.contains(uniqueKey) && key.contains("policy.nodes")){
-                                       if(mapKey.containsKey(uniqueKey)){
-                                               hm = mapKey.get(uniqueKey);
-                                               String keyStr= key.substring(key.lastIndexOf('.')+1);
-                                               String valueStr= map.get(key);
-                                               if(("type").equals(keyStr)){
-                                                       if(!key.contains("entry_schema"))
-                                                       {
-                                                               hm.put(keyStr,valueStr);
-                                                       }
-                                               }else{
-                                                       hm.put(keyStr,valueStr);
-                                               }
-
-                                       } else {
-                                               hm = new HashMap <>();
-                                               String keyStr= key.substring(key.lastIndexOf('.')+1);
-                                               String valueStr= map.get(key);
-                                               if(("type").equals(keyStr)){
-                                                       if(!key.contains("entry_schema"))
-                                                       {
-                                                               hm.put(keyStr,valueStr);
-                                                       }
-                                               }else{
-                                                       hm.put(keyStr,valueStr);
-                                               }
-                                               mapKey.put(uniqueKey, hm);
-                                       }
-                               }
-                       }
-               }
-               return mapKey;
-       }
-
-       void createAttributes(HashMap<String,HashMap<String,String>> mapKey){
-               StringBuilder attributeStringBuilder= new StringBuilder();
-               StringBuilder referenceStringBuilder= new StringBuilder();
-               StringBuilder listBuffer= new StringBuilder();
-               List<String> constraints= new ArrayList<>();
-               for(Map.Entry<String,HashMap<String,String>> entry: mapKey.entrySet()){
-                       String keySetString= entry.getKey();
-                       HashMap<String,String> keyValues=mapKey.get(keySetString);
-                       if(keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(STRING)||
-                                       keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(INTEGER)
-                                       ){
-                               StringBuilder attributeIndividualStringBuilder= new StringBuilder();
-                               attributeIndividualStringBuilder.append(keySetString+"=");
-                               attributeIndividualStringBuilder.append(keyValues.get("type")+":defaultValue-");
-                               attributeIndividualStringBuilder.append(keyValues.get("default")+":required-");
-                               attributeIndividualStringBuilder.append(keyValues.get("required")+":MANY-false");
-                               attributeStringBuilder.append(attributeIndividualStringBuilder+",");    
-
-                       }
-                       else if(keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(LIST)){
-                               //List Datatype
-                               Set<String> keys= keyValues.keySet();
-                               Iterator<String> itr=keys.iterator();
-                               while(itr.hasNext()){
-                                       String key= itr.next();
-                                       if((!("type").equals(key) ||("required").equals(key)))
-                                       {
-                                               String value= keyValues.get(key);
-                                               //The "." in the value determines if its a string or a user defined type.  
-                                               if (!value.contains(".")){
-                                                       //This is string
-                                                       if(StringUtils.isNumeric(key) ){  //only integer key for the value of Constrains 
-                                                           constraints.add(keyValues.get(key));
-                                                       }
-                                               }else{
-                                                       //This is user defined string
-                                                       String trimValue=value.substring(value.lastIndexOf('.')+1);
-                                                       StringBuilder referenceIndividualStringBuilder= new StringBuilder();
-                                                       referenceIndividualStringBuilder.append(keySetString+"="+trimValue+":MANY-true");
-                                                       referenceStringBuilder.append(referenceIndividualStringBuilder+",");
-                                               }
-                                       }                               
-
-                               }
-
-                               if(keyValues.get("type").equalsIgnoreCase(LIST)){
-                                       if(constraints == null || constraints.isEmpty()){
-                                               referenceStringBuilder.append(keySetString+"=MANY-true"+",");
-                                       }
-                               }
-                       }else{
-                               //User defined Datatype. 
-                               String value=keyValues.get("type");
-                               if(value != null && !value.isEmpty()){
-                                       String trimValue=value.substring(value.lastIndexOf('.')+1);
-                                       StringBuilder referenceIndividualStringBuilder= new StringBuilder();
-                                       referenceIndividualStringBuilder.append(keySetString+"="+trimValue+":MANY-false");
-                                       referenceStringBuilder.append(referenceIndividualStringBuilder+",");
-                               }else{
-                                       LOGGER.info("keyValues.get(type) is null/empty");
-                               }
-
-                       }
-                       if(constraints!=null &&constraints.isEmpty()==false){
-                               //List handling. 
-                               listBuffer.append(keySetString.toUpperCase()+"=[");
-                               for(String str:constraints){
-                                       listBuffer.append(str+",");
-                               }
-                               listBuffer.append("]#");
-                               LOGGER.info(listBuffer);
-
-
-                               StringBuilder referenceIndividualStringBuilder= new StringBuilder();
-                               referenceIndividualStringBuilder.append(keySetString+"="+keySetString.toUpperCase()+":MANY-false");
-                               referenceStringBuilder.append(referenceIndividualStringBuilder+",");
-                               constraints.clear();
-                       }
-               }
-               
-               dataListBuffer.append(listBuffer);
-               
-
-               LOGGER.info("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
-               LOGGER.info("Whole attribute String is:"+attributeStringBuilder);       
-               LOGGER.info("Whole reference String is:"+referenceStringBuilder);
-               LOGGER.info("List String is:"+listBuffer);
-               LOGGER.info("Data list buffer is:"+dataListBuffer);
-               LOGGER.info("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
-               
-               this.listConstraints=dataListBuffer.toString();
-               this.referenceAttributes=referenceStringBuilder.toString();
-               this.attributeString=attributeStringBuilder.toString();
-       }
-       
-       
-    
-       public void parseTosca (String fileName){
-               Map<String,String> map= new HashMap<>();
-    
-       try {
-                       map=load(fileName);
-                       
-                       parseDataAndPolicyNodes(map);
-                       
-                       HashMap<String,String> dataMapForJson=parseDataNodes(map);
-                       
-                       constructJsonForDataFields(dataMapForJson);     
-                       
-                       HashMap<String,HashMap<String,String>> mapKey= parsePolicyNodes(map);
-                       
-                       createAttributes(mapKey);
-               
-       } catch (IOException e) {
-               LOGGER.error(e);
-       }
-       
-       } 
-
-       private String cleanUPJson(String json) {
-               String cleanJson = StringUtils.replaceEach(json, new String[]{"\\\\", "\\\\\\", "\\\\\\\\"}, new String[]{"\\", "\\", "\\"});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\\\\\\"}, new String[]{"\\"});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\\\\", "[[", "]]"}, new String[]{"\\", "[", "]"});
-               
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\\\\\"", "\\\"", "\"[{", "}]\""}, new String[]{"\"", "\"", "[{", "}]"});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\"[{", "}]\""}, new String[]{"[{", "}]"});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\"[", "]\""}, new String[]{"[", "]"});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\"{", "}\""}, new String[]{"{", "}"});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\"\"\"", "\"\""}, new String[]{"\"", "\""});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\\\""}, new String[]{""});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\"\""}, new String[]{"\""});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\"\\\\\\"}, new String[]{"\""});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\\\\\\\""}, new String[]{"\""});
-               cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\"[", "]\""}, new String[]{"[", "]"});
-               return cleanJson;
-       }
-       
-       private JSONObject decodeContent(JsonNode jsonNode){
-               Iterator<JsonNode> jsonElements = jsonNode.elements();
-               Iterator<String> jsonKeys = jsonNode.fieldNames();
-               Map<String,String> element = new TreeMap<>();
-               while(jsonElements.hasNext() && jsonKeys.hasNext()){
-                       element.put(jsonKeys.next(), jsonElements.next().toString());
-               }
-               JSONObject jsonResult = new JSONObject();
-               JSONArray jsonArray = null;
-               String oldValue = null;
-               String nodeKey = null;
-               String arryKey = null;
-               Boolean isArray = false;
-               JsonNodeFactory nodeFactory = JsonNodeFactory.instance;
-               ObjectNode node = nodeFactory.objectNode();
-               String prevKey = null;
-               String presKey = null;
-               for(String key: element.keySet()){
-                       if(key.contains(".")){
-                               presKey = key.substring(0,key.indexOf("."));
-                       }else if(key.contains("@")){
-                               presKey = key.substring(0,key.indexOf("@"));
-                       }else{
-                               presKey = key;
-                       }
-                       // first check if we are different from old.
-                       LOGGER.info(key+"\n");
-                       if(jsonArray!=null && jsonArray.length()>0 && key.contains("@") && !key.contains(".") && oldValue!=null){
-                               if(!oldValue.equals(key.substring(0,key.indexOf("@")))){
-                                       jsonResult.put(oldValue, jsonArray);
-                                       jsonArray = new JSONArray();
-                               }
-                       }else if(jsonArray!=null && jsonArray.length()>0 && !presKey.equals(prevKey) && oldValue!=null){ 
-                               jsonResult.put(oldValue, jsonArray);
-                               isArray = false;
-                               jsonArray = new JSONArray();
-                       }
-       
-                       prevKey = presKey;
-                       // 
-                       if(key.contains(".")){
-                               if(nodeKey==null){
-                                       nodeKey = key.substring(0,key.indexOf("."));
-                               }
-                               if(nodeKey.equals(key.substring(0,key.indexOf(".")))){
-                                       node.put(key.substring(key.indexOf(".")+1), element.get(key));
-                               }else{
-                                       if(node.size()!=0){
-                                               if(nodeKey.contains("@")){
-                                                       if(arryKey==null){
-                                                               arryKey = nodeKey.substring(0,nodeKey.indexOf("@"));
-                                                       }
-                                                       if(nodeKey.endsWith("@0")){
-                                                               isArray = true;
-                                                               jsonArray = new JSONArray();
-                                                       }
-                                                       if(jsonArray != null && arryKey.equals(nodeKey.substring(0,nodeKey.indexOf("@")))){
-                                                               jsonArray.put(decodeContent(node));
-                                                       } 
-                                                       if((key.contains("@") && !arryKey.equals(key.substring(0,nodeKey.indexOf("@")))) || !key.contains("@")){
-                                                               jsonResult.put(arryKey, jsonArray);
-                                                               jsonArray = new JSONArray();
-                                                       }
-                                                       arryKey = nodeKey.substring(0,nodeKey.indexOf("@"));
-                                               }else{
-                                                       isArray = false;
-                                                       jsonResult.put(nodeKey, decodeContent(node));
-                                               }
-                                               node = nodeFactory.objectNode();
-                                       }
-                                       nodeKey = key.substring(0,key.indexOf("."));
-                                       if(nodeKey.contains("@")){
-                                               arryKey = nodeKey.substring(0,nodeKey.indexOf("@"));
-                                       }
-                                       node.put(key.substring(key.indexOf(".")+1), element.get(key));
-                               }
-                       }else if(node.size()!=0){
-                               if(nodeKey.contains("@")){
-                                       if(arryKey==null){
-                                               arryKey = nodeKey.substring(0,nodeKey.indexOf("@"));
-                                       }
-                                       if(nodeKey.endsWith("@0")){
-                                               isArray = true;
-                                               jsonArray = new JSONArray();
-                                       }
-                                       if(jsonArray != null && arryKey.equals(nodeKey.substring(0,nodeKey.indexOf("@")))){
-                                               jsonArray.put(decodeContent(node));
-                                       }
-                                       jsonResult.put(arryKey, jsonArray);
-                                       jsonArray = new JSONArray();
-                                       arryKey = nodeKey.substring(0,nodeKey.indexOf("@"));
-                               }else{
-                                       isArray = false;
-                                       jsonResult.put(nodeKey, decodeContent(node));
-                               }
-                               node = nodeFactory.objectNode();
-                               if(key.contains("@")){
-                                       isArray = true;
-                                       if(key.endsWith("@0")|| jsonArray==null){
-                                               jsonArray = new JSONArray();
-                                       }
-                               }else if(!key.contains("@")){
-                                       isArray = false;
-                               }
-                               if(isArray){
-                                       if(oldValue==null){
-                                               oldValue = key.substring(0,key.indexOf("@"));
-                                       }
-                                       if(oldValue!=prevKey){
-                                               oldValue = key.substring(0,key.indexOf("@"));
-                                       }
-                                       if(oldValue.equals(key.substring(0,key.indexOf("@")))){
-                                               jsonArray.put(element.get(key));
-                                       }else{
-                                               jsonResult.put(oldValue, jsonArray);
-                                               jsonArray = new JSONArray();
-                                       }
-                                       oldValue = key.substring(0,key.indexOf("@"));
-                               }else{
-                                       jsonResult.put(key, element.get(key));
-                               }
-                       }else{
-                               if(key.contains("@")){
-                                       isArray = true;
-                                       if(key.endsWith("@0")|| jsonArray==null){
-                                               jsonArray = new JSONArray();
-                                       }
-                               }else if(!key.contains("@")){
-                                       isArray = false;
-                               }
-                               if(isArray){
-                                       if(oldValue==null){
-                                               oldValue = key.substring(0,key.indexOf("@"));
-                                       }
-                                       if(oldValue!=prevKey){
-                                               oldValue = key.substring(0,key.indexOf("@"));
-                                       }
-                                       if(oldValue.equals(key.substring(0,key.indexOf("@")))){
-                                               jsonArray.put(element.get(key));
-                                       }else{
-                                               jsonResult.put(oldValue, jsonArray);
-                                               jsonArray = new JSONArray();
-                                       }
-                                       oldValue = key.substring(0,key.indexOf("@"));
-                               }else{
-                                       jsonResult.put(key, element.get(key));
-                               }
-                       }
-               }
-               if(node.size()>0){
-                       if(nodeKey.contains("@")){
-                               if(jsonArray==null){
-                                       jsonArray = new JSONArray();
-                               }
-                               if(arryKey==null){
-                                       arryKey = nodeKey.substring(0,nodeKey.indexOf("@"));
-                               }
-                               jsonArray.put(decodeContent(node));
-                               jsonResult.put(arryKey, jsonArray);
-                               isArray = false;
-                       }else{
-                               jsonResult.put(nodeKey, decodeContent(node));
-                       }
-               }
-               if(isArray && jsonArray.length() > 0){
-                       jsonResult.put(oldValue, jsonArray);
-               }
-               return jsonResult;
-       }
-       
-       @RequestMapping(value={"/policyController/getDCAEMSTemplateData.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
-       public ModelAndView getDCAEMSTemplateData(HttpServletRequest request, HttpServletResponse response) throws IOException{
-               ObjectMapper mapper = new ObjectMapper();
-               mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-               JsonNode root = mapper.readTree(request.getReader());
-
-               String value = root.get("policyData").toString().replaceAll("^\"|\"$", "");
-               String  servicename = value.toString().split("-v")[0];
-               String version = null;
-               if (value.toString().contains("-v")){
-                       version = value.toString().split("-v")[1];
-               }
-               MicroServiceModels returnModel = getAttributeObject(servicename, version);
-               
-               
-               //Get all keys with "MANY-true" defined in their value from subAttribute 
-               Set<String> allkeys = null;
-               if(returnModel.getSub_attributes() != null && !returnModel.getSub_attributes().isEmpty()){
-                       JSONObject json = new JSONObject(returnModel.getSub_attributes());      
-                       getAllKeys(json); 
-                       allkeys = allManyTrueKeys;
-                       allManyTrueKeys = new  HashSet <>();
-                       LOGGER.info("allkeys : " + allkeys);
-               }
-               
-               String allManyTrueKeys = "";
-               if(allkeys != null){
-                       allManyTrueKeys = allkeys.toString();
-               }
-               
-               String jsonModel = createMicroSeriveJson(returnModel, allkeys);
-               
-               JSONObject jsonObject = new JSONObject(jsonModel);
-               
-               JSONObject finalJsonObject = null;
-               if(allkeys != null){
-                       Iterator<String> iter = allkeys.iterator();
-                       while(iter.hasNext()){
-                               //Convert to array values for MANY-true keys
-                               finalJsonObject = convertToArrayElement(jsonObject, iter.next());
-                       }
-               }
-
-               if(finalJsonObject != null){
-                   LOGGER.info(finalJsonObject.toString());
-                   jsonModel  = finalJsonObject.toString();
-               }
-               
-               //get all properties with "MANY-true" defined in Ref_attributes
-               Set<String> manyTrueProperties = getManyTrueProperties(returnModel.getRef_attributes());
-               if(manyTrueProperties != null){
-                       JSONObject jsonObj = new JSONObject(jsonModel);
-                       for (String s : manyTrueProperties) {
-                               LOGGER.info(s);
-                               //convert to array element for MANY-true properties
-                               finalJsonObject = convertToArrayElement(jsonObj, s.trim());
-                       }
-                       
-                       if(finalJsonObject != null){
-                           LOGGER.info(finalJsonObject.toString());
-                           jsonModel = finalJsonObject.toString();
-                       }
-               }
-               
-               response.setCharacterEncoding("UTF-8");
-               response.setContentType("application / json");
-               request.setCharacterEncoding("UTF-8");
-               List<Object>  list = new ArrayList<>();
-               PrintWriter out = response.getWriter();
-               String responseString = mapper.writeValueAsString(returnModel);
-               JSONObject j = null;
-               if("".equals(allManyTrueKeys)){
-                       j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + "}");     
-               }else{
-                       j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + ",allManyTrueKeys: " + allManyTrueKeys+ "}");     
-               }
-               list.add(j);
-               out.write(list.toString());
-               return null;
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       private String createMicroSeriveJson(MicroServiceModels returnModel, Set<String> allkeys) {
-               Map<String, String> attributeMap = new HashMap<>();
-               Map<String, String> refAttributeMap = new HashMap<>();
-               String attribute = returnModel.getAttributes();
-               if(attribute != null){
-                       attribute = attribute.trim();
-               }
-               String refAttribute = returnModel.getRef_attributes();
-               if(refAttribute != null){
-                       refAttribute = refAttribute.trim();
-               }
-               String enumAttribute = returnModel.getEnumValues();
-               if(enumAttribute != null){
-                       enumAttribute = enumAttribute.trim();
-               }
-               if (!StringUtils.isEmpty(attribute)){
-                       attributeMap = convert(attribute, ",");
-               }
-               if (!StringUtils.isEmpty(refAttribute)){
-                       refAttributeMap = convert(refAttribute, ",");
-               }
-
-               Gson gson = new Gson();
-               
-               String subAttributes = returnModel.getSub_attributes();
-               if(subAttributes != null){
-                       subAttributes = subAttributes.trim();
-               }else{
-                       subAttributes = "";
-               }
-               Map gsonObject = (Map) gson.fromJson(subAttributes, Object.class);
-               
-               JSONObject object = new JSONObject();
-               JSONArray array = new JSONArray();
-               
-               for (Entry<String, String> keySet : attributeMap.entrySet()){
-                       array = new JSONArray();
-                       String value = keySet.getValue();
-                       if (keySet.getValue().split("MANY-")[1].equalsIgnoreCase("true")){
-                               array.put(value);
-                               object.put(keySet.getKey().trim(), array);
-                       }else {
-                               object.put(keySet.getKey().trim(), value.trim());
-                       }
-               }
-               
-               for (Entry<String, String> keySet : refAttributeMap.entrySet()){
-                       array = new JSONArray();
-                       String value = keySet.getValue().split(":")[0];
-                       if (gsonObject.containsKey(value)){
-                               if (keySet.getValue().split("MANY-")[1].equalsIgnoreCase("true")){
-                                       array.put(recursiveReference(value, gsonObject, enumAttribute));
-                                       object.put(keySet.getKey().trim(), array);
-                               }else {
-                                       object.put(keySet.getKey().trim(), recursiveReference(value, gsonObject, enumAttribute));
-                               }
-                       }else {
-                               if (keySet.getValue().split("MANY-")[1].equalsIgnoreCase("true")){
-                                       array.put(value.trim());
-                                       object.put(keySet.getKey().trim(), array);
-                               }else {
-                                       object.put(keySet.getKey().trim(), value.trim()); 
-                               }
-                       }
-               }
-               
-               
-
-               return object.toString();
-       }
-
-       @SuppressWarnings("unchecked")
-       private JSONObject recursiveReference(String name, Map<String,String> subAttributeMap, String enumAttribute) {
-               JSONObject object = new JSONObject();
-               Map<String, String> map = new HashMap<>();
-               Object returnClass = subAttributeMap.get(name);
-               map = (Map<String, String>) returnClass; 
-               JSONArray array = new JSONArray();
-               
-               for( Entry<String, String> m:map.entrySet()){  
-                       String[] splitValue = m.getValue().split(":");
-                       array = new JSONArray();
-                       if (subAttributeMap.containsKey(splitValue[0])){
-                               if (m.getValue().split("MANY-")[1].equalsIgnoreCase("true")){
-                                       array.put(recursiveReference(splitValue[0], subAttributeMap, enumAttribute));
-                                       object.put(m.getKey().trim(), array);
-                               }else {
-                                       object.put(m.getKey().trim(), recursiveReference(splitValue[0], subAttributeMap, enumAttribute));
-                               }
-                       } else{
-                               if (m.getValue().split("MANY-")[1].equalsIgnoreCase("true")){
-                                       array.put(splitValue[0].trim());
-                                       object.put(m.getKey().trim(), array);
-                               }else {
-                                       object.put(m.getKey().trim(), splitValue[0].trim());
-                               }
-                       }
-                 }  
-               
-               return object;
-       }
-       
-       
-       public static JSONObject convertToArrayElement(JSONObject json, String keyValue) {
-           return convertToArrayElement(json, new HashSet<>(), keyValue);
-       }
-       
-       private static JSONObject convertToArrayElement(JSONObject json, Set<String> keys, String keyValue) {
-           for (String key : json.keySet()) {
-               Object obj = json.get(key);
-               if(key.equals(keyValue.trim())){
-                       if(!(obj instanceof JSONArray)){
-                               JSONArray newJsonArray = new JSONArray();
-                               newJsonArray.put(obj);
-                               json.put(key, newJsonArray);
-                       }
-                       LOGGER.info("key : " + key);
-                       LOGGER.info("obj : " + obj);
-                       LOGGER.info("json.get(key) : " + json.get(key));
-                       LOGGER.info("keyValue : " + keyValue);
-                   keys.addAll(json.keySet());
-                   
-                   return json;
-               }
-
-               if (obj instanceof JSONObject) convertToArrayElement(json.getJSONObject(key), keyValue);            
-           }
-
-           return json;
-       }
-       
-       // call this method to get all MANY-true properties 
-       public static Set<String> getManyTrueProperties(String referAttributes){
-               LOGGER.info("referAttributes : " + referAttributes);
-               Set<String> manyTrueProperties = new HashSet<>();
-               
-               if(referAttributes != null){
-                       String[] referAarray = referAttributes.split(",");
-                       String []element= null;
-                       for(int i=0; i<referAarray.length; i++){
-                               element = referAarray[i].split("=");      
-                               if(element.length > 1 && element[1].contains("MANY-true")){
-                                       manyTrueProperties.add(element[0]);
-                               }
-                       }               
-               }
-               
-               return manyTrueProperties;
-       }
-       
-       //call this method to start the recursive
-       private Set<String> getAllKeys(JSONObject json) {
-           return getAllKeys(json, new HashSet<>());
-       }
-
-       private Set<String> getAllKeys(JSONArray arr) {
-           return getAllKeys(arr, new HashSet<>());
-       }
-
-       private Set<String> getAllKeys(JSONArray arr, Set<String> keys) {
-           for (int i = 0; i < arr.length(); i++) {
-               Object obj = arr.get(i);
-               if (obj instanceof JSONObject) keys.addAll(getAllKeys(arr.getJSONObject(i)));
-               if (obj instanceof JSONArray) keys.addAll(getAllKeys(arr.getJSONArray(i)));
-           }
-
-           return keys;
-       }
     // this method returns a set of keys with "MANY-true" defined in their value.
-       private Set<String> getAllKeys(JSONObject json, Set<String> keys) {
-           for (String key : json.keySet()) {
-               Object obj = json.get(key);
-               if(obj instanceof String && ((String) obj).contains("MANY-true")){
-                       LOGGER.info("key : " + key);
-                       LOGGER.info("obj : " + obj);
-                       allManyTrueKeys.add(key);
-               }
-               if (obj instanceof JSONObject) keys.addAll(getAllKeys(json.getJSONObject(key)));
-               if (obj instanceof JSONArray) keys.addAll(getAllKeys(json.getJSONArray(key)));
-           }
-
-           return keys;
-       }
-
-       
-       @RequestMapping(value={"/policyController/getModelServiceVersioneData.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
-       public ModelAndView getModelServiceVersionData(HttpServletRequest request, HttpServletResponse response) throws IOException{
-               ObjectMapper mapper = new ObjectMapper();
-               mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-               JsonNode root = mapper.readTree(request.getReader());
-
-               String value = root.get("policyData").toString().replaceAll("^\"|\"$", "");
-               String  servicename = value.toString().split("-v")[0];
-               Set<String> returnList = getVersionList(servicename);
-               
-               response.setCharacterEncoding("UTF-8");
-               response.setContentType("application / json");
-               request.setCharacterEncoding("UTF-8");
-        List<Object>  list = new ArrayList<>();
-               PrintWriter out = response.getWriter();
-               String responseString = mapper.writeValueAsString(returnList);
-               JSONObject j = new JSONObject("{dcaeModelVersionData: " + responseString +"}");
-               list.add(j);
-               out.write(list.toString());
-               return null;
-       }
-
-       private Set<String> getVersionList(String name) {       
-               MicroServiceModels workingModel = new MicroServiceModels();
-               Set<String> list = new HashSet<>();
-               List<Object> microServiceModelsData = commonClassDao.getDataById(MicroServiceModels.class, "modelName", name);
-               for (int i = 0; i < microServiceModelsData.size(); i++) {
-                       workingModel = (MicroServiceModels) microServiceModelsData.get(i);
-                       if (workingModel.getVersion()!=null){
-                               list.add(workingModel.getVersion());
-                       }else{
-                               list.add("Default");
-                       }
-               }
-               return list;
-       }
-       
-       private MicroServiceModels getAttributeObject(String name, String version) {    
-               MicroServiceModels workingModel = new MicroServiceModels();
-               List<Object> microServiceModelsData = commonClassDao.getDataById(MicroServiceModels.class, "modelName", name);
-               for (int i = 0; i < microServiceModelsData.size(); i++) {
-                       workingModel = (MicroServiceModels) microServiceModelsData.get(i);
-                       if(version != null){
-                               if (workingModel.getVersion()!=null){
-                                       if (workingModel.getVersion().equals(version)){
-                                               return workingModel;
-                                       }
-                               }else{
-                                       return workingModel;
-                               }
-                       }else{
-                               return workingModel;
-                       }
-                       
-               }
-               return workingModel;
-       }
-
-       @RequestMapping(value={"/get_DCAEPriorityValues"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
-       public void getDCAEPriorityValuesData(HttpServletRequest request, HttpServletResponse response){
-               try{
-                       Map<String, Object> model = new HashMap<>();
-                       ObjectMapper mapper = new ObjectMapper();
-                       List<String> priorityList = new ArrayList<>();
-                       priorityCount = 10;
-                       for (int i = 1; i < priorityCount; i++) {
-                               priorityList.add(String.valueOf(i));
-                       }
-                       model.put("priorityDatas", mapper.writeValueAsString(priorityList));
-                       JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
-                       JSONObject j = new JSONObject(msg);
-                       response.getWriter().write(j.toString());
-               }
-               catch (Exception e){
-                       LOGGER.error(e);
-               }
-       }
-
-       public void prePopulateDCAEMSPolicyData(PolicyRestAdapter policyAdapter, PolicyEntity entity) {
-               if (policyAdapter.getPolicyData() instanceof PolicyType) {
-                       Object policyData = policyAdapter.getPolicyData();
-                       PolicyType policy = (PolicyType) policyData;
-                       policyAdapter.setOldPolicyFileName(policyAdapter.getPolicyName());
-                       String policyNameValue = policyAdapter.getPolicyName().substring(policyAdapter.getPolicyName().indexOf("MS_") +3);
-                       policyAdapter.setPolicyName(policyNameValue);
-                       String description = "";
-                       try{
-                               description = policy.getDescription().substring(0, policy.getDescription().indexOf("@CreatedBy:"));
-                       }catch(Exception e){
-                           LOGGER.error("Error while collecting the desciption tag in ActionPolicy " + policyNameValue ,e);
-                               description = policy.getDescription();
-                       }
-                       policyAdapter.setPolicyDescription(description);
-                       // Get the target data under policy.
-                       TargetType target = policy.getTarget();
-                       if (target != null) {
-                               // Under target we have AnyOFType
-                               List<AnyOfType> anyOfList = target.getAnyOf();
-                               if (anyOfList != null) {
-                                       Iterator<AnyOfType> iterAnyOf = anyOfList.iterator();
-                                       while (iterAnyOf.hasNext()) {
-                                               AnyOfType anyOf = iterAnyOf.next();
-                                               // Under AnyOFType we have AllOFType
-                                               List<AllOfType> allOfList = anyOf.getAllOf();
-                                               if (allOfList != null) {
-                                                       Iterator<AllOfType> iterAllOf = allOfList.iterator();
-                                                       while (iterAllOf.hasNext()) {
-                                                               AllOfType allOf = iterAllOf.next();
-                                                               // Under AllOFType we have Match
-                                                               List<MatchType> matchList = allOf.getMatch();
-                                                               if (matchList != null) {
-                                                                       Iterator<MatchType> iterMatch = matchList.iterator();
-                                                                       while (matchList.size()>1 && iterMatch.hasNext()) {
-                                                                               MatchType match = iterMatch.next();
-                                                                               //
-                                                                               // Under the match we have attribute value and
-                                                                               // attributeDesignator. So,finally down to the actual attribute.
-                                                                               //
-                                                                               AttributeValueType attributeValue = match.getAttributeValue();
-                                                                               String value = (String) attributeValue.getContent().get(0);
-                                                                               AttributeDesignatorType designator = match.getAttributeDesignator();
-                                                                               String attributeId = designator.getAttributeId();
-                                                                               // First match in the target is OnapName, so set that value.
-                                                                               if (attributeId.equals("ONAPName")) {
-                                                                                       policyAdapter.setOnapName(value);
-                                                                               }
-                                                                               if (attributeId.equals("ConfigName")){
-                                                                                       policyAdapter.setConfigName(value);
-                                                                               }
-                                                                               if (attributeId.equals("uuid")){
-                                                                                       policyAdapter.setUuid(value);
-                                                                               }
-                                                                               if (attributeId.equals("location")){
-                                                                                       policyAdapter.setLocation(value);
-                                                                               }
-                                                                               if (attributeId.equals("RiskType")){
-                                                                                       policyAdapter.setRiskType(value);
-                                                                               }
-                                                                               if (attributeId.equals("RiskLevel")){
-                                                                                       policyAdapter.setRiskLevel(value);
-                                                                               }
-                                                                               if (attributeId.equals("guard")){
-                                                                                       policyAdapter.setGuard(value);
-                                                                               }
-                                                                               if (attributeId.equals("TTLDate") && !value.contains("NA")){
-                                                                                       PolicyController controller = new PolicyController();
-                                                                                       String newDate = controller.convertDate(value);
-                                                                                       policyAdapter.setTtlDate(newDate);
-                                                                               }
-                                                                       }
-                                                                       readFile(policyAdapter, entity);
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-       
-       public static Map<String, String> convert(String str, String split) {
-               Map<String, String> map = new HashMap<>();
-               for(final String entry : str.split(split)) {
-                   String[] parts = entry.split("=");
-                   map.put(parts[0], parts[1]);
-               }
-               return map;
-       }
-
-
-       @SuppressWarnings("unchecked")
-       private void readFile(PolicyRestAdapter policyAdapter, PolicyEntity entity) {
-               String policyScopeName = null;
-               ObjectMapper mapper = new ObjectMapper();
-               try {
-                       DCAEMicroServiceObject msBody = (DCAEMicroServiceObject) mapper.readValue(entity.getConfigurationData().getConfigBody(), DCAEMicroServiceObject.class);
-                       policyScopeName = getPolicyScope(msBody.getPolicyScope());
-                       policyAdapter.setPolicyScope(policyScopeName);
-
-                       policyAdapter.setPriority(msBody.getPriority());
-
-                       if (msBody.getVersion()!= null){
-                               policyAdapter.setServiceType(msBody.getService());
-                               policyAdapter.setVersion(msBody.getVersion());
-                       }else{
-                               policyAdapter.setServiceType(msBody.getService());
-                       }
-                       if(msBody.getContent() != null){
-                               LinkedHashMap<String, Object>  data = new LinkedHashMap<>();
-                               LinkedHashMap<String, ?> map = (LinkedHashMap<String, ?>) msBody.getContent();
-                               readRecursivlyJSONContent(map, data);
-                               policyAdapter.setRuleData(data);
-                       }
-
-               } catch (Exception e) {
-                       LOGGER.error(e);
-               }
-
-       }
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       private void readRecursivlyJSONContent(LinkedHashMap<String, ?> map, LinkedHashMap<String, Object> data){
-               for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
-                       Object key =  iterator.next();
-                       Object value = map.get(key);
-                       if(value instanceof LinkedHashMap<?, ?>){
-                               LinkedHashMap<String, Object> secondObjec = new LinkedHashMap<>(); 
-                               readRecursivlyJSONContent((LinkedHashMap<String, ?>) value, secondObjec);
-                               for(String objKey: secondObjec.keySet()){
-                                       data.put(key+"." +objKey, secondObjec.get(objKey));
-                               }
-                       }else if(value instanceof ArrayList){
-                               ArrayList<?> jsonArrayVal = (ArrayList<?>)value;
-                               for(int i = 0; i < jsonArrayVal.size(); i++){
-                                       Object arrayvalue = jsonArrayVal.get(i);
-                                       if(arrayvalue instanceof LinkedHashMap<?, ?>){
-                                               LinkedHashMap<String, Object> newData = new LinkedHashMap<>();   
-                                               readRecursivlyJSONContent((LinkedHashMap<String, ?>) arrayvalue, newData);
-                                               for(String objKey: newData.keySet()){
-                                                       data.put(key+"@"+i+"." +objKey, newData.get(objKey));
-                                               }
-                                       }else if(arrayvalue instanceof ArrayList){
-                                               ArrayList<?> jsonArrayVal1 = (ArrayList<?>)value;
-                                               for(int j = 0; j < jsonArrayVal1.size(); j++){
-                                                       Object arrayvalue1 = jsonArrayVal1.get(i);
-                                                       data.put(key+"@"+j, arrayvalue1.toString());
-                                               }       
-                                       }else{
-                                               data.put(key+"@"+i, arrayvalue.toString());
-                                       }       
-                               }
-                       }else{
-                               data.put(key.toString(), value.toString());
-                       }       
-               }
-       }
-
-       private String getPolicyScope(String value) {
-               List<Object> groupList= commonClassDao.getDataById(GroupPolicyScopeList.class, "groupList", value);
-               if(groupList != null && !groupList.isEmpty()){
-                       GroupPolicyScopeList pScope = (GroupPolicyScopeList) groupList.get(0);
-                       return pScope.getGroupName();           
-               }
-               return null;
-       }
-
-       //Convert the map values and set into JSON body
-       public Map<String, String> convertMap(Map<String, String> attributesMap, Map<String, String> attributesRefMap) {
-               Map<String, String> attribute = new HashMap<>();
-               String temp = null;
-               String key;
-               String value;
-               for (Entry<String, String> entry : attributesMap.entrySet()) {
-                       key = entry.getKey();
-                       value = entry.getValue();
-                       attribute.put(key, value);
-               }
-               for (Entry<String, String> entryRef : attributesRefMap.entrySet()) {
-                       key = entryRef.getKey();
-                       value = entryRef.getValue().toString();
-                       attribute.put(key, value);
-               }
-               for (Entry<String, String> entryList : attributesListRefMap.entrySet()) {
-                       key = entryList.getKey();
-                       value = entryList.getValue().toString();
-                       attribute.put(key, value);
-               }
-               for (Entry<String, LinkedList<String>> arrayList : arrayTextList.entrySet()){
-                       key = arrayList.getKey();
-                       temp = null;
-                       for (Object textList : arrayList.getValue()){
-                               if (temp == null){
-                                       temp = "[" + textList;
-                               }else{
-                                       temp = temp + "," + textList;
-                               }
-                       }
-                       attribute.put(key, temp+ "]");                  
-               }
-
-               return  attribute;
-       }
-       
-       @RequestMapping(value={"/ms_dictionary/set_MSModelData"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
-       public void SetMSModelData(HttpServletRequest request, HttpServletResponse response) throws IOException, FileUploadException{
-               modelList = new ArrayList<>();
-               dirDependencyList = new ArrayList<>();
-               classMap = new HashMap<>();
-               retmap = new HashMap<>();
-               uniqueKeys= new HashSet<>();
-               uniqueDataKeys= new HashSet<>();
-               dataListBuffer=new StringBuilder();
-               dataConstraints= new ArrayList <>();
-               List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
-               boolean zip = false;
-               boolean yml= false;
-               String errorMsg = "";
-               for (FileItem item : items) {
-                       if(item.getName().endsWith(".zip") || item.getName().endsWith(".xmi")||item.getName().endsWith(".yml")){
-                               this.newModel = new MicroServiceModels();
-                               try{
-                                       File file = new File(item.getName());
-                                       OutputStream outputStream = new FileOutputStream(file);
-                                       IOUtils.copy(item.getInputStream(), outputStream);
-                                       outputStream.close();
-                                       this.newFile = file.toString();
-                                       this.newModel.setModelName(this.newFile.toString().split("-v")[0]);
-                               
-                                       if (this.newFile.toString().contains("-v")){
-                                               if (item.getName().endsWith(".zip")){
-                                                       this.newModel.setVersion(this.newFile.toString().split("-v")[1].replace(".zip", ""));
-                                                       zip = true;
-                                               }else if(item.getName().endsWith(".yml")){
-                                                       this.newModel.setVersion(this.newFile.toString().split("-v")[1].replace(".yml", ""));
-                                                       yml = true;
-                                               }
-                                               else {
-                                                       this.newModel.setVersion(this.newFile.toString().split("-v")[1].replace(".xmi", ""));
-                                               }
-                                       }                               
-                               }catch(Exception e){
-                                       LOGGER.error("Upload error : ", e);
-                                       errorMsg = "Upload error:" + e.getMessage();
-                               }
-                       }
-                       
-               }
-               
-               if(!errorMsg.isEmpty()){
-                       
-                       PrintWriter out = response.getWriter();
-                       
-                       response.setCharacterEncoding("UTF-8");
-                       response.setContentType("application / json");
-                       request.setCharacterEncoding("UTF-8");
-                       
-                       JSONObject j = new JSONObject();
-                       j.put("errorMsg", errorMsg);
-                       out.write(j.toString());
-                       return;
-               }
-               
-               List<File> fileList = new ArrayList<>();
-               this.directory = "model";
-               if (zip){
-                       extractFolder(this.newFile);
-                       fileList = listModelFiles(this.directory);
-               }else if (yml==true){
-                       parseTosca(this.newFile);
-               }else {
-                       File file = new File(this.newFile);
-                       fileList.add(file);
-               }
-               String modelType= "";
-               if(yml==false){
-                       modelType="xmi";
-                       //Process Main Model file first
-                       classMap = new HashMap<>();
-                       for (File file : fileList) {
-                               if(!file.isDirectory() && file.getName().endsWith(".xmi")){
-                       retreiveDependency(file.toString(), true);
-                   }   
-                       }
-                       
-                       modelList = createList();
-                       
-                       cleanUp(this.newFile);
-                       cleanUp(directory);
-               }else{
-                       modelType="yml";
-                       modelList.add(this.newModel.getModelName());
-                       String className=this.newModel.getModelName();
-                       MSAttributeObject msAttributes= new MSAttributeObject();
-                       msAttributes.setClassName(className);
-                       
-                       HashMap<String, String> returnAttributeList =new HashMap<>();
-                       returnAttributeList.put(className, this.attributeString);
-                       msAttributes.setAttribute(returnAttributeList);
-                       
-                       msAttributes.setSubClass(this.retmap);
-                       
-                       HashMap<String, String> returnReferenceList =new HashMap<>();
-                       //String[] referenceArray=this.referenceAttributes.split("=");
-                       returnReferenceList.put(className, this.referenceAttributes);
-                       msAttributes.setRefAttribute(returnReferenceList);
-                       
-                       if(this.listConstraints!=""){
-                               HashMap<String, String> enumList =new HashMap<>();
-                               String[] listArray=this.listConstraints.split("#");
-                for(String str:listArray){
-                    String[] strArr= str.split("=");
-                    if(strArr.length>1){
+    private Set<String> getAllKeys(JSONObject json, Set<String> keys) {
+        for (String key : json.keySet()) {
+            Object obj = json.get(key);
+            if (obj instanceof String && ((String) obj).contains("MANY-true")) {
+                LOGGER.info("key : " + key);
+                LOGGER.info("obj : " + obj);
+                allManyTrueKeys.add(key);
+            }
+            if (obj instanceof JSONObject)
+                keys.addAll(getAllKeys(json.getJSONObject(key)));
+            if (obj instanceof JSONArray)
+                keys.addAll(getAllKeys(json.getJSONArray(key)));
+        }
+
+        return keys;
+    }
+
+    @RequestMapping(
+            value = {"/policyController/getModelServiceVersioneData.htm"},
+            method = {org.springframework.web.bind.annotation.RequestMethod.POST})
+    public ModelAndView getModelServiceVersionData(HttpServletRequest request, HttpServletResponse response)
+            throws IOException {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        JsonNode root = mapper.readTree(request.getReader());
+
+        String value = root.get("policyData").toString().replaceAll("^\"|\"$", "");
+        String servicename = value.split("-v")[0];
+        Set<String> returnList = getVersionList(servicename);
+
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application / json");
+        request.setCharacterEncoding("UTF-8");
+        List<Object> list = new ArrayList<>();
+        PrintWriter out = response.getWriter();
+        String responseString = mapper.writeValueAsString(returnList);
+        JSONObject j = new JSONObject("{dcaeModelVersionData: " + responseString + "}");
+        list.add(j);
+        out.write(list.toString());
+        return null;
+    }
+
+    private Set<String> getVersionList(String name) {
+        MicroServiceModels workingModel;
+        Set<String> list = new HashSet<>();
+        List<Object> microServiceModelsData = commonClassDao.getDataById(MicroServiceModels.class, "modelName", name);
+        for (int i = 0; i < microServiceModelsData.size(); i++) {
+            workingModel = (MicroServiceModels) microServiceModelsData.get(i);
+            if (workingModel.getVersion() != null) {
+                list.add(workingModel.getVersion());
+            } else {
+                list.add("Default");
+            }
+        }
+        return list;
+    }
+
+    private MicroServiceModels getAttributeObject(String name, String version) {
+        MicroServiceModels workingModel = new MicroServiceModels();
+        List<Object> microServiceModelsData = commonClassDao.getDataById(MicroServiceModels.class, "modelName", name);
+        for (int i = 0; i < microServiceModelsData.size(); i++) {
+            workingModel = (MicroServiceModels) microServiceModelsData.get(i);
+            if (version != null) {
+                if (workingModel.getVersion() != null) {
+                    if (workingModel.getVersion().equals(version)) {
+                        return workingModel;
+                    }
+                } else {
+                    return workingModel;
+                }
+            } else {
+                return workingModel;
+            }
+
+        }
+        return workingModel;
+    }
+
+    private MicroserviceHeaderdeFaults getHeaderDefaultsObject(String modelName) {
+        return (MicroserviceHeaderdeFaults) commonClassDao.getEntityItem(MicroserviceHeaderdeFaults.class, "modelName",
+                modelName);
+    }
+
+    @RequestMapping(
+            value = {"/get_DCAEPriorityValues"},
+            method = {org.springframework.web.bind.annotation.RequestMethod.GET},
+            produces = MediaType.APPLICATION_JSON_VALUE)
+    public void getDCAEPriorityValuesData(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            Map<String, Object> model = new HashMap<>();
+            ObjectMapper mapper = new ObjectMapper();
+            List<String> priorityList = new ArrayList<>();
+            priorityCount = 10;
+            for (int i = 1; i < priorityCount; i++) {
+                priorityList.add(String.valueOf(i));
+            }
+            model.put("priorityDatas", mapper.writeValueAsString(priorityList));
+            JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+            JSONObject j = new JSONObject(msg);
+            response.getWriter().write(j.toString());
+        } catch (Exception e) {
+            LOGGER.error(e);
+        }
+    }
+
+    public void prePopulateDCAEMSPolicyData(PolicyRestAdapter policyAdapter, PolicyEntity entity) {
+        if (policyAdapter.getPolicyData() instanceof PolicyType) {
+            Object policyData = policyAdapter.getPolicyData();
+            PolicyType policy = (PolicyType) policyData;
+            policyAdapter.setOldPolicyFileName(policyAdapter.getPolicyName());
+            String policyNameValue =
+                    policyAdapter.getPolicyName().substring(policyAdapter.getPolicyName().indexOf("MS_") + 3);
+            policyAdapter.setPolicyName(policyNameValue);
+            String description = "";
+            try {
+                description = policy.getDescription().substring(0, policy.getDescription().indexOf("@CreatedBy:"));
+            } catch (Exception e) {
+                LOGGER.error("Error while collecting the desciption tag in ActionPolicy " + policyNameValue, e);
+                description = policy.getDescription();
+            }
+            policyAdapter.setPolicyDescription(description);
+            // Get the target data under policy.
+            TargetType target = policy.getTarget();
+            if (target != null) {
+                // Under target we have AnyOFType
+                List<AnyOfType> anyOfList = target.getAnyOf();
+                if (anyOfList != null) {
+                    Iterator<AnyOfType> iterAnyOf = anyOfList.iterator();
+                    while (iterAnyOf.hasNext()) {
+                        AnyOfType anyOf = iterAnyOf.next();
+                        // Under AnyOFType we have AllOFType
+                        List<AllOfType> allOfList = anyOf.getAllOf();
+                        if (allOfList != null) {
+                            Iterator<AllOfType> iterAllOf = allOfList.iterator();
+                            while (iterAllOf.hasNext()) {
+                                AllOfType allOf = iterAllOf.next();
+                                // Under AllOFType we have Match
+                                List<MatchType> matchList = allOf.getMatch();
+                                if (matchList != null) {
+                                    Iterator<MatchType> iterMatch = matchList.iterator();
+                                    while (matchList.size() > 1 && iterMatch.hasNext()) {
+                                        MatchType match = iterMatch.next();
+                                        //
+                                        // Under the match we have attribute value and
+                                        // attributeDesignator. So,finally down to the actual attribute.
+                                        //
+                                        AttributeValueType attributeValue = match.getAttributeValue();
+                                        String value = (String) attributeValue.getContent().get(0);
+                                        AttributeDesignatorType designator = match.getAttributeDesignator();
+                                        String attributeId = designator.getAttributeId();
+                                        // First match in the target is OnapName, so set that value.
+                                        if ("ONAPName".equals(attributeId)) {
+                                            policyAdapter.setOnapName(value);
+                                        }
+                                        if ("ConfigName".equals(attributeId)) {
+                                            policyAdapter.setConfigName(value);
+                                        }
+                                        if ("uuid".equals(attributeId)) {
+                                            policyAdapter.setUuid(value);
+                                        }
+                                        if ("location".equals(attributeId)) {
+                                            policyAdapter.setLocation(value);
+                                        }
+                                        if ("RiskType".equals(attributeId)) {
+                                            policyAdapter.setRiskType(value);
+                                        }
+                                        if ("RiskLevel".equals(attributeId)) {
+                                            policyAdapter.setRiskLevel(value);
+                                        }
+                                        if ("guard".equals(attributeId)) {
+                                            policyAdapter.setGuard(value);
+                                        }
+                                        if ("TTLDate".equals(attributeId) && !value.contains("NA")) {
+                                            PolicyController controller = new PolicyController();
+                                            String newDate = controller.convertDate(value);
+                                            policyAdapter.setTtlDate(newDate);
+                                        }
+                                    }
+                                    readFile(policyAdapter, entity);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Convert.
+     *
+     * @param str the str
+     * @param split the split
+     * @return the map
+     */
+    public Map<String, String> convert(String str, String split) {
+        Map<String, String> map = new HashMap<>();
+        for (final String entry : str.split(split)) {
+            String[] parts = entry.split("=");
+            map.put(parts[0], parts[1]);
+        }
+        return map;
+    }
+
+    /**
+     * Read file.
+     *
+     * @param policyAdapter the policy adapter
+     * @param entity the entity
+     */
+    @SuppressWarnings("unchecked")
+    public void readFile(PolicyRestAdapter policyAdapter, PolicyEntity entity) {
+        String policyScopeName = null;
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            DCAEMicroServiceObject msBody =
+                    mapper.readValue(entity.getConfigurationData().getConfigBody(), DCAEMicroServiceObject.class);
+            policyScopeName = getPolicyScope(msBody.getPolicyScope());
+            policyAdapter.setPolicyScope(policyScopeName);
+
+            policyAdapter.setPriority(msBody.getPriority());
+
+            if (msBody.getVersion() != null) {
+                policyAdapter.setServiceType(msBody.getService());
+                policyAdapter.setVersion(msBody.getVersion());
+            } else {
+                policyAdapter.setServiceType(msBody.getService());
+            }
+            //
+            LinkedHashMap<String, ?> content = (LinkedHashMap<String, ?>) msBody.getUiContent();
+            if (content == null) {
+                content = (LinkedHashMap<String, ?>) msBody.getContent();
+            }
+            if (content != null) {
+                LinkedHashMap<String, Object> data = new LinkedHashMap<>();
+                LinkedHashMap<String, ?> map = content;
+                readRecursivlyJSONContent(map, data);
+                policyAdapter.setRuleData(data);
+            }
+
+        } catch (Exception e) {
+            LOGGER.error(e);
+        }
+
+    }
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public void readRecursivlyJSONContent(Map<String, ?> map, Map<String, Object> data) {
+        for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
+            Object key = iterator.next();
+            Object value = map.get(key);
+            if (value instanceof LinkedHashMap<?, ?>) {
+                LinkedHashMap<String, Object> secondObjec = new LinkedHashMap<>();
+                readRecursivlyJSONContent((LinkedHashMap<String, ?>) value, secondObjec);
+                for (Entry<String, Object> entry : secondObjec.entrySet()) {
+                    data.put(key + "." + entry.getKey(), entry.getValue());
+                }
+            } else if (value instanceof ArrayList) {
+                ArrayList<?> jsonArrayVal = (ArrayList<?>) value;
+                for (int i = 0; i < jsonArrayVal.size(); i++) {
+                    Object arrayvalue = jsonArrayVal.get(i);
+                    if (arrayvalue instanceof LinkedHashMap<?, ?>) {
+                        LinkedHashMap<String, Object> newData = new LinkedHashMap<>();
+                        readRecursivlyJSONContent((LinkedHashMap<String, ?>) arrayvalue, newData);
+                        for (Entry<String, Object> entry : newData.entrySet()) {
+                            data.put(key + "@" + i + "." + entry.getKey(), entry.getValue());
+                        }
+                    } else if (arrayvalue instanceof ArrayList) {
+                        ArrayList<?> jsonArrayVal1 = (ArrayList<?>) value;
+                        for (int j = 0; j < jsonArrayVal1.size(); j++) {
+                            Object arrayvalue1 = jsonArrayVal1.get(i);
+                            data.put(key + "@" + j, arrayvalue1.toString());
+                        }
+                    } else {
+                        data.put(key + "@" + i, arrayvalue.toString());
+                    }
+                }
+            } else {
+                data.put(key.toString(), value.toString());
+            }
+        }
+    }
+
+    public String getPolicyScope(String value) {
+        List<Object> groupList = commonClassDao.getDataById(GroupPolicyScopeList.class, "groupList", value);
+        if (groupList != null && !groupList.isEmpty()) {
+            GroupPolicyScopeList pScope = (GroupPolicyScopeList) groupList.get(0);
+            return pScope.getGroupName();
+        }
+        return null;
+    }
+
+    // Convert the map values and set into JSON body
+    public Map<String, String> convertMap(Map<String, String> attributesMap, Map<String, String> attributesRefMap) {
+        Map<String, String> attribute = new HashMap<>();
+        StringBuilder temp;
+        String key;
+        String value;
+        for (Entry<String, String> entry : attributesMap.entrySet()) {
+            key = entry.getKey();
+            value = entry.getValue();
+            attribute.put(key, value);
+        }
+        for (Entry<String, String> entryRef : attributesRefMap.entrySet()) {
+            key = entryRef.getKey();
+            value = entryRef.getValue();
+            attribute.put(key, value);
+        }
+        for (Entry<String, String> entryList : attributesListRefMap.entrySet()) {
+            key = entryList.getKey();
+            value = entryList.getValue();
+            attribute.put(key, value);
+        }
+        for (Entry<String, LinkedList<String>> arrayList : arrayTextList.entrySet()) {
+            key = arrayList.getKey();
+            temp = null;
+            for (Object textList : arrayList.getValue()) {
+                if (temp == null) {
+                    temp = new StringBuilder();
+                    temp.append("[" + textList);
+                } else {
+                    temp.append("," + textList);
+                }
+            }
+            attribute.put(key, temp + "]");
+        }
+
+        return attribute;
+    }
+
+    @RequestMapping(
+            value = {"/ms_dictionary/set_MSModelData"},
+            method = {org.springframework.web.bind.annotation.RequestMethod.POST})
+    public void SetMSModelData(HttpServletRequest request, HttpServletResponse response)
+            throws IOException, FileUploadException {
+        modelList = new ArrayList<>();
+        dirDependencyList = new ArrayList<>();
+        classMap = new LinkedHashMap<>();
+        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
+        boolean zip = false;
+        boolean yml = false;
+        String errorMsg = "";
+        for (FileItem item : items) {
+            if (item.getName().endsWith(".zip") || item.getName().endsWith(".xmi") || item.getName().endsWith(".yml")) {
+                this.newModel = new MicroServiceModels();
+                try {
+                    File file = new File(item.getName());
+                    OutputStream outputStream = new FileOutputStream(file);
+                    IOUtils.copy(item.getInputStream(), outputStream);
+                    outputStream.close();
+                    this.newFile = file.toString();
+                    this.newModel.setModelName(this.newFile.split("-v")[0]);
+
+                    if (this.newFile.contains("-v")) {
+                        if (item.getName().endsWith(".zip")) {
+                            this.newModel.setVersion(this.newFile.split("-v")[1].replace(".zip", ""));
+                            zip = true;
+                        } else if (item.getName().endsWith(".yml")) {
+                            this.newModel.setVersion(this.newFile.split("-v")[1].replace(".yml", ""));
+                            yml = true;
+                        } else {
+                            this.newModel.setVersion(this.newFile.split("-v")[1].replace(".xmi", ""));
+                        }
+                    }
+                } catch (Exception e) {
+                    LOGGER.error("Upload error : ", e);
+                    errorMsg = "Upload error:" + e.getMessage();
+                }
+            }
+
+        }
+
+        if (!errorMsg.isEmpty()) {
+
+            PrintWriter out = response.getWriter();
+
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("application / json");
+            request.setCharacterEncoding("UTF-8");
+
+            JSONObject j = new JSONObject();
+            j.put("errorMsg", errorMsg);
+            out.write(j.toString());
+            return;
+        }
+
+        List<File> fileList = new ArrayList<>();
+        MSModelUtils msMLUtils = new MSModelUtils(commonClassDao);
+        this.directory = "model";
+        if (zip) {
+            extractFolder(this.newFile);
+            fileList = listModelFiles(this.directory);
+        } else if (yml) {
+            errorMsg = msMLUtils.parseTosca(this.newFile);
+            if (errorMsg != null) {
+                PrintWriter out = response.getWriter();
+                response.setCharacterEncoding("UTF-8");
+                response.setContentType("application / json");
+                request.setCharacterEncoding("UTF-8");
+                JSONObject j = new JSONObject();
+                j.put("errorMsg", errorMsg);
+                out.write(j.toString());
+                return;
+            }
+
+        } else {
+            File file = new File(this.newFile);
+            fileList.add(file);
+        }
+        String modelType = "";
+        if (!yml) {
+            modelType = "xmi";
+            // Process Main Model file first
+            classMap = new LinkedHashMap<>();
+            for (File file : fileList) {
+                if (!file.isDirectory() && file.getName().endsWith(".xmi")) {
+                    retreiveDependency(file.toString(), true);
+                }
+            }
+
+            modelList = createList();
+
+            cleanUp(this.newFile);
+            cleanUp(directory);
+        } else {
+            modelType = "yml";
+            modelList.add(this.newModel.getModelName());
+            String className = this.newModel.getModelName();
+            MSAttributeObject msAttributes = new MSAttributeObject();
+            msAttributes.setClassName(className);
+
+            LinkedHashMap<String, String> returnAttributeList = new LinkedHashMap<>();
+            returnAttributeList.put(className, msMLUtils.getAttributeString());
+            msAttributes.setAttribute(returnAttributeList);
+
+            msAttributes.setSubClass(msMLUtils.getRetmap());
+
+            msAttributes.setMatchingSet(msMLUtils.getMatchableValues());
+
+            LinkedHashMap<String, String> returnReferenceList = new LinkedHashMap<>();
+
+            returnReferenceList.put(className, msMLUtils.getReferenceAttributes());
+            msAttributes.setRefAttribute(returnReferenceList);
+
+            if (msMLUtils.getListConstraints() != "") {
+                LinkedHashMap<String, String> enumList = new LinkedHashMap<>();
+                String[] listArray = msMLUtils.getListConstraints().split("#");
+                for (String str : listArray) {
+                    String[] strArr = str.split("=");
+                    if (strArr.length > 1) {
                         enumList.put(strArr[0], strArr[1]);
                     }
                 }
-                               msAttributes.setEnumType(enumList);
-                       }
-                       
-                       classMap=new HashMap<>();
-                       classMap.put(className, msAttributes);
-                       
-               }
-               
-               PrintWriter out = response.getWriter();
-               
-               response.setCharacterEncoding("UTF-8");
-               response.setContentType("application / json");
-               request.setCharacterEncoding("UTF-8");
-               
-               ObjectMapper mapper = new ObjectMapper();
-               JSONObject j = new JSONObject();
-               j.put("classListDatas", modelList);
-               j.put("modelDatas", mapper.writeValueAsString(classMap));
-               j.put("modelType", modelType);
-               out.write(j.toString());
-       }
-       
-       /*
-        * Unzip file and store in the model directory for processing
-        */
-       @SuppressWarnings("rawtypes")
-       private void extractFolder(String zipFile )  {
-           int BUFFER = 2048;
-           File file = new File(zipFile);
-
-           ZipFile zip = null;
-               try {
-                       zip = new ZipFile(file);
-                   String newPath =  "model" + File.separator + zipFile.substring(0, zipFile.length() - 4);
-                   this.directory = "model" + File.separator + zipFile.substring(0, zipFile.length() - 4);
-                   checkZipDirectory(this.directory);
-                   new File(newPath).mkdir();
-                   Enumeration zipFileEntries = zip.entries();
-       
-                   // Process each entry
-                   while (zipFileEntries.hasMoreElements()){
-                       // grab a zip file entry
-                       ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
-                       String currentEntry = entry.getName();
-                       File destFile = new File("model" + File.separator + currentEntry);
-                       File destinationParent = destFile.getParentFile();
-                       
-                       destinationParent.mkdirs();
-       
-                       if (!entry.isDirectory()){
-                           BufferedInputStream is = new BufferedInputStream(zip.getInputStream(entry));
-                           int currentByte;
-                           byte data[] = new byte[BUFFER];
-                           FileOutputStream fos = new FileOutputStream(destFile);
-                           BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);
-                           while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
-                               dest.write(data, 0, currentByte);
-                           }
-                           dest.flush();
-                           dest.close();
-                           is.close();
-                       }
-       
-                       if (currentEntry.endsWith(".zip")){
-                           extractFolder(destFile.getAbsolutePath());
-                       }
-                   }
-           } catch (IOException e) {
-               LOGGER.error("Failed to unzip model file " + zipFile, e);
-               }finally{
-                       try {
-                               if(zip != null)
-                               zip.close();
-                       } catch (IOException e) {
-                               LOGGER.error("Exception Occured While closing zipfile " + e);
-                       }
-               }
-       }
-       
-       private void retreiveDependency(String workingFile, Boolean modelClass) {
-               
-               MSModelUtils utils = new MSModelUtils(PolicyController.getMsOnapName(), PolicyController.getMsPolicyName());
-           HashMap<String, MSAttributeObject> tempMap = new HashMap<>();
-           
-           tempMap = utils.processEpackage(workingFile, MODEL_TYPE.XMI);
-           
-           classMap.putAll(tempMap);
-           LOGGER.info(tempMap);
-           
-           return;     
-           
-       }
-               
-       private List<File> listModelFiles(String directoryName) {
-               File directory = new File(directoryName);
-               List<File> resultList = new ArrayList<>();
-               File[] fList = directory.listFiles();
-               for (File file : fList) {
-                       if (file.isFile()) {
-                               resultList.add(file);
-                       } else if (file.isDirectory()) {
-                               dirDependencyList.add(file.getName());
-                               resultList.addAll(listModelFiles(file.getAbsolutePath()));
-                       }
-               }
-               return resultList;
-       }
-       
-    private void cleanUp(String path) {
-        if (path!=null){
+                msAttributes.setEnumType(enumList);
+            }
+
+            classMap = new LinkedHashMap<>();
+            classMap.put(className, msAttributes);
+
+        }
+
+        PrintWriter out = response.getWriter();
+
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application / json");
+        request.setCharacterEncoding("UTF-8");
+
+        ObjectMapper mapper = new ObjectMapper();
+        JSONObject j = new JSONObject();
+        j.put("classListDatas", modelList);
+        j.put("modelDatas", mapper.writeValueAsString(classMap));
+        j.put("modelType", modelType);
+        j.put("dataOrderInfo", msMLUtils.getDataOrderInfo());
+        j.put("ruleFormation", msMLUtils.getJsonRuleFormation());
+
+        out.write(j.toString());
+    }
+
+    /*
+     * Unzip file and store in the model directory for processing
+     */
+    @SuppressWarnings("rawtypes")
+    private void extractFolder(String zipFile) {
+        int BUFFER = 2048;
+        File file = new File(zipFile);
+
+        try (ZipFile zip = new ZipFile(file)) {
+            String newPath = "model" + File.separator + zipFile.substring(0, zipFile.length() - 4);
+            this.directory = "model" + File.separator + zipFile.substring(0, zipFile.length() - 4);
+            checkZipDirectory(this.directory);
+            new File(newPath).mkdir();
+            Enumeration zipFileEntries = zip.entries();
+
+            // Process each entry
+            while (zipFileEntries.hasMoreElements()) {
+                // grab a zip file entry
+                ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
+                String currentEntry = entry.getName();
+                File destFile = new File("model" + File.separator + currentEntry);
+                File destinationParent = destFile.getParentFile();
+
+                destinationParent.mkdirs();
+
+                if (!entry.isDirectory()) {
+                    BufferedInputStream is = new BufferedInputStream(zip.getInputStream(entry));
+                    int currentByte;
+                    byte[] data = new byte[BUFFER];
+                    try (FileOutputStream fos = new FileOutputStream(destFile);
+                            BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER)) {
+                        while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
+                            dest.write(data, 0, currentByte);
+                        }
+                        dest.flush();
+                    } catch (IOException e) {
+                        LOGGER.error("Failed to write zip contents to {}" + destFile + e);
+                        //
+                        // PLD should I throw e?
+                        //
+                        throw e;
+                    }
+                }
+
+                if (currentEntry.endsWith(".zip")) {
+                    extractFolder(destFile.getAbsolutePath());
+                }
+            }
+        } catch (IOException e) {
+            LOGGER.error("Failed to unzip model file " + zipFile, e);
+        }
+    }
+
+    private void retreiveDependency(String workingFile, Boolean modelClass) {
+
+        MSModelUtils utils = new MSModelUtils(PolicyController.getMsOnapName(), PolicyController.getMsPolicyName());
+        Map<String, MSAttributeObject> tempMap;
+
+        tempMap = utils.processEpackage(workingFile, MODEL_TYPE.XMI);
+
+        classMap.putAll(tempMap);
+        LOGGER.info(tempMap);
+
+        return;
+
+    }
+
+    private List<File> listModelFiles(String directoryName) {
+        File fileDirectory = new File(directoryName);
+        List<File> resultList = new ArrayList<>();
+        File[] fList = fileDirectory.listFiles();
+        for (File file : fList) {
+            if (file.isFile()) {
+                resultList.add(file);
+            } else if (file.isDirectory()) {
+                dirDependencyList.add(file.getName());
+                resultList.addAll(listModelFiles(file.getAbsolutePath()));
+            }
+        }
+        return resultList;
+    }
+
+    public void cleanUp(String path) {
+        if (path != null) {
             try {
                 FileUtils.forceDelete(new File(path));
             } catch (IOException e) {
-               LOGGER.error("Failed to delete folder " + path, e);
-            }  
+                LOGGER.error("Failed to delete folder " + path, e);
+            }
         }
     }
-    private void checkZipDirectory(String zipDirectory) {
+
+    public void checkZipDirectory(String zipDirectory) {
         Path path = Paths.get(zipDirectory);
+
         if (Files.exists(path)) {
             cleanUp(zipDirectory);
         }
     }
-       
+
     private List<String> createList() {
-        List<String> list = new  ArrayList<>();
-        for (Entry<String, MSAttributeObject> cMap : classMap.entrySet()){
-            if (cMap.getValue().isPolicyTempalate()){
+        List<String> list = new ArrayList<>();
+        for (Entry<String, MSAttributeObject> cMap : classMap.entrySet()) {
+            if (cMap.getValue().isPolicyTempalate()) {
                 list.add(cMap.getKey());
             }
-            
+
         }
-        
-        if (list.isEmpty()){
-            if (classMap.containsKey(this.newModel.getModelName())){
+
+        if (list.isEmpty()) {
+            if (classMap.containsKey(this.newModel.getModelName())) {
                 list.add(this.newModel.getModelName());
-            }else {
+            } else {
                 list.add("EMPTY");
             }
         }
         return list;
     }
 
-       public Map<String, String> getAttributesListRefMap() {
-               return attributesListRefMap;
-       }
+    public Map<String, String> getAttributesListRefMap() {
+        return attributesListRefMap;
+    }
+
+    public Map<String, LinkedList<String>> getArrayTextList() {
+        return arrayTextList;
+    }
+
+    public Map<String, String> getSigRules() {
+        return sigRules;
+    }
 
-       public Map<String, LinkedList<String>> getArrayTextList() {
-               return arrayTextList;
-       }
+    public void setSigRules(Map<String, String> sigRules) {
+        this.sigRules = sigRules;
+    }
 
 }
 
+
+@Getter
+@Setter
 class DCAEMicroServiceObject {
 
-       private String service;
-       private String location;
-       private String uuid;
-       private String policyName;
-       private String description;
-       private String configName;
-       private String templateVersion;
-       private String version;
-       private String priority;
-       private String policyScope;
-       private String riskType;
-       private String riskLevel; 
-       private String guard = null;
-
-       public String getGuard() {
-               return guard;
-       }
-       public void setGuard(String guard) {
-               this.guard = guard;
-       }
-       public String getRiskType() {
-               return riskType;
-       }
-       public void setRiskType(String riskType) {
-               this.riskType = riskType;
-       }
-       public String getRiskLevel() {
-               return riskLevel;
-       }
-       public void setRiskLevel(String riskLevel) {
-               this.riskLevel = riskLevel;
-       }
-       public String getPolicyScope() {
-               return policyScope;
-       }
-       public void setPolicyScope(String policyScope) {
-               this.policyScope = policyScope;
-       }
-
-       public String getPriority() {
-               return priority;
-       }
-       public void setPriority(String priority) {
-               this.priority = priority;
-       }
-       public String getVersion() {
-               return version;
-       }
-       public void setVersion(String version) {
-               this.version = version;
-       }
-       private Object content;
-
-
-       public String getPolicyName() {
-               return policyName;
-       }
-       public void setPolicyName(String policyName) {
-               this.policyName = policyName;
-       }
-       public String getDescription() {
-               return description;
-       }
-       public void setDescription(String description) {
-               this.description = description;
-       }
-       public String getConfigName() {
-               return configName;
-       }
-       public void setConfigName(String configName) {
-               this.configName = configName;
-       }
-       public Object getContent() {
-               return content;
-       }
-       public void setContent(Object content) {
-               this.content = content;
-       }
-
-       public String getService() {
-               return service;
-       }
-       public void setService(String service) {
-               this.service = service;
-       }
-       public String getLocation() {
-               return location;
-       }
-       public void setLocation(String location) {
-               this.location = location;
-       }
-
-       public String getUuid() {
-               return uuid;
-       }
-       public void setUuid(String uuid) {
-               this.uuid = uuid;
-       }
-       public String getTemplateVersion() {
-               return templateVersion;
-       }
-       public void setTemplateVersion(String templateVersion) {
-               this.templateVersion = templateVersion;
-       }
-
-}
\ No newline at end of file
+    private String service;
+    private String location;
+    private String uuid;
+    private String policyName;
+    private String description;
+    private String configName;
+    private String templateVersion;
+    private String version;
+    private String priority;
+    private String policyScope;
+    private String riskType;
+    private String riskLevel;
+    private String guard = null;
+    private Object uiContent;
+    private Object content;
+}