/*- * ============LICENSE_START======================================================= * ONAP Policy Engine * ================================================================================ * Copyright (C) 2017 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. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.onap.policy.controller; 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; 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; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; import java.util.UUID; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonArrayBuilder; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonReader; import javax.json.JsonValue; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.compress.utils.IOUtils; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.json.JSONArray; import org.json.JSONObject; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.rest.XACMLRestProperties; 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.PolicyEntity; import org.onap.policy.rest.util.MSAttributeObject; import org.onap.policy.rest.util.MSModelUtils; import org.onap.policy.rest.util.MSModelUtils.MODEL_TYPE; import org.onap.portalsdk.core.controller.RestrictedBaseController; import org.onap.portalsdk.core.web.support.JsonMessage; import org.springframework.beans.factory.annotation.Autowired; 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 modelList = new ArrayList<>(); private List dirDependencyList = new ArrayList<>(); private HashMap classMap = new HashMap<>(); //Tosca Model related Datastructure. String referenceAttributes; String attributeString; String listConstraints; String subAttributeString; HashMap retmap = new HashMap<>(); Set uniqueKeys= new HashSet<>(); Set uniqueDataKeys= new HashSet<>(); StringBuilder dataListBuffer=new StringBuilder(); List dataConstraints= new ArrayList <>(); Set 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(){ // Empty Constructor } protected PolicyRestAdapter policyAdapter = null; private int priorityCount; private Map attributesListRefMap = new HashMap<>(); private Map> 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) { return (GroupPolicyScopeList) commonClassDao.getEntityItem(GroupPolicyScopeList.class, "name", policyScope); } 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> fieldsIterator = rootNode.fields(); boolean remove = false; JsonObject removed = null; boolean contentChanged = false; while (fieldsIterator.hasNext()) { Map.Entry 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; } public static JsonArray removeNull(JsonArray array) { JsonArrayBuilder builder = Json.createArrayBuilder(); int i = 0; for (Iterator 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> it = obj.entrySet().iterator(); it.hasNext();) { Entry 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 load(String fileName) throws IOException { File newConfiguration = new File(fileName); Yaml yaml = new Yaml(); Map yamlMap = null; try(InputStream is = new FileInputStream(newConfiguration)){ yamlMap = (Map) yaml.load(is); } catch (FileNotFoundException e) { LOGGER.error(e); } StringBuilder sb = new StringBuilder(); Map settings = new HashMap<>(); if (yamlMap == null) { return settings; } List path = new ArrayList <>(); serializeMap(settings, sb, path, yamlMap); return settings; } public Map load(byte[] source) { Yaml yaml = new Yaml(); @SuppressWarnings("unchecked") Map yamlMap = (Map) yaml.load(Arrays.toString(source)); StringBuilder sb = new StringBuilder(); Map settings = new HashMap <>(); if (yamlMap == null) { return settings; } List path = new ArrayList <>(); serializeMap(settings, sb, path, yamlMap); return settings; } @SuppressWarnings({ "unchecked", "rawtypes" }) private void serializeMap(Map settings, StringBuilder sb, List path, Map yamlMap) { for (Map.Entry entry : yamlMap.entrySet()) { if (entry.getValue() instanceof Map) { path.add((String) entry.getKey()); serializeMap(settings, sb, path, (Map) 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 settings, StringBuilder sb, List path, List yamlList) { int counter = 0; for (Object listEle : yamlList) { if (listEle instanceof Map) { path.add(Integer.toString(counter)); serializeMap(settings, sb, path, (Map) listEle); path.remove(path.size() - 1); } else if (listEle instanceof List) { path.add(Integer.toString(counter)); serializeList(settings, sb, path, (List) listEle); path.remove(path.size() - 1); } else { serializeValue(settings, sb, path, Integer.toString(counter), listEle); } counter++; } } private void serializeValue(Map settings, StringBuilder sb, List 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 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 parseDataNodes(Map map){ HashMap 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 dataMapForJson){ HashMap> dataMapKey= new HashMap <>(); HashMap hmSub; for(Map.Entry 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> entry: dataMapKey.entrySet()){ String s=entry.getKey(); json= new JSONObject(); HashMap jsonHm=dataMapKey.get(s); for(Map.Entry entryMap:jsonHm.entrySet()){ String key=entryMap.getKey(); json.put(key, jsonHm.get(key)); } mainObject.put(s,json); } Iterator 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> parsePolicyNodes(Map map){ HashMap> mapKey= new HashMap <>(); for(String uniqueKey: uniqueKeys){ HashMap hm; for(Map.Entry 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> mapKey){ StringBuilder attributeStringBuilder= new StringBuilder(); StringBuilder referenceStringBuilder= new StringBuilder(); StringBuilder listBuffer= new StringBuilder(); List constraints= new ArrayList<>(); for(Map.Entry> entry: mapKey.entrySet()){ String keySetString= entry.getKey(); HashMap 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 keys= keyValues.keySet(); Iterator 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) && (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()){ //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 map= new HashMap<>(); try { map=load(fileName); parseDataAndPolicyNodes(map); HashMap dataMapForJson=parseDataNodes(map); constructJsonForDataFields(dataMapForJson); HashMap> 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 jsonElements = jsonNode.elements(); Iterator jsonKeys = jsonNode.fieldNames(); Map 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 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{ 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); //Get all keys with "MANY-true" defined in their value from subAttribute Set 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 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 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 list = new ArrayList<>(); PrintWriter out = response.getWriter(); String responseString = mapper.writeValueAsString(returnModel); JSONObject j; 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 allkeys) { Map attributeMap = new HashMap<>(); Map 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; for (Entry 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 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 subAttributeMap, String enumAttribute) { JSONObject object = new JSONObject(); Map map; Object returnClass = subAttributeMap.get(name); map = (Map) returnClass; JSONArray array; for( Entry 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 static JSONObject convertToArrayElement(JSONObject json, String keyValue) { return convertToArrayElement(json, new HashSet<>(), keyValue); } private static JSONObject convertToArrayElement(JSONObject json, Set 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 getManyTrueProperties(String referAttributes){ LOGGER.info("referAttributes : " + referAttributes); Set manyTrueProperties = new HashSet<>(); if(referAttributes != null){ String[] referAarray = referAttributes.split(","); String []element; for(int i=0; i 1 && element[1].contains("MANY-true")){ manyTrueProperties.add(element[0]); } } } return manyTrueProperties; } //call this method to start the recursive private Set getAllKeys(JSONObject json) { return getAllKeys(json, new HashSet<>()); } private Set getAllKeys(JSONArray arr) { return getAllKeys(arr, new HashSet<>()); } private Set getAllKeys(JSONArray arr, Set 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 getAllKeys(JSONObject json, Set 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 returnList = getVersionList(servicename); response.setCharacterEncoding("UTF-8"); response.setContentType("application / json"); request.setCharacterEncoding("UTF-8"); List 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 getVersionList(String name) { MicroServiceModels workingModel; Set list = new HashSet<>(); List 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 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 model = new HashMap<>(); ObjectMapper mapper = new ObjectMapper(); List 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 anyOfList = target.getAnyOf(); if (anyOfList != null) { Iterator iterAnyOf = anyOfList.iterator(); while (iterAnyOf.hasNext()) { AnyOfType anyOf = iterAnyOf.next(); // Under AnyOFType we have AllOFType List allOfList = anyOf.getAllOf(); if (allOfList != null) { Iterator iterAllOf = allOfList.iterator(); while (iterAllOf.hasNext()) { AllOfType allOf = iterAllOf.next(); // Under AllOFType we have Match List matchList = allOf.getMatch(); if (matchList != null) { Iterator 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); } } } } } } } } public static Map convert(String str, String split) { Map 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 = 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 data = new LinkedHashMap<>(); LinkedHashMap map = (LinkedHashMap) msBody.getContent(); readRecursivlyJSONContent(map, data); policyAdapter.setRuleData(data); } } catch (Exception e) { LOGGER.error(e); } } @SuppressWarnings({ "rawtypes", "unchecked" }) private void readRecursivlyJSONContent(LinkedHashMap map, LinkedHashMap data){ for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) { Object key = iterator.next(); Object value = map.get(key); if(value instanceof LinkedHashMap){ LinkedHashMap secondObjec = new LinkedHashMap<>(); readRecursivlyJSONContent((LinkedHashMap) value, secondObjec); for( Entry 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 newData = new LinkedHashMap<>(); readRecursivlyJSONContent((LinkedHashMap) arrayvalue, newData); for(Entry 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()); } } } private String getPolicyScope(String value) { List 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 convertMap(Map attributesMap, Map attributesRefMap) { Map attribute = new HashMap<>(); StringBuilder temp; String key; String value; for (Entry entry : attributesMap.entrySet()) { key = entry.getKey(); value = entry.getValue(); attribute.put(key, value); } for (Entry entryRef : attributesRefMap.entrySet()) { key = entryRef.getKey(); value = entryRef.getValue(); attribute.put(key, value); } for (Entry entryList : attributesListRefMap.entrySet()) { key = entryList.getKey(); value = entryList.getValue(); attribute.put(key, value); } for (Entry> 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 HashMap<>(); retmap = new HashMap<>(); uniqueKeys= new HashSet<>(); uniqueDataKeys= new HashSet<>(); dataListBuffer=new StringBuilder(); dataConstraints= new ArrayList <>(); List 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 fileList = new ArrayList<>(); this.directory = "model"; if (zip){ extractFolder(this.newFile); fileList = listModelFiles(this.directory); }else if (yml){ parseTosca(this.newFile); }else { File file = new File(this.newFile); fileList.add(file); } String modelType; if(! yml){ 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 returnAttributeList =new HashMap<>(); returnAttributeList.put(className, this.attributeString); msAttributes.setAttribute(returnAttributeList); msAttributes.setSubClass(this.retmap); HashMap returnReferenceList =new HashMap<>(); returnReferenceList.put(className, this.referenceAttributes); msAttributes.setRefAttribute(returnReferenceList); if(this.listConstraints!=""){ HashMap enumList =new HashMap<>(); String[] listArray=this.listConstraints.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); 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()); HashMap tempMap; tempMap = utils.processEpackage(workingFile, MODEL_TYPE.XMI); classMap.putAll(tempMap); LOGGER.info(tempMap); return; } private List listModelFiles(String directoryName) { File directory = new File(directoryName); List 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){ try { FileUtils.forceDelete(new File(path)); } catch (IOException e) { LOGGER.error("Failed to delete folder " + path, e); } } } private void checkZipDirectory(String zipDirectory) { Path path = Paths.get(zipDirectory); if (Files.exists(path)) { cleanUp(zipDirectory); } } private List createList() { List list = new ArrayList<>(); for (Entry cMap : classMap.entrySet()){ if (cMap.getValue().isPolicyTempalate()){ list.add(cMap.getKey()); } } if (list.isEmpty()){ if (classMap.containsKey(this.newModel.getModelName())){ list.add(this.newModel.getModelName()); }else { list.add("EMPTY"); } } return list; } public Map getAttributesListRefMap() { return attributesListRefMap; } public Map> getArrayTextList() { return arrayTextList; } } 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; } }