Decision BlackList Guard Enhancements 63/56763/8
authorrb7147 <rb7147@att.com>
Wed, 18 Jul 2018 16:50:06 +0000 (12:50 -0400)
committerrb7147 <rb7147@att.com>
Tue, 24 Jul 2018 18:16:12 +0000 (14:16 -0400)
While creating a decision Bl Guard Policy we are allowing to add
Blacklist entries through file upload for bulk from GUI.

Issue-ID: POLICY-901
Change-Id: I4031fd4a96937b9facc330cecf72777d701d4678
Signed-off-by: rb7147 <rb7147@att.com>
15 files changed:
ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/DecisionPolicy.java
ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/policycontroller/PolicyCreation.java
ONAP-PAP-REST/src/main/resources/Decision_GuardBLPolicyTemplate.xml
ONAP-PAP-REST/src/main/resources/Decision_GuardPolicyTemplate.xml
ONAP-REST/src/main/java/org/onap/policy/rest/adapter/PolicyRestAdapter.java
ONAP-REST/src/main/java/org/onap/policy/rest/adapter/ReturnBlackList.java [new file with mode: 0644]
ONAP-REST/src/main/java/org/onap/policy/rest/util/PolicyValidation.java
ONAP-REST/src/test/java/org/onap/policy/rest/adapter/ReturnBlackListTest.java [new file with mode: 0644]
POLICY-SDK-APP/pom.xml
POLICY-SDK-APP/src/main/java/org/onap/policy/controller/ExportAndImportDecisionBlackListEntries.java [new file with mode: 0644]
POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplateController/DecisionPolicyController.js
POLICY-SDK-APP/src/main/webapp/app/policyApp/policy-models/Editor/PolicyTemplates/DecisionPolicyTemplate.html
POLICY-SDK-APP/src/test/java/org/onap/policy/controller/ExportAndImportDecisionBlackListEntriesTest.java [new file with mode: 0644]
POLICY-SDK-APP/src/test/resources/BlackList.xls [new file with mode: 0644]
POLICY-SDK-APP/src/test/resources/DecisionPolicyData.txt [new file with mode: 0644]

