diff options
author | Michael Mokry <mm117s@att.com> | 2018-03-16 20:50:41 -0500 |
---|---|---|
committer | Michael Mokry <mm117s@att.com> | 2018-03-26 09:43:24 -0500 |
commit | b6d9063e06ab8cdf2d97fc75810792659344e4a8 (patch) | |
tree | 189c47e59cef6650ba0d39bbee31dcdaaa3ddbc7 /POLICY-SDK-APP/src | |
parent | c8bed1e392b935ec50aaeeb5fb82d25a9568b790 (diff) |
New Optimization Policy
This is the new Optimization Policy to support the Integration of
the OOF Policy Model into the Policy Platform.
Added changes from Frank Wang to fix the following issues with existing Model
Parser:
1. TOSCA Rendering issues
2. Matching Attributes support
3. ImportModelAPI to support TOSCA model upload via REST API
Running local Sonar tonight to start fixing Sonar issues
Added changes per review comments and fixed Sonar issues
Change-Id: Ia8ce09c28a718ce4460475e76a750caef774bd6b
Issue-ID: POLICY-622
Signed-off-by: Michael Mokry <mm117s@att.com>
Diffstat (limited to 'POLICY-SDK-APP/src')
23 files changed, 4321 insertions, 779 deletions
diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyAdapter.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyAdapter.java index 42010f147..c1d1e9ce5 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyAdapter.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyAdapter.java @@ -29,6 +29,7 @@ import org.onap.policy.controller.CreateClosedLoopFaultController; import org.onap.policy.controller.CreateClosedLoopPMController; import org.onap.policy.controller.CreateDcaeMicroServiceController; import org.onap.policy.controller.CreateFirewallController; +import org.onap.policy.controller.CreateOptimizationController; import org.onap.policy.controller.CreatePolicyController; import org.onap.policy.controller.DecisionPolicyController; import org.onap.policy.rest.adapter.PolicyRestAdapter; @@ -58,6 +59,8 @@ public class PolicyAdapter { configPolicyName = "BRMS_Param"; }else if(policyAdapter.getPolicyName().startsWith("Config_MS")){ configPolicyName = "Micro Service"; + }else if(policyAdapter.getPolicyName().startsWith("Config_OOF")){ + configPolicyName = "Optimization"; }else if(policyAdapter.getPolicyName().startsWith("Action") || policyAdapter.getPolicyName().startsWith("Decision") ){ // No configPolicyName is applicable }else{ @@ -95,6 +98,9 @@ public class PolicyAdapter { else if("Micro Service".equalsIgnoreCase(policyAdapter.getConfigPolicyType())){ new CreateDcaeMicroServiceController().prePopulateDCAEMSPolicyData(policyAdapter, entity); } + else if("Optimization".equalsIgnoreCase(policyAdapter.getConfigPolicyType())){ + new CreateOptimizationController().prePopulatePolicyData(policyAdapter, entity); + } else if("Firewall Config".equalsIgnoreCase(policyAdapter.getConfigPolicyType())){ new CreateFirewallController().prePopulateFWPolicyData(policyAdapter, entity); } diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyRestController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyRestController.java index 801d4ec9d..8df9d1b89 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyRestController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyRestController.java @@ -45,6 +45,7 @@ import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.controller.CreateClosedLoopFaultController; import org.onap.policy.controller.CreateDcaeMicroServiceController; import org.onap.policy.controller.CreateFirewallController; +import org.onap.policy.controller.CreateOptimizationController; import org.onap.policy.controller.PolicyController; import org.onap.policy.rest.XACMLRestProperties; import org.onap.policy.rest.adapter.PolicyRestAdapter; @@ -79,7 +80,7 @@ public class PolicyRestController extends RestrictedBaseController{ private static final Logger policyLogger = FlexLogger.getLogger(PolicyRestController.class); - private static final String modal = "model"; + private static final String model = "model"; private static final String importDictionary = "import_dictionary"; private static CommonClassDao commonClassDao; @@ -117,21 +118,21 @@ public class PolicyRestController extends RestrictedBaseController{ PolicyRestAdapter policyData = mapper.readValue(root.get(PolicyController.getPolicydata()).get("policy").toString(), PolicyRestAdapter.class); - if("file".equals(root.get(PolicyController.getPolicydata()).get(modal).get("type").toString().replace("\"", ""))){ + if("file".equals(root.get(PolicyController.getPolicydata()).get(model).get("type").toString().replace("\"", ""))){ policyData.setEditPolicy(true); } - if(root.get(PolicyController.getPolicydata()).get(modal).get("path").size() != 0){ + if(root.get(PolicyController.getPolicydata()).get(model).get("path").size() != 0){ String dirName = ""; - for(int i = 0; i < root.get(PolicyController.getPolicydata()).get(modal).get("path").size(); i++){ - dirName = dirName.replace("\"", "") + root.get(PolicyController.getPolicydata()).get(modal).get("path").get(i).toString().replace("\"", "") + File.separator; + for(int i = 0; i < root.get(PolicyController.getPolicydata()).get(model).get("path").size(); i++){ + dirName = dirName.replace("\"", "") + root.get(PolicyController.getPolicydata()).get(model).get("path").get(i).toString().replace("\"", "") + File.separator; } if(policyData.isEditPolicy()){ policyData.setDomainDir(dirName.substring(0, dirName.lastIndexOf(File.separator))); }else{ - policyData.setDomainDir(dirName + root.get(PolicyController.getPolicydata()).get(modal).get("name").toString().replace("\"", "")); + policyData.setDomainDir(dirName + root.get(PolicyController.getPolicydata()).get(model).get("name").toString().replace("\"", "")); } }else{ - String domain = root.get(PolicyController.getPolicydata()).get(modal).get("name").toString(); + String domain = root.get(PolicyController.getPolicydata()).get(model).get("name").toString(); if(domain.contains("/")){ domain = domain.substring(0, domain.lastIndexOf('/')).replace("/", File.separator); } @@ -146,6 +147,8 @@ public class PolicyRestController extends RestrictedBaseController{ policyData = new CreateFirewallController().setDataToPolicyRestAdapter(policyData); }else if("Micro Service".equalsIgnoreCase(policyData.getConfigPolicyType())){ policyData = new CreateDcaeMicroServiceController().setDataToPolicyRestAdapter(policyData, root); + }else if("Optimization".equalsIgnoreCase(policyData.getConfigPolicyType())){ + policyData = new CreateOptimizationController().setDataToPolicyRestAdapter(policyData, root); } } diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java index 422c18a31..0f315a392 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP Policy Engine * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 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. @@ -24,11 +24,8 @@ 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; @@ -36,7 +33,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; @@ -78,6 +74,7 @@ import org.onap.policy.rest.adapter.PolicyRestAdapter; import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.GroupPolicyScopeList; import org.onap.policy.rest.jpa.MicroServiceModels; +import org.onap.policy.rest.jpa.MicroserviceHeaderdeFaults; import org.onap.policy.rest.jpa.PolicyEntity; import org.onap.policy.rest.util.MSAttributeObject; import org.onap.policy.rest.util.MSModelUtils; @@ -89,8 +86,6 @@ 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; @@ -113,7 +108,7 @@ import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType; @RequestMapping("/") public class CreateDcaeMicroServiceController extends RestrictedBaseController { private static final Logger LOGGER = FlexLogger.getLogger(CreateDcaeMicroServiceController.class); - private Map<String, String> matchableValues; + private static CommonClassDao commonClassDao; public static CommonClassDao getCommonClassDao() { @@ -129,19 +124,11 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { private String directory; private List<String> modelList = new ArrayList<>(); private List<String> dirDependencyList = new ArrayList<>(); - private HashMap<String,MSAttributeObject > classMap = new HashMap<>(); - //Tosca Model related Datastructure. + private LinkedHashMap<String,MSAttributeObject > classMap = new LinkedHashMap<>(); String referenceAttributes; String attributeString; - String listConstraints; - String subAttributeString; - HashMap<String, Object> retmap = new HashMap<>(); - Set<String> uniqueKeys= new HashSet<>(); - Set<String> uniqueDataKeys= new HashSet<>(); - StringBuilder dataListBuffer=new StringBuilder(); - List<String> dataConstraints= new ArrayList <>(); Set<String> allManyTrueKeys= new HashSet <>(); - + public static final String DATATYPE = "data_types.policy.data."; public static final String PROPERTIES=".properties."; public static final String TYPE=".type"; @@ -150,8 +137,9 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { 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"; public static final String MATCHABLE=".matchable"; + public static final String MANYFALSE=":MANY-false"; + @Autowired private CreateDcaeMicroServiceController(CommonClassDao commonClassDao){ @@ -260,7 +248,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { return policyAdapter; } - private String removeNullAttributes(String cleanJson) { + public String removeNullAttributes(String cleanJson) { ObjectMapper mapper = new ObjectMapper(); try { @@ -385,446 +373,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { return builder.build(); } - // Second index of dot should be returned. - public int stringBetweenDots(String str){ - String stringToSearch=str; - String[]ss=stringToSearch.split("\\."); - if(ss!=null){ - int len= ss.length; - if(len>2){ - uniqueKeys.add(ss[2]); - } - } - - return uniqueKeys.size(); - } - - public void stringBetweenDotsForDataFields(String str){ - String stringToSearch=str; - String[]ss=stringToSearch.split("\\."); - if(ss!=null){ - int len= ss.length; - - if(len>2){ - uniqueDataKeys.add(ss[0]+"%"+ss[2]); - } - } - } - - - @SuppressWarnings("unchecked") - public Map<String, String> load(String fileName) throws IOException { - File newConfiguration = new File(fileName); - Yaml yaml = new Yaml(); - Map<Object, Object> yamlMap = null; - try(InputStream is = new FileInputStream(newConfiguration)){ - yamlMap = (Map<Object, Object>) yaml.load(is); - } catch (FileNotFoundException e) { - LOGGER.error(e); - } - - StringBuilder sb = new StringBuilder(); - Map<String, String> settings = new HashMap<>(); - if (yamlMap == null) { - return settings; - } - List<String> path = new ArrayList <>(); - serializeMap(settings, sb, path, yamlMap); - return settings; - } - - public Map<String, String> load(byte[] source) { - Yaml yaml = new Yaml(); - @SuppressWarnings("unchecked") - Map<Object, Object> yamlMap = (Map<Object, Object>) yaml.load(Arrays.toString(source)); - StringBuilder sb = new StringBuilder(); - Map<String, String> settings = new HashMap <>(); - if (yamlMap == null) { - return settings; - } - List<String> path = new ArrayList <>(); - serializeMap(settings, sb, path, yamlMap); - return settings; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private void serializeMap(Map<String, String> settings, StringBuilder sb, List<String> path, Map<Object, Object> yamlMap) { - for (Map.Entry<Object, Object> entry : yamlMap.entrySet()) { - if (entry.getValue() instanceof Map) { - path.add((String) entry.getKey()); - serializeMap(settings, sb, path, (Map<Object, Object>) entry.getValue()); - path.remove(path.size() - 1); - } else if (entry.getValue() instanceof List) { - path.add((String) entry.getKey()); - serializeList(settings, sb, path, (List) entry.getValue()); - path.remove(path.size() - 1); - } else { - serializeValue(settings, sb, path, (String) entry.getKey(), entry.getValue()); - } - } - } - - @SuppressWarnings("unchecked") - private void serializeList(Map<String, String> settings, StringBuilder sb, List<String> path, List<String> yamlList) { - int counter = 0; - for (Object listEle : yamlList) { - if (listEle instanceof Map) { - path.add(Integer.toString(counter)); - serializeMap(settings, sb, path, (Map<Object, Object>) listEle); - path.remove(path.size() - 1); - } else if (listEle instanceof List) { - path.add(Integer.toString(counter)); - serializeList(settings, sb, path, (List<String>) listEle); - path.remove(path.size() - 1); - } else { - serializeValue(settings, sb, path, Integer.toString(counter), listEle); - } - counter++; - } - } - - private void serializeValue(Map<String, String> settings, StringBuilder sb, List<String> path, String name, Object value) { - if (value == null) { - return; - } - sb.setLength(0); - for (String pathEle : path) { - sb.append(pathEle).append('.'); - } - sb.append(name); - settings.put(sb.toString(), value.toString()); - } - - void parseDataAndPolicyNodes(Map<String,String> map){ - for(String key:map.keySet()){ - if(key.contains("policy.nodes.Root")) - { - continue; - } - else if(key.contains("policy.nodes")){ - String wordToFind = "policy.nodes."; - int indexForPolicyNode=key.indexOf(wordToFind); - String subNodeString= key.substring(indexForPolicyNode+13, key.length()); - - stringBetweenDots(subNodeString); - } - else if(key.contains("policy.data")){ - String wordToFind="policy.data."; - int indexForPolicyNode=key.indexOf(wordToFind); - String subNodeString= key.substring(indexForPolicyNode+12, key.length()); - - stringBetweenDotsForDataFields(subNodeString); - } - } - } - - HashMap<String,String> parseDataNodes(Map<String,String> map){ - HashMap<String,String> dataMapForJson=new HashMap <>(); - 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); - 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); - - String matchable =DATATYPE+uniqueDataKeySplit[0]+PROPERTIES+uniqueDataKeySplit[1]+MATCHABLE; - - String matchableValue= map.get(matchable); - - if("true".equalsIgnoreCase(matchableValue)){ - String key=uniqueDataKeySplit[uniqueDataKeySplit.length -1]; - matchableValues.put(key, "matching-true"); - } - - 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{ - if(constraintsValue.contains("=")){ - constraintsValue = constraintsValue.replace("=", "equal-sign"); - } - 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()); - - } - }else{ - matchableValues.put(uniqueDataKey, "matching-true"); - } - } - return dataMapForJson; - } - - void constructJsonForDataFields(HashMap<String,String> dataMapForJson){ - HashMap<String,HashMap<String,String>> dataMapKey= new HashMap <>(); - HashMap<String,String> hmSub; - for(Map.Entry<String, String> entry: dataMapForJson.entrySet()){ - String uniqueDataKey= entry.getKey(); - String[] uniqueDataKeySplit=uniqueDataKey.split("%"); - String value= dataMapForJson.get(uniqueDataKey); - if(dataMapKey.containsKey(uniqueDataKeySplit[0])){ - hmSub = dataMapKey.get(uniqueDataKeySplit[0]); - hmSub.put(uniqueDataKeySplit[1], value); - } - else{ - hmSub=new HashMap <>(); - hmSub.put(uniqueDataKeySplit[1], value); - } - - dataMapKey.put(uniqueDataKeySplit[0], hmSub); - } - - JSONObject mainObject= new JSONObject(); - JSONObject json; - for(Map.Entry<String,HashMap<String,String>> entry: dataMapKey.entrySet()){ - String s=entry.getKey(); - json= new JSONObject(); - HashMap<String,String> jsonHm=dataMapKey.get(s); - for(Map.Entry<String,String> entryMap:jsonHm.entrySet()){ - String key=entryMap.getKey(); - json.put(key, jsonHm.get(key)); - } - mainObject.put(s,json); - } - Iterator<String> keysItr = mainObject.keys(); - while(keysItr.hasNext()) { - String key = keysItr.next(); - String value = mainObject.get(key).toString(); - retmap.put(key, value); - } - - LOGGER.info("#############################################################################"); - LOGGER.info(mainObject); - LOGGER.info("###############################################################################"); - } - - - HashMap<String,HashMap<String,String>> parsePolicyNodes(Map<String,String> map){ - HashMap<String,HashMap<String,String>> mapKey= new HashMap <>(); - for(String uniqueKey: uniqueKeys){ - HashMap<String,String> hm; - - for(Map.Entry<String,String> entry:map.entrySet()){ - String key=entry.getKey(); - if(key.contains(uniqueKey) && key.contains("policy.nodes")){ - if(mapKey.containsKey(uniqueKey)){ - hm = mapKey.get(uniqueKey); - String keyStr= key.substring(key.lastIndexOf('.')+1); - String valueStr= map.get(key); - if(("type").equals(keyStr)){ - if(!key.contains("entry_schema")) - { - hm.put(keyStr,valueStr); - } - }else{ - hm.put(keyStr,valueStr); - } - - } else { - hm = new HashMap <>(); - String keyStr= key.substring(key.lastIndexOf('.')+1); - String valueStr= map.get(key); - if(("type").equals(keyStr)){ - if(!key.contains("entry_schema")) - { - hm.put(keyStr,valueStr); - } - }else{ - hm.put(keyStr,valueStr); - } - mapKey.put(uniqueKey, hm); - } - } - } - } - return mapKey; - } - - void createAttributes(HashMap<String,HashMap<String,String>> mapKey){ - StringBuilder attributeStringBuilder= new StringBuilder(); - StringBuilder referenceStringBuilder= new StringBuilder(); - StringBuilder listBuffer= new StringBuilder(); - List<String> constraints= new ArrayList<>(); - for(Map.Entry<String,HashMap<String,String>> entry: mapKey.entrySet()){ - String keySetString= entry.getKey(); - HashMap<String,String> keyValues=mapKey.get(keySetString); - if(keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(STRING)|| - keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(INTEGER) - ){ - StringBuilder attributeIndividualStringBuilder= new StringBuilder(); - attributeIndividualStringBuilder.append(keySetString+"="); - attributeIndividualStringBuilder.append(keyValues.get("type")+":defaultValue-"); - attributeIndividualStringBuilder.append(keyValues.get("default")+":required-"); - attributeIndividualStringBuilder.append(keyValues.get("required")+":MANY-false"); - attributeStringBuilder.append(attributeIndividualStringBuilder+","); - if("true".equalsIgnoreCase(keyValues.get("matchable"))){ - matchableValues.put(keySetString, "matching-true"); - } - } - else if(keyValues.get("type") != null && keyValues.get("type").equalsIgnoreCase(LIST)){ - - if("true".equalsIgnoreCase(keyValues.get("matchable"))){ - matchableValues.put(keySetString, "matching-true"); - } - //List Datatype - Set<String> keys= keyValues.keySet(); - Iterator<String> 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 - 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+":MANY-true"); - referenceStringBuilder.append(referenceIndividualStringBuilder+","); - isDefinedType = true; - } - } - - } - - if(!isDefinedType && keyValues.get("type").equalsIgnoreCase(LIST) && - (constraints == null || constraints.isEmpty()) ) { //type is list but no constraints defined. - referenceStringBuilder.append(keySetString+"=MANY-true"+","); - } - }else{ - //User defined Datatype. - if("true".equalsIgnoreCase(keyValues.get("matchable"))){ - matchableValues.put(keySetString, "matching-true"); - } - 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<String,String> map= new HashMap<>(); - - try { - map=load(fileName); - - parseDataAndPolicyNodes(map); - - HashMap<String,String> dataMapForJson=parseDataNodes(map); - - constructJsonForDataFields(dataMapForJson); - - HashMap<String,HashMap<String,String>> mapKey= parsePolicyNodes(map); - - createAttributes(mapKey); - - } catch (IOException e) { - LOGGER.error(e); - } - - } - - private String cleanUPJson(String json) { + public String cleanUPJson(String json) { String cleanJson = StringUtils.replaceEach(json, new String[]{"\\\\", "\\\\\\", "\\\\\\\\"}, new String[]{"\\", "\\", "\\"}); cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\\\\\\"}, new String[]{"\\"}); cleanJson = StringUtils.replaceEach(cleanJson, new String[]{"\\\\", "[[", "]]"}, new String[]{"\\", "[", "]"}); @@ -842,7 +391,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { return cleanJson; } - private JSONObject decodeContent(JsonNode jsonNode){ + public JSONObject decodeContent(JsonNode jsonNode){ Iterator<JsonNode> jsonElements = jsonNode.elements(); Iterator<String> jsonKeys = jsonNode.fieldNames(); Map<String,String> element = new TreeMap<>(); @@ -1004,6 +553,22 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { } MicroServiceModels returnModel = getAttributeObject(servicename, version); + MicroserviceHeaderdeFaults returnHeaderDefauls = getHeaderDefaultsObject(value); + JSONObject jsonHdDefaultObj = null; + if(returnHeaderDefauls != null){ + jsonHdDefaultObj = new JSONObject(); + jsonHdDefaultObj.put("onapName", returnHeaderDefauls.getOnapName()); + jsonHdDefaultObj.put("guard", returnHeaderDefauls.getGuard()); + jsonHdDefaultObj.put("riskLevel", returnHeaderDefauls.getRiskLevel()); + jsonHdDefaultObj.put("riskType", returnHeaderDefauls.getRiskType()); + jsonHdDefaultObj.put("priority", returnHeaderDefauls.getPriority()); + } + String headDefautlsData = ""; + if(jsonHdDefaultObj != null){ + headDefautlsData = jsonHdDefaultObj.toString(); + }else{ + headDefautlsData = "null"; + } //Get all keys with "MANY-true" defined in their value from subAttribute Set<String> allkeys = null; @@ -1015,9 +580,12 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { LOGGER.info("allkeys : " + allkeys); } - String nameOfTrueKey = ""; + //Get element order info + String dataOrderInfo = returnModel.getDataOrderInfo(); + + String allManyTrueKeys = ""; if(allkeys != null){ - nameOfTrueKey = allkeys.toString(); + allManyTrueKeys = allkeys.toString(); } String jsonModel = createMicroSeriveJson(returnModel, allkeys); @@ -1060,11 +628,13 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { List<Object> list = new ArrayList<>(); PrintWriter out = response.getWriter(); String responseString = mapper.writeValueAsString(returnModel); - JSONObject j; - if("".equals(nameOfTrueKey)){ - j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + "}"); + + JSONObject j = null; + + if("".equals(allManyTrueKeys)){ + j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + ",dataOrderInfo:" + dataOrderInfo + ",headDefautlsData:" + headDefautlsData +"}"); }else{ - j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + ",allManyTrueKeys: " + nameOfTrueKey+ "}"); + j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + ",allManyTrueKeys: " + allManyTrueKeys+",dataOrderInfo:" + dataOrderInfo + ",headDefautlsData:" + headDefautlsData+ "}"); } list.add(j); out.write(list.toString()); @@ -1102,10 +672,11 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { }else{ subAttributes = ""; } + Map gsonObject = (Map) gson.fromJson(subAttributes, Object.class); JSONObject object = new JSONObject(); - JSONArray array; + JSONArray array = new JSONArray(); for (Entry<String, String> keySet : attributeMap.entrySet()){ array = new JSONArray(); @@ -1137,8 +708,6 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { } } } - - return object.toString(); } @@ -1210,7 +779,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { if(referAttributes != null){ String[] referAarray = referAttributes.split(","); - String []element; + String []element= null; for(int i=0; i<referAarray.length; i++){ element = referAarray[i].split("="); if(element.length > 1 && element[1].contains("MANY-true")){ @@ -1240,6 +809,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { return keys; } + // this method returns a set of keys with "MANY-true" defined in their value. private Set<String> getAllKeys(JSONObject json, Set<String> keys) { for (String key : json.keySet()) { @@ -1314,6 +884,10 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { } return workingModel; } + + private MicroserviceHeaderdeFaults getHeaderDefaultsObject(String modelName) { + return (MicroserviceHeaderdeFaults) commonClassDao.getEntityItem(MicroserviceHeaderdeFaults.class, "modelName", modelName); + } @RequestMapping(value={"/get_DCAEPriorityValues"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE) public void getDCAEPriorityValuesData(HttpServletRequest request, HttpServletResponse response){ @@ -1457,8 +1031,8 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { } - @SuppressWarnings({ "rawtypes", "unchecked" }) - private void readRecursivlyJSONContent(LinkedHashMap<String, ?> map, LinkedHashMap<String, Object> data){ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void readRecursivlyJSONContent(LinkedHashMap<String, ?> map, LinkedHashMap<String, Object> data){ for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) { Object key = iterator.next(); Object value = map.get(key); @@ -1494,7 +1068,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { } } - private String getPolicyScope(String value) { + public String getPolicyScope(String value) { List<Object> groupList= commonClassDao.getDataById(GroupPolicyScopeList.class, "groupList", value); if(groupList != null && !groupList.isEmpty()){ GroupPolicyScopeList pScope = (GroupPolicyScopeList) groupList.get(0); @@ -1545,12 +1119,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { 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 <>(); + classMap = new LinkedHashMap<>(); List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); boolean zip = false; boolean yml= false; @@ -1593,7 +1162,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { response.setCharacterEncoding("UTF-8"); response.setContentType("application / json"); request.setCharacterEncoding("UTF-8"); - + JSONObject j = new JSONObject(); j.put("errorMsg", errorMsg); out.write(j.toString()); @@ -1601,21 +1170,24 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { } List<File> fileList = new ArrayList<>(); + MSModelUtils msMLUtils = new MSModelUtils(); this.directory = "model"; if (zip){ extractFolder(this.newFile); fileList = listModelFiles(this.directory); - }else if (yml){ - parseTosca(this.newFile); + }else if (yml==true){ + + msMLUtils.parseTosca(this.newFile); + }else { File file = new File(this.newFile); fileList.add(file); } - String modelType; - if(! yml){ + String modelType= ""; + if(!yml){ modelType="xmi"; //Process Main Model file first - classMap = new HashMap<>(); + classMap = new LinkedHashMap<>(); for (File file : fileList) { if(!file.isDirectory() && file.getName().endsWith(".xmi")){ retreiveDependency(file.toString(), true); @@ -1633,19 +1205,22 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { MSAttributeObject msAttributes= new MSAttributeObject(); msAttributes.setClassName(className); - HashMap<String, String> returnAttributeList =new HashMap<>(); - returnAttributeList.put(className, this.attributeString); + LinkedHashMap<String, String> returnAttributeList =new LinkedHashMap<>(); + returnAttributeList.put(className, msMLUtils.getAttributeString()); msAttributes.setAttribute(returnAttributeList); - msAttributes.setSubClass(this.retmap); - msAttributes.setMatchingSet(matchableValues); - HashMap<String, String> returnReferenceList =new HashMap<>(); - returnReferenceList.put(className, this.referenceAttributes); + msAttributes.setSubClass(msMLUtils.getRetmap()); + + msAttributes.setMatchingSet(msMLUtils.getMatchableValues()); + + LinkedHashMap<String, String> returnReferenceList =new LinkedHashMap<>(); + + returnReferenceList.put(className, msMLUtils.getReferenceAttributes()); msAttributes.setRefAttribute(returnReferenceList); - if(this.listConstraints!=""){ - HashMap<String, String> enumList =new HashMap<>(); - String[] listArray=this.listConstraints.split("#"); + if(msMLUtils.getListConstraints()!=""){ + LinkedHashMap<String, String> enumList =new LinkedHashMap<>(); + String[] listArray=msMLUtils.getListConstraints().split("#"); for(String str:listArray){ String[] strArr= str.split("="); if(strArr.length>1){ @@ -1655,7 +1230,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { msAttributes.setEnumType(enumList); } - classMap=new HashMap<>(); + classMap=new LinkedHashMap<>(); classMap.put(className, msAttributes); } @@ -1671,6 +1246,8 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { j.put("classListDatas", modelList); j.put("modelDatas", mapper.writeValueAsString(classMap)); j.put("modelType", modelType); + j.put("dataOrderInfo", msMLUtils.getDataOrderInfo()); + out.write(j.toString()); } @@ -1756,7 +1333,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { return resultList; } - private void cleanUp(String path) { + public void cleanUp(String path) { if (path!=null){ try { FileUtils.forceDelete(new File(path)); @@ -1766,7 +1343,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { } } - private void checkZipDirectory(String zipDirectory) { + public void checkZipDirectory(String zipDirectory) { Path path = Paths.get(zipDirectory); if (Files.exists(path)) { diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateOptimizationController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateOptimizationController.java new file mode 100644 index 000000000..4ae13443d --- /dev/null +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateOptimizationController.java @@ -0,0 +1,954 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.ArrayList; +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.UUID; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +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.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.OptimizationModels; +import org.onap.policy.rest.jpa.PolicyEntity; +import org.onap.policy.rest.jpa.MicroserviceHeaderdeFaults; +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.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +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.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 CreateOptimizationController extends RestrictedBaseController { + private static final Logger LOGGER = FlexLogger.getLogger(CreateOptimizationController.class); + private static CommonClassDao commonClassDao; + + public static CommonClassDao getCommonClassDao() { + return commonClassDao; + } + + public static void setCommonClassDao(CommonClassDao commonClassDao) { + CreateOptimizationController.commonClassDao = commonClassDao; + } + + private OptimizationModels newModel; + private String newFile; + private String directory; + private List<String> modelList = new ArrayList<>(); + private List<String> dirDependencyList = new ArrayList<>(); + private LinkedHashMap<String,MSAttributeObject > classMap = new LinkedHashMap<>(); + String referenceAttributes; + String attributeString; + Set<String> allManyTrueKeys= 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 MATCHABLE=".matchable"; + public static final String MANYFALSE=":MANY-false"; + public static final String MODEL = "model"; + public static final String MANY = "MANY-"; + public static final String UTF8 = "UTF-8"; + public static final String MODELNAME = "modelName"; + public static final String APPLICATIONJSON = "application / json"; + + + @Autowired + private CreateOptimizationController(CommonClassDao commonClassDao){ + CreateOptimizationController.commonClassDao = commonClassDao; + } + + public CreateOptimizationController(){ + // Empty Constructor + } + + protected PolicyRestAdapter policyAdapter = null; + private Map<String, String> attributesListRefMap = new HashMap<>(); + private Map<String, LinkedList<String>> arrayTextList = new HashMap<>(); + CreateDcaeMicroServiceController msController = new CreateDcaeMicroServiceController(); + + 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 = msController.decodeContent(tempJsonNode).toString(); + constructJson(policyData, jsonContent, dummyValue); + }catch(Exception e){ + LOGGER.error("Error while decoding microservice content", e); + } + + return policyData; + } + + private PolicyRestAdapter constructJson(PolicyRestAdapter policyAdapter, String jsonContent, String dummyValue) { + ObjectWriter om = new ObjectMapper().writer(); + String json=""; + OptimizationObject optimizationObject = setOptimizationObjectValues(policyAdapter); + + optimizationObject.setContent(jsonContent); + + try { + json = om.writeValueAsString(optimizationObject); + } catch (JsonProcessingException e) { + LOGGER.error("Error writing out the object", e); + } + LOGGER.info("input json: " + json); + LOGGER.info("input jsonContent: " + jsonContent); + String cleanJson = msController.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 = msController.removeNullAttributes(tempJson); + policyAdapter.setJsonBody(cleanJson); + return policyAdapter; + } + + @RequestMapping(value={"/policyController/getOptimizationTemplateData.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST}) + public ModelAndView getOptimizationTemplateData(HttpServletRequest request, HttpServletResponse response) throws IOException{ + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + JsonNode root = mapper.readTree(request.getReader()); + + String value = root.get("policyData").toString().replaceAll("^\"|\"$", ""); + String servicename = value.toString().split("-v")[0]; + String version = null; + if (value.toString().contains("-v")){ + version = value.toString().split("-v")[1]; + } + + OptimizationModels returnModel = getAttributeObject(servicename, version); + + MicroserviceHeaderdeFaults returnHeaderDefauls = getHeaderDefaultsObject(value); + JSONObject jsonHdDefaultObj = null; + if(returnHeaderDefauls != null){ + jsonHdDefaultObj = new JSONObject(); + jsonHdDefaultObj.put("onapName", returnHeaderDefauls.getOnapName()); + jsonHdDefaultObj.put("guard", returnHeaderDefauls.getGuard()); + jsonHdDefaultObj.put("riskLevel", returnHeaderDefauls.getRiskLevel()); + jsonHdDefaultObj.put("riskType", returnHeaderDefauls.getRiskType()); + jsonHdDefaultObj.put("priority", returnHeaderDefauls.getPriority()); + } + + String headDefautlsData = ""; + if(jsonHdDefaultObj != null){ + headDefautlsData = jsonHdDefaultObj.toString(); + LOGGER.info("returnHeaderDefauls headDefautlsData: " + headDefautlsData); + }else{ + headDefautlsData = "null"; + } + + //Get all keys with "MANY-true" defined in their value from subAttribute + Set<String> allkeys = null; + if(returnModel.getSubattributes() != null && !returnModel.getSubattributes().isEmpty()){ + JSONObject json = new JSONObject(returnModel.getSubattributes()); + getAllKeys(json); + allkeys = allManyTrueKeys; + allManyTrueKeys = new HashSet <>(); + LOGGER.info("allkeys : " + allkeys); + } + + //Get element order info + String dataOrderInfo = returnModel.getDataOrderInfo(); + String nameOfTrueKeys = ""; + if(allkeys != null){ + nameOfTrueKeys = allkeys.toString(); + } + + String jsonModel = createOptimizationJson(returnModel); + + JSONObject jsonObject = new JSONObject(jsonModel); + + JSONObject finalJsonObject = null; + if(allkeys != null){ + Iterator<String> iter = allkeys.iterator(); + while(iter.hasNext()){ + //Convert to array values for MANY-true keys + finalJsonObject = CreateDcaeMicroServiceController.convertToArrayElement(jsonObject, iter.next()); + } + } + + if(finalJsonObject != null){ + LOGGER.info(finalJsonObject.toString()); + jsonModel = finalJsonObject.toString(); + } + + //get all properties with "MANY-true" defined in Ref_attributes + Set<String> manyTrueProperties = CreateDcaeMicroServiceController.getManyTrueProperties(returnModel.getRefattributes()); + JSONObject jsonObj = new JSONObject(jsonModel); + for (String s : manyTrueProperties) { + LOGGER.info(s); + //convert to array element for MANY-true properties + finalJsonObject = CreateDcaeMicroServiceController.convertToArrayElement(jsonObj, s.trim()); + } + + if(finalJsonObject != null){ + LOGGER.info(finalJsonObject.toString()); + jsonModel = finalJsonObject.toString(); + } + + response.setCharacterEncoding(UTF8); + response.setContentType(APPLICATIONJSON); + request.setCharacterEncoding(UTF8); + List<Object> list = new ArrayList<>(); + PrintWriter out = response.getWriter(); + String responseString = mapper.writeValueAsString(returnModel); + JSONObject j = null; + if("".equals(nameOfTrueKeys)){ + j = new JSONObject("{optimizationModelData: " + responseString + ",jsonValue: " + jsonModel + ",dataOrderInfo:" + dataOrderInfo + ",headDefautlsData:" + headDefautlsData +"}"); + }else{ + j = new JSONObject("{optimizationModelData: " + responseString + ",jsonValue: " + jsonModel + ",allManyTrueKeys: " + allManyTrueKeys+",dataOrderInfo:" + dataOrderInfo + ",headDefautlsData:" + headDefautlsData+ "}"); + } + list.add(j); + out.write(list.toString()); + return null; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private String createOptimizationJson(OptimizationModels returnModel) { + Map<String, String> attributeMap = new HashMap<>(); + Map<String, String> refAttributeMap = new HashMap<>(); + + String attribute = returnModel.getAttributes(); + if(attribute != null){ + attribute = attribute.trim(); + } + String refAttribute = returnModel.getRefattributes(); + if(refAttribute != null){ + refAttribute = refAttribute.trim(); + } + + String enumAttribute = returnModel.getEnumValues(); + if(enumAttribute != null){ + enumAttribute = enumAttribute.trim(); + } + + if (!StringUtils.isEmpty(attribute)){ + attributeMap = CreateDcaeMicroServiceController.convert(attribute, ","); + } + + if (!StringUtils.isEmpty(refAttribute)){ + refAttributeMap = CreateDcaeMicroServiceController.convert(refAttribute, ","); + } + + Gson gson = new Gson(); + + String subAttributes = returnModel.getSubattributes(); + if(subAttributes != null){ + subAttributes = subAttributes.trim(); + }else{ + subAttributes = ""; + } + + Map gsonObject = (Map) gson.fromJson(subAttributes, Object.class); + + JSONObject object = new JSONObject(); + JSONArray array; + + for (Entry<String, String> keySet : attributeMap.entrySet()){ + array = new JSONArray(); + String value = keySet.getValue(); + if ("true".equalsIgnoreCase(keySet.getValue().split(MANY)[1])){ + array.put(value); + object.put(keySet.getKey().trim(), array); + }else { + object.put(keySet.getKey().trim(), value.trim()); + } + } + + for (Entry<String, String> keySet : refAttributeMap.entrySet()){ + array = new JSONArray(); + String value = keySet.getValue().split(":")[0]; + if (gsonObject.containsKey(value)){ + if ("true".equalsIgnoreCase(keySet.getValue().split(MANY)[1])){ + array.put(recursiveReference(value, gsonObject, enumAttribute)); + object.put(keySet.getKey().trim(), array); + }else { + object.put(keySet.getKey().trim(), recursiveReference(value, gsonObject, enumAttribute)); + } + }else { + if ("true".equalsIgnoreCase(keySet.getValue().split(MANY)[1])){ + array.put(value.trim()); + object.put(keySet.getKey().trim(), array); + }else { + object.put(keySet.getKey().trim(), value.trim()); + } + } + } + + return object.toString(); + } + + @SuppressWarnings("unchecked") + private JSONObject recursiveReference(String name, Map<String,String> subAttributeMap, String enumAttribute) { + JSONObject object = new JSONObject(); + Map<String, String> map; + Object returnClass = subAttributeMap.get(name); + map = (Map<String, String>) returnClass; + JSONArray array; + + for( Entry<String, String> m:map.entrySet()){ + String[] splitValue = m.getValue().split(":"); + array = new JSONArray(); + if (subAttributeMap.containsKey(splitValue[0])){ + if ("true".equalsIgnoreCase(m.getValue().split(MANY)[1])){ + array.put(recursiveReference(splitValue[0], subAttributeMap, enumAttribute)); + object.put(m.getKey().trim(), array); + }else { + object.put(m.getKey().trim(), recursiveReference(splitValue[0], subAttributeMap, enumAttribute)); + } + } else{ + if ("true".equalsIgnoreCase(m.getValue().split(MANY)[1])){ + array.put(splitValue[0].trim()); + object.put(m.getKey().trim(), array); + }else { + object.put(m.getKey().trim(), splitValue[0].trim()); + } + } + } + + return object; + } + + //call this method to start the recursive + private Set<String> getAllKeys(JSONObject json) { + return getAllKeys(json, new HashSet<>()); + } + + private Set<String> getAllKeys(JSONArray arr) { + return getAllKeys(arr, new HashSet<>()); + } + + private Set<String> getAllKeys(JSONArray arr, Set<String> keys) { + for (int i = 0; i < arr.length(); i++) { + Object obj = arr.get(i); + if (obj instanceof JSONObject) keys.addAll(getAllKeys(arr.getJSONObject(i))); + if (obj instanceof JSONArray) keys.addAll(getAllKeys(arr.getJSONArray(i))); + } + + return keys; + } + + // this method returns a set of keys with "MANY-true" defined in their value. + private Set<String> getAllKeys(JSONObject json, Set<String> keys) { + for (String key : json.keySet()) { + Object obj = json.get(key); + if(obj instanceof String && ((String) obj).contains("MANY-true")){ + LOGGER.info("key : " + key); + LOGGER.info("obj : " + obj); + allManyTrueKeys.add(key); + } + if (obj instanceof JSONObject) keys.addAll(getAllKeys(json.getJSONObject(key))); + if (obj instanceof JSONArray) keys.addAll(getAllKeys(json.getJSONArray(key))); + } + + return keys; + } + + @RequestMapping(value={"/policyController/getModelServiceVersionData.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST}) + public ModelAndView getModelServiceVersionData(HttpServletRequest request, HttpServletResponse response) throws IOException{ + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + JsonNode root = mapper.readTree(request.getReader()); + + String value = root.get("policyData").toString().replaceAll("^\"|\"$", ""); + String servicename = value.split("-v")[0]; + Set<String> returnList = getVersionList(servicename); + + response.setCharacterEncoding(UTF8); + response.setContentType(APPLICATIONJSON); + request.setCharacterEncoding(UTF8); + List<Object> list = new ArrayList<>(); + PrintWriter out = response.getWriter(); + String responseString = mapper.writeValueAsString(returnList); + JSONObject j = new JSONObject("{optimizationModelVersionData: " + responseString +"}"); + list.add(j); + out.write(list.toString()); + return null; + } + + private Set<String> getVersionList(String name) { + OptimizationModels workingModel; + Set<String> list = new HashSet<>(); + List<Object> optimizationModelsData = commonClassDao.getDataById(OptimizationModels.class, MODELNAME, name); + for (int i = 0; i < optimizationModelsData.size(); i++) { + workingModel = (OptimizationModels) optimizationModelsData.get(i); + if (workingModel.getVersion()!=null){ + list.add(workingModel.getVersion()); + }else{ + list.add("Default"); + } + } + return list; + } + + private OptimizationModels getAttributeObject(String name, String version) { + OptimizationModels workingModel = new OptimizationModels(); + List<Object> optimizationModelsData = commonClassDao.getDataById(OptimizationModels.class, MODELNAME, name); + for (int i = 0; i < optimizationModelsData.size(); i++) { + workingModel = (OptimizationModels) optimizationModelsData.get(i); + if(version != null){ + if (workingModel.getVersion()!=null){ + if (workingModel.getVersion().equals(version)){ + return workingModel; + } + }else{ + return workingModel; + } + }else{ + return workingModel; + } + + } + return workingModel; + } + + private MicroserviceHeaderdeFaults getHeaderDefaultsObject(String modelName) { + return (MicroserviceHeaderdeFaults) commonClassDao.getEntityItem(MicroserviceHeaderdeFaults.class, MODELNAME, modelName); + } + + public void prePopulatePolicyData(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("OOF_") +4); + policyAdapter.setPolicyName(policyNameValue); + String description = ""; + try{ + description = policy.getDescription().substring(0, policy.getDescription().indexOf("@CreatedBy:")); + }catch(Exception e){ + LOGGER.error("Error while collecting the description tag in " + policyNameValue ,e); + description = policy.getDescription(); + } + policyAdapter.setPolicyDescription(description); + // Get the target data under policy. + TargetType target = policy.getTarget(); + if (target != null) { + // Under target we have AnyOFType + List<AnyOfType> anyOfList = target.getAnyOf(); + if (anyOfList != null) { + Iterator<AnyOfType> iterAnyOf = anyOfList.iterator(); + while (iterAnyOf.hasNext()) { + AnyOfType anyOf = iterAnyOf.next(); + // Under AnyOFType we have AllOFType + List<AllOfType> allOfList = anyOf.getAllOf(); + if (allOfList != null) { + Iterator<AllOfType> iterAllOf = allOfList.iterator(); + while (iterAllOf.hasNext()) { + AllOfType allOf = iterAllOf.next(); + // Under AllOFType we have Match + List<MatchType> matchList = allOf.getMatch(); + if (matchList != null) { + Iterator<MatchType> iterMatch = matchList.iterator(); + while (matchList.size()>1 && iterMatch.hasNext()) { + MatchType match = iterMatch.next(); + // + // Under the match we have attribute value and + // attributeDesignator. So,finally down to the actual attribute. + // + AttributeValueType attributeValue = match.getAttributeValue(); + String value = (String) attributeValue.getContent().get(0); + AttributeDesignatorType designator = match.getAttributeDesignator(); + String attributeId = designator.getAttributeId(); + // First match in the target is OnapName, so set that value. + if ("ONAPName".equals(attributeId)) { + policyAdapter.setOnapName(value); + } + if ("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); + } + } + } + } + } + } + } + } + + @SuppressWarnings("unchecked") + private void readFile(PolicyRestAdapter policyAdapter, PolicyEntity entity) { + String policyScopeName = null; + ObjectMapper mapper = new ObjectMapper(); + try { + OptimizationObject optimizationBody = mapper.readValue(entity.getConfigurationData().getConfigBody(), OptimizationObject.class); + policyScopeName = msController.getPolicyScope(optimizationBody.getPolicyScope()); + policyAdapter.setPolicyScope(policyScopeName); + + policyAdapter.setPriority(optimizationBody.getPriority()); + + if (optimizationBody.getVersion()!= null){ + policyAdapter.setServiceType(optimizationBody.getService()); + policyAdapter.setVersion(optimizationBody.getVersion()); + }else{ + policyAdapter.setServiceType(optimizationBody.getService()); + } + if(optimizationBody.getContent() != null){ + LinkedHashMap<String, Object> data = new LinkedHashMap<>(); + LinkedHashMap<String, ?> map = (LinkedHashMap<String, ?>) optimizationBody.getContent(); + msController.readRecursivlyJSONContent(map, data); + policyAdapter.setRuleData(data); + } + + } catch (Exception e) { + LOGGER.error(e); + } + + } + + @RequestMapping(value={"/oof_dictionary/set_ModelData"}, method={org.springframework.web.bind.annotation.RequestMethod.POST}) + public void SetModelData(HttpServletRequest request, HttpServletResponse response) throws IOException, FileUploadException{ + modelList = new ArrayList<>(); + dirDependencyList = new ArrayList<>(); + classMap = new LinkedHashMap<>(); + List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); + + boolean zip = false; + boolean yml= false; + String errorMsg = ""; + for (FileItem item : items) { + if(item.getName().endsWith(".zip") || item.getName().endsWith(".xmi")||item.getName().endsWith(".yml")){ + this.newModel = new OptimizationModels(); + 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(UTF8); + response.setContentType(APPLICATIONJSON); + request.setCharacterEncoding(UTF8); + + JSONObject j = new JSONObject(); + j.put("errorMsg", errorMsg); + out.write(j.toString()); + return; + } + + List<File> fileList = new ArrayList<>(); + MSModelUtils modelUtil = new MSModelUtils(); + this.directory = MODEL; + if (zip){ + extractFolder(this.newFile); + fileList = listModelFiles(this.directory); + }else if (yml){ + modelUtil.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 LinkedHashMap<>(); + for (File file : fileList) { + if(!file.isDirectory() && file.getName().endsWith(".xmi")){ + retrieveDependency(file.toString()); + } + } + + modelList = createList(); + + msController.cleanUp(this.newFile); + msController.cleanUp(directory); + }else{ + modelType="yml"; + modelList.add(this.newModel.getModelName()); + String className=this.newModel.getModelName(); + MSAttributeObject optimizationAttributes= new MSAttributeObject(); + optimizationAttributes.setClassName(className); + + LinkedHashMap<String, String> returnAttributeList =new LinkedHashMap<>(); + returnAttributeList.put(className, modelUtil.getAttributeString()); + optimizationAttributes.setAttribute(returnAttributeList); + + optimizationAttributes.setSubClass(modelUtil.getRetmap()); + + optimizationAttributes.setMatchingSet(modelUtil.getMatchableValues()); + + LinkedHashMap<String, String> returnReferenceList =new LinkedHashMap<>(); + returnReferenceList.put(className, modelUtil.getReferenceAttributes()); + optimizationAttributes.setRefAttribute(returnReferenceList); + + if(!"".equals(modelUtil.getListConstraints())){ + LinkedHashMap<String, String> enumList =new LinkedHashMap<>(); + String[] listArray=modelUtil.getListConstraints().split("#"); + for(String str:listArray){ + String[] strArr= str.split("="); + if(strArr.length>1){ + enumList.put(strArr[0], strArr[1]); + } + } + optimizationAttributes.setEnumType(enumList); + } + + classMap=new LinkedHashMap<>(); + classMap.put(className, optimizationAttributes); + + } + + PrintWriter out = response.getWriter(); + + response.setCharacterEncoding(UTF8); + response.setContentType(APPLICATIONJSON); + request.setCharacterEncoding(UTF8); + + ObjectMapper mapper = new ObjectMapper(); + JSONObject j = new JSONObject(); + j.put("classListDatas", modelList); + j.put("modelDatas", mapper.writeValueAsString(classMap)); + j.put("modelType", modelType); + j.put("dataOrderInfo", modelUtil.getDataOrderInfo()); + + 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); + msController.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 retrieveDependency(String workingFile) { + + MSModelUtils utils = new MSModelUtils(PolicyController.getMsOnapName(), PolicyController.getMsPolicyName()); + Map<String, MSAttributeObject> tempMap; + + tempMap = utils.processEpackage(workingFile, MODEL_TYPE.XMI); + + classMap.putAll(tempMap); + LOGGER.info(tempMap); + + return; + + } + + private List<File> listModelFiles(String directoryName) { + File fileDirectory = new File(directoryName); + List<File> resultList = new ArrayList<>(); + File[] fList = fileDirectory.listFiles(); + for (File file : fList) { + if (file.isFile()) { + resultList.add(file); + } else if (file.isDirectory()) { + dirDependencyList.add(file.getName()); + resultList.addAll(listModelFiles(file.getAbsolutePath())); + } + } + return resultList; + } + + private List<String> createList() { + List<String> list = new ArrayList<>(); + for (Entry<String, MSAttributeObject> cMap : classMap.entrySet()){ + if (cMap.getValue().isPolicyTempalate()){ + list.add(cMap.getKey()); + } + + } + + if (list.isEmpty()){ + if (classMap.containsKey(this.newModel.getModelName())){ + list.add(this.newModel.getModelName()); + }else { + list.add("EMPTY"); + } + } + return list; + } + + public Map<String, String> getAttributesListRefMap() { + return attributesListRefMap; + } + + public Map<String, LinkedList<String>> getArrayTextList() { + return arrayTextList; + } + + private OptimizationObject setOptimizationObjectValues(PolicyRestAdapter policyAdapter) { + OptimizationObject optimizationObject = new OptimizationObject(); + optimizationObject.setTemplateVersion(XACMLProperties.getProperty(XACMLRestProperties.TemplateVersion_OOF)); + + if(policyAdapter.getServiceType() !=null){ + optimizationObject.setService(policyAdapter.getServiceType()); + optimizationObject.setVersion(policyAdapter.getVersion()); + } + if(policyAdapter.getPolicyName()!=null){ + optimizationObject.setPolicyName(policyAdapter.getPolicyName()); + } + if(policyAdapter.getPolicyDescription()!=null){ + optimizationObject.setDescription(policyAdapter.getPolicyDescription()); + } + if (policyAdapter.getPriority()!=null){ + optimizationObject.setPriority(policyAdapter.getPriority()); + }else { + optimizationObject.setPriority("9999"); + } + if (policyAdapter.getRiskLevel()!=null){ + optimizationObject.setRiskLevel(policyAdapter.getRiskLevel()); + } + if (policyAdapter.getRiskType()!=null){ + optimizationObject.setRiskType(policyAdapter.getRiskType()); + } + if (policyAdapter.getGuard()!=null){ + optimizationObject.setGuard(policyAdapter.getGuard()); + } + return optimizationObject; + } +} + +class OptimizationObject { + + private String service; + private String policyName; + private String description; + 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 getPriority() { + return priority; + } + public void setPriority(String priority) { + this.priority = priority; + } + public String getPolicyScope() { + return policyScope; + } + public void setPolicyScope(String policyScope) { + this.policyScope = policyScope; + } + 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 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 getTemplateVersion() { + return templateVersion; + } + public void setTemplateVersion(String templateVersion) { + this.templateVersion = templateVersion; + } + +}
\ No newline at end of file diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/Windows/Dictionary/MSHeaderDefaultValuesDictionary.html b/POLICY-SDK-APP/src/main/webapp/app/policyApp/Windows/Dictionary/MSHeaderDefaultValuesDictionary.html new file mode 100644 index 000000000..6b841e747 --- /dev/null +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/Windows/Dictionary/MSHeaderDefaultValuesDictionary.html @@ -0,0 +1,90 @@ +<!--/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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========================================================= + */--> +<script type="text/ng-template" id="add_HeaderDefaultValues_popup.html"> +<div class="modal" tabindex="-1"> + <div class="modal-dialog modal-lg"> + <div class="modal-content"> + <div class="modal-header"> + <h2 class="font-showcase-font-name" style="color : #157bb2">{{label}}</h2> + </div> + <form name="formdata" ng-submit="saveHeaderDefaults(editHeaderDefaults);" novalidate> + <div class="modal-body" id="HeaderDefaultValues"> + <div class="form-group row"> + <div class="form-group col-sm-6" ng-class="{ 'has-error' : formdata.modelName.$invalid && !formdata.modelName.$pristine }"> + <label>Micro Service:<sup><b>*</b></sup></label><br> + <select class="form-control" name= "modelName" required ng-model="editHeaderDefaults.modelName" ng-options="option for option in microServiceModelsDictionaryDatas track by option" ></select> + <p ng-show="formdata.modelName.$invalid && !formdata.modelName.$pristine" class="help-block">Micro Service is required.</p> + </div> + <div class="form-group col-sm-6" ng-class="{ 'has-error' : formdata.modelName.$invalid && !formdata.modelName.$pristine }"> + <label>Onap Name:<sup><b>*</b></sup></label><br> + <select class="form-control" name= "modelName" required ng-model="editHeaderDefaults.onapName" ng-options="option for option in onapNameDictionaryDatas track by option" ></select> + <p ng-show="formdata.modelName.$invalid && !formdata.modelName.$pristine" class="help-block">Micro Service is required.</p> + </div> + </div> + + <div class="form-group row"> + <div class="form-group col-sm-6" ng-class="{ 'has-error' : formdata.modelName.$invalid && !formdata.modelName.$pristine }"> + <label>Guard:<sup><b>*</b></sup></label><br> + <select + class="form-control" ng-disabled="temp.policy.readOnly" + ng-model="editHeaderDefaults.guard" > + <option>True</option> + <option>False</option> + </select> + <p ng-show="formdata.modelName.$invalid && !formdata.modelName.$pristine" class="help-block">Guard is required.</p> + </div> + <div class="form-group col-sm-6" ng-class="{ 'has-error' : formdata.modelName.$invalid && !formdata.modelName.$pristine }"> + <label>Priority:<sup><b>*</b></sup></label><br> + <select + class="form-control" ng-disabled="temp.policy.readOnly" + ng-model="editHeaderDefaults.priority" + ng-options="option for option in priorityDatas track by option"> + </select> + <p ng-show="formdata.modelName.$invalid && !formdata.modelName.$pristine" class="help-block">Priority is required.</p> + </div> + </div> + <div class="form-group row"> + <div class="form-group col-sm-6" ng-class="{ 'has-error' : formdata.modelName.$invalid && !formdata.modelName.$pristine }"> + <label>Risk Type:<sup><b>*</b></sup></label><br> + <select name= "riskType" required class="form-control" ng-model="editHeaderDefaults.riskType" ng-options="option for option in riskTypeDictionaryDatas track by option"></select> + <p ng-show="formdata.riskType.$invalid && !formdata.riskType.$pristine" class="help-block">Policy riskType is required.</p> + </div> + <div class="form-group col-sm-6" ng-class="{ 'has-error' : formdata.modelName.$invalid && !formdata.modelName.$pristine }"> + <label>Risk Level:<sup><b>*</b></sup></label><br> + <select class="form-control" ng-disabled="temp.policy.readOnly" + ng-model="editHeaderDefaults.riskLevel"> + <option>1</option> + <option>2</option> + <option>3</option> + <option>4</option> + <option>5</option></select> + <p ng-show="formdata.modelName.$invalid && !formdata.modelName.$pristine" class="help-block">Risk Level is required.</p> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-success" type="submit" ng-disabled="formdata.$invalid">Save</button> + <button class="btn btn-default" type="button" ng-click="close()">Close</button> + </div> + </form> + </div> + </div> +</div> +</script>
\ No newline at end of file diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/Windows/Dictionary/OptimizationModelsDictionary.html b/POLICY-SDK-APP/src/main/webapp/app/policyApp/Windows/Dictionary/OptimizationModelsDictionary.html new file mode 100644 index 000000000..bd9c51bd3 --- /dev/null +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/Windows/Dictionary/OptimizationModelsDictionary.html @@ -0,0 +1,61 @@ +<!--/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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========================================================= + */--> +<script type="text/ng-template" id="add_optimizationModel_popup.html"> +<div class="modal" tabindex="-1"> + <div class="modal-dialog modal-lg"> + <div class="modal-content"> + <div class="modal-header"> + <h2 class="font-showcase-font-name" style="color : #157bb2">{{label}}</h2> + </div> + <form name="formdata" ng-submit="saveOptimizationModel(editOptimizationModelName);" novalidate> + <div class="modal-body"> + <div class="form-group row"> + <div class="form-group col-sm-12"> + <label>Description:</label><br> + <input type="text" ng-model="editOptimizationModelName.description" class="form-control"/> + </div> + </div> + <div class="form-group row"> + <div class="form-group col-sm-6" ng-class="{ 'has-error' : formdata.file.$invalid && !formdata.file.$pristine }"> + <input type="file" name="file" onchange="angular.element(this).scope().uploadFile(this.files)" name= "file" required/> + <p ng-show="formdata.file.$invalid && !formdata.file.$pristine" class="help-block">Uploading Model is required.</p> + </div> + </div> + <div class="form-group row"> + <div class="form-group col-sm-6" ng-class="{ 'has-error' : formdata.modelName.$invalid && !formdata.modelName.$pristine }"> + <label>Optimization Model Name:<sup><b>*</b></sup></label><br> + <select class="form-control" name= "editOptimizationModelName.modelName" required ng-model="editOptimizationModelName.modelName" ng-options="option for option in classListDatas track by option" ></select> + <p ng-show="formdata.classList.$invalid && !formdata.classList.$pristine" class="help-block">Optimization Model is required.</p> + </div> + <div class="form-group col-sm-6"> + <label>Version:<sup><b>*</b></sup></label><br> + <input type="text" required ng-model="editOptimizationModelName.version" class="form-control"/> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-success" type="submit" ng-disabled="formdata.$invalid">Save</button> + <button class="btn btn-default" type="button" ng-click="close()">Close</button> + </div> + </form> + </div> +</div> + </div> +</script> diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/DictionaryController.js b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/DictionaryController.js index cc3dd14ee..d12523879 100644 --- a/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/DictionaryController.js +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/DictionaryController.js @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP Policy Engine * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 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. @@ -19,7 +19,7 @@ */ var mainDictionarys = ["Action Policy", "BRMS Policy", "Common Dictionary", "ClosedLoop Policy","Decision Policy", "Descriptive Policy", - "Firewall Policy", "MicroService Policy", "Policy Scope", "Safe Policy Dictionary"]; + "Firewall Policy", "MicroService Policy", "Optimization Policy", "Policy Scope", "Safe Policy Dictionary"]; var subDictionarys = [["Action Dictionary"], ["BRMS Controller" , "BRMS Dependency", "BRMS Param Template"], ["Attribute Dictionary","OnapName Dictionary"], @@ -27,7 +27,8 @@ var subDictionarys = [["Action Dictionary"], ["Settings Dictionary","Rainy Day Allowed Treatments"], ["Descriptive Scope"], ["Action List", "Address Group", "Parent Dictionary List", "Port List", "Prefix List", "Protocol List", "Security Zone", "Service Group", "Service List", "Tag List", "Tag Picker List", "Term List", "Zone"], - ["DCAE UUID","MicroService ConfigName","MicroService Location", "MicroService Models", "MicroService Dictionary"], + ["DCAE UUID","Header Default Values","MicroService ConfigName","MicroService Location", "MicroService Models", "MicroService Dictionary"], + ["ONAP Optimization Models"], ["Closed Loop", "Group Policy Scope", "Resource", "Service", "Type"], ["Risk Type", "Safe Policy Warning"]]; app.controller('dictionaryTabController', function ($scope, PolicyAppService, modalService, $modal){ diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSHeaderDefaultValuesDictController.js b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSHeaderDefaultValuesDictController.js new file mode 100644 index 000000000..883ac2508 --- /dev/null +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSHeaderDefaultValuesDictController.js @@ -0,0 +1,133 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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========================================================= + */ +app.controller('editMSHeaderDefaultValuesController' , function ($scope, $modalInstance, message, PolicyAppService, UserInfoServiceDS2, Notification){ + if(message.modelAttributeDictionaryData==null) + $scope.label='Set Header Default Values' + else{ + $scope.label='Edit Header Default Values' + $scope.disableCd=true; + } + + PolicyAppService.getData('getDictionary/get_MicroServiceHeaderDefaultsData').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.microServiceHeaderDefaultDatas = JSON.parse($scope.data.microServiceHeaderDefaultDatas); + console.log("microServiceHeaderDefaultDatas:" + $scope.microServiceHeaderDefaultDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('getDictionary/get_MicroServiceModelsDataServiceVersion').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.microServiceModelsDictionaryDatas = JSON.parse($scope.data.microServiceModelsDictionaryDatas); + console.log($scope.microServiceModelsDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('getDictionary/get_RiskTypeDataByName').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log("riskTypeDictionaryDatas = " + $scope.data); + $scope.riskTypeDictionaryDatas = JSON.parse($scope.data.riskTypeDictionaryDatas); + console.log($scope.riskTypeDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('getDictionary/get_RiskTypeDataByName').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log("riskTypeDictionaryDatas: " + $scope.data); + $scope.riskTypeDictionaryDatas = JSON.parse($scope.data.riskTypeDictionaryDatas); + console.log($scope.riskTypeDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('getDictionary/get_OnapNameDataByName').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.onapNameDictionaryDatas = JSON.parse($scope.data.onapNameDictionaryDatas); + console.log($scope.onapNameDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('get_DCAEPriorityValues').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.priorityDatas = JSON.parse($scope.data.priorityDatas); + console.log($scope.priorityDatas); + }, function (error) { + console.log("failed"); + }); + + /*getting user info from session*/ + var userid = null; + UserInfoServiceDS2.getFunctionalMenuStaticDetailSession() + .then(function (response) { + userid = response.userid; + }); + + $scope.editHeaderDefaults = message.modelAttributeDictionaryData; + $scope.editModelAttribute1 = {microservice: []}; + if($scope.edit){ + if(message.modelAttributeDictionaryData.groupList != null){ + var splitValue = message.modelAttributeDictionaryData.groupList.split(","); + console.log(splitValue); + } + } + $scope.saveHeaderDefaults = function(editHeaderDefaultsData) { + console.log("editHeaderDefaultsData :" + editHeaderDefaultsData); + var uuu = "saveDictionary/ms_dictionary/save_headerDefaults"; + var postData={modelAttributeDictionaryData: editHeaderDefaultsData, userid: userid}; + $.ajax({ + type : 'POST', + url : uuu, + dataType: 'json', + contentType: 'application/json', + data: JSON.stringify(postData), + success : function(data){ + $scope.$apply(function(){ + $scope.microServiceAttributeDictionaryDatas=data.microServiceHeaderDefaultDatas;}); + if($scope.microServiceAttributeDictionaryDatas == "Duplicate"){ + Notification.error("Model Attribute Dictionary exists with Same Attribute Name.") + }else{ + console.log($scope.microServiceAttributeDictionaryDatas); + $modalInstance.close({microServiceAttributeDictionaryDatas:$scope.microServiceAttributeDictionaryDatas}); + } + }, + error : function(data){ + alert("Error while saving."); + } + }); + + }; + + $scope.close = function() { + $modalInstance.close(); + }; + });
\ No newline at end of file diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSModelsDictController.js b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSModelsDictController.js index 105225abc..3165b1b98 100644 --- a/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSModelsDictController.js +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/MSModelsDictController.js @@ -57,6 +57,7 @@ app.controller('editMSModelController' , function ($scope, $modalInstance, mess $scope.classListDatas=data.classListDatas; $scope.modalDatas = data.modelDatas; $scope.modelType= data.modelType; + $scope.dataOrderInfo= data.dataOrderInfo; console.log($scope.classListDatas); } }).error( ); @@ -70,7 +71,7 @@ app.controller('editMSModelController' , function ($scope, $modalInstance, mess $scope.saveMSModel = function(microServiceModelsDictionaryData) { if(valid){ var uuu = "saveDictionary/ms_dictionary/save_model"; - var postData={microServiceModelsDictionaryData: microServiceModelsDictionaryData, userid: userid, classMap: $scope.modalDatas,modelType:$scope.modelType}; + var postData={microServiceModelsDictionaryData: microServiceModelsDictionaryData, userid: userid, classMap: $scope.modalDatas,modelType:$scope.modelType, dataOrderInfo:$scope.dataOrderInfo}; $.ajax({ type : 'POST', url : uuu, diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/OptimizationModelsDictController.js b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/OptimizationModelsDictController.js new file mode 100644 index 000000000..3279a6075 --- /dev/null +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryController/OptimizationModelsDictController.js @@ -0,0 +1,104 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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========================================================= + */ +app.controller('editOptimizationModelController' , function ($scope, $modalInstance, message, $http, UserInfoServiceDS2, Notification){ + if(message.optimizationModelsDictionaryData==null) + $scope.label='Add Optimization Model' + else{ + $scope.label='Edit Optimization Model' + $scope.disableCd=true; + } + + /*getting user info from session*/ + var userid = null; + UserInfoServiceDS2.getFunctionalMenuStaticDetailSession() + .then(function (response) { + userid = response.userid; + }); + + var valid = true; + $scope.editOptimizationModelName = message.optimizationModelsDictionaryData; + + $scope.uploadFile = function(files) { + var extn = files[0].name.substr(files[0].name.lastIndexOf('.')+1); + if(extn == 'zip' || extn == 'xmi'|| extn == 'yml'){ + valid = true; + var fd = new FormData(); + fd.append("file", files[0]); + $http.post("oof_dictionary/set_ModelData", fd, { + withCredentials: false, + headers: {'Content-Type': undefined }, + transformRequest: angular.identity + }).success(function(data){ + if(data.errorMsg != undefined){ + Notification.error(data.errorMsg); + valid = false; + return; + } + if(data.classListDatas == "EMPTY"){ + Notification.error("No Optimization Models Available.") + }else{ + $scope.classListDatas=data.classListDatas; + $scope.modalDatas = data.modelDatas; + $scope.modelType= data.modelType; + $scope.dataOrderInfo= data.dataOrderInfo; + console.log($scope.classListDatas); + } + }).error( ); + }else{ + Notification.error("Optimization Model Upload file should ends with .zip or .xmi extension"); + valid = false; + } + + }; + + $scope.saveOptimizationModel = function(optimizationModelsDictionaryData) { + if(valid){ + var uuu = "saveDictionary/oof_dictionary/save_model"; + var postData={optimizationModelsDictionaryData: optimizationModelsDictionaryData, userid: userid, classMap: $scope.modalDatas,modelType:$scope.modelType, dataOrderInfo:$scope.dataOrderInfo}; + $.ajax({ + type : 'POST', + url : uuu, + dataType: 'json', + contentType: 'application/json', + data: JSON.stringify(postData), + success : function(data){ + $scope.$apply(function(){ + $scope.optimizationModelsDictionaryDatas=data.optimizationModelsDictionaryDatas;}); + if($scope.optimizationModelsDictionaryDatas == "Duplicate"){ + Notification.error("Optimization Model Dictionary exists with Same Model Name.") + }else{ + console.log($scope.optimizationModelsDictionaryDatas); + $modalInstance.close({optimizationModelsDictionaryDatas:$scope.optimizationModelsDictionaryDatas}); + } + }, + error : function(data){ + Notification.error("Error while saving."); + } + }); + }else{ + Notification.error("Please check Optimization Model Upload file format."); + } + + }; + + $scope.close = function() { + $modalInstance.close(); + }; +});
\ No newline at end of file diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryGridController/MSHeaderDefaultValuesDictGridController.js b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryGridController/MSHeaderDefaultValuesDictGridController.js new file mode 100644 index 000000000..5a86c14d5 --- /dev/null +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryGridController/MSHeaderDefaultValuesDictGridController.js @@ -0,0 +1,168 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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========================================================= + */ +app.controller('msHeaderDefaultValuesDictGridController', function ($scope, PolicyAppService, modalService, $modal){ + $( "#dialog" ).hide(); + + PolicyAppService.getData('getDictionary/get_MicroServiceHeaderDefaultsData').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.microServiceHeaderDefaultDatas = JSON.parse($scope.data.microServiceHeaderDefaultDatas); + console.log("microServiceHeaderDefaultDatas: " + $scope.microServiceHeaderDefaultDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('getDictionary/get_MicroServiceModelsDataByName').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.microServiceModelsDictionaryDatas = JSON.parse($scope.data.microServiceModelsDictionaryDatas); + console.log($scope.microServiceModelsDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('getDictionary/get_RiskTypeDataByName').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log("riskTypeDictionaryDatas: " + $scope.data); + $scope.riskTypeDictionaryDatas = JSON.parse($scope.data.riskTypeDictionaryDatas); + console.log($scope.riskTypeDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('getDictionary/get_OnapNameDataByName').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.onapNameDictionaryDatas = JSON.parse($scope.data.onapNameDictionaryDatas); + console.log($scope.onapNameDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('get_DCAEPriorityValues').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.priorityDatas = JSON.parse($scope.data.priorityDatas); + console.log($scope.priorityDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('get_LockDownData').then(function(data){ + var j = data; + $scope.data = JSON.parse(j.data); + $scope.lockdowndata = JSON.parse($scope.data.lockdowndata); + if($scope.lockdowndata[0].lockdown == true){ + $scope.msHeaderDefaultValuesDictionaryGrid.columnDefs[0].visible = false; + $scope.gridApi.grid.refresh(); + }else{ + $scope.msHeaderDefaultValuesDictionaryGrid.columnDefs[0].visible = true; + $scope.gridApi.grid.refresh(); + } + },function(error){ + console.log("failed"); + }); + + $scope.msHeaderDefaultValuesDictionaryGrid = { + data : 'microServiceHeaderDefaultDatas', + enableFiltering: true, + columnDefs: [{ + field: 'id', enableFiltering: false, headerCellTemplate: '' + + '<button id=\'New\' ng-click="grid.appScope.createNewModelAttributeWindow()" class="btn btn-success">' + 'Create</button>', + cellTemplate: + '<button type="button" class="btn btn-primary" ng-click="grid.appScope.editModelHeaderDefaultsWindow(row.entity)"><i class="fa fa-pencil-square-o"></i></button> ' + + '<button type="button" class="btn btn-danger" ng-click="grid.appScope.deleteModelAttribute(row.entity)" ><i class="fa fa-trash-o"></i></button> ', width: '8%' + },{ field: 'modelName', displayName :'MicroService', sort: { direction: 'asc', priority: 0 }}, + { field: 'guard', displayName :'Guard'}, { field: 'priority', displayName :'Priority'},{ field: 'riskType', displayName :'Risk Type'},{ field: 'riskLevel', displayName :'Risk Level'},{field: 'onapName' , displayName :'Onap Name' } + ] + }; + + $scope.editModelAttribute = null; + $scope.createNewModelAttributeWindow = function(){ + $scope.editModelAttribute = null; + var modalInstance = $modal.open({ + backdrop: 'static', keyboard: false, + templateUrl : 'add_HeaderDefaultValues_popup.html', + controller: 'editMSHeaderDefaultValuesController', + resolve: { + message: function () { + var message = { + microServiceAttributeDictionaryDatas: $scope.editModelAttribute + }; + return message; + } + } + }); + modalInstance.result.then(function(response){ + console.log('response', response); + $scope.microServiceHeaderDefaultDatas=response.microServiceHeaderDefaultDatas; + }); + }; + + $scope.editModelHeaderDefaultsWindow = function(modelAttributeDictionaryData) { + $scope.editHeaderDefaults = modelAttributeDictionaryData; + var modalInstance = $modal.open({ + backdrop: 'static', keyboard: false, + templateUrl : 'add_HeaderDefaultValues_popup.html', + controller: 'editMSHeaderDefaultValuesController', + resolve: { + message: function () { + var message = { + modelAttributeDictionaryData: $scope.editHeaderDefaults + }; + return message; + } + } + }); + modalInstance.result.then(function(response){ + console.log('response', response); + $scope.modelAttributeDictionaryDataa = response.modelAttributeDictionaryDatas; + }); + }; + + $scope.deleteModelAttribute = function(data) { + modalService.popupConfirmWin("Confirm","You are about to delete the Header Default Values : "+data.name+". Do you want to continue?", + function(){ + var uuu = "deleteDictionary/ms_dictionary/remove_headerDefaults"; + var postData={data: data}; + $.ajax({ + type : 'POST', + url : uuu, + dataType: 'json', + contentType: 'application/json', + data: JSON.stringify(postData), + success : function(data){ + $scope.$apply(function(){$scope.microServiceHeaderDefaultDatas=data.microServiceHeaderDefaultDatas;}); + }, + error : function(data){ + console.log(data); + modalService.showFailure("Fail","Error while deleting: "+ data.responseText); + } + }); + + }) + }; + +});
\ No newline at end of file diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryGridController/OptimizationModelDictGridController.js b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryGridController/OptimizationModelDictGridController.js new file mode 100644 index 000000000..625467a8b --- /dev/null +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/controller/dictionaryGridController/OptimizationModelDictGridController.js @@ -0,0 +1,166 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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========================================================= + */ +app.controller('optimizationModelsDictGridController', function ($scope, PolicyAppService, modalService, $modal){ + $( "#dialog" ).hide(); + + PolicyAppService.getData('getDictionary/get_OptimizationModelsData').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.optimizationModelsDictionaryDatas = JSON.parse($scope.data.optimizationModelsDictionaryDatas); + console.log($scope.optimizationModelsDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('get_LockDownData').then(function(data){ + var j = data; + $scope.data = JSON.parse(j.data); + $scope.lockdowndata = JSON.parse($scope.data.lockdowndata); + if($scope.lockdowndata[0].lockdown == true){ + $scope.optimizationModelsDictionaryGrid.columnDefs[0].visible = false; + $scope.gridApi.grid.refresh(); + }else{ + $scope.optimizationModelsDictionaryGrid.columnDefs[0].visible = true; + $scope.gridApi.grid.refresh(); + } + },function(error){ + console.log("failed"); + }); + + $scope.optimizationModelsDictionaryGrid = { + data : 'optimizationModelsDictionaryDatas', + enableFiltering: true, + exporterCsvFilename: 'OptimizationPolicyDictionary.csv', + enableGridMenu: true, + enableSelectAll: true, + columnDefs: [{ + field: 'id', + enableFiltering: false, headerCellTemplate: '' + + '<button id=\'New\' ng-click="grid.appScope.createNewOptimizationModelsWindow()" class="btn btn-success">' + 'Create</button>', + cellTemplate: + '<button type="button" class="btn btn-danger" ng-click="grid.appScope.deleteOptimizationModels(row.entity)" ><i class="fa fa-trash-o"></i></button> ', width: '8%' + },{ field: 'modelName', displayName : 'ONAP Optimization Model', sort: { direction: 'asc', priority: 0 }}, + { field: 'description' }, + { field: 'version', displayName : 'Model Version' }, + {field: 'userCreatedBy.userName', displayName : 'Imported By' }, + {field: 'dependency', visible: false}, + {field: 'attributes', visible: false}, + {field: 'enumValues', visible: false}, + {field: 'ref_attributes',visible: false}, + {field: 'sub_attributes', visible: false} + ], + exporterMenuPdf: false, + exporterPdfDefaultStyle: {fontSize: 9}, + exporterPdfTableStyle: {margin: [30, 30, 30, 30]}, + exporterPdfTableHeaderStyle: {fontSize: 10, bold: true, italics: true, color: 'red'}, + exporterPdfHeader: { text: "My Header", style: 'headerStyle' }, + exporterPdfFooter: function ( currentPage, pageCount ) { + return { text: currentPage.toString() + ' of ' + pageCount.toString(), style: 'footerStyle' }; + }, + exporterPdfCustomFormatter: function ( docDefinition ) { + docDefinition.styles.headerStyle = { fontSize: 22, bold: true }; + docDefinition.styles.footerStyle = { fontSize: 10, bold: true }; + return docDefinition; + }, + exporterFieldCallback: function(grid, row, col, input) { + if( col.name == 'createdDate' || col.name == 'modifiedDate') { + var date = new Date(input); + return date.toString("yyyy-MM-dd HH:MM:ss a"); + } else { + return input; + } + }, + exporterPdfOrientation: 'portrait', + exporterPdfPageSize: 'LETTER', + exporterPdfMaxGridWidth: 500, + exporterCsvLinkElement: angular.element(document.querySelectorAll(".custom-csv-link-location")), + onRegisterApi: function(gridApi){ + $scope.gridApi = gridApi; + } + }; + + $scope.editOptimizationModelName = null; + $scope.createNewOptimizationModelsWindow = function(){ + $scope.editOptimizationModelName = null; + var modalInstance = $modal.open({ + backdrop: 'static', keyboard: false, + templateUrl : 'add_optimizationModel_popup.html', + controller: 'editOptimizationModelController', + resolve: { + message: function () { + var message = { + optimizationModelsDictionaryDatas: $scope.editOptimizationModelName + }; + return message; + } + } + }); + modalInstance.result.then(function(response){ + console.log('response', response); + $scope.optimizationModelsDictionaryDatas=response.optimizationModelsDictionaryDatas; + }); + }; + + $scope.editOptimizationModelsWindow = function(optimizationModelsDictionaryData) { + $scope.editOptimizationModelName = optimizationModelsDictionaryData; + var modalInstance = $modal.open({ + backdrop: 'static', keyboard: false, + templateUrl : 'add_optimizationModel_popup.html', + controller: 'editOptimizationModelController', + resolve: { + message: function () { + var message = { + optimizationModelsDictionaryData: $scope.editOptimizationModelName + }; + return message; + } + } + }); + modalInstance.result.then(function(response){ + console.log('response', response); + $scope.optimizationModelsDictionaryDatas = response.optimizationModelsDictionaryDatas; + }); + }; + + $scope.deleteOptimizationModels = function(data) { + modalService.popupConfirmWin("Confirm","You are about to delete the Optimization Model : "+data.modelName+". Do you want to continue?", + function(){ + var uuu = "deleteDictionary/oof_dictionary/remove_model"; + var postData={data: data}; + $.ajax({ + type : 'POST', + url : uuu, + dataType: 'json', + contentType: 'application/json', + data: JSON.stringify(postData), + success : function(data){ + $scope.$apply(function(){$scope.optimizationModelsDictionaryDatas=data.optimizationModelsDictionaryDatas;}); + }, + error : function(data){ + console.log(data); + modalService.showFailure("Fail","Error while deleting: "+ data.responseText); + } + }); + + }) + }; + +});
\ No newline at end of file diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/main/policyEditor.html b/POLICY-SDK-APP/src/main/webapp/app/policyApp/main/policyEditor.html index f5a5e8678..9be8d015a 100644 --- a/POLICY-SDK-APP/src/main/webapp/app/policyApp/main/policyEditor.html +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/main/policyEditor.html @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP Policy Engine * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 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. @@ -119,6 +119,7 @@ <script src= "app/policyApp/policy-models/Editor/PolicyTemplateController/DecisionPolicyController.js"></script> <script src= "app/policyApp/policy-models/Editor/PolicyTemplateController/FirewallPolicyController.js"></script> <script src= "app/policyApp/policy-models/Editor/PolicyTemplateController/DCAEMicroServicePolicyController.js"></script> + <script src= "app/policyApp/policy-models/Editor/PolicyTemplateController/OptimizationPolicyController.js"></script> <script src= "app/policyApp/policy-models/Editor/PolicyTemplateController/BRMSRawPolicyController.js"></script> <script src= "app/policyApp/policy-models/Editor/PolicyTemplateController/BRMSParamPolicyController.js"></script> @@ -153,11 +154,13 @@ <script src= "app/policyApp/controller/dictionaryGridController/FWTagPickerListDictGridController.js"></script> <script src= "app/policyApp/controller/dictionaryGridController/FWZoneDictGridController.js"></script> <script src= "app/policyApp/controller/dictionaryGridController/MSConfigNameDictGridController.js"></script> + <script src= "app/policyApp/controller/dictionaryGridController/MSHeaderDefaultValuesDictGridController.js"></script> <script src= "app/policyApp/controller/dictionaryGridController/MSDcaeUUIDDictGridController.js"></script> <script src= "app/policyApp/controller/dictionaryGridController/MSLocationDictGridController.js"></script> <script src= "app/policyApp/controller/dictionaryGridController/MSModelDictGridController.js"></script> <script src= "app/policyApp/controller/dictionaryGridController/ModelAttributeDictGridController.js"></script> - + <script src= "app/policyApp/controller/dictionaryGridController/OptimizationModelDictGridController.js"></script> + <script src= "app/policyApp/controller/dictionaryGridController/PSClosedLoopDictGridController.js"></script> <script src= "app/policyApp/controller/dictionaryGridController/PSGroupPolicyScopeDictGridController.js"></script> <script src= "app/policyApp/controller/dictionaryGridController/PSResourceDictGridController.js"></script> @@ -195,11 +198,13 @@ <script src= "app/policyApp/controller/dictionaryController/FWTagListDictController.js"></script> <script src= "app/policyApp/controller/dictionaryController/FWTagPickerListDictController.js"></script> <script src= "app/policyApp/controller/dictionaryController/FWZoneDictController.js"></script> + <script src= "app/policyApp/controller/dictionaryController/MSHeaderDefaultValuesDictController.js"></script> <script src= "app/policyApp/controller/dictionaryController/MSConfigNameDictController.js"></script> <script src= "app/policyApp/controller/dictionaryController/MSDcaeUUIDDictController.js"></script> <script src= "app/policyApp/controller/dictionaryController/MSLocationDictController.js"></script> <script src= "app/policyApp/controller/dictionaryController/MSModelsDictController.js"></script> <script src= "app/policyApp/controller/dictionaryController/ModelAttributeDictController.js"></script> + <script src= "app/policyApp/controller/dictionaryController/OptimizationModelsDictController.js"></script> <script src= "app/policyApp/controller/dictionaryController/PSClosedLoopDictController.js"></script> <script src= "app/policyApp/controller/dictionaryController/PSGroupPolicyScopeDictController.js"></script> @@ -258,11 +263,12 @@ <div ng-include src="'app/policyApp/Windows/Dictionary/FWTermListDictionary.html'"></div> <div ng-include src="'app/policyApp/Windows/Dictionary/FWZoneDictionary.html'"></div> <div ng-include src="'app/policyApp/Windows/Dictionary/MSConfigNameDictionary.html'"></div> + <div ng-include src="'app/policyApp/Windows/Dictionary/MSHeaderDefaultValuesDictionary.html'"></div> <div ng-include src="'app/policyApp/Windows/Dictionary/MSDCAEUUIDDictionary.html'"></div> <div ng-include src="'app/policyApp/Windows/Dictionary/MSLocationDictionary.html'"></div> <div ng-include src="'app/policyApp/Windows/Dictionary/MSModelsDictionary.html'"></div> <div ng-include src="'app/policyApp/Windows/Dictionary/ModelAttributeDictionary.html'"></div> - + <div ng-include src="'app/policyApp/Windows/Dictionary/OptimizationModelsDictionary.html'"></div> <div ng-include src="'app/policyApp/Windows/Dictionary/PSClosedLoopDictionary.html'"></div> <div ng-include src="'app/policyApp/Windows/Dictionary/PSGroupPolicyScopeDictionary.html'"></div> <div ng-include src="'app/policyApp/Windows/Dictionary/PSResourceDictionary.html'"></div> diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Dictionary/MSHeaderDefaultValuesDictionary.html b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Dictionary/MSHeaderDefaultValuesDictionary.html new file mode 100644 index 000000000..c848de5b7 --- /dev/null +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Dictionary/MSHeaderDefaultValuesDictionary.html @@ -0,0 +1,22 @@ +<!--/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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========================================================= + */--> +<div ng-app ng-controller = "msHeaderDefaultValuesDictGridController"> + <div ui-grid = "msHeaderDefaultValuesDictionaryGrid" ui-grid-pagination ui-grid-selection ui-grid-exporter class= "grid"></div> +</div>
\ No newline at end of file diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Dictionary/OptimizationModelDictionary.html b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Dictionary/OptimizationModelDictionary.html new file mode 100644 index 000000000..fc44bad72 --- /dev/null +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Dictionary/OptimizationModelDictionary.html @@ -0,0 +1,22 @@ +<!--/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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========================================================= + */--> +<div ng-controller = "optimizationModelsDictGridController"> + <div ui-grid = "optimizationModelsDictionaryGrid" ui-grid-pagination ui-grid-selection ui-grid-exporter class= "grid"></div> +</div>
\ 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 cfc9bec22..cb5c9ca19 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 @@ -167,7 +167,7 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind $scope.attributeDatas = [{"attributes" : $scope.choices}]; $scope.isInitEditTemplate = true; //just initially create the edit template, didn't click add button yet. $scope.addNewChoice = function(value) { - console.log(value); + console.log("input value : " + value); if(value != undefined){ if (value.startsWith('div.')){ value = value.replace('div.',''); @@ -184,20 +184,24 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind if($scope.temp.policy.ruleData[clone.id]){ clone.value = $scope.temp.policy.ruleData[clone.id]; } - clone.className += ' child_single'; //here cloned is single element + if(!clone.className.includes("child_single")){ + clone.className += ' child_single'; //here cloned is single element + } document.getElementById("div."+value).appendChild(clone); plainAttributeKeys.push(''+value+'@'+addElement); } }else{ //not view or edit - clone.className += ' child_single'; //here cloned is single element + if(!clone.className.includes("child_single")){ + clone.className += ' child_single'; //here cloned is single element + } document.getElementById("div."+value).appendChild(clone); plainAttributeKeys.push(''+value+'@'+addElement); } }else{ div = document.getElementById("div."+value+"@0"); - - div.className += ' children_group'; //here is div with a group of children. - + if(div){ + div.className += ' children_group'; //here is div with a group of children. + } var childElement = parentElement.firstElementChild; var countParent = parentElement.childElementCount; var childElementString = childElement.innerHTML; @@ -279,6 +283,21 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind } }; + function findVal(object, key) { + var value; + Object.keys(object).some(function(k) { + if (k === key) { + value = object[k]; + return true; + } + if (object[k] && typeof object[k] === 'object') { + value = findVal(object[k], key); + return value !== undefined; + } + }); + return value; + } + $scope.pullVersion = function(serviceName) { console.log(serviceName); if(serviceName != undefined){ @@ -320,6 +339,11 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind myNode.innerHTML = ''; var uuu = "policyController/getDCAEMSTemplateData.htm"; var postData={policyData: service}; + + console.log("service: " +service); + + var dataOrderInfo = ""; + $.ajax({ type : 'POST', url : uuu, @@ -328,10 +352,15 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind data: JSON.stringify(postData), success : function(data){ $scope.$apply(function(){ - $scope.addNewChoice(); + // $scope.addNewChoice(); var plainAttributeKeys = []; $scope.dcaeModelData = data[0].dcaeModelData; $scope.dcaeJsonDate = data[0].jsonValue; + $scope.dataOrderInfo = null; + $scope.dataOrderInfo = data[0].dataOrderInfo; + console.log("data[0].dataOrderInfo: " + data[0].dataOrderInfo); + console.log("$scope.dataOrderInfo: " + $scope.dataOrderInfo); + if(data[0].allManyTrueKeys){ console.log("$scope.allManyTrueKeys: " + $scope.allManyTrueKeys); } @@ -341,6 +370,22 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind var subAttributes = $scope.dcaeModelData.sub_attributes; console.log("subAttributes: " + subAttributes); console.log("refAttributes: " + refAttributes); + var headDefautlsData = data[0].headDefautlsData; + if(headDefautlsData != null){ + $scope.temp.policy.onapName = headDefautlsData.onapName; + $scope.temp.policy.guard = headDefautlsData.guard; + $scope.temp.policy.riskType = headDefautlsData.riskType; + $scope.temp.policy.riskLevel = headDefautlsData.riskLevel; + $scope.temp.policy.priority = headDefautlsData.priority; + + }else if(!$scope.temp.policy.editPolicy && !$scope.temp.policy.readOnly){ + $scope.temp.policy.onapName = ""; + $scope.temp.policy.guard = ""; + $scope.temp.policy.riskType = ""; + $scope.temp.policy.riskLevel = ""; + $scope.temp.policy.priority = ""; + } + var enumAttributes = $scope.dcaeModelData.enumValues; var annotation = $scope.dcaeModelData.annotation; var dictionary = $scope.microServiceAttributeDictionaryDatas; @@ -380,6 +425,10 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind $scope.temp.policy.ruleGridData = []; + if($scope.temp.policy.editPolicy || $scope.temp.policy.readOnly){ + dataOrderInfo = $scope.dataOrderInfo; + } + $scope.jsonLayout($scope.dcaeJsonDate); }); @@ -401,59 +450,97 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind var extraElements = data; - if(plainAttributeKeys != null){ - for(b = 0; b < plainAttributeKeys.length; b++){ // Remove already populated elements from data array - var newValue = plainAttributeKeys[b].split("*"); - for(a = 0; a < data.length; a++){ - if(data[a] === newValue[0] || data[a] === (newValue[0]+"@0")){ - extraElements.splice(a, 1); + if(plainAttributeKeys != null){ + for(b = 0; b < plainAttributeKeys.length; b++){ // Remove already populated elements from data array + var newValue = plainAttributeKeys[b].split("*"); + for(a = 0; a < data.length; a++){ + if(data[a] === newValue[0] || data[a] === (newValue[0]+"@0")){ + extraElements.splice(a, 1); + } } - } - } - - //--- Populate these extra elements created by clicked add button - for(a = 0; a < extraElements.length; a++){ - if(extraElements[a].includes("@")){ - var index = extraElements[a].lastIndexOf("@"); - if(index > 0){ - // Get the number after @ - var n = getNumOfDigits(extraElements[a], index+1); - - var key = extraElements[a].substring(0, index+n+1); //include @x in key also by n+2 since x can be 1,12, etc - console.log("key: " + key); - checkData.push(key); - } - } - } - var unique = checkData.filter(onlyUnique); - for(i =0; i < unique.length; i++){ - //remove @x and let addNewChoice add @1 or @2... - //var newKey = unique[i].substring(0, unique[i].length-2); - var index = unique[i].lastIndexOf("@"); - var newKey = unique[i].substring(0, index); - console.log("newKey: " + newKey); - $scope.addNewChoice(newKey); - } + } + + //--- Populate these extra elements created by clicked add button + for(a = 0; a < extraElements.length; a++){ + if(extraElements[a].includes("@")){ + var index = extraElements[a].lastIndexOf("@"); + if(index > 0){ + // Get the number after @ + var n = getNumOfDigits(extraElements[a], index+1); + + var key = extraElements[a].substring(0, index+n+1); //include @x in key also by n+2 since x can be 1,12, etc + console.log("key: " + key); + checkData.push(key); + } + } + } + var unique = checkData.filter(onlyUnique); + //if no layout order info, keep the process as before + if(!dataOrderInfo){ + for(i =0; i < unique.length; i++){ + //remove @x and let addNewChoice add @1 or @2... + //var newKey = unique[i].substring(0, unique[i].length-2); + var index = unique[i].lastIndexOf("@"); + var newKey = unique[i].substring(0, index); + console.log("newKey: " + newKey); + $scope.addNewChoice(newKey); + } + }else{ + + for (i = 0; i < $scope.labelManyKeys.length; i++) { + //console.log("dataOrderInfo["+i+"]"+ dataOrderInfo[i]); + var label = $scope.labelManyKeys[i]; + // first add parent/label level + for (k = 0; k < unique.length; k++){ + var index = unique[k].lastIndexOf("@"); + var newKey = unique[k].substring(0, index); + if(label == newKey){ + //Check this label has bee created or not + if(!document.getElementById(unique[k])){ + $scope.addNewChoice(newKey); + } + unique[k] = "*processed*"; + break; + } + } + } + + //---reset to default + dataOrderInfo = []; + $scope.labelManyKeys = []; + + //---process none labels + for (j = 0; j < unique.length; j++){ + if(unique[j] != "*processed*"){ + // if not created yet + if(!document.getElementById(unique[j])){ + var index = unique[j].lastIndexOf("@"); + var newKey = unique[j].substring(0, index); + $scope.addNewChoice(newKey); + } + } + } + } + } } - } - //After initially create the edit template, reset it to false. - $scope.isInitEditTemplate = false; + if($scope.temp.policy.editPolicy){ - //reset it to false since the template has been created - $scope.temp.policy.editPolicy = false; //clean all the events of addNewChoice $scope.$on('$destroy', addNewChoice); } - } var ele = angular.element(document.getElementById("DynamicTemplate")); $compile(ele.contents())($scope); $scope.$apply(); + }, error : function(data){ alert("Error While Retriving the Template Layout Pattren."); } }); + + + } }; @@ -538,9 +625,16 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind return Object.prototype.toString.call(arrayTest) === '[object Array]'; } var lableList = []; - function deconstructJSON(dataTest, level , name) { - var array = false; - var label = level; + + $scope.layOutElementList = []; + $scope.layOutOnlyLableList = []; + + var elementOrderNum = 0; + + function deconstructJSON(layOutData, level , name) { + + var array = false; + var label = level; var stringValue = "java.lang.String"; var string = "string"; var intValue = "int"; @@ -548,18 +642,33 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind var double = "double"; var boolean = "boolean"; var baseLevel = level; + var list = "list"; + var String = "String"; + + var attributekey = ""; if (name.length > 1){ label = label + name + '.'; } - for (key in dataTest) { - array = isArray(dataTest[key]); - console.log(key , dataTest[key]); + for (key in layOutData) { + array = isArray(layOutData[key]); + console.log("key: " + key , "value: " + layOutData[key]); - if (!!dataTest[key] && typeof(dataTest[key])=="object") { + if (!!layOutData[key] && typeof(layOutData[key])=="object") { + if (array==false && key!=="0"){ - $scope.labelLayout(label, key, array ); + + if($scope.dataOrderInfo){ + var labelObject = {"label" : key, "level" : label, "array" : array}; + //save it to the list + $scope.layOutOnlyLableList.push(labelObject); + + }else { + //call label layout + $scope.labelLayout(label, key, array ); + } + } if (array == true && key!=0){ @@ -571,20 +680,31 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind } if ( key==="0"){ var newKey = lableList.pop(); - $scope.labelLayout(baseLevel, newKey, array ); + + if($scope.dataOrderInfo){ + + var labelObject = {"label" : newKey, "level" : baseLevel, "array" : array}; + //save it to the list + $scope.layOutOnlyLableList.push(labelObject); + + }else { + //call label layout + $scope.labelLayout(baseLevel, newKey, array ); + } + if (array){ label = baseLevel + newKey + '@0.'; } else { label = baseLevel + newKey + '.'; } } - deconstructJSON(dataTest[key] , label, key); + deconstructJSON(layOutData[key] , label, key); } else { var attirbuteLabel = label; var defaultValue=''; var isRequired = false; - if (dataTest[key].includes('defaultValue-')){ - defaultValue = dataTest[key].split('defaultValue-')[1]; + if (layOutData[key].includes('defaultValue-')){ + defaultValue = layOutData[key].split('defaultValue-')[1]; } if (key==="0"){ @@ -595,7 +715,7 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind attributekey = key.split(); } - if (dataTest[key].includes('required-true')){ + if (layOutData[key].includes('required-true')){ isRequired = true; } @@ -620,45 +740,176 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind } } - switch (dataTest[key].split(splitcolon)[0]){ + var elementObject = {}; + switch (layOutData[key].split(splitcolon)[0]){ + case stringValue: - $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "text"); - break; case string: - $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "text"); + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue, "isRequired": isRequired, "type":"text"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "text"); + } break; case intValue: - $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "number"); - break; case integerValue: - $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "number"); + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue,"isRequired": isRequired, "type":"number"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "number"); + } break; case double: - $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "double"); + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue,"isRequired": isRequired, "type":"double"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "double"); + } break; case boolean: - $scope.dropBoxLayout(attirbuteLabel, attributekey, array, dataTest[key], getBooleanList()); + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": layOutData[key], "list": getBooleanList, "isRequired": isRequired, "type":"dropBox"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.dropBoxLayout(attirbuteLabel, attributekey, array, layOutData[key], getBooleanList()); + } break; default: - if (dataTest[key].includes('dictionary-')){ - var list = getDictionary(dataTest[key].split('dictionary-')[1]); + if (layOutData[key].includes('dictionary-')){ + var list = getDictionary(layOutData[key].split('dictionary-')[1]); }else{ //--- get dropdown values from enumValues - var list = getList(dataTest[key]); + var list = getList(layOutData[key]); } if (list.length===0){ //not dropdown element - $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "text"); + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue,"isRequired": isRequired, "type":"text"}; + $scope.layOutElementList.push(elementObject); + + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "text"); + } }else{ - $scope.dropBoxLayout(attirbuteLabel, attributekey, array, dataTest[key], list, isRequired); + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum, "attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": layOutData[key],"isRequired": isRequired, "list":list, "type":"dropBox"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.dropBoxLayout(attirbuteLabel, attributekey, array, layOutData[key], list, isRequired); + } } break; } } } } + + + $scope.validContionalRequired = function(parentId) { + console.log("ng-blur event: parentId : " + parentId); + var c = document.getElementById(parentId).children; + var i; + var hasValue = false; + for (i = 0; i < c.length; i++) { + if(c[i].getAttribute("data-conditional")){ + console.log(c[i].getAttribute("data-conditional")); + console.log(c[i].value); + if(c[i].value != null && c[i].value.trim() != ""){ + hasValue = true; + } + } + } + + for (i = 0; i < c.length; i++) { + if(c[i].getAttribute("data-conditional")){ + if(hasValue){ + c[i].setAttribute("required", true); + }else{ + c[i].removeAttribute("required"); + } + } + } + } + + $scope.jsonLayout = function(layOutData){ + + deconstructJSON(layOutData , "", ""); + + var orderValue = $scope.dataOrderInfo; + var layOutElementList = $scope.layOutElementList; + var labelList = $scope.layOutOnlyLableList; + + //reset to default + elementOrderNum = 0; + $scope.layOutElementList = []; + $scope.layOutOnlyLableList = []; + + // Only layout in order if order info provided + if(orderValue){ + + if(orderValue.includes("[")){ + orderValue = orderValue.replace("[", "") ; + orderValue = orderValue.replace("]", "") ; + } + + orderValue = orderValue.split(',') ; + + for (i = 0; i < orderValue.length; i++) { + console.log("orderValue["+i+"]"+ orderValue[i]); + var key = orderValue[i].trim(); + + //--- Create labels first {"label" : newKey, "level" : baseLevel, "array" : array}; + if(labelList){ + for (k = 0; k < labelList.length; k++){ + + var label = labelList[k].label.toString().trim(); + var level = labelList[k].level.toString().trim(); + var array = labelList[k].array; + + if(key == label){ + $scope.labelLayout(level, label, array); + //in case to have duplicate label names + labelList[k].label = "*processed*"; + break; + } + } + } + //--- then layout each element based on its order defined in YAML file + for (j = 0; j < layOutElementList.length; j++) { + + var attributekey = layOutElementList[j].attributekey.toString().trim(); + + if(key == attributekey){ - $scope.jsonLayout = function(dataTest){ - deconstructJSON(dataTest , "", ""); + var attirbuteLabel = layOutElementList[j].attirbuteLabel.toString().trim(); + var defaultValue = layOutElementList[j].defaultValue.toString().trim(); + var isRequired = layOutElementList[j].isRequired; + + console.log("layOutElementList[" +j+ "]: id:" + layOutElementList[j].id + ", attributekey:"+ layOutElementList[j].attributekey + ", attirbuteLabel:" + layOutElementList[j].attirbuteLabel); + + if (layOutElementList[j].type == "dropBox"){ + $scope.dropBoxLayout(attirbuteLabel, attributekey, layOutElementList[j].array, defaultValue, layOutElementList[j].list, isRequired); + + }else{ + $scope.attributeBox(attributekey, layOutElementList[j].array, attirbuteLabel, defaultValue, isRequired, layOutElementList[j].type); + + } + + //in case to have duplicate attribute names + layOutElementList[j].attributekey = "*processed*"; + break; + } + } + } + } } @@ -674,7 +925,7 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind isRequired = true; //set required as true for matching element }else { if(isRequired){ - requiredLabName = attibuteKey + " *"; + requiredLabName = attibuteKey + " * "; labeltext = document.createTextNode(requiredLabName); }else{ labeltext = document.createTextNode(attibuteKey); @@ -706,6 +957,7 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind textField.setAttribute("style" , "width:300px;"); textField.setAttribute("ng-disabled" , "temp.policy.readOnly"); var checkKey; + var id = ""; if(attributeManyKey){ checkKey = labelValue + attibuteKey+'@0'; textField.setAttribute("id" , ''+labelValue + attibuteKey+'@0'+''); @@ -727,8 +979,8 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind document.getElementById(divID).appendChild(addButton); document.getElementById(divID).appendChild(removeButton); document.getElementById(divID).appendChild(label); - var id = "div."+labelValue+attibuteKey; - var divTag = document.createElement("div"); + id = "div."+labelValue+attibuteKey; + //var divTag = document.createElement("div"); divTag.setAttribute("id", id); document.getElementById(divID).appendChild(divTag); textField.className += ' first_child'; @@ -741,15 +993,33 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind }else{ checkKey = labelValue + attibuteKey; textField.setAttribute("id" , ''+labelValue +attibuteKey+''); - if(requiredLabName.includes("*")){ - textField.setAttribute("required", "true"); + if(document.getElementById(divID).hasAttribute('required') || !document.getElementById(divID).hasAttribute('data-conditional')){ + if(requiredLabName.includes("*") || isRequired){ + textField.setAttribute("required", "true"); + } + }else if (document.getElementById(divID).hasAttribute('data-conditional')){ + if(requiredLabName.includes("*")){ + var requiredNode = document.createElement('span'); + requiredNode.setAttribute("class", "mstooltip"); + requiredNode.textContent = "?"; + label.appendChild(requiredNode); + + var requiredNodeToolTip = document.createElement('span'); + requiredNodeToolTip.setAttribute("class", "tooltiptext"); + requiredNodeToolTip.textContent = "Conditional Required"; + requiredNode.appendChild(requiredNodeToolTip); + + textField.setAttribute("data-conditional", divID); + textField.setAttribute("ng-blur", "validContionalRequired('"+divID+"')"); + } } + document.getElementById(divID).appendChild(label); document.getElementById(divID).appendChild(textField); document.getElementById(divID).appendChild(br); } - + if(divID.includes("@0") && divID.includes("div.")){ var firstChild_Id = divID.split("@0")[0]; var firstChild_element = document.getElementById(firstChild_Id); @@ -767,7 +1037,7 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind defaultValue = ""; } } - if(defaultValue != "undefined" && defaultValue != undefined){ + if(defaultValue != "undefined" && defaultValue != undefined && defaultValue != "null"){ document.getElementById(checkKey).value = defaultValue; } } @@ -788,6 +1058,7 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind plainAttributeKeys.push(labelValue + attibuteKey+'*'+attributeManyKey); }; + $scope.labelManyKeys = []; $scope.labelLayout = function(labelValue, lableName, labelManyKey ){ var label = document.createElement("Label") var divID = labelValue; @@ -803,11 +1074,25 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind var divID = 'div.'+ labelValue.substring(0, labelValue.length-1); } - var labeltext = document.createTextNode(lableName); + var subAttributes = $scope.dcaeModelData.sub_attributes; + var jsonObject = JSON.parse(subAttributes); + var lablInfo = findVal(jsonObject, lableName); + console.log("findValue : " + lableName +": "+ lablInfo); + var star = ""; + var required = null; + if(lablInfo){ + if(lablInfo.includes("required-true")){ + star = " *"; + required = true; + }else if (lablInfo.includes("required-false")){ + required = false + } + } + + var labeltext = document.createTextNode(lableName + star); label.appendChild(labeltext); - - var subAttributes = $scope.dcaeModelData.sub_attributes; + if(labelManyKey){ var addButton = document.createElement("BUTTON"); @@ -835,117 +1120,147 @@ angular.module('abs').controller('dcaeMicroServiceController', ['$scope', '$wind divTag.className += ' children_group'; //here is div with a group of children. + if(required){ + divTag.setAttribute("required", required); + }else if(required == false){ + divTag.setAttribute("data-conditional", "yes"); + } + document.getElementById(id).appendChild(divTag); + + $scope.labelManyKeys.push(lableName); + }else{ var divTag = document.createElement("div"); divTag.setAttribute("id", "div."+labelValue+lableName); divTag.className += ' children_group'; //here is div with a group of children. + if(required){ + divTag.setAttribute("required", required); + }else if(required == false){ + divTag.setAttribute("data-conditional", "yes"); + } document.getElementById(divID).appendChild(label); document.getElementById(divID).appendChild(divTag); } }; $scope.dropBoxLayout = function(labelLevel, attributeName, many , refValue, listemunerateValues, isRequired){ - var br = document.createElement("BR"); - - if (labelLevel.length < 1){ - var divID = "DynamicTemplate"; - } else if (labelLevel.endsWith('.')){ - var divID = 'div.'+ labelLevel.substring(0, labelLevel.length-1); - } - - - var label = document.createElement("Label") - - var refAttributes = $scope.dcaeModelData.ref_attributes; - if(isRequired != true && refAttributes){ //check refAttributes also - var refAttributesList = refAttributes.split(splitComma); - for (k = 0; k < refAttributesList.length; k++){ - var refAttribute = refAttributesList[k].split(splitEqual); - if (attributeName == refAttribute[0].trim() && refAttribute[1].includes("required-true")){ - isRequired = true; - } - } - } - - if (matching.includes(attributeName)){ - var labeltext = document.createTextNode(attributeName + "*!"); - label.appendChild(labeltext); - isRequired = true; //set required as true for matching element - }else { - var labeltext = document.createTextNode(attributeName); - if(isRequired){ - requiredLabName = attributeName+ " *"; - labeltext = document.createTextNode(requiredLabName); - }else{ - labeltext = document.createTextNode(attributeName); - } - - label.appendChild(labeltext); - } - label.appendChild(labeltext); - - var listField = document.createElement("SELECT"); - listField.setAttribute("class" , "form-control"); - listField.setAttribute("style" , "width:300px;"); - listField.setAttribute("ng-disabled" , "temp.policy.readOnly"); - - if(isRequired){ - listField.setAttribute("required", true); - } - if( many != true || isRequired != true){ // add an empty option for not required or not multiple select element - var optionFirst = document.createElement('option'); - optionFirst.setAttribute('value', ""); - listField.appendChild(optionFirst); - } - - for (i=0; i < listemunerateValues.length; i += 1) { + var br = document.createElement("BR"); - if(listemunerateValues[i].includes("equal-sign")){ - listemunerateValues[i] = listemunerateValues[i].replace('equal-sign','='); - } + if (labelLevel.length < 1){ + var divID = "DynamicTemplate"; + } else if (labelLevel.endsWith('.')){ + var divID = 'div.'+ labelLevel.substring(0, labelLevel.length-1); + } - option = document.createElement('option'); - option.setAttribute('value', listemunerateValues[i]); - option.appendChild(document.createTextNode(listemunerateValues[i])); - option.setAttribute('value', listemunerateValues[i]); - listField.appendChild(option); - } - listField.setAttribute("id" , ''+ labelLevel + attributeName + ''); - - enumKeyList.push(attributeName); - - document.getElementById(divID).appendChild(label); - document.getElementById(divID).appendChild(br); + + var label = document.createElement("Label") - if(many == true){ - document.getElementById(divID).appendChild(listField).multiple = true; - plainAttributeKeys.push(labelLevel + attributeName+'*'+true); - }else { - document.getElementById(divID).appendChild(listField).multiple = false; - plainAttributeKeys.push(labelLevel + attributeName+'*'+false); - } + var refAttributes = $scope.dcaeModelData.ref_attributes; + if(isRequired != true && refAttributes){ //check refAttributes also + var refAttributesList = refAttributes.split(splitComma); + for (k = 0; k < refAttributesList.length; k++){ + var refAttribute = refAttributesList[k].split(splitEqual); + if (attributeName == refAttribute[0].trim() && refAttribute[1].includes("required-true")){ + isRequired = true; + } + } + } + + if (matching.includes(attributeName)){ + var labeltext = document.createTextNode(attributeName + "*!"); + label.appendChild(labeltext); + isRequired = true; //set required as true for matching element + }else { + var labeltext = document.createTextNode(attributeName); + if(isRequired){ + var requiredLabName = attributeName+ " * "; + labeltext = document.createTextNode(requiredLabName); + }else{ + labeltext = document.createTextNode(attributeName); + } + + label.appendChild(labeltext); + } + label.appendChild(labeltext); + // if this field is required, but its parent is not required + if(isRequired && document.getElementById(divID).hasAttribute('data-conditional')){ + var requiredNode = document.createElement('span'); + requiredNode.setAttribute("class", "mstooltip"); + requiredNode.textContent = "?"; + label.appendChild(requiredNode); + + var requiredNodeToolTip = document.createElement('span'); + requiredNodeToolTip.setAttribute("class", "tooltiptext"); + requiredNodeToolTip.textContent = "Conditional Required"; + requiredNode.appendChild(requiredNodeToolTip); - if($scope.temp.policy.ruleData != null){ - if (many == true){ - document.getElementById(labelLevel +attributeName).options[0].selected = false; + } + + var listField = document.createElement("SELECT"); + listField.setAttribute("class" , "form-control"); + listField.setAttribute("style" , "width:300px;"); + listField.setAttribute("ng-disabled" , "temp.policy.readOnly"); + + if(isRequired){ + if(document.getElementById(divID).hasAttribute('data-conditional')){ + listField.setAttribute("data-conditional", divID); + listField.setAttribute("ng-blur", "validContionalRequired('"+divID+"')"); + }else{ + listField.setAttribute("required", true); + } + } + if( many != true || isRequired != true){ // add an empty option for not required or not multiple select element + var optionFirst = document.createElement('option'); + optionFirst.setAttribute('value', ""); + listField.appendChild(optionFirst); + } + for (i=0; i < listemunerateValues.length; i += 1) { - var testValue = $scope.temp.policy.ruleData[labelLevel +attributeName+'@' + i]; - if (testValue === undefined){ - testValue = $scope.temp.policy.ruleData[labelLevel +attributeName]; - } - var location = listemunerateValues.indexOf(testValue); - if (location!=-1){ - document.getElementById(labelLevel +attributeName).options[location].selected = true; - } - } + if(listemunerateValues[i].includes("equal-sign")){ + listemunerateValues[i] = listemunerateValues[i].replace('equal-sign','='); + } + option = document.createElement('option'); + option.setAttribute('value', listemunerateValues[i]); + option.appendChild(document.createTextNode(listemunerateValues[i])); + option.setAttribute('value', listemunerateValues[i]); + listField.appendChild(option); + } + listField.setAttribute("id" , ''+ labelLevel + attributeName + ''); + + enumKeyList.push(attributeName); + + document.getElementById(divID).appendChild(label); + document.getElementById(divID).appendChild(br); + + if(many == true){ + document.getElementById(divID).appendChild(listField).multiple = true; + plainAttributeKeys.push(labelLevel + attributeName+'*'+true); }else { - if($scope.temp.policy.ruleData[labelLevel + attributeName] != undefined && $scope.temp.policy.ruleData[labelLevel + attributeName] != "undefined"){ - document.getElementById(labelLevel + attributeName).value = $scope.temp.policy.ruleData[labelLevel + attributeName]; - } + document.getElementById(divID).appendChild(listField).multiple = false; + plainAttributeKeys.push(labelLevel + attributeName+'*'+false); } - } - }; + + if($scope.temp.policy.ruleData != null){ + if (many == true){ + document.getElementById(labelLevel +attributeName).options[0].selected = false; + for (i=0; i < listemunerateValues.length; i += 1) { + var testValue = $scope.temp.policy.ruleData[labelLevel +attributeName+'@' + i]; + if (testValue === undefined){ + testValue = $scope.temp.policy.ruleData[labelLevel +attributeName]; + } + var location = listemunerateValues.indexOf(testValue); + if (location!=-1){ + document.getElementById(labelLevel +attributeName).options[location].selected = true; + } + } + }else { + if($scope.temp.policy.ruleData[labelLevel + attributeName] != undefined && $scope.temp.policy.ruleData[labelLevel + attributeName] != "undefined"){ + document.getElementById(labelLevel + attributeName).value = $scope.temp.policy.ruleData[labelLevel + attributeName]; + } + } + } + }; function onlyUnique(value, index, self) { return self.indexOf(value) === index; diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/OptimizationPolicyController.js b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/OptimizationPolicyController.js new file mode 100644 index 000000000..e499c9ff5 --- /dev/null +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/OptimizationPolicyController.js @@ -0,0 +1,1389 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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========================================================= + */ +angular.module('abs').controller('optimizationController', ['$scope', '$window', '$compile', 'PolicyAppService', 'policyNavigator', 'modalService', '$modal', 'Notification', function ($scope, $window, $compile, PolicyAppService, PolicyNavigator, modalService, $modal, Notification) { + $("#dialog").hide(); + + $scope.policyNavigator; + $scope.isCheck = false; + $scope.savebutton = true; + $scope.refreshCheck = false; + + if(!$scope.temp.policy.editPolicy && !$scope.temp.policy.readOnly){ + $scope.temp.policy = { + policyType : "Config", + configPolicyType : "Optimization" + } + }; + + $scope.refresh = function(){ + if($scope.refreshCheck){ + $scope.policyNavigator.refresh(); + } + $scope.modal('createNewPolicy', true); + $scope.temp.policy = ""; + }; + + $scope.modal = function(id, hide) { + return $('#' + id).modal(hide ? 'hide' : 'show'); + }; + + $('#ttlDate').datepicker({ + dateFormat: 'dd/mm/yy', + changeMonth: true, + changeYear: true, + onSelect: function(date) { + angular.element($('#ttlDate')).triggerHandler('input'); + } + }); + + if ($scope.temp.policy.editPolicy != undefined|| $scope.temp.policy.readOnly != undefined){ + if ($scope.temp.policy.configName == undefined){ + $scope.isCheck = false; + }else{ + $scope.isCheck = true; + } + }else { + $scope.isCheck = false; + } + + PolicyAppService.getData('getDictionary/get_OnapNameDataByName').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.onapNameDictionaryDatas = JSON.parse($scope.data.onapNameDictionaryDatas); + console.log($scope.onapNameDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('get_PriorityValues').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.priorityDatas = JSON.parse($scope.data.priorityDatas); + console.log($scope.priorityDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('getDictionary/get_OptimizationModelsDataByName').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + var inputModelList = JSON.parse($scope.data.optimizationModelsDictionaryDatas); + var unique = {}; + var uniqueList = []; + for(var i = 0; i < inputModelList.length; i++){ + if(typeof unique[inputModelList[i]] == "undefined"){ + unique[inputModelList[i]] = ""; + uniqueList.push(inputModelList[i]); + } + } + $scope.optimizationModelsDictionaryDatas = uniqueList; + console.log($scope.optimizationModelsDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + PolicyAppService.getData('getDictionary/get_RiskTypeDataByName').then(function (data) { + var j = data; + $scope.data = JSON.parse(j.data); + console.log($scope.data); + $scope.riskTypeDictionaryDatas = JSON.parse($scope.data.riskTypeDictionaryDatas); + console.log($scope.riskTypeDictionaryDatas); + }, function (error) { + console.log("failed"); + }); + + $scope.choices = []; + $scope.attributeDatas = [{"attributes" : $scope.choices}]; + $scope.isInitEditTemplate = true; //just initially create the edit template, didn't click add button yet. + $scope.addNewChoice = function(value) { + console.log("input value : " + value); + if(value != undefined){ + if (value.startsWith('div.')){ + value = value.replace('div.',''); + } + var parentElement = document.getElementById("div."+value); + var div = document.getElementById(value+"@0"); + if(div != null){ + var clone = div.cloneNode(true); + var addElement = parentElement.childElementCount; + 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]){ + clone.value = $scope.temp.policy.ruleData[clone.id]; + } + if(!clone.className.includes("child_single")){ + clone.className += ' child_single'; //single element clone + } + document.getElementById("div."+value).appendChild(clone); + plainAttributeKeys.push(''+value+'@'+addElement); + } + }else{ //not view or edit + if(!clone.className.includes("child_single")){ + clone.className += ' child_single'; //single element clone + } + document.getElementById("div."+value).appendChild(clone); + plainAttributeKeys.push(''+value+'@'+addElement); + } + }else{ + div = document.getElementById("div."+value+"@0"); + + if(div){ + div.className += ' children_group'; //div with a group of children. + } + var childElement = parentElement.firstElementChild; + var countParent = parentElement.childElementCount; + var childElementString = childElement.innerHTML; + var find = value+"@0"; + var re = new RegExp(find, 'g'); + childElementString = childElementString.replace(re,value+'@' + countParent); + var clone = childElement.cloneNode(true); + for (var ii = 0; ii < parentElement.childNodes.length; ii++){ + var childId = parentElement.childNodes[ii].id; + if(ii = parentElement.childNodes.length){ + var childnewId = childId.slice(0, -1); + var count = childId.slice(-1); + } + } + var countvalue = parseInt(count) + 1; + clone.id = childnewId+countvalue; + clone.value = ''; + clone.innerHTML=childElementString; + document.getElementById("div."+value).appendChild(clone); + var selects = clone.getElementsByTagName("select"); + var inputs = clone.getElementsByTagName("input"); + var removeValues = []; + for(var i=0; i<inputs.length; i++){ + if ($scope.temp.policy.ruleData!=undefined){ + var checkValue = $scope.temp.policy.ruleData[inputs[i].id]; + if (checkValue!=undefined && checkValue != "undefined"){ + if($scope.temp.policy.ruleData != null){ + var checkValue = $scope.temp.policy.ruleData[inputs[i].id]; + document.getElementById(inputs[i].id).value = $scope.temp.policy.ruleData[inputs[i].id]; + plainAttributeKeys.push(inputs[i].id); + } + } else { + plainAttributeKeys.push(inputs[i].id); + } + }else { + plainAttributeKeys.push(inputs[i].id); + } + } + + for(var i=0; i<selects.length; i++){ + if ($scope.temp.policy.ruleData!=undefined){ + var checkValue = $scope.temp.policy.ruleData[selects[i].id]; + if (checkValue!=undefined && checkValue!="undefined"){ + if($scope.temp.policy.ruleData != null){ + var checkValue = $scope.temp.policy.ruleData[selects[i].id]; + document.getElementById(selects[i].id).value = $scope.temp.policy.ruleData[selects[i].id]; + plainAttributeKeys.push(selects[i].id); + } + } else { + plainAttributeKeys.push(selects[i].id); + } + }else { + plainAttributeKeys.push(selects[i].id); + } + } + + for (var k=0; k<removeValues.length; k++){ + var elem = document.getElementById(removeValues[k]); + elem.parentNode.removeChild(elem); + } + var ele = angular.element(document.getElementById("div."+value)); + $compile(ele.contents())($scope); + $scope.$apply(); + } + } + }; + + function findVal(object, key) { + var value; + Object.keys(object).some(function(k) { + if (k === key) { + value = object[k]; + return true; + } + if (object[k] && typeof object[k] === 'object') { + value = findVal(object[k], key); + return value !== undefined; + } + }); + return value; + } + + $scope.removeChoice = function(value) { + console.log(value); + if(value != undefined){ + var c = document.getElementById("div."+value).childElementCount; + + if(c == 1){ + Notification.error("The original one is not removable."); + return; + } + document.getElementById("div."+value).removeChild(document.getElementById("div."+value).lastChild); + } + }; + + $scope.pullVersion = function(serviceName) { + console.log(serviceName); + if(serviceName != undefined){ + var uuu = "policyController/getModelServiceVersionData.htm"; + var postData={policyData: serviceName}; + $.ajax({ + type : 'POST', + url : uuu, + dataType: 'json', + contentType: 'application/json', + data: JSON.stringify(postData), + success : function(data){ + $scope.$apply(function(){ + $scope.optimizationModelsDictionaryVersionDatas = data[0].optimizationModelVersionData; + }); + }, + error : function(data){ + alert("Error While Retrieving the Template Layout Pattern."); + } + }); + } + }; + + var splitDash = '-'; + var splitEqual = '='; + var splitComma = ','; + var splitcolon = ':'; + var splitsemicolon = ";"; + var splitEnum = "],"; + var plainAttributeKeys = []; + var matching = []; + var enumKeyList = []; + var dictionaryList = []; + var dictionaryNameList = []; + $scope.addDataToFields = function(serviceName, version){ + if(serviceName != null && version !=null){ + var service=serviceName+"-v"+version; + var myNode = document.getElementById("DynamicTemplate"); + myNode.innerHTML = ''; + var uuu = "policyController/getOptimizationTemplateData.htm"; + var postData={policyData: service}; + var dataOrderInfo = ""; + + $.ajax({ + type : 'POST', + url : uuu, + dataType: 'json', + contentType: 'application/json', + data: JSON.stringify(postData), + success : function(data){ + $scope.$apply(function(){ + var plainAttributeKeys = []; + $scope.optimizationModelData = data[0].optimizationModelData; + $scope.optimizationJsonDate = data[0].jsonValue; + $scope.dataOrderInfo = null; + $scope.dataOrderInfo = data[0].dataOrderInfo; + console.log("data[0].dataOrderInfo: " + data[0].dataOrderInfo); + console.log("$scope.dataOrderInfo: " + $scope.dataOrderInfo); + if(data[0].allManyTrueKeys){ + console.log("$scope.allManyTrueKeys: " + $scope.allManyTrueKeys); + } + console.log("$scope.optimizationJsonDate: " + $scope.optimizationJsonDate); + var attributes = $scope.optimizationModelData.attributes; + var refAttributes = $scope.optimizationModelData.ref_attributes; + var subAttributes = $scope.optimizationModelData.sub_attributes; + console.log("attributes: " +attributes); + console.log("subAttributes: " + subAttributes); + console.log("refAttributes: " + refAttributes); + + var headDefautlsData = data[0].headDefautlsData; + if(headDefautlsData != null){ + $scope.temp.policy.onapName = headDefautlsData.onapName; + $scope.temp.policy.guard = headDefautlsData.guard; + $scope.temp.policy.riskType = headDefautlsData.riskType; + $scope.temp.policy.riskLevel = headDefautlsData.riskLevel; + $scope.temp.policy.priority = headDefautlsData.priority; + + }else if(!$scope.temp.policy.editPolicy && !$scope.temp.policy.readOnly){ + $scope.temp.policy.onapName = ""; + $scope.temp.policy.guard = ""; + $scope.temp.policy.riskType = ""; + $scope.temp.policy.riskLevel = ""; + $scope.temp.policy.priority = ""; + } + + var enumAttributes = $scope.optimizationModelData.enumValues; + var annotation = $scope.optimizationModelData.annotation; + var dictionary = $scope.microServiceAttributeDictionaryDatas; + + if (annotation == null || annotation.length<1){ + $scope.isCheck = true; + }else { + $scope.isCheck = false; + var annoationList = annotation.split(splitComma); + for (k = 0; k < annoationList.length; k++){ + var splitAnnotation = annoationList[k].split(splitEqual); + if (splitAnnotation[1].includes("matching-true")){ + matching.push(splitAnnotation[0].trim()); + } + } + + } + + if (dictionary!= null && dictionary.length>1){ + for (m=0; m < dictionary.length; m += 1){ + var keyCompare = dictionary[m].name; + var valueCompare = dictionary[m].value; + var valueModel = dictionary[m].modelName; + var conpairService = serviceName; + if (valueModel.includes('-v')){ + conpairService = service; + } + if(valueModel.localeCompare(conpairService) == 0){ + console.log(valueCompare); + dictionaryList.push(dictionary[m]); + if (!dictionaryNameList.includes(dictionary[m].name)){ + dictionaryNameList.push(dictionary[m].name) + } + } + } + } + + $scope.temp.policy.ruleGridData = []; + + if($scope.temp.policy.editPolicy || $scope.temp.policy.readOnly){ + dataOrderInfo = $scope.dataOrderInfo; + } + + $scope.jsonLayout($scope.optimizationJsonDate); + + }); + + if($scope.temp.policy.editPolicy || $scope.temp.policy.readOnly){ // If it's veiw or edit + + if($scope.temp.policy.editPolicy){ + $scope.isInitEditTemplate = true; + } + + var checkData = []; + var data = []; + // If ruleData contains extra elements created by clicked add button + if($scope.temp.policy.ruleData != null){ + var propNames = Object.getOwnPropertyNames($scope.temp.policy.ruleData); + propNames.forEach(function(name) { + data.push(name); + }); + + var extraElements = data; + + if(plainAttributeKeys != null){ + for(b = 0; b < plainAttributeKeys.length; b++){ // Remove already populated elements from data array + var newValue = plainAttributeKeys[b].split("*"); + for(a = 0; a < data.length; a++){ + if(data[a] === newValue[0] || data[a] === (newValue[0]+"@0")){ + extraElements.splice(a, 1); + } + } + + } + + //--- Populate these extra elements created by clicked add button + for(a = 0; a < extraElements.length; a++){ + if(extraElements[a].includes("@")){ + var index = extraElements[a].lastIndexOf("@"); + if(index > 0){ + // Get the number after @ + var n = getNumOfDigits(extraElements[a], index+1); + + var key = extraElements[a].substring(0, index+n+1); //include @x in key also by n+2 since x can be 1,12, etc + console.log("key: " + key); + checkData.push(key); + } + } + } + var unique = checkData.filter(onlyUnique); + //if no layout order info, keep the process as before + if(!dataOrderInfo){ + for(i =0; i < unique.length; i++){ + //remove @x and let addNewChoice add @1 or @2... + //var newKey = unique[i].substring(0, unique[i].length-2); + var index = unique[i].lastIndexOf("@"); + var newKey = unique[i].substring(0, index); + console.log("newKey: " + newKey); + $scope.addNewChoice(newKey); + } + }else{ + + for (i = 0; i < $scope.labelManyKeys.length; i++) { + console.log("dataOrderInfo["+i+"]"+ dataOrderInfo[i]); + var label = $scope.labelManyKeys[i]; + // first add parent/label level + for (k = 0; k < unique.length; k++){ + var newindex = unique[k].lastIndexOf("@"); + var newKey = unique[k].substring(0, index); + if(label == newKey){ + //Check this label has bee created or not + if(!document.getElementById(unique[k])){ + $scope.addNewChoice(newKey); + } + unique[k] = "*processed*"; + break; + } + } + } + + //---reset to default + dataOrderInfo = []; + $scope.labelManyKeys = []; + + //---process none labels + for (j = 0; j < unique.length; j++){ + if(unique[j] != "*processed*"){ + // if not created yet + if(!document.getElementById(unique[j])){ + var index = unique[j].lastIndexOf("@"); + var newKey = unique[j].substring(0, index); + $scope.addNewChoice(newKey); + } + } + } + } + } + } + + if($scope.temp.policy.editPolicy){ + //clean all the events of addNewChoice + $scope.$on('$destroy', addNewChoice); + } + + } + var ele = angular.element(document.getElementById("DynamicTemplate")); + $compile(ele.contents())($scope); + $scope.$apply(); + }, + error : function(data){ + alert("Error While Retrieving the Template Layout Pattern."); + } + }); + } + }; + + function getNumOfDigits(str_value, index){ + // Get the number after @ + var str = str_value.substring(index, str_value.length); + var c = ''; + var n = 0; + for (var x = 0; x < str.length; x++){ + c = str.charAt(x); + if(!isNaN(c)){ + n++; + }else{ + break; + } + } + return n; + } + + function getDictionary(attribute){ + var dicName = attribute; + if(attribute){ + if(attribute.includes(":")){ + dicName = attribute.split(":")[0]; + } + } + var dictionaryRegExp = new RegExp(dicName); + listemunerateValues = []; + if (dictionaryRegExp.test(dictionaryNameList)) { + for (p=0; p < dictionaryList.length; p += 1) { + if (dicName == dictionaryList[p].name) { + listemunerateValues.push(dictionaryList[p].value); + } + } + } + return listemunerateValues; + } + + function getList(attribute) { + var enumName = attribute; + console.log("In getList: attribute => " + attribute); + if(attribute){ + if(attribute.includes(":")){ + enumName = attribute.split(":")[0]; + } + } + var baseEnum = $scope.optimizationModelData.enumValues; + var enumList = []; + if(baseEnum != null){ + enumList = baseEnum.split(splitEnum); + } + var enumAttributes; + var patternTest = new RegExp(enumName); + for (k=0; k < enumList.length; k += 1){ + if(patternTest.test(enumList[k]) == true){ + enumAttributes = enumList[k].trim(); + } + } + + if(enumAttributes){ + enumAttributes = enumAttributes.replace("[", ""); + enumAttributes = enumAttributes.replace("]", ""); + enumAttributes = enumAttributes.replace(/ /g, ''); + var dropListAfterCommaSplit = enumAttributes.split(splitEqual); + listemunerateValues = dropListAfterCommaSplit[1].split(splitComma); + return listemunerateValues; + } + + return []; + } + + function getBooleanList(){ + var booleanList = []; + booleanList.push(true); + booleanList.push(false); + return booleanList; + } + + function isArray(arrayTest) { + return Object.prototype.toString.call(arrayTest) === '[object Array]'; + } + + var lableList = []; + + $scope.layOutElementList = []; + $scope.layOutOnlyLableList = []; + + var elementOrderNum = 0; + + function deconstructJSON(layOutData, level , name) { + + var array = false; + var label = level; + var stringValue = "java.lang.String"; + var string = "string"; + var intValue = "int"; + var integerValue = "integer"; + var double = "double"; + var boolean = "boolean"; + var baseLevel = level; + var list = "list"; + var String = "String"; + + var attributekey = ""; + + if (name.length > 1){ + label = label + name + '.'; + } + + for (key in layOutData) { + array = isArray(layOutData[key]); + console.log("key: " + key , "value: " + layOutData[key]); + + if (!!layOutData[key] && typeof(layOutData[key])=="object") { + + if (array==false && key!=="0"){ + + if($scope.dataOrderInfo){ + var labelObject = {"label" : key, "level" : label, "array" : array}; + //save it to the list + $scope.layOutOnlyLableList.push(labelObject); + + }else { + //call label layout + $scope.labelLayout(label, key, array ); + } + + } + + if (array == true && key!=0){ + lableList.push(key); + } + + if (lableList.length > 0){ + array = true; + } + if ( key==="0"){ + var newKey = lableList.pop(); + + if($scope.dataOrderInfo){ + + var labelObject = {"label" : newKey, "level" : baseLevel, "array" : array}; + //save it to the list + $scope.layOutOnlyLableList.push(labelObject); + + }else { + //call label layout + $scope.labelLayout(baseLevel, newKey, array ); + } + + if (array){ + label = baseLevel + newKey + '@0.'; + } else { + label = baseLevel + newKey + '.'; + } + } + deconstructJSON(layOutData[key] , label, key); + } else { + var attirbuteLabel = label; + var defaultValue=''; + var isRequired = false; + if (layOutData[key].includes('defaultValue-')){ + defaultValue = layOutData[key].split('defaultValue-')[1]; + } + + if (key==="0"){ + array = true; + attributekey = lableList.pop(); + attirbuteLabel = baseLevel; + } else { + attributekey = key.split(); + } + + if (layOutData[key].includes('required-true')){ + isRequired = true; + } + + var subAttributes = $scope.optimizationModelData.sub_attributes; + + if(subAttributes){ + var jsonObject = JSON.parse(subAttributes); + var allkeys = Object.keys(jsonObject); + if(allkeys){ + for (var k = 0; k < allkeys.length; k++) { + var keyValue = allkeys[k]; + console.log(" keyValue:jsonObject["+keyValue+ "]: " + jsonObject[keyValue]); + if(jsonObject[keyValue]){ + var tempObject = jsonObject[keyValue]; + if(tempObject && tempObject[key]){ + if (tempObject[key].includes('required-true')){ + isRequired = true; + } + } + } + } + } + } + + var elementObject = {}; + switch (layOutData[key].split(splitcolon)[0]){ + + case stringValue: + case string: + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue, "isRequired": isRequired, "type":"text"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "text"); + } + break; + case intValue: + case integerValue: + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue,"isRequired": isRequired, "type":"number"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "number"); + } + break; + case double: + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue,"isRequired": isRequired, "type":"double"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "double"); + } + break; + case boolean: + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": layOutData[key], "list": getBooleanList, "isRequired": isRequired, "type":"dropBox"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.dropBoxLayout(attirbuteLabel, attributekey, array, layOutData[key], getBooleanList()); + } + break; + default: + if (layOutData[key].includes('dictionary-')){ + var list = getDictionary(layOutData[key].split('dictionary-')[1]); + }else{ + //--- get dropdown values from enumValues + var list = getList(layOutData[key]); + } + if (list.length===0){ //not dropdown element + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum,"attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": defaultValue,"isRequired": isRequired, "type":"text"}; + $scope.layOutElementList.push(elementObject); + + }else{ + $scope.attributeBox(attributekey, array, attirbuteLabel, defaultValue, isRequired, "text"); + } + }else{ + if($scope.dataOrderInfo){ + elementOrderNum++; + elementObject = {"id": elementOrderNum, "attributekey" : attributekey, "array": array, "attirbuteLabel" : attirbuteLabel, "defaultValue": layOutData[key],"isRequired": isRequired, "list":list, "type":"dropBox"}; + $scope.layOutElementList.push(elementObject); + }else{ + $scope.dropBoxLayout(attirbuteLabel, attributekey, array, layOutData[key], list, isRequired); + } + } + break; + } + } + } + } + + $scope.validContionalRequired = function(parentId) { + console.log("ng-blur event: parentId : " + parentId); + var c = document.getElementById(parentId).children; + var i; + var hasValue = false; + for (i = 0; i < c.length; i++) { + if(c[i].getAttribute("data-conditional")){ + console.log(c[i].getAttribute("data-conditional")); + console.log(c[i].value); + if(c[i].value != null && c[i].value.trim() != ""){ + hasValue = true; + } + } + } + + for (i = 0; i < c.length; i++) { + if(c[i].getAttribute("data-conditional")){ + if(hasValue){ + c[i].setAttribute("required", true); + }else{ + c[i].removeAttribute("required"); + } + } + } + } + + $scope.jsonLayout = function(layOutData){ + + deconstructJSON(layOutData , "", ""); + + var orderValue = $scope.dataOrderInfo; + var layOutElementList = $scope.layOutElementList; + var labelList = $scope.layOutOnlyLableList; + + //reset to default + elementOrderNum = 0; + $scope.layOutElementList = []; + $scope.layOutOnlyLableList = []; + + // Only layout in order if order info provided + if(orderValue){ + + if(orderValue.includes("[")){ + orderValue = orderValue.replace("[", "") ; + orderValue = orderValue.replace("]", "") ; + } + + orderValue = orderValue.split(',') ; + + for (i = 0; i < orderValue.length; i++) { + console.log("orderValue["+i+"]"+ orderValue[i]); + var key = orderValue[i].trim(); + + //--- Create labels first {"label" : newKey, "level" : baseLevel, "array" : array}; + if(labelList){ + for (k = 0; k < labelList.length; k++){ + + var label = labelList[k].label.toString().trim(); + var level = labelList[k].level.toString().trim(); + var array = labelList[k].array; + + if(key == label){ + $scope.labelLayout(level, label, array); + //in case to have duplicate label names + labelList[k].label = "*processed*"; + break; + } + } + } + //--- then layout each element based on its order defined in YAML file + for (j = 0; j < layOutElementList.length; j++) { + + var attributekey = layOutElementList[j].attributekey.toString().trim(); + + if(key == attributekey){ + + var attirbuteLabel = layOutElementList[j].attirbuteLabel.toString().trim(); + var defaultValue = layOutElementList[j].defaultValue.toString().trim(); + var isRequired = layOutElementList[j].isRequired; + + console.log("layOutElementList[" +j+ "]: id:" + layOutElementList[j].id + ", attributekey:"+ layOutElementList[j].attributekey + ", attirbuteLabel:" + layOutElementList[j].attirbuteLabel); + + if (layOutElementList[j].type == "dropBox"){ + $scope.dropBoxLayout(attirbuteLabel, attributekey, layOutElementList[j].array, defaultValue, layOutElementList[j].list, isRequired); + + }else{ + $scope.attributeBox(attributekey, layOutElementList[j].array, attirbuteLabel, defaultValue, isRequired, layOutElementList[j].type); + + } + + //in case to have duplicate attribute names + layOutElementList[j].attributekey = "*processed*"; + break; + } + + } + + } + } + } + + + $scope.attributeBox = function(attibuteKey, attributeManyKey, labelValue, defaultValue, isRequired, dataType ){ + $scope.temp.policy.ruleGridData.push(attibuteKey); + var br = document.createElement("BR"); + + var label = document.createElement("Label"); + var labeltext = null; + var requiredLabName = ""; + if (matching.includes(attibuteKey)){ + labeltext = document.createTextNode(attibuteKey + "*!"); + isRequired = true; //set required as true for matching element + }else { + if(isRequired){ + requiredLabName = attibuteKey + " * "; + labeltext = document.createTextNode(requiredLabName); + }else{ + labeltext = document.createTextNode(attibuteKey); + } + } + + + var divID = labelValue; + + if (labelValue.length < 1){ + divID = "DynamicTemplate"; + }else if (labelValue.endsWith('.')){ + var divID = 'div.'+ labelValue.substring(0, labelValue.length-1); + } + + label.appendChild(labeltext); + + var textField = document.createElement("INPUT"); + + textField.setAttribute("class" , "form-control"); + if(dataType){ + if(dataType == "double"){ + textField.setAttribute("type" , "number"); + textField.setAttribute("step" , "any"); + }else{ + textField.setAttribute("type" , dataType); + } + } + textField.setAttribute("style" , "width:300px;"); + textField.setAttribute("ng-disabled" , "temp.policy.readOnly"); + var checkKey; + var id = ""; + if(attributeManyKey){ + checkKey = labelValue + attibuteKey+'@0'; + textField.setAttribute("id" , ''+labelValue + attibuteKey+'@0'+''); + var divTag = document.createElement("div"); + divTag.setAttribute("id", "div."+ labelValue +attibuteKey); + var addButton = document.createElement("BUTTON"); + var buttonaddLabel = document.createTextNode("+"); + addButton.appendChild(buttonaddLabel); + addButton.setAttribute("id", labelValue + attibuteKey); + addButton.setAttribute("class", "btn btn-add-remove"); + addButton.setAttribute("ng-click" , 'addNewChoice("'+labelValue + attibuteKey+'");'); + addButton.setAttribute("ng-disabled" , "temp.policy.readOnly"); + var removeButton = document.createElement("BUTTON"); + var buttonremoveLabel = document.createTextNode("-"); + removeButton.appendChild(buttonremoveLabel); + removeButton.setAttribute("class", "btn btn-add-remove"); + removeButton.setAttribute("ng-click" , 'removeChoice("'+labelValue + attibuteKey+'");'); + removeButton.setAttribute("ng-disabled" , "temp.policy.readOnly"); + document.getElementById(divID).appendChild(addButton); + document.getElementById(divID).appendChild(removeButton); + document.getElementById(divID).appendChild(label); + id = "div."+labelValue+attibuteKey; + divTag.setAttribute("id", id); + document.getElementById(divID).appendChild(divTag); + textField.className += ' first_child'; + if(isRequired){ + textField.setAttribute("required", "true"); + } + divTag.appendChild(textField); + document.getElementById(divID).appendChild(divTag); + + }else{ + checkKey = labelValue + attibuteKey; + textField.setAttribute("id" , ''+labelValue +attibuteKey+''); + if(document.getElementById(divID).hasAttribute('required') || !document.getElementById(divID).hasAttribute('data-conditional')){ + if(requiredLabName.includes("*") || isRequired){ + textField.setAttribute("required", "true"); + } + }else if (document.getElementById(divID).hasAttribute('data-conditional')){ + if(requiredLabName.includes("*")){ + var requiredNode = document.createElement('span'); + requiredNode.setAttribute("class", "mstooltip"); + requiredNode.textContent = "?"; + label.appendChild(requiredNode); + + var requiredNodeToolTip = document.createElement('span'); + requiredNodeToolTip.setAttribute("class", "tooltiptext"); + requiredNodeToolTip.textContent = "Conditional Required"; + requiredNode.appendChild(requiredNodeToolTip); + + textField.setAttribute("data-conditional", divID); + textField.setAttribute("ng-blur", "validContionalRequired('"+divID+"')"); + } + } + + document.getElementById(divID).appendChild(label); + document.getElementById(divID).appendChild(textField); + document.getElementById(divID).appendChild(br); + + } + + if(divID.includes("@0") && divID.includes("div.")){ + var firstChild_Id = divID.split("@0")[0]; + var firstChild_element = document.getElementById(firstChild_Id); + if(firstChild_element){ + firstChild_element.className += ' children_group'; //here is a div with a group of children. + } + } + console.log('firstChild_Id: ' + firstChild_Id); + console.log('divID: ' + divID); + + if (defaultValue.length > 0){ + if(defaultValue.includes(":")){ + defaultValue = defaultValue.split(":")[0]; + if(defaultValue === "NA") { + defaultValue = ""; + } + } + if(defaultValue != "undefined" && defaultValue != undefined && defaultValue != "null"){ + document.getElementById(checkKey).value = defaultValue; + } + } + + if($scope.temp.policy.ruleData != null){ + if (attributeManyKey){ + var newCheckKey = checkKey.replace(attibuteKey + '@0',attibuteKey); + if($scope.temp.policy.ruleData[newCheckKey +'@0'] != undefined && $scope.temp.policy.ruleData[newCheckKey +'@0'] != "undefined"){ + document.getElementById(newCheckKey +'@0').value = $scope.temp.policy.ruleData[newCheckKey +'@0']; + } + }else{ + if($scope.temp.policy.ruleData[checkKey] != undefined && $scope.temp.policy.ruleData[checkKey] != "undefined"){ + document.getElementById(checkKey).value = $scope.temp.policy.ruleData[checkKey]; + } + } + } + plainAttributeKeys.push(labelValue + attibuteKey+'*'+attributeManyKey); + + }; + + $scope.labelManyKeys = []; + $scope.labelLayout = function(labelValue, lableName, labelManyKey ){ + var label = document.createElement("Label") + var divID = labelValue; + if (labelValue.endsWith('.')){ + var workingLabel = labelValue.substring(0, labelValue.length-1); + }else { + var workingLabel = labelValue; + } + + if (labelValue.length < 1){ + divID = "DynamicTemplate"; + } else if (labelValue.endsWith('.')){ + var divID = 'div.'+ labelValue.substring(0, labelValue.length-1); + } + + var subAttributes = $scope.optimizationModelData.subattributes; + var jsonObject = JSON.parse(subAttributes); + var lablInfo = findVal(jsonObject, lableName); + console.log("findValue : " + lableName +": "+ lablInfo); + var star = ""; + var required = null; + if(lablInfo){ + if(lablInfo.includes("required-true")){ + star = " *"; + required = true; + }else if (lablInfo.includes("required-false")){ + required = false + } + } + + var labeltext = document.createTextNode(lableName + star); + + label.appendChild(labeltext); + + + if(labelManyKey){ + var addButton = document.createElement("BUTTON"); + var buttonLabel = document.createTextNode("+"); + addButton.appendChild(buttonLabel); + addButton.setAttribute("class", "btn btn-add-remove"); + addButton.setAttribute("ng-click" , 'addNewChoice("'+labelValue + lableName+'");'); + addButton.setAttribute("ng-disabled" , "temp.policy.readOnly"); + var removeButton = document.createElement("BUTTON"); + var buttonremoveLabel = document.createTextNode("-"); + removeButton.appendChild(buttonremoveLabel); + removeButton.setAttribute("class", "btn btn-add-remove"); + removeButton.setAttribute("ng-click" , 'removeChoice("'+labelValue +lableName+'");'); + removeButton.setAttribute("ng-disabled" , "temp.policy.readOnly"); + document.getElementById(divID).appendChild(addButton); + document.getElementById(divID).appendChild(removeButton); + document.getElementById(divID).appendChild(label); + var id = "div."+labelValue+lableName; + var divTag = document.createElement("div"); + divTag.setAttribute("id", id); + document.getElementById(divID).appendChild(divTag); + + var divTag = document.createElement("div"); + divTag.setAttribute("id", id +'@0'); + + divTag.className += ' children_group'; //here is div with a group of children. + + if(required){ + divTag.setAttribute("required", required); + }else if(required == false){ + divTag.setAttribute("data-conditional", "yes"); + } + + document.getElementById(id).appendChild(divTag); + + $scope.labelManyKeys.push(lableName); + + }else{ + var divTag = document.createElement("div"); + divTag.setAttribute("id", "div."+labelValue+lableName); + divTag.className += ' children_group'; //here is div with a group of children. + if(required){ + divTag.setAttribute("required", required); + }else if(required == false){ + divTag.setAttribute("data-conditional", "yes"); + } + document.getElementById(divID).appendChild(label); + document.getElementById(divID).appendChild(divTag); + } + }; + + $scope.dropBoxLayout = function(labelLevel, attributeName, many , refValue, listemunerateValues, isRequired){ + var br = document.createElement("BR"); + + if (labelLevel.length < 1){ + var divID = "DynamicTemplate"; + } else if (labelLevel.endsWith('.')){ + var divID = 'div.'+ labelLevel.substring(0, labelLevel.length-1); + } + + + var label = document.createElement("Label") + + var refAttributes = $scope.optimizationModelData.ref_attributes; + if(isRequired != true && refAttributes){ //check refAttributes also + var refAttributesList = refAttributes.split(splitComma); + for (k = 0; k < refAttributesList.length; k++){ + var refAttribute = refAttributesList[k].split(splitEqual); + if (attributeName == refAttribute[0].trim() && refAttribute[1].includes("required-true")){ + isRequired = true; + } + } + } + + if (matching.includes(attributeName)){ + var labeltext = document.createTextNode(attributeName + "*!"); + label.appendChild(labeltext); + isRequired = true; //set required as true for matching element + }else { + var labeltext = document.createTextNode(attributeName); + if(isRequired){ + var requiredLabName = attributeName+ " * "; + labeltext = document.createTextNode(requiredLabName); + }else{ + labeltext = document.createTextNode(attributeName); + } + + label.appendChild(labeltext); + } + label.appendChild(labeltext); + // if this field is required, but its parent is not required + if(isRequired && document.getElementById(divID).hasAttribute('data-conditional')){ + var requiredNode = document.createElement('span'); + requiredNode.setAttribute("class", "mstooltip"); + requiredNode.textContent = "?"; + label.appendChild(requiredNode); + + var requiredNodeToolTip = document.createElement('span'); + requiredNodeToolTip.setAttribute("class", "tooltiptext"); + requiredNodeToolTip.textContent = "Conditional Required"; + requiredNode.appendChild(requiredNodeToolTip); + + } + + var listField = document.createElement("SELECT"); + listField.setAttribute("class" , "form-control"); + listField.setAttribute("style" , "width:300px;"); + listField.setAttribute("ng-disabled" , "temp.policy.readOnly"); + + if(isRequired){ + if(document.getElementById(divID).hasAttribute('data-conditional')){ + listField.setAttribute("data-conditional", divID); + listField.setAttribute("ng-blur", "validContionalRequired('"+divID+"')"); + }else{ + listField.setAttribute("required", true); + } + } + if( many != true || isRequired != true){ // add an empty option for not required or not multiple select element + var optionFirst = document.createElement('option'); + optionFirst.setAttribute('value', ""); + listField.appendChild(optionFirst); + } + + for (i=0; i < listemunerateValues.length; i += 1) { + if(listemunerateValues[i].includes("equal-sign")){ + listemunerateValues[i] = listemunerateValues[i].replace('equal-sign','='); + } + option = document.createElement('option'); + option.setAttribute('value', listemunerateValues[i]); + option.appendChild(document.createTextNode(listemunerateValues[i])); + option.setAttribute('value', listemunerateValues[i]); + listField.appendChild(option); + } + listField.setAttribute("id" , ''+ labelLevel + attributeName + ''); + + enumKeyList.push(attributeName); + + document.getElementById(divID).appendChild(label); + document.getElementById(divID).appendChild(br); + + if(many == true){ + document.getElementById(divID).appendChild(listField).multiple = true; + plainAttributeKeys.push(labelLevel + attributeName+'*'+true); + }else { + document.getElementById(divID).appendChild(listField).multiple = false; + plainAttributeKeys.push(labelLevel + attributeName+'*'+false); + } + + if($scope.temp.policy.ruleData != null){ + if (many == true){ + document.getElementById(labelLevel +attributeName).options[0].selected = false; + for (i=0; i < listemunerateValues.length; i += 1) { + var testValue = $scope.temp.policy.ruleData[labelLevel +attributeName+'@' + i]; + if (testValue === undefined){ + testValue = $scope.temp.policy.ruleData[labelLevel +attributeName]; + } + var location = listemunerateValues.indexOf(testValue); + if (location!=-1){ + document.getElementById(labelLevel +attributeName).options[location].selected = true; + } + } + }else { + if($scope.temp.policy.ruleData[labelLevel + attributeName] != undefined && $scope.temp.policy.ruleData[labelLevel + attributeName] != "undefined"){ + document.getElementById(labelLevel + attributeName).value = $scope.temp.policy.ruleData[labelLevel + attributeName]; + } + } + } + }; + + function onlyUnique(value, index, self) { + return self.indexOf(value) === index; + }; + + $scope.savePolicy = function(policy){ + if(policy.itemContent != undefined){ + $scope.refreshCheck = true; + $scope.policyNavigator = policy.itemContent; + policy.itemContent = ""; + } + $scope.savebutton = false; + var splitAt = '*'; + var dot ='.'; + var jsonPolicy = {}; + if(plainAttributeKeys != null){ + for(a = 0; a < plainAttributeKeys.length; a++){ + var splitPlainAttributeKey = plainAttributeKeys[a].split(splitAt); + console.log("splitPlainAttributeKey: " + splitPlainAttributeKey); + var searchElement = document.getElementById(splitPlainAttributeKey[0]); + var key = splitPlainAttributeKey[0]; + + if(searchElement == null || searchElement.nodeName == 'BUTTON'){ + searchElement = document.getElementById(splitPlainAttributeKey[0]+'@0'); + key = splitPlainAttributeKey[0]+'@0'; + } + + if(searchElement != null){ + var keySplit = key.split(dot); + var elumentLocation = keySplit.length; + var enumKey = key; + if (elumentLocation > 1){ + enumKey = keySplit[keySplit.length - 1]; + } + //check it is undefined or not + if (enumKeyList != undefined && enumKeyList.indexOf(enumKey) != -1){ + if (splitPlainAttributeKey[1]!= undefined && splitPlainAttributeKey[1].indexOf("true") !== -1){ + var multiSlect = []; + for ( var i = 0; i < searchElement.selectedOptions.length; i++) { + multiSlect.push(searchElement.selectedOptions[i].value); + } + jsonPolicy[key]= multiSlect; + }else{ + console.log(" searchElement.value = > " + searchElement.value); + jsonPolicy[key]= searchElement.value; + } + } else { + if(searchElement.value != null){ + console.log(" searchElement.value = > " + searchElement.value); + jsonPolicy[key]= searchElement.value; + } + } + } + } + } + var uuu = "policycreation/save_policy"; + var postData={policyData: policy, policyJSON : jsonPolicy}; + $.ajax({ + type : 'POST', + url : uuu, + dataType: 'json', + contentType: 'application/json', + data: JSON.stringify(postData), + success : function(data){ + $scope.$apply(function(){ + $scope.data=data.policyData; + if($scope.data == 'success'){ + $scope.temp.policy.readOnly = 'true'; + $scope.safetyChecker = data.policyData.split("#")[2]; + if ($scope.safetyChecker!=undefined) { + Notification.success($scope.safetyChecker); + } + $scope.pushStatus=data.policyData.split("&")[1]; + if($scope.pushStatus=="successPush"){ + Notification.success("Policy pushed successfully"); + } + Notification.success("Policy Saved Successfully."); + }else if ($scope.data == 'PolicyExists'){ + $scope.savebutton = true; + Notification.error("Policy Already Exists with Same Name in Scope."); + } + }); + console.log($scope.data); + }, + error : function(data){ + Notification.error("Error Occured while saving Policy."); + } + }); + }; + + $scope.validatePolicy = function(policy){ + document.getElementById("validate").innerHTML = ""; + var splitAt = '*'; + var dot ='.'; + var jsonPolicy = {}; + if(plainAttributeKeys != null){ + for(a = 0; a < plainAttributeKeys.length; a++){ + var splitPlainAttributeKey = plainAttributeKeys[a].split(splitAt); + console.log(splitPlainAttributeKey[1]); + var searchElement = document.getElementById(splitPlainAttributeKey[0]); + var key = splitPlainAttributeKey[0]; + if(searchElement == null || searchElement.nodeName == 'BUTTON'){ + searchElement = document.getElementById(splitPlainAttributeKey[0]+'@0'); + key = splitPlainAttributeKey[0]+'@0'; + } + if(searchElement != null){ + if (enumKeyList.indexOf(key) != -1){ + if (splitPlainAttributeKey[1].indexOf("true") !== -1){ + var multiSlect = []; + for ( var i = 0; i < searchElement.selectedOptions.length; i++) { + multiSlect.push(searchElement.selectedOptions[i].value); + } + jsonPolicy[key]= multiSlect; + }else{ + jsonPolicy[key]= searchElement.value; + } + if(searchElement.getAttribute("required")){ + if(!searchElement.value){ + return; + } + } + } else { + if(searchElement.value != null){ + jsonPolicy[key]= searchElement.value; + if(searchElement.getAttribute("required")){ + if(!searchElement.value){ + return; + } + } + } + } + } + } + } + var uuu = "policyController/validate_policy.htm"; + var postData={policyData: policy, policyJSON : jsonPolicy}; + $.ajax({ + type : 'POST', + url : uuu, + dataType: 'json', + contentType: 'application/json', + data: JSON.stringify(postData), + success : function(data){ + $scope.$apply(function(){ + $scope.validateData = data.data.replace(/\"/g, ""); + $scope.data=data.data.substring(1,8); + var size = data.data.length; + if($scope.data == 'success'){ + Notification.success("Validation Success."); + $scope.savebutton = false; + if (size > 18){ + var displayWarning = data.data.substring(19,size - 1); + document.getElementById("validate").innerHTML = "Safe Policy Warning Message : "+displayWarning; + document.getElementById("validate").style.color = "white"; + document.getElementById("validate").style.backgroundColor = "skyblue"; + } + }else{ + Notification.error("Validation Failed."); + document.getElementById("validate").innerHTML = $scope.validateData; + document.getElementById("validate").style.color = "white"; + document.getElementById("validate").style.backgroundColor = "red"; + $scope.savebutton = true; + } + + }); + console.log($scope.data); + }, + error : function(data){ + Notification.error("Validation Failed."); + $scope.savebutton = true; + } + }); + }; + + function extend(obj, src) { + for (var key in src) { + if (src.hasOwnProperty(key)) obj[key] = src[key]; + } + return obj; + } +}]);/** + * + */
\ No newline at end of file diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplates/OptimizationPolicyTemplate.html b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplates/OptimizationPolicyTemplate.html new file mode 100644 index 000000000..070a7a8aa --- /dev/null +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplates/OptimizationPolicyTemplate.html @@ -0,0 +1,108 @@ +<div ng-controller="optimizationController"> + <form> + <div class="well"> + <div class="form-group row"> + <div class="form-group col-sm-6"> + <label>Policy Name:<sup><b>*</b></sup></label> <input type="text" + class="form-control" ng-disabled="temp.policy.readOnly" + ng-readonly="temp.policy.editPolicy" + ng-model="temp.policy.policyName" required pattern="\S+" + title="Enter Policy Name without any spaces and special characters and will accept _." /> + </div> + <div class="form-group col-sm-6"> + <label>Description:</label> <input type="text" class="form-control" + ng-disabled="temp.policy.readOnly" + ng-model="temp.policy.policyDescription" + title="Description field will accept any type of data."/> + </div> + </div> + <div class="form-group row"> + <div class="form-group col-sm-3"> + <label>Onap Name:<sup><b>*</b></sup></label> <select + class="form-control" ng-disabled="temp.policy.readOnly" + ng-model="temp.policy.onapName" + ng-options="option for option in onapNameDictionaryDatas track by option" + required pattern="\S+" title="Select the dropdown value driven from OnapName (common)Dictionary."></select> + </div> + <div class="form-group col-sm-3"> + <label>Time to Live Date:</label> <input type="text" id="ttlDate" + class="form-control" name="ttlDate" ng-disabled="temp.policy.readOnly" + ng-model="temp.policy.ttlDate" title="Select the date from calender onclick on the field."/> + </div> + <div class="form-group col-sm-3"> + <label>Guard:<sup><b>*</b></sup></label> <select + class="form-control" ng-disabled="temp.policy.readOnly" + ng-model="temp.policy.guard" + required pattern="\S+" title="Select the dropdown Guard value."> + <option>True</option> + <option>False</option></select> + </div> + <div class="form-group col-sm-3"> + <label>Risk Type:<sup><b>*</b></sup></label> <select + class="form-control" ng-disabled="temp.policy.readOnly" + ng-model="temp.policy.riskType" + ng-options="option for option in riskTypeDictionaryDatas track by option" + required pattern="\S+" title="Select the dropdown value driven from RiskType (Safe Policy)Dictionary."></select> + </div> + </div> + <div class="form-group row"> + <div class="form-group col-sm-3"> + <label>Risk Level:<sup><b>*</b></sup></label> <select + class="form-control" ng-disabled="temp.policy.readOnly" + ng-model="temp.policy.riskLevel" + required pattern="\S+" title="Select the dropdown Risk level value."> + <option>1</option> + <option>2</option> + <option>3</option> + <option>4</option> + <option>5</option></select> + </div> + <div class="form-group col-sm-3"> + <label>Priority:<sup><b>*</b></sup></label> <select + class="form-control" ng-disabled="temp.policy.readOnly" + ng-model="temp.policy.priority" + ng-options="option for option in priorityDatas track by option" title="Select the dropdown Priority value."> + <option value="">{{temp.policy.priority}}</option> + </select> + </div> + <div class="form-group col-sm-3"> + <label>Optimization Model:<sup><b>*</b></sup></label> <select + class="form-control" ng-disabled="temp.policy.readOnly" + ng-model="temp.policy.serviceType" + ng-options="option for option in optimizationModelsDictionaryDatas track by option" + ng-init="pullVersion(temp.policy.serviceType);" + ng-click="pullVersion(temp.policy.serviceType);" + title="Select the dropdown value driven from Optimization Models (Optimization Policy)Dictionary."></select> + </div> + <div class="form-group col-sm-3"> + <label>Optimization Model Version:<sup><b>*</b></sup></label> <select + class="form-control" ng-disabled="temp.policy.readOnly" + ng-model="temp.policy.version" + ng-options="option for option in optimizationModelsDictionaryVersionDatas track by option" + ng-init="addDataToFields(temp.policy.serviceType, temp.policy.version);" + ng-change="addDataToFields(temp.policy.serviceType, temp.policy.version);" + title="Select the dropdown value driven based on Optimization Models (Optimization Policy)Dictionary selection."></select> + </div> + </div> + </div> + <div class="well"> + <div class="form-group col-sm-12" id="DynamicTemplate"> + <label>Optimization Model Attributes:<sup><b>*</b></sup></label><br> + </div> + </br> + <div class="form-group row"></div> + </div> + <br /> + <div id="validate" style="width: 70%"></div> + <br> + <div class="modal-footer"> + <button class="btn btn-primary" herf="javascript:void(0)" + ng-disabled="temp.policy.readOnly" + ng-click="validatePolicy(temp.policy);" title="Validate the data entered in the Policy fields.">Validate</button> + <button class="btn btn-success" herf="javascript:void(0)" + ng-disabled="savebutton" ng-disabled="temp.policy.readOnly" + ng-click="savePolicy(temp);" title="Save the Policy with validated data.">Save</button> + <button type="button" class="btn btn-default" ng-click="refresh();" title="Close the template.">Close</button> + </div> + </form> +</div> diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplates/PolicyTypeTemplate.html b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplates/PolicyTypeTemplate.html index 861e9d660..3230aa1f8 100644 --- a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplates/PolicyTypeTemplate.html +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplates/PolicyTypeTemplate.html @@ -2,7 +2,7 @@ ============LICENSE_START======================================================= ONAP Policy Engine ================================================================================ - Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + Copyright (C) 2017-2018 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. @@ -59,6 +59,7 @@ <option>ClosedLoop_PM</option> <option>Micro Service</option> <option>Firewall Config</option> + <option>Optimization</option> </select> </div> </div> @@ -76,6 +77,8 @@ ng-include="'app/policyApp/policy-models/Editor/PolicyTemplates/DCAEMicroServicePolicyTemplate.html'"></div> <div ng-if="temp.policy.configPolicyType == 'Firewall Config'" ng-include="'app/policyApp/policy-models/Editor/PolicyTemplates/FirewallPolicyTemplate.html'"></div> + <div ng-if="temp.policy.configPolicyType == 'Optimization'" + ng-include="'app/policyApp/policy-models/Editor/PolicyTemplates/OptimizationPolicyTemplate.html'"></div> </div> </form> </div> diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/css/main.css b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/css/main.css index 078e8297a..1e6da205d 100644 --- a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/css/main.css +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/css/main.css @@ -103,6 +103,11 @@ body { margin-top: 10px; } +div#HeaderDefaultValues.modal-body { + position: relative; + padding: 30px; +} + .btn { box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .26); font-weight: 500; @@ -420,4 +425,31 @@ table th > a:focus { .tooltip:hover .tooltiptext { visibility: visible; opacity: 1; +} + +.mstooltip { + position: relative; + display: inline-block; + color: orange; + font-weight: lighter; +} + +.mstooltip .tooltiptext { + font-weight: lighter; + visibility: hidden; + width: 150px; + background-color: #555; + color: #fff; + text-align: center; + border-radius: 6px; + padding: 4px 5px; + margin-left: 5px; + position: absolute; + bottom: 100%; + left: 50%; + z-index: 1; +} + +.mstooltip:hover .tooltiptext { + visibility: visible; }
\ No newline at end of file diff --git a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/policy_Dictionary.html b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/policy_Dictionary.html index c4559a4ad..690f43b36 100644 --- a/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/policy_Dictionary.html +++ b/POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/policy_Dictionary.html @@ -2,7 +2,7 @@ ============LICENSE_START======================================================= ONAP Policy Engine ================================================================================ - Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + Copyright (C) 2017-2018 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. @@ -101,9 +101,12 @@ <!--Micro Service Policy Dictionary's--> <div ng-if="option2 == 'DCAE UUID'" ng-include = "'app/policyApp/policy-models/Dictionary/MSDcaeUUIDDictionary.html'"></div> <div ng-if="option2 == 'MicroService ConfigName'" ng-include = "'app/policyApp/policy-models/Dictionary/MSConfigNameDictionary.html'"></div> + <div ng-if="option2 == 'Header Default Values'" ng-include = "'app/policyApp/policy-models/Dictionary/MSHeaderDefaultValuesDictionary.html'"></div> <div ng-if="option2 == 'MicroService Location'" ng-include = "'app/policyApp/policy-models/Dictionary/MSLocationDictionary.html'"></div> <div ng-if="option2 == 'MicroService Models'" ng-include = "'app/policyApp/policy-models/Dictionary/MSModelDictionary.html'"></div> <div ng-if="option2 == 'MicroService Dictionary'" ng-include = "'app/policyApp/policy-models/Dictionary/ModelAttributeDictionary.html'"></div> + <!--Optimization Policy Dictionary's--> + <div ng-if="option2 == 'ONAP Optimization Models'" ng-include = "'app/policyApp/policy-models/Dictionary/OptimizationModelDictionary.html'"></div> <!-- Policy Scope Dictionary's --> <div ng-if="option2 == 'Closed Loop'" ng-include = "'app/policyApp/policy-models/Dictionary/PSClosedLoopDictionary.html'"></div> <div ng-if="option2 == 'Group Policy Scope'" ng-include = "'app/policyApp/policy-models/Dictionary/PSGroupPolicyScopeDictionary.html'"></div> @@ -120,7 +123,7 @@ <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> - <h2 class="font-showcase-font-name" style="color : #157bb2">Import Dictionary's</h2> + <h2 class="font-showcase-font-name" style="color : #157bb2">Import Dictionary's</h2> </div> <div class="modal-body"> <div class="fn-ebz-container"> diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateDcaeMicroServiceControllerTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateDcaeMicroServiceControllerTest.java index 8d8f57b0d..1301d3f3d 100644 --- a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateDcaeMicroServiceControllerTest.java +++ b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateDcaeMicroServiceControllerTest.java @@ -158,90 +158,6 @@ public class CreateDcaeMicroServiceControllerTest { } /** - * Run the void stringBetweenDots(String, String) method test - */ - - @Test - public void testStringBetweenDots() { - - logger.debug("testStringBetweenDots: enter"); - - //expect: uniqueKeys should contain a string value - CreateDcaeMicroServiceController controllerA = new CreateDcaeMicroServiceController(); - String str = "testing\\.byCorrectWay\\.OfDATA"; - assertEquals(1, controllerA.stringBetweenDots(str)); - - //expect: uniqueKeys should not contain a string value - str = "testing\byWrongtWay.\\OfDATA"; - CreateDcaeMicroServiceController controllerB = new CreateDcaeMicroServiceController(); - assertEquals(0, controllerB.stringBetweenDots(str)); - - logger.debug("testStringBetweenDots: exit"); - } - - /** - * Run the Map<String,String> load(String) method test - */ - - @Test - public void testLoad() { - - logger.debug("testLoad: enter"); - - boolean isLocalTesting = true; - CreateDcaeMicroServiceController controller = new CreateDcaeMicroServiceController(); - String fileName = null; - Map<String,String> result = null; - try { - ClassLoader classLoader = getClass().getClassLoader(); - fileName = new File(classLoader.getResource("policy_tosca_tca_v1707.yml").getFile()).getAbsolutePath(); - } catch (Exception e1) { - logger.error("Exception Occured while loading file"+e1); - } - if(isLocalTesting){ - try { - result = controller.load(fileName); - } catch (IOException e) { - logger.error("testLoad", e); - result = null; - } - - assertTrue(result != null && !result.isEmpty()); - logger.debug("result : " + result); - } - - logger.debug("testLoad: exit"); - } - - /** - * Run the void parseTosca(String) method test - */ - - @Test - public void testParseTosca() { - - logger.debug("testParseTosca: enter"); - boolean isLocalTesting = true; - String fileName = null; - try { - ClassLoader classLoader = getClass().getClassLoader(); - fileName = new File(classLoader.getResource("policy_tosca_tca_v1707.yml").getFile()).getAbsolutePath(); - } catch (Exception e1) { - logger.error("Exception Occured while loading file"+e1); - } - - CreateDcaeMicroServiceController contoller = new CreateDcaeMicroServiceController(); - if(isLocalTesting){ - try { - contoller.parseTosca(fileName); - }catch (Exception e) { - fail("parseTosca caused error: " + e); - } - } - logger.debug("testParseTosca: exit"); - } - - /** * Run the ModelAndView getDCAEMSTemplateData(HttpServletRequest, * HttpServletResponse) method test */ @@ -584,9 +500,7 @@ public class CreateDcaeMicroServiceControllerTest { logger.error("testSetMSModelData" + e); e.printStackTrace(); } - - //assertTrue(false); - + logger.debug("testSetMSModelData: exit"); } diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateOptimizationControllerTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateOptimizationControllerTest.java new file mode 100644 index 000000000..af573c616 --- /dev/null +++ b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/CreateOptimizationControllerTest.java @@ -0,0 +1,464 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2018 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 static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; + +import org.junit.Before; +import org.junit.Test; +import org.onap.policy.common.logging.flexlogger.FlexLogger; +import org.onap.policy.common.logging.flexlogger.Logger; +import org.onap.policy.rest.adapter.PolicyRestAdapter; +import org.onap.policy.rest.dao.CommonClassDao; +import org.onap.policy.rest.jpa.ConfigurationDataEntity; +import org.onap.policy.rest.jpa.OptimizationModels; +import org.onap.policy.rest.jpa.PolicyEntity; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.fge.jackson.JsonLoader; + +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; + +/** + * The class <code>CreateOptimizationControllerTest</code> contains tests + * for the class {@link <code>CreateOptimizationController</code>}* + * + * All JUnits are designed to run in the local development environment + * where they have write privileges and can execute time-sensitive + * tasks. + */ +public class CreateOptimizationControllerTest { + + private static Logger logger = FlexLogger.getLogger(CreateOptimizationControllerTest.class); + private static CommonClassDao commonClassDao; + private String jsonString = null; + private String configBodyString = null; + private HttpServletRequest request = null; + + @Before + public void setUp() throws Exception { + + logger.info("setUp: Entering"); + commonClassDao = mock(CommonClassDao.class); + List<Object> optimizationModelsData = new ArrayList<Object>(); + OptimizationModels testData = new OptimizationModels(); + testData.setVersion("OpenOnap-Junit"); + optimizationModelsData.add(testData); + + // mock the getDataById() call + when(commonClassDao.getDataById(OptimizationModels.class, "modelName", "test")).thenReturn(optimizationModelsData); + + jsonString = "{\"policyData\": {\"error\": \"\", \"inprocess\": false,\"model\": {\"name\": \"testingdata\", " + + " \"subScopename\": \"\",\"path\": [],\"type\": \"dir\",\"size\": 0,\"date\": \"2017-04-12T21:26:57.000Z\", " + + " \"version\": \"\",\"createdBy\": \"someone\", \"modifiedBy\": \"someone\", \"content\": \"\",\"recursive\": false}," + + " \"tempModel\": {\"name\": \"testingdata\",\"subScopename\": \"\" }," + + " \"policy\": {\"policyType\": \"Config\",\"configPolicyType\": \"OOF\",\"policyName\": \"testPolicy\", " + + " \"policyDescription\": \"testing input\", \"onapName\": \"test\",\"guard\": \"False\",\"riskType\": \"Risk12345\",\"riskLevel\": \"2\"," + + " \"priority\": \"6\",\"serviceType\": \"DkatPolicyBody\",\"version\": \"1707.41.02\",\"ruleGridData\": [ [\"fileId\"]],\"ttlDate\": null}}, " + + " \"policyJSON\": {\"pmTableName\": \"test\", \"dmdTopic\": \"1\",\"fileId\": \"56\"} }"; + + configBodyString = "{\"service\":\"PolicyEntityTest\",\"policyName\":\"someone\",\"description\":\"test\",\"templateVersion\":\"1607\",\"version\":\"HD\"," + + "\"priority\":\"2\",\"content\":{\"lastPolled\":\"1\",\"boolen-test\":\"true\",\"created\":\"test\",\"retiredDate\":\"test\",\"scope\":\"TEST_PLACEMENT_VDHV\"," + + "\"name\":\"test\",\"lastModified\":\"test\",\"state\":\"CREATED\",\"type\":\"CONFIG\",\"intent\":\"test\",\"target\":\"TEST\"}}"; + + request = mock(HttpServletRequest.class); + BufferedReader br = new BufferedReader(new StringReader(jsonString)); + // mock the getReader() call + when(request.getReader()).thenReturn(br); + + logger.info("setUp: exit"); + } + + + /** + * Run the PolicyRestAdapter setDataToPolicyRestAdapter(PolicyRestAdapter, + * JsonNode) method test + */ + + @Test + public void testSetDataToPolicyRestAdapter() { + + logger.debug("testSetDataToPolicyRestAdapter: enter"); + + CreateOptimizationController controller = new CreateOptimizationController(); + CreateOptimizationController.setCommonClassDao(commonClassDao); + + JsonNode root = null; + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + PolicyRestAdapter policyData = null; + try { + root = JsonLoader.fromString(jsonString); + policyData = (PolicyRestAdapter)mapper.readValue(root.get("policyData").get("policy").toString(), PolicyRestAdapter.class); + } catch (Exception e) { + logger.error("testSetDataToPolicyRestAdapter", e); + } + + PolicyRestAdapter result = controller.setDataToPolicyRestAdapter(policyData, root); + assertTrue(result != null && result.getJsonBody() != null && !result.getJsonBody().isEmpty()); + + logger.debug("result.getJsonBody() : " + result.getJsonBody()); + logger.debug("testSetDataToPolicyRestAdapter: exit"); + } + + + /** + * Run the ModelAndView getOptimizationTemplateData(HttpServletRequest, + * HttpServletResponse) method test + */ + + @Test + public void testGetOptimizationTemplateData() { + + logger.debug("testGetOptimizationTemplateData: enter"); + + CreateOptimizationController controller = new CreateOptimizationController(); + MockHttpServletResponse response = new MockHttpServletResponse(); + String modelJson = "{\"policyData\":\"testPolicyBody\"}"; + try { + + CreateOptimizationController.setCommonClassDao(commonClassDao); + + BufferedReader br = new BufferedReader(new StringReader(modelJson)); + // mock the getReader() call + when(request.getReader()).thenReturn(br); + + List<Object> optimizationModelsData = new ArrayList<Object>(); + OptimizationModels testData = new OptimizationModels(); + testData.setVersion("1707.4.1.2-Junit"); + optimizationModelsData.add(testData); + // mock the getDataById() call with the same MS model name + when(commonClassDao.getDataById(OptimizationModels.class, "modelName", "testPolicyBody")).thenReturn(optimizationModelsData); + + controller.getOptimizationTemplateData(request, response); + + assertTrue( response.getContentAsString() != null && response.getContentAsString().contains("optimizationModelData")); + + logger.debug("response: " + response.getContentAsString()); + + } catch (Exception e) { + logger.error("testGetOptimizationTemplateData", e); + } + + logger.debug("testGetOptimizationTemplateData: exit"); + } + + /** + * Run the ModelAndView getModelServiceVersionData(HttpServletRequest, + * HttpServletResponse) method test + */ + + @Test + public void testGetModelServiceVersionData() { + + logger.debug("testGetModelServiceVersionData: enter"); + + CreateOptimizationController controller = new CreateOptimizationController(); + MockHttpServletResponse response = new MockHttpServletResponse(); + String modelJson = "{\"policyData\":\"TestPolicyBody\"}"; + try { + + CreateOptimizationController.setCommonClassDao(commonClassDao); + + BufferedReader br = new BufferedReader(new StringReader(modelJson)); + // mock the getReader() call + when(request.getReader()).thenReturn(br); + + List<Object> optimizationModelsData = new ArrayList<Object>(); + OptimizationModels testData = new OptimizationModels(); + testData.setVersion("1707.4.1.2-Junit"); + optimizationModelsData.add(testData); + + // mock the getDataById() call with the same MS model name + when(commonClassDao.getDataById(OptimizationModels.class, "modelName", "TestPolicyBody")).thenReturn(optimizationModelsData); + controller.getModelServiceVersionData(request, response); + + assertTrue( response.getContentAsString() != null && response.getContentAsString().contains("1707.4.1.2-Junit")); + + logger.debug("response: " + response.getContentAsString()); + + } catch (Exception e) { + logger.error("testGetModelServiceVersionData", e); + fail("testGetModelServiceVersionData failed due to: " + e); + } + + logger.debug("testGetModelServiceVersionData: exit"); + } + + /** + * Run the void prePopulateDCAEMSPolicyData(PolicyRestAdapter, + * PolicyEntity) method test + */ + + @Test + public void testPrePopulatePolicyData() { + + logger.debug("testPrePopulatePolicyData: enter"); + + CreateOptimizationController controller = new CreateOptimizationController(); + + // populate an entity object for testing + PolicyEntity entity = new PolicyEntity(); + ConfigurationDataEntity configData = new ConfigurationDataEntity(); + configData.setConfigBody(configBodyString); + entity.setConfigurationData(configData); + + JsonNode root = null; + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + PolicyRestAdapter restAdapter = null; + + try { + root = JsonLoader.fromString(jsonString); + restAdapter = (PolicyRestAdapter)mapper.readValue(root.get("policyData").get("policy").toString(), PolicyRestAdapter.class); + PolicyType policyType = new PolicyType(); + TargetType target = new TargetType(); + + // create guard attribute + AnyOfType anyOfType = new AnyOfType(); + AllOfType alltype = new AllOfType(); + MatchType matchType = new MatchType(); + // set value + AttributeValueType attributeValue1 = new AttributeValueType(); + attributeValue1.getContent().add("True"); + matchType.setAttributeValue(attributeValue1); + // set Id + AttributeDesignatorType designator = new AttributeDesignatorType(); + designator.setAttributeId("guard"); + matchType.setAttributeDesignator(designator); + alltype.getMatch().add(matchType); + + // add a dummy MatchType object since while (matchList.size()>1 ...) + MatchType matchDummy = new MatchType(); + // set value + AttributeValueType dummyValue = new AttributeValueType(); + dummyValue.getContent().add("dummy"); + matchDummy.setAttributeValue(dummyValue); + // set Id + AttributeDesignatorType designatorDummy = new AttributeDesignatorType(); + designatorDummy.setAttributeId("dummyId"); + matchDummy.setAttributeDesignator(designatorDummy); + + alltype.getMatch().add(matchDummy); + anyOfType.getAllOf().add(alltype); + + target.getAnyOf().add(anyOfType); + + // create RiskType attribute + AnyOfType anyRiskType = new AnyOfType(); + AllOfType allRiskType = new AllOfType(); + MatchType matchRiskType = new MatchType(); + // set value + AttributeValueType riskTypeValue = new AttributeValueType(); + riskTypeValue.getContent().add("test"); + matchRiskType.setAttributeValue(riskTypeValue); + // set Id + AttributeDesignatorType designatorRiskType = new AttributeDesignatorType(); + designatorRiskType.setAttributeId("RiskType"); + matchRiskType.setAttributeDesignator(designatorRiskType); + allRiskType.getMatch().add(matchRiskType); + + // add a dummy MatchType object since while (matchList.size()>1 ...) + MatchType matchDummy1 = new MatchType(); + // set value + AttributeValueType dummy1Value = new AttributeValueType(); + dummy1Value.getContent().add("dummy"); + matchDummy1.setAttributeValue(dummy1Value); + // set Id + AttributeDesignatorType designatorDummy1 = new AttributeDesignatorType(); + designatorDummy1.setAttributeId("dummyId"); + matchDummy1.setAttributeDesignator(designatorDummy1); + + allRiskType.getMatch().add(matchDummy1); + + anyRiskType.getAllOf().add(allRiskType); + + target.getAnyOf().add(anyRiskType); + + // create RiskLevel attribute + AnyOfType anyRiskLevel = new AnyOfType(); + AllOfType allRiskLevel = new AllOfType(); + MatchType matchRiskLevel = new MatchType(); + // set value + AttributeValueType riskLevel = new AttributeValueType(); + riskLevel.getContent().add("3"); + matchRiskLevel.setAttributeValue(riskLevel); + // set Id + AttributeDesignatorType designatorRiskLevel = new AttributeDesignatorType(); + designatorRiskLevel.setAttributeId("RiskLevel"); + matchRiskLevel.setAttributeDesignator(designatorRiskLevel); + allRiskLevel.getMatch().add(matchRiskLevel); + + // add a dummy MatchType object since while (matchList.size()>1 ...) + MatchType matchDummy2 = new MatchType(); + // set value + AttributeValueType dummy2Value = new AttributeValueType(); + dummy2Value.getContent().add("dummy"); + matchDummy2.setAttributeValue(dummy2Value); + // set Id + AttributeDesignatorType designatorDummy2 = new AttributeDesignatorType(); + designatorDummy2.setAttributeId("dummyId"); + matchDummy2.setAttributeDesignator(designatorDummy2); + + allRiskLevel.getMatch().add(matchDummy2); + + anyRiskLevel.getAllOf().add(allRiskLevel); + target.getAnyOf().add(anyRiskLevel); + + policyType.setTarget(target); + + restAdapter.setPolicyData(policyType); + + controller.prePopulatePolicyData(restAdapter, entity); + + logger.error("restAdapter.getRiskType() : " + restAdapter.getRiskType()); + logger.error("restAdapter.getRiskLevel() : " + restAdapter.getRiskLevel()); + logger.error("restAdapter.getGuard() : " + restAdapter.getGuard()); + + assertEquals("True", restAdapter.getGuard()); + assertEquals("3", restAdapter.getRiskLevel()); + assertEquals("test", restAdapter.getRiskType()); + + } catch (Exception e) { + logger.error("testPrePopulatePolicyData", e); + fail("testPrePopulatePolicyData failed due to: " + e); + } + + logger.debug("testPrePopulatePolicyData: exit"); + + } + + /** + * Run the void SetMSModelData(HttpServletRequest, HttpServletResponse) + * method test + */ + + @Test + public void testSetModelData() { + + logger.debug("testSetModelData: enter"); + + HttpServletRequest request = createMock(HttpServletRequest.class); + expect(request.getContentType()).andReturn("multipart/form-data; boundary=----WebKitFormBoundaryWcRUaIbC8kXgjr3p"); + expect(request.getMethod()).andReturn("post"); + expect(request.getHeader("Content-length")).andReturn("7809"); + + expect(request.getContentLength()).andReturn(7809); + + try { + // value of fileName needs to be matched to your local directory + String fileName = ""; + try { + ClassLoader classLoader = getClass().getClassLoader(); + fileName = new File(classLoader.getResource("schedulerPolicies-v1707.xmi").getFile()).getAbsolutePath(); + } catch (Exception e1) { + logger.error("Exception Occured while loading file"+e1); + } + expect(request.getInputStream()).andReturn(new MockServletInputStream(fileName)); + expect(request.getCharacterEncoding()).andReturn("UTF-8"); + expect(request.getContentLength()).andReturn(1024); + replay(request); + + } catch (Exception e) { + logger.error("testSetModelData" + e); + e.printStackTrace(); + } + + logger.debug("testSetModelData: exit"); + } + + /** + * + * @ Get File Stream + * + */ + private class MockServletInputStream extends ServletInputStream { + + InputStream fis = null; + public MockServletInputStream(String fileName) { + try { + fis = new FileInputStream(fileName); + } catch (Exception genExe) { + genExe.printStackTrace(); + } + } + @Override + public int read() throws IOException { + if(fis.available() > 0) { + return fis.read(); + } + return 0; + } + + @Override + public int read(byte[] bytes, int len, int size) throws IOException { + if(fis.available() > 0) { + int length = fis.read(bytes, len, size); + return length; + } + return -1; + } + @Override + public boolean isFinished() { + return false; + } + @Override + public boolean isReady() { + return false; + } + @Override + public void setReadListener(ReadListener arg0) { + + } + } + +}
\ No newline at end of file |