From 9b57ecb9bfbf50d3c38e390fb61b7efd05fa049e Mon Sep 17 00:00:00 2001 From: "Wang,Frank(gw1218)" Date: Thu, 30 Aug 2018 11:16:37 -0500 Subject: [PATCH] TOSCA model enhancements Add those features below to existing TOSCA Policy model: 1. Set default value to HTML element 2. Set description of a property as a tooltip 3. Support Boolean type 4. User defined object can be re-used by different properties in the same yaml file Issue-ID: POLICY-900 Change-Id: I337107828ce8130b9a68a2ba000ee719bbcb923e Signed-off-by: Wang,Frank(gw1218) --- .../org/onap/policy/rest/util/MSModelUtils.java | 784 +++++++++++---------- .../DCAEMicroServicePolicyController.js | 292 ++++++-- 2 files changed, 653 insertions(+), 423 deletions(-) diff --git a/ONAP-REST/src/main/java/org/onap/policy/rest/util/MSModelUtils.java b/ONAP-REST/src/main/java/org/onap/policy/rest/util/MSModelUtils.java index 50628d7d5..411ecaa26 100644 --- a/ONAP-REST/src/main/java/org/onap/policy/rest/util/MSModelUtils.java +++ b/ONAP-REST/src/main/java/org/onap/policy/rest/util/MSModelUtils.java @@ -23,11 +23,40 @@ package org.onap.policy.rest.util; import com.att.research.xacml.util.XACMLProperties; import com.google.gson.Gson; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.eclipse.emf.common.util.*; -import org.eclipse.emf.ecore.*; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.common.util.EMap; +import org.eclipse.emf.common.util.Enumerator; +import org.eclipse.emf.common.util.TreeIterator; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EAnnotation; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EEnum; +import org.eclipse.emf.ecore.EEnumLiteral; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.impl.EAttributeImpl; import org.eclipse.emf.ecore.impl.EEnumImpl; import org.eclipse.emf.ecore.resource.Resource; @@ -38,16 +67,12 @@ import org.json.JSONObject; import org.onap.policy.rest.XACMLRestProperties; import org.yaml.snakeyaml.Yaml; -import java.io.*; -import java.util.*; -import java.util.Map.Entry; - public class MSModelUtils { - private static final Log logger = LogFactory.getLog(MSModelUtils.class); + private static final Log logger = LogFactory.getLog(MSModelUtils.class); - private HashMap classMap = new HashMap<>(); + private HashMap classMap = new HashMap<>(); private HashMap enumMap = new HashMap<>(); private HashMap matchingClass = new HashMap<>(); private String configuration = "configuration"; @@ -56,45 +81,54 @@ public class MSModelUtils { private String policy = ""; private String eProxyURI = "eProxyURI:"; private List orderedElements = new ArrayList<>(); - private String dataOrderInfo = null; - private Set uniqueDataKeys= new HashSet<>(); - private Set uniqueKeys= new HashSet<>(); + private String dataOrderInfo = ""; + private Set uniqueDataKeys = new HashSet<>(); + private Set uniqueKeys = new HashSet<>(); private String listConstraints = null; private String referenceAttributes; private LinkedHashMap retmap = new LinkedHashMap<>(); - private Map matchableValues; - private static final String PROPERTIES=".properties."; - public static final String DATATYPE = "data_types.policy.data."; - public static final String TYPE=".type"; - public static final String REQUIRED=".required"; - private static final String MATCHABLE=".matchable"; - private static final String STRING="string"; - private static final String INTEGER="integer"; - private static final String LIST="list"; - public static final String MAP="map"; - private static final String DEFAULT=".default"; - private static final String MANYFALSE=":MANY-false"; - private static final String MANYTRUE=":MANY-true"; - private static final String DEFAULTVALUE=":defaultValue-"; - private static final String REQUIREDVALUE=":required-"; - private static final String MATCHABLEKEY="matchable"; - private static final String REQUIREDFALSE=":required-false"; - private static final String REQUIREDTRUE=":required-true"; - private static final String MATCHINGTRUE="matching-true"; - - private StringBuilder dataListBuffer=new StringBuilder(); - private List dataConstraints= new ArrayList <>(); + private Map matchableValues; + private static final String PROPERTIES = ".properties."; + private static final String DATATYPE = "data_types.policy.data."; + private static final String TYPE = ".type"; + private static final String REQUIRED = ".required"; + private static final String MATCHABLE = ".matchable"; + private static final String STRING = "string"; + private static final String INTEGER = "integer"; + private static final String BOOLEAN = "boolean"; + private static final String LIST = "list"; + private static final String MAP = "map"; + private static final String DEFAULT = ".default"; + private static final String MANYFALSE = ":MANY-false"; + private static final String DESCRIPTION = ".description"; + + private static final String MANYTRUE = ":MANY-true"; + private static final String DEFAULTVALUE = ":defaultValue-"; + private static final String REQUIREDVALUE = ":required-"; + private static final String MATCHABLEKEY = "matchable"; + private static final String REQUIREDFALSE = ":required-false"; + private static final String REQUIREDTRUE = ":required-true"; + private static final String MATCHINGTRUE = "matching-true"; + private static final String DESCRIPTION_KEY = "description"; + private static final String DESCRIPTION_TOKEN =":description-"; + private static final String PROPERTIES_KEY = "properties"; + private static final String DATA_TYPE = "data_types"; + private static final String ERROR = "error"; + private static final String NODE_TYPE = "node_types"; + private static final String TOSCA_DEFINITION_VERSION = "tosca_definitions_version"; + private StringBuilder dataListBuffer = new StringBuilder(); + private List dataConstraints = new ArrayList<>(); private String attributeString = null; + private boolean isDuplicatedAttributes = false; - public MSModelUtils(){ - } + public MSModelUtils() {} - public MSModelUtils(String onap, String policy){ + public MSModelUtils(String onap, String policy) { this.onap = onap; this.policy = policy; } - private enum ANNOTATION_TYPE{ + private enum ANNOTATION_TYPE { MATCHING, VALIDATION, DICTIONARY }; @@ -103,8 +137,8 @@ public class MSModelUtils { }; - public Map processEpackage(String file, MODEL_TYPE model){ - if (model == MODEL_TYPE.XMI ){ + public Map processEpackage(String file, MODEL_TYPE model) { + if (model == MODEL_TYPE.XMI) { processXMIEpackage(file); } return classMap; @@ -742,31 +776,22 @@ public class MSModelUtils { /* * For TOSCA Model */ - public String parseTosca (String fileName){ - LinkedHashMap map= new LinkedHashMap<>(); - + public String parseTosca(String fileName) { + LinkedHashMap map = new LinkedHashMap<>(); try { - map=load(fileName); - - if(map != null){ - if(map.get("error") != null){ - return map.get("error"); - } + map = load(fileName); + if (map != null && map.get(ERROR) != null) { + return map.get(ERROR); } - parseDataAndPolicyNodes(map); - - LinkedHashMap dataMapForJson=parseDataNodes(map); - + LinkedHashMap dataMapForJson = parseDataNodes(map); constructJsonForDataFields(dataMapForJson); - - LinkedHashMap> mapKey= parsePolicyNodes(map); - + LinkedHashMap> mapKey = parsePolicyNodes(map); createAttributes(mapKey); } catch (IOException e) { logger.error(e); - }catch(ParserException e){ + } catch (ParserException e) { logger.error(e); return e.getMessage(); } @@ -775,16 +800,16 @@ public class MSModelUtils { } @SuppressWarnings("unchecked") - public LinkedHashMap load(String fileName) throws IOException,ParserException { + public LinkedHashMap load(String fileName) throws IOException, ParserException { File newConfiguration = new File(fileName); - StringBuilder orderInfo = new StringBuilder("["); + StringBuffer orderInfo = new StringBuffer("["); Yaml yaml = new Yaml(); LinkedHashMap yamlMap = null; - try(InputStream is = new FileInputStream(newConfiguration)){ + try (InputStream is = new FileInputStream(newConfiguration)) { yamlMap = (LinkedHashMap) yaml.load(is); } catch (FileNotFoundException e) { logger.error(e); - }catch(Exception e){ + } catch (Exception e) { throw new ParserException("Invalid TOSCA Model format. Please make sure it is a valid YAML file"); } @@ -796,33 +821,35 @@ public class MSModelUtils { String message = validations(yamlMap); - if(message != null){ - settings.put("error", message); + if (message != null) { + settings.put(ERROR, message); return settings; } findNode(yamlMap); - orderedElements.stream().forEach((string) -> { - orderInfo.append(string); - orderInfo.append(","); - logger.info("Content: " + string); - }); + if (!isDuplicatedAttributes && orderedElements != null && orderedElements.size() > 0) { + orderedElements.stream().forEach((string) -> { + orderInfo.append(string); + orderInfo.append(","); + logger.info("Content: " + string); + }); - orderInfo.append("]"); + orderInfo.append("]"); - dataOrderInfo = orderInfo.toString(); - dataOrderInfo = dataOrderInfo.replace(",]", "]"); + dataOrderInfo = orderInfo.toString(); + dataOrderInfo = dataOrderInfo.replace(",]", "]"); - logger.info("dataOrderInfo :" + dataOrderInfo); + logger.info("dataOrderInfo :" + dataOrderInfo); + } - List path = new ArrayList <>(); + List path = new ArrayList<>(); serializeMap(settings, sb, path, yamlMap); return settings; } @SuppressWarnings("unchecked") - private String validations(@SuppressWarnings("rawtypes") LinkedHashMap yamlMap){ + private String validations(@SuppressWarnings("rawtypes") LinkedHashMap yamlMap) { boolean isNoteTypeFound = false; boolean isDataTypeFound = false; @@ -830,76 +857,72 @@ public class MSModelUtils { boolean isToscaVersionValueFound = false; @SuppressWarnings("rawtypes") Map m1 = new HashMap(); - short order =0; - if(yamlMap != null){ + short order = 0; + if (yamlMap != null) { // Get a set of the entries - @SuppressWarnings("rawtypes") + @SuppressWarnings("rawtypes") Set set = yamlMap.entrySet(); - // Get an iterator - @SuppressWarnings("rawtypes") + // Get an iterator + @SuppressWarnings("rawtypes") Iterator i = set.iterator(); - // Display elements - while(i.hasNext()) { - @SuppressWarnings("rawtypes") - Entry me = (Entry)i.next(); - - if("tosca_definitions_version".equals(me.getKey())){ - isToscaVersionKeyFound = true; - order++; - m1.put("tosca_definitions_version", order); - } - - if("tosca_simple_yaml_1_0_0".equals(me.getValue())){ - isToscaVersionValueFound = true; - } - - if("node_types".equals(me.getKey())){ - isNoteTypeFound = true; - order++; - m1.put("node_types", order); - } + // Display elements + while (i.hasNext()) { + @SuppressWarnings("rawtypes") + Map.Entry me = (Map.Entry) i.next(); + + if (TOSCA_DEFINITION_VERSION.equals(me.getKey())) { + isToscaVersionKeyFound = true; + order++; + m1.put(TOSCA_DEFINITION_VERSION, order); + } - if("data_types".equals(me.getKey())){ - isDataTypeFound = true; - order++; - m1.put("data_types", order); - } + if ("tosca_simple_yaml_1_0_0".equals(me.getValue())) { + isToscaVersionValueFound = true; + } - } + if (NODE_TYPE.equals(me.getKey())) { + isNoteTypeFound = true; + order++; + m1.put(NODE_TYPE, order); + } + if (DATA_TYPE.equals(me.getKey())) { + isDataTypeFound = true; + order++; + m1.put(DATA_TYPE, order); + } - if(!isDataTypeFound){ - return "data_types are missing or invalid."; - } + } - if(!isToscaVersionKeyFound || !isToscaVersionValueFound){ - return "tosca_definitions_version is missing or invalid."; - } + if (!isToscaVersionKeyFound || !isToscaVersionValueFound) { + return "tosca_definitions_version is missing or invalid."; + } - if(!isNoteTypeFound){ - return "node_types are missing or invalid."; - } + if (!isNoteTypeFound) { + return "node_types are missing or invalid."; + } - short version = (short) m1.get("tosca_definitions_version"); + short version = (short) m1.get(TOSCA_DEFINITION_VERSION); - if(version > 1 ){ + if (version > 1) { return "tosca_definitions_version should be defined first."; - } + } - short data = (short) m1.get("data_types"); - short node = (short) m1.get("node_types"); - if(node > data){ + short data = (short) m1.get(DATA_TYPE); + short node = (short) m1.get(NODE_TYPE); + if (isDataTypeFound && node > data) { return "node_types should be defined before data_types."; - } + } } return null; } - @SuppressWarnings({ "unchecked", "rawtypes" }) - private void serializeMap(LinkedHashMap settings, StringBuilder sb, List path, Map yamlMap) { - for (Entry entry : yamlMap.entrySet()) { + @SuppressWarnings({"unchecked", "rawtypes"}) + private void serializeMap(LinkedHashMap settings, StringBuilder sb, List path, + Map yamlMap) { + for (Map.Entry entry : yamlMap.entrySet()) { if (entry.getValue() instanceof Map) { path.add((String) entry.getKey()); @@ -916,7 +939,8 @@ public class MSModelUtils { } @SuppressWarnings("unchecked") - private void serializeList(LinkedHashMap settings, StringBuilder sb, List path, List yamlList) { + private void serializeList(LinkedHashMap settings, StringBuilder sb, List path, + List yamlList) { int counter = 0; for (Object listEle : yamlList) { if (listEle instanceof Map) { @@ -934,7 +958,8 @@ public class MSModelUtils { } } - private void serializeValue(LinkedHashMap settings, StringBuilder sb, List path, String name, Object value) { + private void serializeValue(LinkedHashMap settings, StringBuilder sb, List path, + String name, Object value) { if (value == null) { return; } @@ -947,23 +972,20 @@ public class MSModelUtils { } - void parseDataAndPolicyNodes(LinkedHashMap map){ - for(String key:map.keySet()){ - if(key.contains("policy.nodes.Root")) - { + void parseDataAndPolicyNodes(LinkedHashMap map) { + for (String key : map.keySet()) { + if (key.contains("policy.nodes.Root")) { continue; - } - else if(key.contains("policy.nodes")){ + } else if (key.contains("policy.nodes")) { String wordToFind = "policy.nodes."; - int indexForPolicyNode=key.indexOf(wordToFind); - String subNodeString= key.substring(indexForPolicyNode+13, key.length()); + 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()); + } 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); } @@ -971,12 +993,12 @@ public class MSModelUtils { } // 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){ + 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]); } } @@ -985,51 +1007,50 @@ public class MSModelUtils { } - public void stringBetweenDotsForDataFields(String str){ - String stringToSearch=str; - String[]ss=stringToSearch.split("\\."); - if(ss!=null){ - int len= ss.length; + 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]); + if (len > 2) { + uniqueDataKeys.add(ss[0] + "%" + ss[2]); } } } - void constructJsonForDataFields(LinkedHashMap dataMapForJson){ - LinkedHashMap> dataMapKey= new LinkedHashMap <>(); + void constructJsonForDataFields(LinkedHashMap dataMapForJson) { + LinkedHashMap> dataMapKey = new LinkedHashMap<>(); LinkedHashMap hmSub; - for(Entry entry: dataMapForJson.entrySet()){ - String uniqueDataKey= entry.getKey(); - String[] uniqueDataKeySplit=uniqueDataKey.split("%"); - String value= dataMapForJson.get(uniqueDataKey); - if(dataMapKey.containsKey(uniqueDataKeySplit[0])){ + 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 LinkedHashMap <>(); + } else { + hmSub = new LinkedHashMap<>(); hmSub.put(uniqueDataKeySplit[1], value); } dataMapKey.put(uniqueDataKeySplit[0], hmSub); } - JSONObject mainObject= new JSONObject(); + JSONObject mainObject = new JSONObject(); JSONObject json; - for(Entry> entry: dataMapKey.entrySet()){ - String s=entry.getKey(); - json= new JSONObject(); - HashMap jsonHm=dataMapKey.get(s); - for(Entry entryMap:jsonHm.entrySet()){ - String key=entryMap.getKey(); + 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); + mainObject.put(s, json); } Iterator keysItr = mainObject.keys(); - while(keysItr.hasNext()) { + while (keysItr.hasNext()) { String key = keysItr.next(); String value = mainObject.get(key).toString(); retmap.put(key, value); @@ -1039,166 +1060,175 @@ public class MSModelUtils { logger.info(mainObject); logger.info("###############################################################################"); } - LinkedHashMap parseDataNodes(LinkedHashMap map){ - LinkedHashMap dataMapForJson=new LinkedHashMap <>(); - matchableValues = 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); + + LinkedHashMap parseDataNodes(LinkedHashMap map) { + LinkedHashMap dataMapForJson = new LinkedHashMap<>(); + matchableValues = 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); - String findRequired=DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+REQUIRED; - String requiredValue= map.get(findRequired); + String findRequired = DATATYPE + uniqueDataKeySplit[0] + PROPERTIES + uniqueDataKeySplit[1] + REQUIRED; + String requiredValue = map.get(findRequired); - String matchable =DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+MATCHABLE; + String matchable = DATATYPE + uniqueDataKeySplit[0] + PROPERTIES + uniqueDataKeySplit[1] + MATCHABLE; - String matchableValue= map.get(matchable); + String matchableValue = map.get(matchable); - if(matchableValue != null && matchableValue.equalsIgnoreCase("true")){ - if(uniqueDataKey.contains("%")){ - String[] keys= uniqueDataKey.split("%"); - String key=keys[keys.length -1]; - matchableValues.put(key, MATCHINGTRUE); - }else{ - matchableValues.put(uniqueDataKey, MATCHINGTRUE); - } + if ("true".equalsIgnoreCase(matchableValue)) { + String key = uniqueDataKeySplit[uniqueDataKeySplit.length - 1]; + matchableValues.put(key, MATCHINGTRUE); } - if(requiredValue == null || requiredValue.isEmpty()){ + if (requiredValue == null || requiredValue.isEmpty()) { requiredValue = "false"; } - 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); - logger.info("requiredValue is:"+ requiredValue); - - StringBuilder attributeIndividualStringBuilder= new StringBuilder(); - attributeIndividualStringBuilder.append(typeValue+DEFAULTVALUE); - attributeIndividualStringBuilder.append(defaultValue+REQUIREDVALUE); - attributeIndividualStringBuilder.append(requiredValue+MANYFALSE); + if (INTEGER.equalsIgnoreCase(typeValue) || STRING.equalsIgnoreCase(typeValue) + || typeValue.equalsIgnoreCase(BOOLEAN)) { + String findDefault = + DATATYPE + uniqueDataKeySplit[0] + PROPERTIES + uniqueDataKeySplit[1] + DEFAULT; + String findDescription = + DATATYPE + uniqueDataKeySplit[0] + PROPERTIES + uniqueDataKeySplit[1] + DESCRIPTION; + String defaultValue = map.get(findDefault); + String descriptionDefined = map.get(findDescription); + logger.info("defaultValue is:" + defaultValue); + logger.info("requiredValue is:" + requiredValue); + + StringBuilder attributeIndividualStringBuilder = new StringBuilder(); + attributeIndividualStringBuilder.append(typeValue + DEFAULTVALUE); + attributeIndividualStringBuilder.append(defaultValue + REQUIREDVALUE); + attributeIndividualStringBuilder.append(requiredValue + MANYFALSE); + attributeIndividualStringBuilder.append(DESCRIPTION_TOKEN + descriptionDefined); dataMapForJson.put(uniqueDataKey, attributeIndividualStringBuilder.toString()); - } - else if(LIST.equalsIgnoreCase(typeValue) || MAP.equalsIgnoreCase(typeValue)){ - logger.info("requiredValue is:"+ requiredValue); - 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+REQUIREDVALUE); - referenceIndividualStringBuilder.append(requiredValue+MANYTRUE); + } else if (LIST.equalsIgnoreCase(typeValue) || MAP.equalsIgnoreCase(typeValue)) { + logger.info("requiredValue is:" + requiredValue); + String findList = + DATATYPE + uniqueDataKeySplit[0] + PROPERTIES + uniqueDataKeySplit[1] + + ".entry_schema.type"; + String findDefaultValue = + DATATYPE + uniqueDataKeySplit[0] + PROPERTIES + uniqueDataKeySplit[1] + + ".entry_schema.default"; + String findDescription = + DATATYPE + uniqueDataKeySplit[0] + PROPERTIES + uniqueDataKeySplit[1] + + ".entry_schema.description"; + String listValue = map.get(findList); + String defaultValue = map.get(findDefaultValue); + String description = map.get(findDescription); + 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 + REQUIREDVALUE); + referenceIndividualStringBuilder.append(requiredValue + MANYTRUE); + referenceIndividualStringBuilder.append(DESCRIPTION_TOKEN + description); dataMapForJson.put(uniqueDataKey, referenceIndividualStringBuilder.toString()); - }//Its string - else{ - StringBuilder stringListItems= new StringBuilder(); - if(LIST.equalsIgnoreCase(typeValue)){ - stringListItems.append(uniqueDataKeySplit[1].toUpperCase()+REQUIREDVALUE+requiredValue +MANYFALSE); - }else if( MAP.equalsIgnoreCase(typeValue)){ - stringListItems.append(uniqueDataKeySplit[1].toUpperCase()+REQUIREDVALUE+requiredValue +MANYTRUE); + } else { // Its string + StringBuilder stringListItems = new StringBuilder(); + if (LIST.equalsIgnoreCase(typeValue)) { + stringListItems.append(uniqueDataKeySplit[1].toUpperCase() + DEFAULTVALUE + + defaultValue + REQUIREDVALUE + requiredValue + MANYFALSE + DESCRIPTION_TOKEN + + description); + } else if (MAP.equalsIgnoreCase(typeValue)) { + stringListItems.append(uniqueDataKeySplit[1].toUpperCase() + DEFAULTVALUE + + defaultValue + REQUIREDVALUE + requiredValue + MANYTRUE + DESCRIPTION_TOKEN + + description); } dataMapForJson.put(uniqueDataKey, stringListItems.toString()); - boolean isConstraintsFound = false; - for(int i=0;i<10;i++){ - String findConstraints= DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+".entry_schema.constraints.0.valid_values."+i; - logger.info("findConstraints => " + findConstraints); - String constraintsValue=map.get(findConstraints); - logger.info("constraintsValue => " + constraintsValue); - - if((constraintsValue==null || constraintsValue.isEmpty()) && i==0){ //if no constraints at all ( index i as 0 can tell this ) - isConstraintsFound = false; - //if type is list but no constraints - String newValue = dataMapForJson.get(uniqueDataKey).replace("MANY-false", "MANY-true"); - newValue = newValue.replace(uniqueDataKeySplit[1].toUpperCase()+":", ""); - dataMapForJson.put(uniqueDataKey, newValue); + 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{ - isConstraintsFound = true; - if(i == 0){ // only need to add one time for the same attribute - dataListBuffer.append(uniqueDataKeySplit[1].toUpperCase()+"=["); - } - - if(constraintsValue==null){ - constraintsValue = ""; - }else if (constraintsValue.contains("=")) { + } else { + System.out.println("constraintsValue => " + constraintsValue); + if (constraintsValue.contains("=")) { constraintsValue = constraintsValue.replace("=", "equal-sign"); } - dataConstraints.add(constraintsValue); - dataListBuffer.append(constraintsValue+","); + dataListBuffer.append(constraintsValue + ","); } } - if(isConstraintsFound){ - dataListBuffer.append("]#"); - } + dataListBuffer.append("]#"); + logger.info(dataListBuffer); } - }else{ - logger.info("entry_schema.type is not defined correctly"); } - } - else{ - String findUserDefined=DATATYPE+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+REQUIREDVALUE); - referenceIndividualStringBuilder.append(requiredValue+MANYFALSE); + } else { + String findUserDefined = + DATATYPE + uniqueDataKeySplit[0] + "." + PROPERTIES_KEY + "." + uniqueDataKeySplit[1] + + ".type"; + String findDescription = + DATATYPE + uniqueDataKeySplit[0] + "." + PROPERTIES_KEY + "." + uniqueDataKeySplit[1] + + ".description"; + String userDefinedValue = map.get(findUserDefined); + String description = map.get(findDescription); + // String requiredValue = map.get(required); + String trimValue = userDefinedValue.substring(userDefinedValue.lastIndexOf('.') + 1); + StringBuilder referenceIndividualStringBuilder = new StringBuilder(); + referenceIndividualStringBuilder.append(trimValue + REQUIREDVALUE); + referenceIndividualStringBuilder.append(requiredValue + MANYFALSE); + referenceIndividualStringBuilder.append(DESCRIPTION_TOKEN + description); dataMapForJson.put(uniqueDataKey, referenceIndividualStringBuilder.toString()); } + } else { + matchableValues.put(uniqueDataKey, MATCHINGTRUE); } } return dataMapForJson; } + LinkedHashMap> parsePolicyNodes(Map map) + throws ParserException { + LinkedHashMap> mapKey = new LinkedHashMap<>(); + for (String uniqueKey : uniqueKeys) { + LinkedHashMap hm; - LinkedHashMap> parsePolicyNodes(Map map) throws ParserException{ - LinkedHashMap> mapKey= new LinkedHashMap <>(); - for(String uniqueKey: uniqueKeys){ - LinkedHashMap hm; - - for(Entry entry:map.entrySet()){ - String key=entry.getKey(); - if(key.contains(uniqueKey) && key.contains("policy.nodes")){ - if(mapKey.containsKey(uniqueKey)){ + for (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".equalsIgnoreCase(keyStr) && ((key.contains("entry_schema.0.type") || key.contains("entry_schema.type") && valueStr.contains("policy.data.")))){ - throw new ParserException("For using user defined object type, Please make sure no space between 'type:' and object " + valueStr ); + String keyStr = key.substring(key.lastIndexOf('.') + 1); + String valueStr = map.get(key); + if ("type".equalsIgnoreCase(keyStr) + && key.contains("entry_schema.0.type") || key.contains("entry_schema.type") + && valueStr.contains("policy.data.")) { + throw new ParserException( + "For user defined object type, Please make sure no space between 'type:' and object " + + valueStr); } - if("type".equals(keyStr)){ - if(!key.contains("entry_schema")) - { - hm.put(keyStr,valueStr); + if ("type".equals(keyStr)) { + if (!key.contains("entry_schema")) { + hm.put(keyStr, valueStr); } - }else{ - hm.put(keyStr,valueStr); + } else { + hm.put(keyStr, valueStr); } } else { - hm = new LinkedHashMap <>(); - String keyStr= key.substring(key.lastIndexOf('.')+1); - String valueStr= map.get(key); - if(key.contains(".objective.")){ + hm = new LinkedHashMap<>(); + String keyStr = key.substring(key.lastIndexOf('.') + 1); + String valueStr = map.get(key); + if (key.contains(".objective.")) { throw new ParserException("Attribute objective is a key word. Please use a different name"); } - if(("type").equals(keyStr)){ - if(!key.contains("entry_schema")) - { - hm.put(keyStr,valueStr); + if (("type").equals(keyStr)) { + if (!key.contains("entry_schema")) { + hm.put(keyStr, valueStr); } - }else{ - hm.put(keyStr,valueStr); + } else { + hm.put(keyStr, valueStr); } mapKey.put(uniqueKey, hm); } @@ -1208,92 +1238,94 @@ public class MSModelUtils { return mapKey; } - void createAttributes(LinkedHashMap> mapKey){ - StringBuilder attributeStringBuilder= new StringBuilder(); - StringBuilder referenceStringBuilder= new StringBuilder(); - StringBuilder listBuffer= new StringBuilder(); - List constraints= new ArrayList<>(); - for(Entry> entry: mapKey.entrySet()){ - String keySetString= entry.getKey(); - LinkedHashMap keyValues=mapKey.get(keySetString); - if(STRING.equalsIgnoreCase(keyValues.get("type"))|| - INTEGER.equalsIgnoreCase(keyValues.get("type"))){ - StringBuilder attributeIndividualStringBuilder= new StringBuilder(); - attributeIndividualStringBuilder.append(keySetString+"="); - attributeIndividualStringBuilder.append(keyValues.get("type")+DEFAULTVALUE); - attributeIndividualStringBuilder.append(keyValues.get("default")+REQUIREDVALUE); - attributeIndividualStringBuilder.append(keyValues.get("required")+MANYFALSE); - attributeStringBuilder.append(attributeIndividualStringBuilder+","); - if("true".equalsIgnoreCase(keyValues.get(MATCHABLEKEY))){ + void createAttributes(LinkedHashMap> 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(); + LinkedHashMap keyValues = mapKey.get(keySetString); + if (keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(STRING) + || keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(INTEGER) + || keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(BOOLEAN)) { + StringBuilder attributeIndividualStringBuilder = new StringBuilder(); + attributeIndividualStringBuilder.append(keySetString + "="); + attributeIndividualStringBuilder.append(keyValues.get("type") + DEFAULTVALUE); + attributeIndividualStringBuilder.append(keyValues.get("default") + REQUIREDVALUE); + attributeIndividualStringBuilder.append(keyValues.get("required") + MANYFALSE); + attributeIndividualStringBuilder.append(DESCRIPTION_TOKEN + keyValues.get(DESCRIPTION_KEY)); + attributeStringBuilder.append(attributeIndividualStringBuilder + ","); + if (keyValues.get(MATCHABLEKEY) != null && keyValues.get(MATCHABLEKEY).equalsIgnoreCase("true")) { matchableValues.put(keySetString, MATCHINGTRUE); } - } - else if(LIST.equalsIgnoreCase(keyValues.get("type"))){ + } else if (LIST.equalsIgnoreCase(keyValues.get("type"))) { - if(("true").equalsIgnoreCase(keyValues.get(MATCHABLEKEY))){ + if ("true".equalsIgnoreCase(keyValues.get(MATCHABLEKEY))) { matchableValues.put(keySetString, MATCHINGTRUE); } - //List Datatype - Set keys= keyValues.keySet(); - Iterator itr=keys.iterator(); + // List Datatype + Set keys = keyValues.keySet(); + Iterator itr = keys.iterator(); boolean isDefinedType = false; - 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 + 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 type - String trimValue=value.substring(value.lastIndexOf('.')+1); - StringBuilder referenceIndividualStringBuilder= new StringBuilder(); - referenceIndividualStringBuilder.append(keySetString+"="+trimValue+MANYTRUE); - referenceStringBuilder.append(referenceIndividualStringBuilder+","); + } else { + // This is user defined type + String trimValue = value.substring(value.lastIndexOf('.') + 1); + StringBuilder referenceIndividualStringBuilder = new StringBuilder(); + referenceIndividualStringBuilder.append(keySetString + "=" + trimValue + MANYTRUE + + DESCRIPTION_TOKEN + keyValues.get(DESCRIPTION_KEY)); + referenceStringBuilder.append(referenceIndividualStringBuilder + ","); isDefinedType = true; } } } - if(!isDefinedType && LIST.equalsIgnoreCase(keyValues.get("type"))){ //type is not user defined and is a list but no constraints defined. - if(constraints == null || constraints.isEmpty()){ - referenceStringBuilder.append(keySetString+"=MANY-true"+","); + if (!isDefinedType && LIST.equalsIgnoreCase(keyValues.get("type"))) { + if (constraints == null || constraints.isEmpty()) { + referenceStringBuilder.append(keySetString + "=MANY-true" + ","); } } - }else{ - //User defined Datatype. - if("true".equalsIgnoreCase(keyValues.get(MATCHABLEKEY))){ + } else { + // User defined Datatype. + if ("true".equalsIgnoreCase(keyValues.get(MATCHABLEKEY))) { matchableValues.put(keySetString, MATCHINGTRUE); } - 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+MANYFALSE); - referenceStringBuilder.append(referenceIndividualStringBuilder+","); - }else{ + 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 + MANYFALSE + + DESCRIPTION_TOKEN + keyValues.get(DESCRIPTION_KEY)); + 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+","); + 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()+MANYFALSE); - referenceStringBuilder.append(referenceIndividualStringBuilder+","); + StringBuilder referenceIndividualStringBuilder = new StringBuilder(); + referenceIndividualStringBuilder.append(keySetString + "=" + keySetString.toUpperCase() + MANYFALSE); + referenceStringBuilder.append(referenceIndividualStringBuilder + ","); constraints.clear(); } } @@ -1302,47 +1334,57 @@ public class MSModelUtils { 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("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(); + this.listConstraints = dataListBuffer.toString(); + this.referenceAttributes = referenceStringBuilder.toString(); + this.attributeString = attributeStringBuilder.toString(); } @SuppressWarnings("unchecked") - public void findNode(LinkedHashMap map) { + private void findNode(LinkedHashMap map) { - map.forEach((key,value) -> { + map.forEach((key, value) -> { // if the value is properties and its type is map object, then save all the keys - if(key.equals("properties") && value instanceof Map){ - saveNodes((LinkedHashMap)value); + if (key.equals(PROPERTIES_KEY) && value instanceof Map) { + saveNodes((LinkedHashMap) value); + if (isDuplicatedAttributes) { + orderedElements = new ArrayList(); + return; + } } - if(!key.equals("policy.nodes.Root") && value instanceof Map){ - //value is a Map object, then make a recursive call - findNode((LinkedHashMap) value); + if (!key.equals("policy.nodes.Root")) { + // value is a Map object, then make a recursive call + if (value instanceof Map) { + findNode((LinkedHashMap) value); + } } }); } - public void saveNodes(LinkedHashMap map) { - - map.forEach((key,value) -> { + private void saveNodes(LinkedHashMap map) { - orderedElements.add((String)key); - - }); + for (Entry entry : map.entrySet()) { + if (orderedElements.indexOf((String) entry.getKey()) >= 0) { // duplicated attribute names + isDuplicatedAttributes = true; + return; + } else { + orderedElements.add((String) entry.getKey()); + } + } } public String getAttributeString() { return attributeString; } + public void setAttributeString(String attributeString) { this.attributeString = attributeString; } @@ -1354,6 +1396,7 @@ public class MSModelUtils { public void setRetmap(LinkedHashMap retmap) { this.retmap = retmap; } + public Map getMatchableValues() { return matchableValues; } @@ -1361,6 +1404,7 @@ public class MSModelUtils { public void setMatchableValues(Map matchableValues) { this.matchableValues = matchableValues; } + public String getReferenceAttributes() { return referenceAttributes; } @@ -1368,6 +1412,7 @@ public class MSModelUtils { public void setReferenceAttributes(String referenceAttributes) { this.referenceAttributes = referenceAttributes; } + public String getListConstraints() { return listConstraints; } @@ -1375,6 +1420,7 @@ public class MSModelUtils { public void setListConstraints(String listConstraints) { this.listConstraints = listConstraints; } + public String getDataOrderInfo() { return dataOrderInfo; } @@ -1383,4 +1429,4 @@ public class MSModelUtils { this.dataOrderInfo = dataOrderInfo; } -} \ No newline at end of file +} diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/DCAEMicroServicePolicyController.js b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/DCAEMicroServicePolicyController.js index dca8e9166..d53a9198e 100644 --- a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/DCAEMicroServicePolicyController.js +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/DCAEMicroServicePolicyController.js @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$window', '$compile', 'PolicyAppService', 'policyNavigator', 'modalService', '$modal', 'Notification', function ($scope, $window, $compile, PolicyAppService, PolicyNavigator, modalService, $modal, Notification) { $("#dialog").hide(); @@ -170,9 +171,9 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind $scope.choices = []; $scope.attributeDatas = [{"attributes" : $scope.choices}]; - $scope.isInitEditTemplate = true; //just initially create the edit template, didn't click add button yet. addNewChoice = function(value) { - console.log("input value : " + value); + console.log("input key : " + value); + var isFoundInRuleData = false; if(value != undefined){ if (value.startsWith('div.')){ value = value.replace('div.',''); @@ -188,9 +189,15 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind clone.id = ''+value+'@'+addElement; clone.value = ''; if($scope.temp.policy.editPolicy || $scope.temp.policy.readOnly){ //if it's view or edit - if($scope.temp.policy.ruleData[clone.id] || ($scope.temp.policy.editPolicy && !$scope.isInitEditTemplate)){ // Only append child if its value found in ruleData or edit mode + if($scope.temp.policy.ruleData[clone.id] || $scope.temp.policy.editPolicy){ // Only append child if its value found in ruleData or edit mode if($scope.temp.policy.ruleData[clone.id]){ clone.value = $scope.temp.policy.ruleData[clone.id]; + isFoundInRuleData = true; + } + console.log(" clone.value :" + clone.value); + console.log(" clone.id :" + clone.id); + if(!isFoundInRuleData && isInitViewEdit){ + return; } if(!clone.className.includes("child_single")){ clone.className += ' child_single'; //here cloned is single element @@ -246,6 +253,8 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind for(var i=0; i 0){ + if(dataType != "boolean" && defaultValue.length > 0){ if(defaultValue.includes(":")){ defaultValue = defaultValue.split(":")[0]; if(defaultValue === "NA") { @@ -1098,7 +1196,12 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind } } } - plainAttributeKeys.push(labelValue + attibuteKey+'*'+attributeManyKey); + + if (dataType != "boolean"){ + plainAttributeKeys.push(labelValue + attibuteKey+'*'+attributeManyKey); + }else{ + plainAttributeKeys.push(labelValue + attibuteKey+'*'+"boolean"); + } }; $scope.labelManyKeys = []; @@ -1201,7 +1304,7 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind } }; - $scope.dropBoxLayout = function(labelLevel, attributeName, many , refValue, listemunerateValues, isRequired){ + $scope.dropBoxLayout = function(labelLevel, attributeName, many , defaultValue, listemunerateValues, isRequired, description){ var br = document.createElement("BR"); if (labelLevel.length < 1){ @@ -1259,6 +1362,10 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind listField.setAttribute("style" , "width:300px;"); listField.setAttribute("ng-disabled" , "temp.policy.readOnly"); + if(description && description != "null"){ + listField.setAttribute("title", description); + } + if(isRequired){ if(document.getElementById(divID).hasAttribute('data-conditional')){ listField.setAttribute("data-conditional", divID); @@ -1296,6 +1403,14 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind }else { document.getElementById(divID).appendChild(listField).multiple = false; plainAttributeKeys.push(labelLevel + attributeName+'*'+false); + + if (defaultValue){ + if(defaultValue.includes(':')){ + defaultValue = defaultValue.split(':')[0]; + } + var location = listemunerateValues.indexOf(defaultValue); + document.getElementById(labelLevel +attributeName).options[location+1].selected = true; + } } if($scope.temp.policy.ruleData != null){ @@ -1372,12 +1487,30 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind jsonPolicy[key]= multiSlect; }else{ console.log(" searchElement.value = > " + searchElement.value); - jsonPolicy[key]= searchElement.value; + if(splitPlainAttributeKey[1]!= undefined && splitPlainAttributeKey[1] == "boolean"){ + jsonPolicy[key]= false; + for(var i=0; i " + searchElement.value); - jsonPolicy[key]= searchElement.value; + if(splitPlainAttributeKey[1] == "boolean"){ + jsonPolicy[key]= false; + for(var i=0; i