index 56c23ac..c8c540c 100644 (file)
@@ -167,7 +167,9 @@ public class DecisionPolicy extends Policy {
                
                if(policyAdapter.getRuleProvider().equals(GUARD_YAML) || policyAdapter.getRuleProvider().equals(GUARD_BL_YAML)){
                        Map<String, String> yamlParams = new HashMap<>();
-                       yamlParams.put(DESCRIPTION, (policyAdapter.getPolicyDescription()!=null)? policyAdapter.getPolicyDescription(): "YAML Guard Policy");
+                       String blackListEntryType = policyAdapter.getBlackListEntryType() !=null ? policyAdapter.getBlackListEntryType(): "Use Manual Entry";
+                       String description = policyAdapter.getPolicyDescription() != null? policyAdapter.getPolicyDescription(): "YAML Guard Policy";
+                       yamlParams.put(DESCRIPTION, description + "@blEntry@" + blackListEntryType + "@blEntry@");
                        String fileName = policyAdapter.getNewFileName();
                        String name = fileName.substring(fileName.lastIndexOf('\\') + 1, fileName.length());
                        if ((name == null) || ("".equals(name))) {
@@ -295,6 +297,16 @@ public class DecisionPolicy extends Policy {
                                        blackList.add(blackListString);
                                }       
                        }
+            if(yamlParams.containsKey("appendBlackList")){
+               String appendBlackListString = yamlParams.get("appendBlackList");
+                List<String> appendBlackList = null;
+                if(appendBlackListString!=null && !appendBlackListString.trim().isEmpty()){
+                       appendBlackList = Arrays.asList(appendBlackListString.split(","));      
+                       for(int i=0; i<appendBlackList.size();i++){
+                               blackList.remove(appendBlackList.get(i));
+                       }
+                }
+            }
                        File templateFile;
                        Path xacmlTemplatePath;
                        ClassLoader classLoader = getClass().getClassLoader();
@@ -781,7 +793,7 @@ public class DecisionPolicy extends Policy {
        }
        
        public String getFunctionDefinitionId(String key){
-       FunctionDefinition object = (FunctionDefinition) commonClassDao.getDataById(FunctionDefinition.class, "short_name", key);
+       FunctionDefinition object = (FunctionDefinition) commonClassDao.getDataById(FunctionDefinition.class, "shortname", key);
        if(object != null){
                return object.getXacmlid();
        }
index f7ef1a0..a6cda5e 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP-PAP-REST
  * ================================================================================
- * 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.
@@ -416,6 +416,16 @@ public class PolicyCreation extends AbstractPolicyCreation{
                                                        String blackList = StringUtils.join(policyData.getYamlparams().getBlackList(), ",");
                                                        attributeMap.put("blackList", blackList);
                                                }
+                                               if(DecisionPolicy.GUARD_BL_YAML.equals(policyData.getRuleProvider()) && "Use File Upload".equals(policyData.getBlackListEntryType())){
+                                                       if(policyData.getBlackListEntries() != null && !policyData.getBlackListEntries().isEmpty()){
+                                                               String blackList = StringUtils.join(policyData.getBlackListEntries(), ",");
+                                                               attributeMap.put("blackList", blackList);
+                                                       }
+                                                       if(policyData.getAppendBlackListEntries() != null && !policyData.getAppendBlackListEntries().isEmpty()){
+                                                               String blackList = StringUtils.join(policyData.getAppendBlackListEntries(), ",");
+                                                               attributeMap.put("appendBlackList", blackList);
+                                                       }
+                                               }
                                                if(policyData.getYamlparams().getTargets()!=null){
                                                        String targets = StringUtils.join(policyData.getYamlparams().getTargets(),",");
                                                        attributeMap.put("targets", targets);
index 1ac292c..43d7a23 100644 (file)
         <AdviceExpressions>
             <AdviceExpression AdviceId="GUARD_BL_YAML" AppliesTo="Deny">
                 <AttributeAssignmentExpression AttributeId="guard.response" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
-                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Denied!</AttributeValue>
+                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Denied By Blacklist</AttributeValue>
                 </AttributeAssignmentExpression>
             </AdviceExpression>
         </AdviceExpressions>
index 15465f3..809dc99 100644 (file)
         <AdviceExpressions>
             <AdviceExpression AdviceId="GUARD_YAML" AppliesTo="Deny">
                 <AttributeAssignmentExpression AttributeId="guard.response" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
-                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Denied!</AttributeValue>
+                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Denied By Guard</AttributeValue>
                 </AttributeAssignmentExpression>
             </AdviceExpression>
         </AdviceExpressions>
index a9daf17..e815fe2 100644 (file)
@@ -127,6 +127,9 @@ public class PolicyRestAdapter {
        private String actionDictUrl = null;
        private String actionDictMethod = null;
        private YAMLParams yamlparams; 
+       private List<String> blackListEntries;
+       private List<String> appendBlackListEntries;
+       private String blackListEntryType;
        
        //Rainy Day Decision
        private RainyDayParams rainyday;
@@ -907,4 +910,22 @@ public class PolicyRestAdapter {
        public void setFaultDatas(ClosedLoopFaultTrapDatas faultDatas) {
                this.faultDatas = faultDatas;
        }
+       public List<String> getAppendBlackListEntries() {
+               return appendBlackListEntries;
+       }
+       public void setAppendBlackListEntries(List<String> appendBlackListEntries) {
+               this.appendBlackListEntries = appendBlackListEntries;
+       }
+       public List<String> getBlackListEntries() {
+               return blackListEntries;
+       }
+       public void setBlackListEntries(List<String> blackListEntries) {
+               this.blackListEntries = blackListEntries;
+       }
+       public String getBlackListEntryType() {
+               return blackListEntryType;
+       }
+       public void setBlackListEntryType(String blackListEntryType) {
+               this.blackListEntryType = blackListEntryType;
+       }
 }
diff --git a/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/ReturnBlackList.java b/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/ReturnBlackList.java
new file mode 100644 (file)
index 0000000..6ecf1b5
--- /dev/null
@@ -0,0 +1,51 @@
+/*-
+ * ============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.rest.adapter;
+
+public class ReturnBlackList {
+    private boolean entryCheck;
+    private int actionValue;
+    private String entryValue;
+
+    public boolean isEntryCheck() {
+        return entryCheck;
+    }
+
+    public void setEntryCheck(boolean entryCheck) {
+        this.entryCheck = entryCheck;
+    }
+
+    public int getActionValue() {
+        return actionValue;
+    }
+
+    public void setActionValue(int actionValue) {
+        this.actionValue = actionValue;
+    }
+
+    public String getEntryValue() {
+        return entryValue;
+    }
+
+    public void setEntryValue(String entryValue) {
+        this.entryValue = entryValue;
+    }
+}
index 50985b1..0478f5f 100644 (file)
@@ -940,20 +940,25 @@ public class PolicyValidation {
                                                                responseString.append("Guard Params <b>Time Units</b> is Required" + HTML_ITALICS_LNBREAK);
                                                                valid = false;
                                                        }
-                                               }else if("GUARD_BL_YAML".equals(policyData.getRuleProvider())){
-                                                       if(policyData.getYamlparams().getBlackList()==null || policyData.getYamlparams().getBlackList().isEmpty()){
-                                                               responseString.append(" Guard Params <b>BlackList</b> is Required " + HTML_ITALICS_LNBREAK);
-                                                               valid = false;
-                                                       }else{
-                                                               for(String blackList: policyData.getYamlparams().getBlackList()){
-                                                                       if(blackList==null || !(SUCCESS.equals(PolicyUtils.policySpecialCharValidator(blackList)))){
-                                                                               responseString.append(" Guard Params <b>BlackList</b> Should be valid String" + HTML_ITALICS_LNBREAK);
-                                                                               valid = false;
-                                                                               break;
-                                                                       }
-                                                               }
-                                                       }
-                                               }
+                                               } else if ("GUARD_BL_YAML".equals(policyData.getRuleProvider())
+                                && "Use Manual Entry".equals(policyData.getBlackListEntryType())) {
+                            if (policyData.getYamlparams().getBlackList() == null
+                                    || policyData.getYamlparams().getBlackList().isEmpty()) {
+                                responseString
+                                        .append(" Guard Params <b>BlackList</b> is Required " + HTML_ITALICS_LNBREAK);
+                                valid = false;
+                            } else {
+                                for (String blackList : policyData.getYamlparams().getBlackList()) {
+                                    if (blackList == null
+                                            || !(SUCCESS.equals(PolicyUtils.policySpecialCharValidator(blackList)))) {
+                                        responseString.append(" Guard Params <b>BlackList</b> Should be valid String"
+                                                + HTML_ITALICS_LNBREAK);
+                                        valid = false;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
                                        }
                                }
                        }
diff --git a/ONAP-REST/src/test/java/org/onap/policy/rest/adapter/ReturnBlackListTest.java b/ONAP-REST/src/test/java/org/onap/policy/rest/adapter/ReturnBlackListTest.java
new file mode 100644 (file)
index 0000000..e8f6684
--- /dev/null
@@ -0,0 +1,41 @@
+/*-
+ * ============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.rest.adapter;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class ReturnBlackListTest {
+
+    @Test
+    public void testReturnBlackList() {
+        ReturnBlackList list = new ReturnBlackList();
+        list.setActionValue(1);
+        list.setEntryCheck(true);
+        list.setEntryValue("Test");
+
+        assertTrue(1 == list.getActionValue());
+        assertTrue(list.isEntryCheck());
+        assertTrue("Test".equals(list.getEntryValue()));
+    }
+
+}
index 7017017..1160a8f 100644 (file)
                        <artifactId>jackson-dataformat-xml</artifactId>
                        <version>${jackson.version}</version>
                </dependency>
+               <dependency>
+                       <groupId>com.google.code.gson</groupId>
+                       <artifactId>gson</artifactId>
+                       <version>2.8.0</version>
+               </dependency>
                <!-- Elastic Search -->
                <dependency>
                        <groupId>org.elasticsearch</groupId>
diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/ExportAndImportDecisionBlackListEntries.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/ExportAndImportDecisionBlackListEntries.java
new file mode 100644 (file)
index 0000000..8a37e9d
--- /dev/null
@@ -0,0 +1,380 @@
+/*-
+ * ============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 com.google.gson.Gson;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.nio.file.Files;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+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.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+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.adapter.PolicyRestAdapter;
+import org.onap.policy.rest.adapter.ReturnBlackList;
+import org.onap.policy.xacml.api.XACMLErrorConstants;
+import org.onap.portalsdk.core.controller.RestrictedBaseController;
+import org.onap.portalsdk.core.web.support.JsonMessage;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+
+
+/**
+ * This class is used to import and export the black list entries which were used in the Decision Blacklist Guard YAML
+ * Policy.
+ *
+ */
+@Controller
+@RequestMapping("/")
+public class ExportAndImportDecisionBlackListEntries extends RestrictedBaseController {
+
+    private static final Logger policyLogger = FlexLogger.getLogger(ExportAndImportDecisionBlackListEntries.class);
+    private static final String BLACKLISTENTRIESDATA = "blackListEntries";
+    private static final String ACTION = "Action";
+    private static final String BLACKLISTENTRY = "BlackListEntry";
+
+    /**
+     * This method is used to Export the Black List entries data from Decision BlackList Guard YAML Policy. So, user can
+     * update the file on adding or removing the entries, for updating the policies or using in other Environments.
+     * 
+     * @param request the request contains the policy data. So, based on that we can populate and read and write the
+     *        entries.
+     * @param response after reading and writing the blacklist list entries to file, the file is copied to tmp directory
+     *        and making available to user to download from GUI.
+     * @throws IOException exception throws if anything goes wrong in the process.
+     */
+    @RequestMapping(value = {"/policycreation/exportDecisionBlackListEntries"}, method = {RequestMethod.POST})
+    public void exportBlackList(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        try (HSSFWorkbook workBook = new HSSFWorkbook()) {
+            String requestData = request.getReader().lines().collect(Collectors.joining());
+            JSONObject root = new JSONObject(requestData);
+            PolicyRestAdapter adapter = new Gson().fromJson(root.get("policyData").toString(), PolicyRestAdapter.class);
+            DecisionPolicyController controller = new DecisionPolicyController();
+            controller.prePopulateDecisionPolicyData(adapter, null);
+            List<String> blackLists = adapter.getYamlparams().getBlackList();
+            HSSFSheet sheet = workBook.createSheet("BlackList");
+            HSSFRow headingRow = sheet.createRow(0);
+            headingRow.createCell(0).setCellValue("Action");
+            headingRow.createCell(1).setCellValue("BlackListEntry");
+
+            short rowNo = 1;
+            for (Object object : blackLists) {
+                HSSFRow row = sheet.createRow(rowNo);
+                row.createCell(0).setCellValue(1);
+                row.createCell(1).setCellValue(object.toString());
+                rowNo++;
+            }
+
+            String tmpFile = System.getProperty("catalina.base") + File.separator + "webapps" + File.separator + "temp";
+
+            /*
+             * Export FileName is the combination of BlacList+Scope+PolicyName+Version+PolicyCreatedDate.
+             * 
+             */
+
+            SimpleDateFormat parseFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Date date = parseFormat.parse(root.get("date").toString().replaceAll("\"", ""));
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
+            String formatedDate = dateFormat.format(date);
+
+            String fileName = "BlackList_Scope_" + adapter.getDomainDir() + "_Name_" + adapter.getPolicyName()
+                    + "_Version_" + root.get("version").toString() + "_Date_" + formatedDate + ".xls";
+
+            String deleteCheckPath = tmpFile + File.separator + fileName;
+            File deleteCheck = new File(deleteCheckPath);
+            if (deleteCheck.exists() && deleteCheck.delete()) {
+                policyLogger.info("Deleted the file from system before exporting a new file.");
+            }
+
+            File temPath = new File(tmpFile);
+            if (!temPath.exists()) {
+                temPath.mkdir();
+            }
+
+            String file = temPath + File.separator + fileName;
+            File filepath = new File(file);
+            FileOutputStream fos = new FileOutputStream(filepath);
+            workBook.write(fos);
+            fos.flush();
+
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("application / json");
+            request.setCharacterEncoding("UTF-8");
+
+            PrintWriter out = response.getWriter();
+            String successMap = file.substring(file.lastIndexOf("webapps") + 8);
+            String responseString = new Gson().toJson(successMap);
+            JSONObject jsonResposne = new JSONObject("{data: " + responseString + "}");
+            out.write(jsonResposne.toString());
+        } catch (Exception e) {
+            policyLogger.error(
+                    XACMLErrorConstants.ERROR_SYSTEM_ERROR + "Exception Occured while Exporting BlackList Entries" , e);
+        }
+    }
+
+    /**
+     * This method is used to import the BlackList excel file into the system. Which is used to create Decision
+     * Blacklist Guard YAML Policy.
+     * 
+     * @param request the HTTP request contains file upload stream form GUI.
+     * @param response the response is send to the GUI after reading the file input stream.
+     * @throws FileUploadException throws fileUpload Exception.
+     * @throws IOException throws IO Exceptions.
+     */
+    @RequestMapping(value = {"/policycreation/importBlackListForDecisionPolicy"}, method = {RequestMethod.POST})
+    public void importBlackListFile(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
+        List<String> errorLogs = new ArrayList<>();
+        Gson mapper = new Gson();
+        errorLogs.add("error");
+        Map<String, Object> model = new HashMap<>();
+        if (items.isEmpty()) {
+            errorLogs.add("The File doesn't have any content and it is invalid.");
+            model.put(BLACKLISTENTRIESDATA, errorLogs);
+        } else {
+            readItems(items, errorLogs, model);
+        }
+        JsonMessage msg = new JsonMessage(mapper.toJson(model));
+        JSONObject jsonResposne = new JSONObject(msg);
+        response.getWriter().write(jsonResposne.toString());
+    }
+
+    /**
+     * This method is used to read the first item, as we expect only one entry in the file upload.
+     * 
+     * @param items The file entries which were uploaded from GUI.
+     * @param errorLogs on adding all incorrect entries, we can let user know what need to fixed.
+     * @param model Map which stores key value (blacklist and append list data)
+     * @throws Exception throws exception if it is not .xls format
+     */
+    private void readItems(List<FileItem> items, List<String> errorLogs, Map<String, Object> model) throws Exception {
+        Map<String, InputStream> files = new HashMap<>();
+
+        FileItem item = items.get(0);
+        files.put(item.getName(), item.getInputStream());
+        File file = new File(item.getName());
+        String fileName = file.getName();
+        try (OutputStream outputStream = new FileOutputStream(file);) {
+            IOUtils.copy(item.getInputStream(), outputStream);
+            if (fileName.startsWith("BlackList") && fileName.endsWith(".xls")) {
+                readWorkBook(fileName, errorLogs, model);
+            } else {
+                errorLogs.add("The File Name should start with BlackList and must be .xls format.");
+                model.put(BLACKLISTENTRIESDATA, errorLogs);
+            }
+        }
+        Files.delete(file.toPath());
+    }
+
+    /**
+     * This method is used to read the workbook in xls file item.
+     * 
+     * @param fileName fileName as input parameter
+     * @param errorLogs on adding all incorrect entries, we can let user know what need to fixed.
+     * @param model Map which stores key value (blacklist and append list data)
+     */
+    private void readWorkBook(String fileName, List<String> errorLogs, Map<String, Object> model) {
+        Set<String> blackListEntries = new HashSet<>();
+        Set<String> appendBlackListEntries = new HashSet<>();
+        try (Workbook workbook = WorkbookFactory.create(new File(fileName))) {
+            Sheet datatypeSheet = workbook.getSheetAt(0);
+            Iterator<Row> rowIterator = datatypeSheet.iterator();
+            readExcelRows(rowIterator, blackListEntries, appendBlackListEntries, errorLogs);
+            if (errorLogs.size() == 1) {
+                model.put(BLACKLISTENTRIESDATA, blackListEntries);
+                model.put("appendBlackListEntries", appendBlackListEntries);
+            } else {
+                model.put(BLACKLISTENTRIESDATA, errorLogs);
+            }
+        } catch (Exception e) {
+            String error = "Error Occured While Reading File. Please check the format of the file.";
+            errorLogs.add(error);
+            model.put(BLACKLISTENTRIESDATA, errorLogs);
+            policyLogger.error(error , e);
+        }
+    }
+
+    /**
+     * This method is used to read all the rows from imported Excel sheet and set to respective objects.
+     * 
+     * @param rowIterator Excel Sheet rows are passed as input parameters.
+     * @param blackListEntries the data is set to this object, which is going to be added.
+     * @param appendBlackListEntries the data is set to this object which is going to be removed.
+     * @param errorLogs on adding all incorrect entries, we can let user know what need to fixed.
+     */
+    private void readExcelRows(Iterator<Row> rowIterator, Set<String> blackListEntries,
+            Set<String> appendBlackListEntries, List<String> errorLogs) {
+        while (rowIterator.hasNext()) {
+            Row currentRow = rowIterator.next();
+            if (currentRow.getRowNum() == 0) {
+                continue;
+            }
+            Iterator<Cell> cellIterator = currentRow.cellIterator();
+            readExcelCells(cellIterator, blackListEntries, appendBlackListEntries, errorLogs);
+        }
+    }
+
+    /**
+     * This method is used to read all the cells in the row.
+     * 
+     * @param cellIterator iterating the cells and will parse based on the cell type.
+     * @param blackListEntries the data is set to this object, which is going to be added.
+     * @param appendBlackListEntries the data is set to this object which is going to be removed.
+     * @param errorLogs on adding all incorrect entries, we can let user know what need to fixed.
+     */
+    private void readExcelCells(Iterator<Cell> cellIterator, Set<String> blackListEntries,
+            Set<String> appendBlackListEntries, List<String> errorLogs) {
+        boolean actionCheck = false;
+        boolean blackListCheck = false;
+        String blEntry = "";
+        int actionEntry = 0;
+        int lineNo = 1;
+        while (cellIterator.hasNext()) {
+            Cell cell = cellIterator.next();
+            if (ACTION.equalsIgnoreCase(getCellHeaderName(cell))) {
+                ReturnBlackList returnList = readActionCell(cell, lineNo, errorLogs);
+                actionEntry = returnList.getActionValue();
+                actionCheck = returnList.isEntryCheck();
+            }
+            if (BLACKLISTENTRY.equalsIgnoreCase(getCellHeaderName(cell))) {
+                ReturnBlackList returnList = readBlackListCell(cell, lineNo, errorLogs);
+                blEntry = returnList.getEntryValue();
+                blackListCheck = returnList.isEntryCheck();
+                actionEntry = returnList.getActionValue();
+            }
+            lineNo++;
+        }
+        if (actionCheck && blackListCheck) {
+            addBlackListEntries(actionEntry, blackListEntries, appendBlackListEntries, blEntry);
+        }
+    }
+
+    /**
+     * This method is used to read the Action cell entry.
+     * 
+     * @param cell reading the action entry cell.
+     * @param lineNo counts the number of the cell.
+     * @param errorLogs on adding all incorrect entries, we can let user know what need to fixed.
+     * @return returns the response on setting to ReturnBlackList class.
+     */
+    private ReturnBlackList readActionCell(Cell cell, int lineNo, List<String> errorLogs) {
+        ReturnBlackList returnValues = new ReturnBlackList();
+        String error = "Entry at row " + lineNo + " not added, the value in the " + ACTION
+                + "column is neither \"0\" nor \"1\"";
+        int actionEntry = 0;
+        try {
+            actionEntry = (int) cell.getNumericCellValue();
+            returnValues.setEntryCheck(true);
+            if (actionEntry != 1 && actionEntry != 0) {
+                errorLogs.add(error);
+            }
+        } catch (Exception e) {
+            errorLogs.add(error);
+            policyLogger.error(error, e);
+            actionEntry = 0;
+        }
+        returnValues.setActionValue(actionEntry);
+        return returnValues;
+    }
+
+    /**
+     * 
+     * This method is used to read the BlackList cell entry.
+     * 
+     * @param cell reading the blacklist entry cell.
+     * @param lineNo counts the number of the cell.
+     * @param errorLogs on adding all incorrect entries, we can let user know what need to fixed.
+     * @return returns the response on setting to ReturnBlackList class.
+     */
+    private ReturnBlackList readBlackListCell(Cell cell, int lineNo, List<String> errorLogs) {
+        ReturnBlackList returnValues = new ReturnBlackList();
+        String blEntry = "";
+        try {
+            blEntry = cell.getStringCellValue();
+            returnValues.setEntryCheck(true);
+        } catch (Exception e) {
+            String error = "Entry at row " + lineNo + " not added, the value in the " + BLACKLISTENTRY
+                    + " column is not a valid string";
+            errorLogs.add(error);
+            policyLogger.error(error, e);
+            returnValues.setActionValue(0);
+        }
+        returnValues.setEntryValue(blEntry);
+        return returnValues;
+    }
+
+    /**
+     * This method is used to add the data to blacklist and append list after parsing each and every row.
+     * 
+     * @param actionEntry it has the input to add or not and holds either 0 or 1.
+     * @param blackListEntries list to add blacklist entries based on action entry = 1.
+     * @param appendBlackListEntries list to add append list entries based on action entry = 0.
+     * @param blEntry the value added to both entries based on action entry.
+     */
+    private void addBlackListEntries(int actionEntry, Set<String> blackListEntries, Set<String> appendBlackListEntries,
+            String blEntry) {
+        if (actionEntry == 1) {
+            blackListEntries.add(blEntry);
+        } else {
+            appendBlackListEntries.add(blEntry);
+        }
+    }
+
+    /**
+     * This method is used to identify the header of the cell.
+     * 
+     * @param cell Excel sheet cell is passed as input parameter.
+     * @return the column header name value
+     */
+    private String getCellHeaderName(Cell cell) {
+        return cell.getSheet().getRow(0).getCell(cell.getColumnIndex()).getRichStringCellValue().toString();
+    }
+}
index 5b2bdb2..f560f4d 100644 (file)
@@ -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.
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-angular.module('abs').controller('decisionPolicyController', ['$scope', 'PolicyAppService', 'policyNavigator', 'modalService', '$modal', 'Notification', function ($scope, PolicyAppService, PolicyNavigator, modalService, $modal, Notification) {
+angular.module('abs').controller('decisionPolicyController', ['$scope', 'PolicyAppService', 'policyNavigator', 'modalService', '$modal', 'Notification', '$http', function ($scope, PolicyAppService, PolicyNavigator, modalService, $modal, Notification, $http) {
     $("#dialog").hide();
     
     $scope.policyNavigator;
     $scope.savebutton = true;
     $scope.refreshCheck = false;
+    $scope.disableOnCreate = false;
     
     if(!$scope.temp.policy.editPolicy  && !$scope.temp.policy.readOnly){
+       $scope.disableOnCreate = true;
        $scope.temp.policy = {
                        policyType : "Decision"
        }
@@ -45,7 +47,11 @@ angular.module('abs').controller('decisionPolicyController', ['$scope', 'PolicyA
        if($scope.temp.policy.ruleProvider==undefined){
                $scope.temp.policy.ruleProvider="Custom";
        }
-               
+       
+       if($scope.temp.policy.blackListEntryType==undefined){
+               $scope.temp.policy.blackListEntryType="Use Manual Entry";
+       }
+       
        PolicyAppService.getData('getDictionary/get_OnapNameDataByName').then(function (data) {
                var j = data;
                $scope.data = JSON.parse(j.data);
@@ -216,9 +222,15 @@ angular.module('abs').controller('decisionPolicyController', ['$scope', 'PolicyA
                   $scope.temp.policy.ruleAlgorithmschoices = [];
           }
     }else if($scope.temp.policy.ruleProvider=="GUARD_BL_YAML"){
-          if($scope.temp.policy.yamlparams.blackList.length==0){
-                  $scope.temp.policy.yamlparams.blackList = [];
-          }
+       if($scope.temp.policy.yamlparams.blackList == null || $scope.temp.policy.yamlparams.blackList.length==0){
+               $scope.temp.policy.yamlparams.blackList = [];
+       }
+       if($scope.temp.policy.blackListEntries == null || $scope.temp.policy.blackListEntries.length==0){
+               $scope.temp.policy.blackListEntries = [];
+       }
+       $scope.blackListEntries = [];
+       $scope.temp.policy.appendBlackListEntries = [];
+       $scope.blackListEntries = arrayUnique($scope.temp.policy.blackListEntries.concat($scope.temp.policy.yamlparams.blackList));
     }else if($scope.temp.policy.ruleProvider=="GUARD_YAML"){
        if($scope.temp.policy.yamlparams.targets.length==0){
                   $scope.temp.policy.yamlparams.targets = [];
@@ -259,9 +271,11 @@ angular.module('abs').controller('decisionPolicyController', ['$scope', 'PolicyA
     $scope.addNewBL = function() {
        $scope.temp.policy.yamlparams.blackList.push('');
     };
-    $scope.removeBL = function() {
-       var lastItem = $scope.temp.policy.yamlparams.blackList.length-1;
-       $scope.temp.policy.yamlparams.blackList.splice(lastItem);
+    
+    $scope.removeBL = function(id) {
+       $scope.temp.policy.yamlparams.blackList = $scope.temp.policy.yamlparams.blackList.filter(function (obj){
+                       return obj !== id;
+               });
     };
     
     $scope.treatmentDatas = [{"treatmentValues" : $scope.temp.policy.rainyday.treatmentTableChoices}];
@@ -324,4 +338,93 @@ angular.module('abs').controller('decisionPolicyController', ['$scope', 'PolicyA
                $scope.temp.policy.attributes = [];
        }
     };
+    
+    $scope.importButton = true;
+    var fd;
+       $scope.uploadBLFile = function(files) {
+               fd = new FormData();
+               fd.append("file", files[0]);
+               var fileExtension = files[0].name.split(".")[1];
+               if(fileExtension == "xls"){
+                       $scope.importButton = false;
+                       $scope.$apply();
+               }else{
+                       Notification.error("Upload the BlackList file which extends with .xls format.");
+               }
+       };
+       
+       function arrayUnique(array) {
+           var a = array.concat();
+           for(var i=0; i<a.length; ++i) {
+               for(var j=i+1; j<a.length; ++j) {
+                   if(a[i] === a[j])
+                       a.splice(j--, 1);
+               }
+           }
+           return a;
+       }
+       
+       $scope.submitUpload = function(){
+               $http.post("policycreation/importBlackListForDecisionPolicy", fd,  {
+                       withCredentials: false,
+                       headers: {'Content-Type': undefined},
+                       transformRequest: angular.identity
+               }).success(function(data){
+                       $scope.data = JSON.parse(data.data);
+                       $scope.temp.policy.blackListEntries = $scope.data.blackListEntries;
+                       if($scope.temp.policy.blackListEntries[0] !== "error"){
+                               $scope.blackListEntries = arrayUnique($scope.temp.policy.blackListEntries.concat($scope.temp.policy.yamlparams.blackList));
+                               $scope.temp.policy.appendBlackListEntries = $scope.data.appendBlackListEntries;
+                               $scope.blackListEntries = $scope.blackListEntries.filter(function (obj){
+                                       return !$scope.temp.policy.appendBlackListEntries.includes(obj);
+                               });
+                               if($scope.blackListEntries.length == 0){
+                                       $scope.validateButton = true;
+                                       Notification.error("Black Lists are empty. Minimum one entry required.");
+                               }else{
+                                       $scope.temp.policy.blackListEntries = $scope.blackListEntries;
+                                       Notification.success("Blacklist File Uploaded Successfully.");
+                                       $scope.validateButton = false;
+                                       $scope.importButton = true;
+                               }
+                       }else{
+                                Notification.error("Blacklist File Upload Failed." + $scope.temp.policy.blackListEntries[1]);
+                       }
+               }).error(function(data){
+                        Notification.error("Blacklist File Upload Failed.");
+               });
+       };
+       
+       $scope.initializeBlackList = function(){
+               if($scope.temp.policy.blackListEntryType === "Use File Upload"){
+                        $scope.validateButton = true;  
+               } else {
+                        $scope.validateButton = false; 
+               }
+               $("#importFile").val('');
+       };
+       
+       $scope.exportBlackListEntries = function(){
+               var uuu = "policycreation/exportDecisionBlackListEntries";
+               var postData={policyData: $scope.temp.policy, date : $scope.temp.model.modifiedDate, version : $scope.temp.model.version};
+               $.ajax({
+                       type : 'POST',
+                       url : uuu,
+                       dataType: 'json',
+                       contentType: 'application/json',
+                       data: JSON.stringify(postData),
+                       success : function(data){
+                               $scope.$apply(function(){
+                                       $scope.data=data.data;
+                                       var url = '../' + $scope.data;
+                                       window.location = url;
+                                       Notification.success("BlackList Entries Exported Successfully.");
+                               });
+                               console.log($scope.data);
+                       },
+                       error : function(data){         
+                               Notification.error("Error Occured while Exporting BlackList Entries.");
+                       }
+               });
+       };      
 }]);
\ No newline at end of file
index 27b6287..151af15 100644 (file)
@@ -31,8 +31,8 @@
                                <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."/>
+                                               ng-model="temp.policy.policyDescription"
+                                               title="Description field will accept any type of data." />
                                </div>
                        </div>
                        <div class="form-group row">
@@ -41,7 +41,8 @@
                                                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>
+                                               required pattern="\S+"
+                                               title="Select the dropdown value driven from OnapName (common)Dictionary."></select>
                                </div>
                                <div class="form-group col-sm-6">
                                        <label>Rule Provider:<sup><b>*</b></sup></label><select
@@ -53,7 +54,7 @@
                                                <option>AAF</option>
                                                <option>Rainy_Day</option>
                                                <option>GUARD_YAML</option>
-                                               <option>GUARD_BL_YAML<option>
+                                               <option>GUARD_BL_YAML</option>
                                        </select>
                                </div>
                        </div>
                                                </div>
                                                <div class="form-group col-sm-2">
                                                        <input type="text" class="form-control"
-                                                               ng-disabled="temp.policy.readOnly" ng-model="temp.policy.rainyday.serviceType"
-                                                               placeholder="Service Type" title="Enter Service Type value."/>
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.rainyday.serviceType"
+                                                               placeholder="Service Type" title="Enter Service Type value." />
                                                </div>
                                                <div class="form-group col-sm-1">
                                                        <label>VNF Type:<sup><b>*</b></sup></label>
                                                </div>
                                                <div class="form-group col-sm-2">
                                                        <input type="text" class="form-control"
-                                                               ng-disabled="temp.policy.readOnly" ng-model="temp.policy.rainyday.vnfType"
-                                                               placeholder="VNF Type" title="Enter VNF Type value."/>
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.rainyday.vnfType" placeholder="VNF Type"
+                                                               title="Enter VNF Type value." />
                                                </div>
                                                <div class="form-group col-sm-1">
                                                        <label>Building Block ID:<sup><b>*</b></sup></label>
                                                </div>
                                                <div class="form-group col-sm-2">
-                                                               <select
-                                                                       class="form-control" ng-disabled="temp.policy.readOnly"
-                                                                       ng-model="temp.policy.rainyday.bbid"
-                                                                       ng-options="option for option in rainyDayDictionaryDatas track by option"
-                                                                       ng-change="getWorkstepValues(temp.policy.rainyday.bbid)" title="Select the dropdown value driven from Rainday Allowed Treatments (Decision)Dictionary.">
-                                                                       <option value="">{{temp.policy.rainyday.bbid}}</option>
-                                                               </select>
+                                                       <select class="form-control" ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.rainyday.bbid"
+                                                               ng-options="option for option in rainyDayDictionaryDatas track by option"
+                                                               ng-change="getWorkstepValues(temp.policy.rainyday.bbid)"
+                                                               title="Select the dropdown value driven from Rainday Allowed Treatments (Decision)Dictionary.">
+                                                               <option value="">{{temp.policy.rainyday.bbid}}</option>
+                                                       </select>
                                                </div>
                                                <div class="form-group col-sm-1">
                                                        <label>Work Step:<sup><b>*</b></sup></label>
                                                </div>
                                                <div class="form-group col-sm-2">
-                                                       <select
-                                                                       class="form-control" ng-disabled="temp.policy.readOnly"
-                                                                       ng-model="temp.policy.rainyday.workstep"
-                                                                       ng-options="option for option in workstepDictionaryDatas track by option"
-                                                                       ng-change="getTreatmentValues(temp.policy.rainyday.bbid, temp.policy.rainyday.workstep)">
-                                                                       <option value="">{{temp.policy.rainyday.workstep}}</option>
+                                                       <select class="form-control" ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.rainyday.workstep"
+                                                               ng-options="option for option in workstepDictionaryDatas track by option"
+                                                               ng-change="getTreatmentValues(temp.policy.rainyday.bbid, temp.policy.rainyday.workstep)">
+                                                               <option value="">{{temp.policy.rainyday.workstep}}</option>
                                                        </select>
                                                </div>
                                        </div>
                                                <div class="form-group col-sm-3">
                                                        <label>Desired Automated Treatments:</label>
                                                        <button type="button" class="btn btn-default"
-                                                               ng-disabled="temp.policy.readOnly"
-                                                               ng-click="addNewTreatment()">
+                                                               ng-disabled="temp.policy.readOnly" ng-click="addNewTreatment()">
                                                                <i class="fa fa-plus"></i>
                                                        </button>
                                                </div>
                                        </div>
                                        <div class="form-group row">
-                                       <div data-ng-repeat="treatmentTableChoice in temp.policy.rainyday.treatmentTableChoices">
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-1">
-                                                               <label>Error Code:<sup><b>*</b></sup></label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly"
-                                                                       ng-model="treatmentTableChoice.errorcode"
-                                                                       placeholder="Error Code" />
-                                                       </div>
-                                                       <div class="form-group col-sm-1">
-                                                               <label>Desired Treatment:<sup><b>*</b></sup></label>
-                                                       </div>          
-                                                       <div class="form-group col-sm-3">
-                                                               <select
-                                                                       class="form-control" 
-                                                                       ng-disabled="temp.policy.readOnly"
-                                                                       ng-model="treatmentTableChoice.treatment"
-                                                                       ng-options="option for option in allowedTreatmentsDatas track by option">
-                                                                       <option value="">{{treatmentTableChoice.treatment}}</option>
-                                                               </select>                                               
-                                                       </div>
-                                                       <div class="form-group col-sm-1">
-                                                               <button type="button" class="btn btn-default"
-                                                                       ng-disabled="temp.policy.readOnly"
-                                                                       ng-click="removeTreatment()">
-                                                                       <i class="fa fa-minus"></i>
-                                                               </button>
+                                               <div
+                                                       data-ng-repeat="treatmentTableChoice in temp.policy.rainyday.treatmentTableChoices">
+                                                       <div class="form-group row" style="margin-left: 2%">
+                                                               <div class="form-group col-sm-1">
+                                                                       <label>Error Code:<sup><b>*</b></sup></label>
+                                                               </div>
+                                                               <div class="form-group col-sm-3">
+                                                                       <input type="text" class="form-control"
+                                                                               ng-disabled="temp.policy.readOnly"
+                                                                               ng-model="treatmentTableChoice.errorcode"
+                                                                               placeholder="Error Code" />
+                                                               </div>
+                                                               <div class="form-group col-sm-1">
+                                                                       <label>Desired Treatment:<sup><b>*</b></sup></label>
+                                                               </div>
+                                                               <div class="form-group col-sm-3">
+                                                                       <select class="form-control" ng-disabled="temp.policy.readOnly"
+                                                                               ng-model="treatmentTableChoice.treatment"
+                                                                               ng-options="option for option in allowedTreatmentsDatas track by option">
+                                                                               <option value="">{{treatmentTableChoice.treatment}}</option>
+                                                                       </select>
+                                                               </div>
+                                                               <div class="form-group col-sm-1">
+                                                                       <button type="button" class="btn btn-default"
+                                                                               ng-disabled="temp.policy.readOnly"
+                                                                               ng-click="removeTreatment()">
+                                                                               <i class="fa fa-minus"></i>
+                                                                       </button>
+                                                               </div>
                                                        </div>
                                                </div>
                                        </div>
-                                       </div>
                                </div>
                        </div>
                </div>
                                        </div>
                                </div>
                                <div class="form-group row">
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> actor: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.actor"
-                                                                       placeholder="Actor" />
-                                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> actor: </label>
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> recipe: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.recipe"
-                                                                       placeholder="Recipe" />
-                                                       </div>
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.actor" placeholder="Actor" />
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> CLName: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.clname"
-                                                                       placeholder="CLName" />
-                                                       </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> recipe: </label>
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> guardActiveStart: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.guardActiveStart"
-                                                                       placeholder="00:00:00-05:00" />
-                                                       </div>
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.recipe" placeholder="Recipe" />
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> guardActiveEnd: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.guardActiveEnd"
-                                                                       placeholder="00:00:00-05:00" />
-                                                       </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> CLName: </label>
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> BlackList: </label>
-                                                               <button type="button" class="btn btn-default"
-                                                                       ng-disabled="temp.policy.readOnly" ng-click="addNewBL()">
-                                                                       <i class="fa fa-plus"></i>
-                                                               </button>
-                                                       </div>
-                                                       <div class="form-group col-sm-4">
-                                                               <div data-ng-repeat="choice in temp.policy.yamlparams.blackList track by $index">
-                                                                       <div class="form-group row">
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.clname" placeholder="CLName" />
+                                               </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> guardActiveStart: </label>
+                                               </div>
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.guardActiveStart"
+                                                               placeholder="00:00:00-05:00" />
+                                               </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> guardActiveEnd: </label>
+                                               </div>
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.guardActiveEnd"
+                                                               placeholder="00:00:00-05:00" />
+                                               </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> BlackList Entry Type: </label>
+                                               </div>
+                                               <div class="form-group col-sm-3">
+                                                       <select class="form-control"
+                                                               ng-model="temp.policy.blackListEntryType"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-change="initializeBlackList(temp.policy.blackListEntryType)">
+                                                               <option>Use Manual Entry</option>
+                                                               <option>Use File Upload</option>
+                                                       </select>
+                                               </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label>Export BlackList Entries:</label>
+                                               </div>
+                                               <div class="form-group col-sm-3">
+                                                       <button type="button" class="btn btn-default"
+                                                               ng-disabled="disableOnCreate"
+                                                               ng-click="exportBlackListEntries()">Export BlackList</button>
+                                               </div>
+                                       </div>
+                                       <div ng-if="temp.policy.blackListEntryType == 'Use File Upload'"
+                                               class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label>Upload BlackList: </label>
+                                               </div>
+                                               <div class="form-group col-sm-4">
+                                                       <input type="file" name="file" class="form-control"
+                                                               id="importFile"
+                                                               onchange="angular.element(this).scope().uploadBLFile(this.files)" />
+                                               </div>
+                                               <div class="form-group col-sm-2">
+                                                       <button class="btn btn-primary" ng-disabled="importButton"
+                                                               ng-click="submitUpload()">Upload</button>
+                                               </div>
+                                       </div>
+                                       <div ng-if="temp.policy.blackListEntryType == 'Use File Upload'"
+                                               class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label>Search BlackList: </label>
+                                               </div>
+                                               <div class="form-group col-sm-4">
+                                                       <input type="text" class="form-control" class="search"
+                                                               placeholder="{{'search'}}..." ng-model="search"> <select
+                                                               class="form-control" multiple ng-disabled="true"
+                                                               style="height: 400px;"
+                                                               ng-model="temp.policy.blackListSearchEntry"
+                                                               ng-options="option for option in blackListEntries | filter:search"></select>
+                                               </div>
+                                       </div>
+                                       <div ng-if="temp.policy.blackListEntryType == 'Use Manual Entry'"
+                                               class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> BlackList: </label>
+                                                       <button type="button" class="btn btn-default"
+                                                               ng-disabled="temp.policy.readOnly" ng-click="addNewBL()">
+                                                               <i class="fa fa-plus"></i>
+                                                       </button>
+                                               </div>
+                                               <div class="form-group col-sm-4">
+                                                       <div
+                                                               data-ng-repeat="choice in temp.policy.yamlparams.blackList track by $index">
+                                                               <div class="form-group row">
                                                                        <div class="form-group col-sm-9">
                                                                                <input type="text" class="form-control"
-                                                                               ng-disabled="temp.policy.readOnly"
-                                                                               ng-model="temp.policy.yamlparams.blackList[$index]" placeholder="BlackList" />
+                                                                                       ng-disabled="temp.policy.readOnly"
+                                                                                       ng-model="temp.policy.yamlparams.blackList[$index]"
+                                                                                       placeholder="BlackList" />
                                                                        </div>
                                                                        <div class="form-group col-sm-1">
-                                                                               <button type="button" class="btn btn-default" ng-show="$last"
-                                                                               ng-disabled="temp.policy.readOnly" ng-click="removeBL()">
-                                                                               <i class="fa fa-minus"></i>
+                                                                               <button type="button" class="btn btn-default"
+                                                                                       ng-disabled="temp.policy.readOnly"
+                                                                                       ng-click="removeBL(temp.policy.yamlparams.blackList[$index])">
+                                                                                       <i class="fa fa-minus"></i>
                                                                                </button>
                                                                        </div>
-                                                                       </div>
                                                                </div>
                                                        </div>
                                                </div>
+                                       </div>
                                </div>
                        </div>
                </div>
-               
+
                <div ng-if="temp.policy.ruleProvider == 'GUARD_YAML'">
                        <div class="well">
                                <div class="form-group row">
                                        </div>
                                </div>
                                <div class="form-group row">
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> actor: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.actor"
-                                                                       placeholder="Actor" />
-                                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> actor: </label>
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> recipe: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.recipe"
-                                                                       placeholder="Recipe" />
-                                                       </div>
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.actor" placeholder="Actor" />
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> CLName: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.clname"
-                                                                       placeholder="CLName" />
-                                                       </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> recipe: </label>
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> Targets: </label>
-                                                               <button type="button" class="btn btn-default"
-                                                                       ng-disabled="temp.policy.readOnly" ng-click="addNewTarget()">
-                                                                       <i class="fa fa-plus"></i>
-                                                               </button>
-                                                       </div>
-                                                       <div class="form-group col-sm-4">
-                                                               <div data-ng-repeat="choice in temp.policy.yamlparams.targets track by $index">
-                                                                       <div class="form-group row">
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.recipe" placeholder="Recipe" />
+                                               </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> CLName: </label>
+                                               </div>
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.clname" placeholder="CLName" />
+                                               </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> Targets: </label>
+                                                       <button type="button" class="btn btn-default"
+                                                               ng-disabled="temp.policy.readOnly" ng-click="addNewTarget()">
+                                                               <i class="fa fa-plus"></i>
+                                                       </button>
+                                               </div>
+                                               <div class="form-group col-sm-4">
+                                                       <div
+                                                               data-ng-repeat="choice in temp.policy.yamlparams.targets track by $index">
+                                                               <div class="form-group row">
                                                                        <div class="form-group col-sm-9">
                                                                                <input type="text" class="form-control"
-                                                                               ng-disabled="temp.policy.readOnly"
-                                                                               ng-model="temp.policy.yamlparams.targets[$index]" placeholder="Target" />
+                                                                                       ng-disabled="temp.policy.readOnly"
+                                                                                       ng-model="temp.policy.yamlparams.targets[$index]"
+                                                                                       placeholder="Target" />
                                                                        </div>
                                                                        <div class="form-group col-sm-1">
                                                                                <button type="button" class="btn btn-default" ng-show="$last"
-                                                                               ng-disabled="temp.policy.readOnly" ng-click="removeTarget()">
-                                                                               <i class="fa fa-minus"></i>
+                                                                                       ng-disabled="temp.policy.readOnly" ng-click="removeTarget()">
+                                                                                       <i class="fa fa-minus"></i>
                                                                                </button>
                                                                        </div>
-                                                                       </div>
                                                                </div>
                                                        </div>
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> limit: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.limit"
-                                                                       placeholder="Limit" title="Enter time limit value."/>
-                                                       </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> limit: </label>
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> timeWindow: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-2">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.timeWindow"
-                                                                       placeholder="Time Window" title="Enter time window value."/>
-                                                       </div>
-                                                       <div class="form-group col-sm-1">
-                                                               <select class="form-control" ng-disabled="temp.policy.readOnly" 
-                                                               ng-model="temp.policy.yamlparams.timeUnits" title="Select the Time Units value from dropdown options.">
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.limit" placeholder="Limit"
+                                                               title="Enter time limit value." />
+                                               </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> timeWindow: </label>
+                                               </div>
+                                               <div class="form-group col-sm-2">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.timeWindow"
+                                                               placeholder="Time Window" title="Enter time window value." />
+                                               </div>
+                                               <div class="form-group col-sm-1">
+                                                       <select class="form-control" ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.timeUnits"
+                                                               title="Select the Time Units value from dropdown options.">
                                                                <option>minute</option>
                                                                <option>hour</option>
                                                                <option>day</option>
                                                                <option>week</option>
                                                                <option>month</option>
                                                                <option>year</option>
-                                                               </select>
-                                                       </div>
+                                                       </select>
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> guardActiveStart: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.guardActiveStart" title="Enter Guard Active Start value in following patren '00:00:00-05:00'."
-                                                                       placeholder="00:00:00-05:00" />
-                                                       </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> guardActiveStart: </label>
                                                </div>
-                                               <div class="form-group row" style="margin-left: 2%">
-                                                       <div class="form-group col-sm-3">
-                                                               <label> guardActiveEnd: </label>
-                                                       </div>
-                                                       <div class="form-group col-sm-3">
-                                                               <input type="text" class="form-control"
-                                                                       ng-disabled="temp.policy.readOnly" ng-model="temp.policy.yamlparams.guardActiveEnd" title="Enter Guard Active End value in following patren '00:00:00-05:00'."
-                                                                       placeholder="00:00:00-05:00" />
-                                                       </div>
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.guardActiveStart"
+                                                               title="Enter Guard Active Start value in following patren '00:00:00-05:00'."
+                                                               placeholder="00:00:00-05:00" />
+                                               </div>
+                                       </div>
+                                       <div class="form-group row" style="margin-left: 2%">
+                                               <div class="form-group col-sm-3">
+                                                       <label> guardActiveEnd: </label>
                                                </div>
+                                               <div class="form-group col-sm-3">
+                                                       <input type="text" class="form-control"
+                                                               ng-disabled="temp.policy.readOnly"
+                                                               ng-model="temp.policy.yamlparams.guardActiveEnd"
+                                                               title="Enter Guard Active End value in following patren '00:00:00-05:00'."
+                                                               placeholder="00:00:00-05:00" />
+                                               </div>
+                                       </div>
                                </div>
                        </div>
                </div>
                                        <div class="form-group col-sm-1">
                                                <label>Component Attributes:</label><br>
                                                <button type="button" class="btn btn-default"
-                                                       ng-disabled="temp.policy.readOnly" ng-click="addNewChoice()" title="onClick Component Attribute row is added.">
+                                                       ng-disabled="temp.policy.readOnly" ng-click="addNewChoice()"
+                                                       title="onClick Component Attribute row is added.">
                                                        <i class="fa fa-plus"></i>
                                                </button>
                                        </div>
                                                        <div class="form-group col-sm-3">
                                                                <select class="form-control" ng-disabled="temp.policy.readOnly"
                                                                        ng-model="choice.key"
-                                                                       ng-options="option for option in attributeDictionaryDatas track by option" title="Select the dropdown value driven from Attribute (common)Dictionary.">
+                                                                       ng-options="option for option in attributeDictionaryDatas track by option"
+                                                                       title="Select the dropdown value driven from Attribute (common)Dictionary.">
                                                                        <option value="">{{choice.key}}</option>
                                                                </select>
                                                        </div>
                                                        <div class="form-group col-sm-3">
                                                                <input type="text" class="form-control"
                                                                        ng-disabled="temp.policy.readOnly" ng-model="choice.value"
-                                                                       placeholder="Attribute Value" title="Enter the Attribute Value without any spaces and special characters"/>
+                                                                       placeholder="Attribute Value"
+                                                                       title="Enter the Attribute Value without any spaces and special characters" />
                                                        </div>
                                                        <div class="form-group col-sm-1">
                                                                <button type="button" class="btn btn-default" ng-show="$last"
-                                                                       ng-disabled="temp.policy.readOnly" ng-click="removeChoice()" title="onClick will remove the last row">
+                                                                       ng-disabled="temp.policy.readOnly" ng-click="removeChoice()"
+                                                                       title="onClick will remove the last row">
                                                                        <i class="fa fa-minus"></i>
                                                                </button>
                                                        </div>
                                                <label>Settings Attributes:</label><br>
                                                <button type="button" class="btn btn-default"
                                                        ng-disabled="temp.policy.readOnly"
-                                                       ng-click="addNewSettingsChoice()" title="onClick Settings Attribute row is added.">
+                                                       ng-click="addNewSettingsChoice()"
+                                                       title="onClick Settings Attribute row is added.">
                                                        <i class="fa fa-plus"></i>
                                                </button>
                                        </div>
                                                        <div class="form-group col-sm-3">
                                                                <select class="form-control" ng-disabled="temp.policy.readOnly"
                                                                        ng-model="settingschoice.key"
-                                                                       ng-options="option for option in settingsDictionaryDatas track by option" title="Select the dropdown value driven from Settings (Decision)Dictionary.">
+                                                                       ng-options="option for option in settingsDictionaryDatas track by option"
+                                                                       title="Select the dropdown value driven from Settings (Decision)Dictionary.">
                                                                        <option value="">{{settingschoice.key}}</option>
                                                                </select>
                                                        </div>
                                                        <div class="form-group col-sm-3">
                                                                <input type="text" class="form-control"
                                                                        ng-disabled="temp.policy.readOnly"
-                                                                       ng-model="settingschoice.value" placeholder="Settings Value" title="Enter the Settings Attribute Value without any spaces and special characters"/>
+                                                                       ng-model="settingschoice.value" placeholder="Settings Value"
+                                                                       title="Enter the Settings Attribute Value without any spaces and special characters" />
                                                        </div>
                                                        <div class="form-group col-sm-1">
                                                                <button type="button" class="btn btn-default" ng-show="$last"
                                                                        ng-disabled="temp.policy.readOnly"
-                                                                       ng-click="removeSettingsChoice()" title="onClick will remove the last row">
+                                                                       ng-click="removeSettingsChoice()"
+                                                                       title="onClick will remove the last row">
                                                                        <i class="fa fa-minus"></i>
                                                                </button>
                                                        </div>
                                        <div class="form-group col-sm-1">
                                                <button type="button" class="btn btn-default"
                                                        ng-disabled="temp.policy.readOnly"
-                                                       ng-click="addNewRuleAlgorithm()" title="onClick Rule Algorithms row is added.">
+                                                       ng-click="addNewRuleAlgorithm()"
+                                                       title="onClick Rule Algorithms row is added.">
                                                        <i class="fa fa-plus"></i>
                                                </button>
                                        </div>
                                                                        ng-disabled="temp.policy.readOnly"
                                                                        ng-model="ruleAlgorithmschoice.dynamicRuleAlgorithmField1"
                                                                        ng-options="option for option in attributeDictionaryDatas track by option"
-                                                                       name="dynamicRuleAlgorithmField1" title="Select the dropdown value driven from Attribute (common)Dictionary or Settings (Decision)Dictionary.">
+                                                                       name="dynamicRuleAlgorithmField1"
+                                                                       title="Select the dropdown value driven from Attribute (common)Dictionary or Settings (Decision)Dictionary.">
                                                                        <option value="">{{ruleAlgorithmschoice.dynamicRuleAlgorithmField1}}</option>
                                                                </select>
                                                        </div>
                                                                        ng-disabled="temp.policy.readOnly"
                                                                        ng-model="ruleAlgorithmschoice.dynamicRuleAlgorithmCombo"
                                                                        ng-options="option for option in functionDefinitionDatas track by option"
-                                                                       name="dynamicRuleAlgorithmCombo" title="Select the dropdown value driven from FunctionDataType."></select>
+                                                                       name="dynamicRuleAlgorithmCombo"
+                                                                       title="Select the dropdown value driven from FunctionDataType."></select>
                                                        </div>
                                                        <div class="form-group col-sm-3">
                                                                <input type="text" class="form-control"
                                                                        ng-disabled="temp.policy.readOnly"
                                                                        ng-model="ruleAlgorithmschoice.dynamicRuleAlgorithmField2"
-                                                                       name="dynamicRuleAlgorithmField2" title="Enter the Value without any spaces and special characters and for rule formation use A1, A2,..etc., based on above Rules."/>
+                                                                       name="dynamicRuleAlgorithmField2"
+                                                                       title="Enter the Value without any spaces and special characters and for rule formation use A1, A2,..etc., based on above Rules." />
                                                        </div>
                                                        <div class="form-group col-sm-1">
                                                                <button type="button" class="btn btn-default"
                                                                        ng-disabled="temp.policy.readOnly"
-                                                                       ng-click="removeRuleAlgorithm()" title="onClick will remove the last row">
+                                                                       ng-click="removeRuleAlgorithm()"
+                                                                       title="onClick will remove the last row">
                                                                        <i class="fa fa-minus"></i>
                                                                </button>
                                                        </div>
                <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>
+                               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="saveDecisionPolicy(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>
+                               ng-click="saveDecisionPolicy(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>
\ No newline at end of file
diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/ExportAndImportDecisionBlackListEntriesTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/ExportAndImportDecisionBlackListEntriesTest.java
new file mode 100644 (file)
index 0000000..bf01ac1
--- /dev/null
@@ -0,0 +1,126 @@
+/*-
+ * ============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.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+public class ExportAndImportDecisionBlackListEntriesTest {
+
+       private HttpServletRequest request;
+       private MockHttpServletResponse response;
+       String jsonString;
+       
+       @Before
+       public void setUp() throws Exception {
+               request = mock(HttpServletRequest.class);       
+               response =  new MockHttpServletResponse();
+       }
+       
+       @Test
+       public void testExportBlackList() throws IOException{
+               ClassLoader classLoader = getClass().getClassLoader();
+               jsonString = IOUtils.toString(classLoader.getResourceAsStream("DecisionPolicyData.txt"));
+               try(BufferedReader reader = new BufferedReader(new StringReader(jsonString))){
+                       Mockito.when(request.getReader()).thenReturn(reader);
+                       ExportAndImportDecisionBlackListEntries controller = new ExportAndImportDecisionBlackListEntries();
+                       controller.exportBlackList(request, response);
+                       assertTrue("".equals(response.getContentAsString()));
+               }catch(Exception e){
+                       fail("Not expecting Exception while Exporting BlackListEntries.");
+               }
+       }
+       
+       @Test
+       public void testImportBlackList() throws Exception{
+               MockHttpServletRequest request =  new MockHttpServletRequest();
+               ExportAndImportDecisionBlackListEntries controller = new ExportAndImportDecisionBlackListEntries();
+               File file = new File("src/test/resources/BlackList.xls");
+               try(FileInputStream targetStream = new FileInputStream(file)){
+                       ExportAndImportDecisionBlackListEntriesTest testController = Mockito.mock(ExportAndImportDecisionBlackListEntriesTest.class);
+                       ServletInputStream inputStream = testController.getInputStream(getBytes(targetStream));
+                       Mockito.when(request.getInputStream()).thenReturn(inputStream);
+                       String boundary = "===" + System.currentTimeMillis() + "===";
+                       request.addHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
+                       request.addHeader("name", "BlackList.xls");
+                       controller.importBlackListFile(request, response);
+                       assertTrue(response.getContentAsString().contains("data"));
+               }catch(Exception e){
+                       fail("Not expecting Exception while importing BlackListEntries.");
+               }
+       }
+       
+       public static byte[] getBytes(InputStream is) throws IOException {
+               int len;
+               int size = 1024;
+               byte[] buf;
+               ByteArrayOutputStream bos = new ByteArrayOutputStream();
+               buf = new byte[size];
+               while ((len = is.read(buf, 0, size)) != -1)
+                       bos.write(buf, 0, len);
+               buf = bos.toByteArray();
+               return buf;
+       }
+       
+       public ServletInputStream getInputStream(byte[] body) throws IOException { 
+        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body); 
+        ServletInputStream servletInputStream = new ServletInputStream() { 
+            public int read() throws IOException { 
+                return byteArrayInputStream.read(); 
+            }
+
+                       @Override
+                       public boolean isFinished() {
+                               return false;
+                       }
+
+                       @Override
+                       public boolean isReady() {
+                               return false;
+                       }
+
+                       @Override
+                       public void setReadListener(ReadListener readListener) {
+                       } 
+        }; 
+        return servletInputStream; 
+    } 
+}
diff --git a/POLICY-SDK-APP/src/test/resources/BlackList.xls b/POLICY-SDK-APP/src/test/resources/BlackList.xls
new file mode 100644 (file)
index 0000000..228d724
Binary files /dev/null and b/POLICY-SDK-APP/src/test/resources/BlackList.xls differ
diff --git a/POLICY-SDK-APP/src/test/resources/DecisionPolicyData.txt b/POLICY-SDK-APP/src/test/resources/DecisionPolicyData.txt
new file mode 100644 (file)
index 0000000..26b07cf
--- /dev/null
@@ -0,0 +1 @@
+{"policyData":{"data":{"description":"SampelGuardBLOne@CreatedBy:demo@CreatedBy:@ModifiedBy:demo@ModifiedBy:","policyIssuer":null,"policyDefaults":null,"target":{"anyOf":[{"allOf":[{"match":[{"attributeValue":{"content":["com.Decision_SampelGuardBLOne.4.xml"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:1.0:subject-category:access-subject","attributeId":"PolicyName","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"org.onap.function.regex-match"}]},{"match":[{"attributeValue":{"content":["Test"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:1.0:subject-category:access-subject","attributeId":"ONAPName","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"org.onap.function.regex-match"},{"attributeValue":{"content":["(?i)testActor"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"actor","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:1.0:function:string-regexp-match"},{"attributeValue":{"content":["(?i)testRecipe"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"recipe","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:1.0:function:string-regexp-match"},{"attributeValue":{"content":["testCLName"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"clname","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:1.0:function:string-regexp-match"},{"attributeValue":{"content":["Use Manual Entry"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"blackListEntryType","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:1.0:function:string-regexp-match"}]}]}]},"combinerParametersOrRuleCombinerParametersOrVariableDefinition":[{"description":null,"target":{"anyOf":[{"allOf":[{"match":[{"attributeValue":{"content":["DECIDE"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:action","attributeId":"urn:oasis:names:tc:xacml:1.0:action:action-id","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case"}]}]}]},"condition":{"expression":{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeDesignator","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:environment","attributeId":"urn:oasis:names:tc:xacml:1.0:environment:current-time","dataType":"http://www.w3.org/2001/XMLSchema#time","issuer":null,"mustBePresent":false},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:time-one-and-only"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["5:00"],"dataType":"http://www.w3.org/2001/XMLSchema#time","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["10:00"],"dataType":"http://www.w3.org/2001/XMLSchema#time","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:2.0:function:time-in-range"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Function","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.FunctionType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-equal"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeDesignator","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"target","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-one-and-only"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL2"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL3"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL4"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-bag"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:3.0:function:any-of"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:and"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:not"},"nil":false,"globalScope":true,"typeSubstituted":false}},"obligationExpressions":null,"adviceExpressions":null,"ruleId":"urn:com:xacml:rule:id:284d9393-f861-4250-b62d-fc36640a363a","effect":"PERMIT"},{"description":null,"target":{"anyOf":[{"allOf":[{"match":[{"attributeValue":{"content":["DECIDE"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:action","attributeId":"urn:oasis:names:tc:xacml:1.0:action:action-id","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case"}]}]}]},"condition":{"expression":{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeDesignator","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:environment","attributeId":"urn:oasis:names:tc:xacml:1.0:environment:current-time","dataType":"http://www.w3.org/2001/XMLSchema#time","issuer":null,"mustBePresent":false},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:time-one-and-only"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["5:00"],"dataType":"http://www.w3.org/2001/XMLSchema#time","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["10:00"],"dataType":"http://www.w3.org/2001/XMLSchema#time","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:2.0:function:time-in-range"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Function","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.FunctionType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-equal"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeDesignator","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"target","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-one-and-only"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL2"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL3"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL4"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-bag"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:3.0:function:any-of"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:and"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:not"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:not"},"nil":false,"globalScope":true,"typeSubstituted":false}},"obligationExpressions":null,"adviceExpressions":{"adviceExpression":[{"attributeAssignmentExpression":[{"expression":{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["Denied!"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},"attributeId":"guard.response","category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","issuer":null}],"adviceId":"GUARD_BL_YAML","appliesTo":"DENY"}]},"ruleId":"urn:com:xacml:rule:id:284d9393-f861-4250-b62d-fc36640a363a","effect":"DENY"}],"obligationExpressions":null,"adviceExpressions":null,"policyId":"urn:com:xacml:policy:id:d56af069-6cf1-430c-ba07-e26602e06a52","version":"4","ruleCombiningAlgId":"urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides","maxDelegationDepth":null},"policyName":"SampelGuardBLOne","configBodyData":null,"configType":null,"policyID":null,"policyType":"Decision","comboPolicyType":null,"configPolicyType":null,"policyDescription":"SampelGuardBLOne","onapName":"Test","configName":null,"ruleID":null,"parentPath":null,"adminNotification":null,"policyData":{"description":"SampelGuardBLOne@CreatedBy:demo@CreatedBy:@ModifiedBy:demo@ModifiedBy:","policyIssuer":null,"policyDefaults":null,"target":{"anyOf":[{"allOf":[{"match":[{"attributeValue":{"content":["com.Decision_SampelGuardBLOne.4.xml"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:1.0:subject-category:access-subject","attributeId":"PolicyName","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"org.onap.function.regex-match"}]},{"match":[{"attributeValue":{"content":["Test"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:1.0:subject-category:access-subject","attributeId":"ONAPName","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"org.onap.function.regex-match"},{"attributeValue":{"content":["(?i)testActor"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"actor","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:1.0:function:string-regexp-match"},{"attributeValue":{"content":["(?i)testRecipe"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"recipe","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:1.0:function:string-regexp-match"},{"attributeValue":{"content":["testCLName"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"clname","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:1.0:function:string-regexp-match"},{"attributeValue":{"content":["Use Manual Entry"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"blackListEntryType","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:1.0:function:string-regexp-match"}]}]}]},"combinerParametersOrRuleCombinerParametersOrVariableDefinition":[{"description":null,"target":{"anyOf":[{"allOf":[{"match":[{"attributeValue":{"content":["DECIDE"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:action","attributeId":"urn:oasis:names:tc:xacml:1.0:action:action-id","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case"}]}]}]},"condition":{"expression":{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeDesignator","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:environment","attributeId":"urn:oasis:names:tc:xacml:1.0:environment:current-time","dataType":"http://www.w3.org/2001/XMLSchema#time","issuer":null,"mustBePresent":false},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:time-one-and-only"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["5:00"],"dataType":"http://www.w3.org/2001/XMLSchema#time","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["10:00"],"dataType":"http://www.w3.org/2001/XMLSchema#time","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:2.0:function:time-in-range"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Function","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.FunctionType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-equal"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeDesignator","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"target","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-one-and-only"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL2"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL3"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL4"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-bag"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:3.0:function:any-of"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:and"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:not"},"nil":false,"globalScope":true,"typeSubstituted":false}},"obligationExpressions":null,"adviceExpressions":null,"ruleId":"urn:com:xacml:rule:id:284d9393-f861-4250-b62d-fc36640a363a","effect":"PERMIT"},{"description":null,"target":{"anyOf":[{"allOf":[{"match":[{"attributeValue":{"content":["DECIDE"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"attributeDesignator":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:action","attributeId":"urn:oasis:names:tc:xacml:1.0:action:action-id","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"attributeSelector":null,"matchId":"urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case"}]}]}]},"condition":{"expression":{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeDesignator","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:environment","attributeId":"urn:oasis:names:tc:xacml:1.0:environment:current-time","dataType":"http://www.w3.org/2001/XMLSchema#time","issuer":null,"mustBePresent":false},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:time-one-and-only"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["5:00"],"dataType":"http://www.w3.org/2001/XMLSchema#time","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["10:00"],"dataType":"http://www.w3.org/2001/XMLSchema#time","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:2.0:function:time-in-range"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Function","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.FunctionType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-equal"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeDesignator","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","attributeId":"target","dataType":"http://www.w3.org/2001/XMLSchema#string","issuer":null,"mustBePresent":false},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-one-and-only"},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}Apply","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"description":null,"expression":[{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL2"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL3"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["testBL4"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:string-bag"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:3.0:function:any-of"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:and"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:not"},"nil":false,"globalScope":true,"typeSubstituted":false}],"functionId":"urn:oasis:names:tc:xacml:1.0:function:not"},"nil":false,"globalScope":true,"typeSubstituted":false}},"obligationExpressions":null,"adviceExpressions":{"adviceExpression":[{"attributeAssignmentExpression":[{"expression":{"name":"{urn:oasis:names:tc:xacml:3.0:core:schema:wd-17}AttributeValue","declaredType":"oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType","scope":"javax.xml.bind.JAXBElement$GlobalScope","value":{"content":["Denied!"],"dataType":"http://www.w3.org/2001/XMLSchema#string","otherAttributes":{}},"nil":false,"globalScope":true,"typeSubstituted":false},"attributeId":"guard.response","category":"urn:oasis:names:tc:xacml:3.0:attribute-category:resource","issuer":null}],"adviceId":"GUARD_BL_YAML","appliesTo":"DENY"}]},"ruleId":"urn:com:xacml:rule:id:284d9393-f861-4250-b62d-fc36640a363a","effect":"DENY"}],"obligationExpressions":null,"adviceExpressions":null,"policyId":"urn:com:xacml:policy:id:d56af069-6cf1-430c-ba07-e26602e06a52","version":"4","ruleCombiningAlgId":"urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides","maxDelegationDepth":null},"gitPath":null,"readOnly":false,"configHome":null,"configUrl":null,"finalPolicyPath":null,"version":null,"jsonBody":null,"apiflag":null,"prevJsonBody":null,"highestVersion":null,"entityManagerFactory":null,"policyExists":false,"oldPolicyFileName":"Decision_SampelGuardBLOne","userId":null,"newFileName":null,"clWarning":null,"newCLName":null,"existingCLName":null,"onapNameField":null,"jsonBodyData":null,"dirPath":null,"configBodyPath":null,"attributes":[],"settings":[],"ruleAlgorithmschoices":[],"serviceTypePolicyName":null,"verticaMetrics":null,"description":null,"attributeFields":null,"clearTimeOut":null,"trapMaxAge":null,"verificationclearTimeOut":null,"dynamicLayoutMap":null,"trapDatas":null,"faultDatas":null,"fwPolicyType":null,"fwattributes":null,"parentForChild":null,"securityZone":null,"ruleCombiningAlgId":null,"dynamicFieldConfigAttributes":null,"dynamicSettingsMap":null,"dropDownMap":null,"actionPerformer":null,"actionAttribute":null,"dynamicRuleAlgorithmLabels":null,"dynamicRuleAlgorithmCombo":null,"dynamicRuleAlgorithmField1":null,"dynamicRuleAlgorithmField2":null,"dynamicVariableList":null,"dataTypeList":null,"actionAttributeValue":null,"ruleProvider":"GUARD_BL_YAML","actionBody":null,"actionDictHeader":null,"actionDictType":null,"actionDictUrl":null,"actionDictMethod":null,"yamlparams":{"actor":"testActor","recipe":"testRecipe","clname":"testCLName","limit":null,"timeWindow":null,"timeUnits":null,"guardActiveStart":"5:00","guardActiveEnd":"10:00","blackList":["testBL2","testBL3","testBL4"],"targets":null,"blackListEntryType":"Use Manual Entry"},"blackListEntries":[],"appendBlackListEntries":[],"rainyday":{"serviceType":null,"vnfType":null,"bbid":null,"workstep":null,"treatmentTableChoices":[],"errorcode":null,"treatment":null},"rainydayMap":null,"errorCodeList":null,"treatmentList":null,"serviceType":null,"uuid":null,"location":null,"priority":null,"msLocation":null,"policyJSON":null,"ruleName":null,"brmsParamBody":null,"brmsController":null,"brmsDependency":null,"ruleData":null,"ruleListData":null,"drlRuleAndUIParams":null,"policyScope":null,"providerComboBox":null,"riskType":null,"riskLevel":null,"guard":null,"ttlDate":null,"matching":null,"triggerSignatures":null,"symptomSignatures":null,"logicalConnector":null,"policyStatus":null,"gocServerScope":null,"supressionType":null,"editPolicy":true,"domainDir":"com","validData":false,"draft":false,"viewPolicy":false,"blackListEntryType":"Use Manual Entry"},"date":"2018-03-27 13:36:12.0","version":4}
\ No newline at end of file