Consolidate PolicyRestAdapter setup
[policy/engine.git] / ONAP-PAP-REST / src / main / java / org / onap / policy / pap / xacml / rest / components / DecisionPolicy.java
index eece6c0..ed1d551 100644 (file)
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * ONAP-PAP-REST
  * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
 package org.onap.policy.pap.xacml.rest.components;
 
+import com.att.research.xacml.api.XACML3;
+import com.att.research.xacml.api.pap.PAPException;
+import com.att.research.xacml.std.IdentifierImpl;
+
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
@@ -37,9 +41,26 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import javax.persistence.EntityManager;
-import javax.persistence.Query;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicySetType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType;
 
+import org.apache.commons.lang3.StringEscapeUtils;
 import org.onap.policy.common.logging.eelf.MessageCodes;
 import org.onap.policy.common.logging.eelf.PolicyLogger;
 import org.onap.policy.common.logging.flexlogger.FlexLogger;
@@ -52,7 +73,6 @@ import org.onap.policy.controlloop.policy.guard.Guard;
 import org.onap.policy.controlloop.policy.guard.GuardPolicy;
 import org.onap.policy.controlloop.policy.guard.MatchParameters;
 import org.onap.policy.controlloop.policy.guard.builder.ControlLoopGuardBuilder;
-import org.onap.policy.pap.xacml.rest.XACMLPapServlet;
 import org.onap.policy.rest.adapter.PolicyRestAdapter;
 import org.onap.policy.rest.dao.CommonClassDao;
 import org.onap.policy.rest.jpa.DecisionSettings;
@@ -61,59 +81,47 @@ import org.onap.policy.utils.PolicyUtils;
 import org.onap.policy.xacml.api.XACMLErrorConstants;
 import org.onap.policy.xacml.std.pip.engines.aaf.AAFEngine;
 import org.onap.policy.xacml.util.XACMLPolicyScanner;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
-import com.att.research.xacml.api.XACML3;
-import com.att.research.xacml.api.pap.PAPException;
-import com.att.research.xacml.std.IdentifierImpl;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType;
-
+@Component
 public class DecisionPolicy extends Policy {
 
-    private static final Logger LOGGER = FlexLogger.getLogger(DecisionPolicy.class);
+    private static final Logger LOGGER = FlexLogger.getLogger(DecisionPolicy.class);
 
     public static final String FUNCTION_NOT = "urn:oasis:names:tc:xacml:1.0:function:not";
     private static final String AAFPROVIDER = "AAF";
     public static final String GUARD_YAML = "GUARD_YAML";
     public static final String GUARD_BL_YAML = "GUARD_BL_YAML";
+    public static final String GUARD_MIN_MAX = "GUARD_MIN_MAX";
     public static final String RAINY_DAY = "Rainy_Day";
+    public static final String MS_MODEL = "MicroService_Model";
     private static final String XACML_GUARD_TEMPLATE = "Decision_GuardPolicyTemplate.xml";
     private static final String XACML_BLGUARD_TEMPLATE = "Decision_GuardBLPolicyTemplate.xml";
+    private static final String XACML_GUARD_MIN_MAX_TEMPLATE = "Decision_GuardMinMaxPolicyTemplate.xml";
 
     private static final String ONAPNAME = "ONAPName";
     private static final String POLICY_NAME = "PolicyName";
     private static final String DESCRIPTION = "description";
 
-
     List<String> dynamicLabelRuleAlgorithms = new LinkedList<>();
     List<String> dynamicFieldComboRuleAlgorithms = new LinkedList<>();
     List<String> dynamicFieldOneRuleAlgorithms = new LinkedList<>();
     List<String> dynamicFieldTwoRuleAlgorithms = new LinkedList<>();
     List<String> dataTypeList = new LinkedList<>();
 
-    private CommonClassDao commonClassDao;
+    private static CommonClassDao commonClassDao;
 
     public DecisionPolicy() {
         super();
     }
 
-    public DecisionPolicy(PolicyRestAdapter policyAdapter, CommonClassDao commonClassDao){
+    @Autowired
+    public DecisionPolicy(CommonClassDao commonClassDao) {
+        DecisionPolicy.commonClassDao = commonClassDao;
+    }
+
+    public DecisionPolicy(PolicyRestAdapter policyAdapter) {
         this.policyAdapter = policyAdapter;
         this.commonClassDao = commonClassDao;
     }
@@ -122,13 +130,13 @@ public class DecisionPolicy extends Policy {
     public Map<String, String> savePolicies() throws PAPException {
 
         Map<String, String> successMap = new HashMap<>();
-        if(isPolicyExists()){
+        if (isPolicyExists()) {
             successMap.put("EXISTS", "This Policy already exist on the PAP");
             return successMap;
         }
 
-        if(!isPreparedToSave()){
-            //Prep and configure the policy for saving
+        if (!isPreparedToSave()) {
+            // Prep and configure the policy for saving
             prepareToSave();
         }
 
@@ -136,17 +144,43 @@ public class DecisionPolicy extends Policy {
         Path newPolicyPath = null;
         newPolicyPath = Paths.get(policyAdapter.getNewFileName());
 
-        successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject());
+        successMap = createPolicy(newPolicyPath, getCorrectPolicyDataObject());
         return successMap;
     }
 
-    //This is the method for preparing the policy for saving.  We have broken it out
-    //separately because the fully configured policy is used for multiple things
+    /**
+     * Scan the Raw Policy data and set to PolicyAdapter.
+     */
+    private void readRawPolicyData() {
+        Object policy;
+        if ("API".equalsIgnoreCase(policyAdapter.getApiflag())) {
+            policy = XACMLPolicyScanner.readPolicy(new ByteArrayInputStream(
+                    StringEscapeUtils.unescapeXml(policyAdapter.getRawXacmlPolicy()).getBytes(StandardCharsets.UTF_8)));
+        } else {
+            policy = XACMLPolicyScanner.readPolicy(
+                    new ByteArrayInputStream(policyAdapter.getRawXacmlPolicy().getBytes(StandardCharsets.UTF_8)));
+        }
+        String policyRawDesc;
+        if (policy instanceof PolicySetType) {
+            policyRawDesc = ((PolicySetType) policy).getDescription() + "@#RuleProvider@#Decision_Raw@#RuleProvider@#";
+            ((PolicySetType) policy).setDescription(policyRawDesc);
+        } else {
+            policyRawDesc = ((PolicyType) policy).getDescription() + "@#RuleProvider@#Decision_Raw@#RuleProvider@#";
+            ((PolicyType) policy).setDescription(policyRawDesc);
+        }
+        policyAdapter.setPolicyData(policy);
+        policyAdapter.setData(policy);
+        setPreparedToSave(true);
+
+    }
+
+    // This is the method for preparing the policy for saving. We have broken it out
+    // separately because the fully configured policy is used for multiple things
     @Override
-    public boolean prepareToSave() throws PAPException{
+    public boolean prepareToSave() throws PAPException {
 
-        if(isPreparedToSave()){
-            //we have already done this
+        if (isPreparedToSave()) {
+            // we have already done this
             return true;
         }
 
@@ -154,6 +188,10 @@ public class DecisionPolicy extends Policy {
         String policyID = policyAdapter.getPolicyID();
         version = policyAdapter.getHighestVersion();
 
+        if ("Raw".equals(policyAdapter.getRuleProvider())) {
+            readRawPolicyData();
+            return true;
+        }
         // Create the Instance for pojo, PolicyType object is used in marshalling.
         if ("Decision".equals(policyAdapter.getPolicyType())) {
             PolicyType policyConfig = new PolicyType();
@@ -165,10 +203,15 @@ public class DecisionPolicy extends Policy {
         }
         policyName = policyAdapter.getNewFileName();
 
-        if(policyAdapter.getRuleProvider().equals(GUARD_YAML) || policyAdapter.getRuleProvider().equals(GUARD_BL_YAML)){
+        if (policyAdapter.getRuleProvider().equals(GUARD_YAML) || policyAdapter.getRuleProvider().equals(GUARD_BL_YAML)
+                || policyAdapter.getRuleProvider().equals(GUARD_MIN_MAX)) {
+
             Map<String, String> yamlParams = new HashMap<>();
-            String blackListEntryType = policyAdapter.getBlackListEntryType() !=null ? policyAdapter.getBlackListEntryType(): "Use Manual Entry";
-            String 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());
@@ -190,8 +233,8 @@ public class DecisionPolicy extends Policy {
                 LOGGER.error(e);
                 throw new PAPException(e);
             }
-        }else if (policyAdapter.getData() != null) {
-            PolicyType decisionPolicy = (PolicyType)  policyAdapter.getData();
+        } else if (policyAdapter.getData() != null) {
+            PolicyType decisionPolicy = (PolicyType) policyAdapter.getData();
 
             decisionPolicy.setDescription(policyAdapter.getPolicyDescription());
 
@@ -210,7 +253,7 @@ public class DecisionPolicy extends Policy {
             allOf.getMatch().add(createMatch(ONAPNAME, (policyAdapter.getOnapName())));
 
             Map<String, String> dynamicFieldComponentAttributes = policyAdapter.getDynamicFieldConfigAttributes();
-            if(policyAdapter.getRuleProvider()!=null && policyAdapter.getRuleProvider().equals(AAFPROVIDER)){
+            if (policyAdapter.getRuleProvider() != null && policyAdapter.getRuleProvider().equals(AAFPROVIDER)) {
                 dynamicFieldComponentAttributes = new HashMap<>();
             }
 
@@ -231,8 +274,8 @@ public class DecisionPolicy extends Policy {
             decisionPolicy.setTarget(target);
 
             Map<String, String> dynamicFieldDecisionSettings = policyAdapter.getDynamicSettingsMap();
-            if(policyAdapter.getRuleProvider()!=null && (policyAdapter.getRuleProvider().equals(AAFPROVIDER)||
-                    policyAdapter.getRuleProvider().equals(RAINY_DAY))){
+            if (policyAdapter.getRuleProvider() != null && (policyAdapter.getRuleProvider().equals(AAFPROVIDER)
+                    || policyAdapter.getRuleProvider().equals(RAINY_DAY))) {
                 dynamicFieldDecisionSettings = new HashMap<>();
             }
 
@@ -246,8 +289,8 @@ public class DecisionPolicy extends Policy {
             }
 
             Map<String, String> dynamicFieldTreatmentAttributes = policyAdapter.getRainydayMap();
-            if(policyAdapter.getRuleProvider().equals(RAINY_DAY)){
-                for(String keyField : dynamicFieldTreatmentAttributes.keySet()) {
+            if (policyAdapter.getRuleProvider().equals(RAINY_DAY)) {
+                for (String keyField : dynamicFieldTreatmentAttributes.keySet()) {
                     String errorcode = keyField;
                     String treatment = dynamicFieldTreatmentAttributes.get(errorcode);
                     createRainydayRule(decisionPolicy, errorcode, treatment, true);
@@ -262,47 +305,47 @@ public class DecisionPolicy extends Policy {
         return true;
     }
 
-    public PolicyType getGuardPolicy(Map<String, String> yamlParams, String ruleProvider) throws BuilderException{
+    public PolicyType getGuardPolicy(Map<String, String> yamlParams, String ruleProvider) throws BuilderException {
         try {
             ControlLoopGuardBuilder builder = ControlLoopGuardBuilder.Factory.buildControlLoopGuard(new Guard());
             MatchParameters matchParameters = new MatchParameters(yamlParams.get("actor"), yamlParams.get("recipe"));
             matchParameters.setControlLoopName(yamlParams.get("clname"));
-            if(yamlParams.containsKey("targets")){
+            if (yamlParams.containsKey("targets")) {
                 String targetString = yamlParams.get("targets");
                 List<String> targets = null;
-                if(targetString!=null && !targetString.isEmpty()){
-                    if (targetString.contains(",")){
+                if (targetString != null && !targetString.isEmpty()) {
+                    if (targetString.contains(",")) {
                         targets = Arrays.asList(targetString.split(","));
-                    }
-                    else{
+                    } else {
                         targets = new ArrayList<>();
                         targets.add(targetString);
                     }
                 }
                 matchParameters.setTargets(targets);
             }
-            GuardPolicy policy1 = new GuardPolicy((policyAdapter.getUuid()!=null? policyAdapter.getUuid(): UUID.randomUUID().toString()) ,yamlParams.get(POLICY_NAME), yamlParams.get(DESCRIPTION), matchParameters);
+            GuardPolicy policy1 = new GuardPolicy(
+                    (policyAdapter.getUuid() != null ? policyAdapter.getUuid() : UUID.randomUUID().toString()),
+                    yamlParams.get(POLICY_NAME), yamlParams.get(DESCRIPTION), matchParameters);
             builder = builder.addGuardPolicy(policy1);
             Map<String, String> activeTimeRange = new HashMap<>();
             activeTimeRange.put("start", yamlParams.get("guardActiveStart"));
             activeTimeRange.put("end", yamlParams.get("guardActiveEnd"));
             String blackListString = yamlParams.get("blackList");
             List<String> blackList = null;
-            if(blackListString!=null && !blackListString.trim().isEmpty()){
-                if (blackListString.contains(",")){
+            if (blackListString != null && !blackListString.trim().isEmpty()) {
+                if (blackListString.contains(",")) {
                     blackList = Arrays.asList(blackListString.split(","));
-                }
-                else{
+                } else {
                     blackList = new ArrayList<>();
                     blackList.add(blackListString);
                 }
             }
-            if(yamlParams.containsKey("appendBlackList")){
+            if (yamlParams.containsKey("appendBlackList")) {
                 String appendBlackListString = yamlParams.get("appendBlackList");
                 List<String> appendBlackList = null;
-                if(appendBlackListString!=null && !appendBlackListString.trim().isEmpty()){
+                if (appendBlackListString != null && !appendBlackListString.trim().isEmpty()) {
                     appendBlackList = Arrays.asList(appendBlackListString.split(","));
-                    for(int i=0; i<appendBlackList.size();i++){
+                    for (int i = 0; i < appendBlackList.size(); i++) {
                         blackList.remove(appendBlackList.get(i));
                     }
                 }
@@ -311,33 +354,42 @@ public class DecisionPolicy extends Policy {
             Path xacmlTemplatePath;
             ClassLoader classLoader = getClass().getClassLoader();
             Constraint cons = new Constraint();
-            switch (ruleProvider){
-            case GUARD_BL_YAML:
-                templateFile = new File(classLoader.getResource(XACML_BLGUARD_TEMPLATE).getFile());
-                xacmlTemplatePath = templateFile.toPath();
-                cons.setActive_time_range(activeTimeRange);
-                if(blackList==null || blackList.isEmpty()){
-                    throw new BuilderException("blackList is required");
-                }
-                cons.setBlacklist(blackList);
-                break;
-            default:
-                templateFile = new File(classLoader.getResource(XACML_GUARD_TEMPLATE).getFile());
-                xacmlTemplatePath = templateFile.toPath();
-                Map<String,String> timeWindow = new HashMap<>();
-                if(!PolicyUtils.isInteger(yamlParams.get("timeWindow"))){
-                    throw new BuilderException("time window is not in Integer format.");
-                }
-                String timeUnits = yamlParams.get("timeUnits");
-                if(timeUnits==null || !(timeUnits.equalsIgnoreCase("minute") || timeUnits.equalsIgnoreCase("hour") || timeUnits.equalsIgnoreCase("day")
-                        || timeUnits.equalsIgnoreCase("week") || timeUnits.equalsIgnoreCase("month")||timeUnits.equalsIgnoreCase("year"))){
-                    throw new BuilderException("time Units is not in proper format.");
-                }
-                timeWindow.put("value", yamlParams.get("timeWindow"));
-                timeWindow.put("units", yamlParams.get("timeUnits"));
-                cons = new Constraint(Integer.parseInt(yamlParams.get("limit")),timeWindow,activeTimeRange);
-                break;
+            switch (ruleProvider) {
+                case GUARD_BL_YAML:
+                    templateFile = new File(classLoader.getResource(XACML_BLGUARD_TEMPLATE).getFile());
+                    xacmlTemplatePath = templateFile.toPath();
+                    cons.setActive_time_range(activeTimeRange);
+                    if (blackList == null || blackList.isEmpty()) {
+                        throw new BuilderException("blackList is required");
+                    }
+                    cons.setBlacklist(blackList);
+                    break;
+                case GUARD_MIN_MAX:
+                    templateFile = new File(classLoader.getResource(XACML_GUARD_MIN_MAX_TEMPLATE).getFile());
+                    xacmlTemplatePath = templateFile.toPath();
+                    cons = new Constraint(Integer.parseInt(yamlParams.get("min")),
+                            Integer.parseInt(yamlParams.get("max")), activeTimeRange);
+                    break;
+                default:
+                    templateFile = new File(classLoader.getResource(XACML_GUARD_TEMPLATE).getFile());
+                    xacmlTemplatePath = templateFile.toPath();
+                    Map<String, String> timeWindow = new HashMap<>();
+                    if (!PolicyUtils.isInteger(yamlParams.get("timeWindow"))) {
+                        throw new BuilderException("time window is not in Integer format.");
+                    }
+                    String timeUnits = yamlParams.get("timeUnits");
+                    if (timeUnits == null
+                            || !("minute".equalsIgnoreCase(timeUnits) || "hour".equalsIgnoreCase(timeUnits)
+                                    || "day".equalsIgnoreCase(timeUnits) || "week".equalsIgnoreCase(timeUnits)
+                                    || "month".equalsIgnoreCase(timeUnits) || "year".equalsIgnoreCase(timeUnits))) {
+                        throw new BuilderException("time Units is not in proper format.");
+                    }
+                    timeWindow.put("value", yamlParams.get("timeWindow"));
+                    timeWindow.put("units", yamlParams.get("timeUnits"));
+                    cons = new Constraint(Integer.parseInt(yamlParams.get("limit")), timeWindow, activeTimeRange);
+                    break;
             }
+
             builder = builder.addLimitConstraint(policy1.getId(), cons);
             // Build the specification
             Results results = builder.buildSpecification();
@@ -350,46 +402,51 @@ public class DecisionPolicy extends Policy {
                 yamlSpecs.put(POLICY_NAME, yamlParams.get(POLICY_NAME));
                 yamlSpecs.put(DESCRIPTION, yamlParams.get(DESCRIPTION));
                 yamlSpecs.put(ONAPNAME, yamlParams.get(ONAPNAME));
-                yamlSpecs.put("actor", yamlGuardObject.getGuards().getFirst().getMatch_parameters().getActor());
-                yamlSpecs.put("recipe", yamlGuardObject.getGuards().getFirst().getMatch_parameters().getRecipe());
-                yamlSpecs.put("clname", yamlGuardObject.getGuards().getFirst().getMatch_parameters().getControlLoopName());
-                if(yamlGuardObject.getGuards().getFirst().getLimit_constraints().getFirst().getFreq_limit_per_target()!=null){
-                    yamlSpecs.put("limit", yamlGuardObject.getGuards().getFirst().getLimit_constraints().getFirst().getFreq_limit_per_target().toString());
+                GuardPolicy guard = yamlGuardObject.getGuards().get(0);
+
+                yamlSpecs.put("actor", guard.getMatch_parameters().getActor());
+                yamlSpecs.put("recipe", guard.getMatch_parameters().getRecipe());
+                yamlSpecs.put("clname", guard.getMatch_parameters().getControlLoopName());
+
+                Constraint constraints = guard.getLimit_constraints().get(0);
+                if (constraints.getFreq_limit_per_target() != null) {
+                    yamlSpecs.put("limit", constraints.getFreq_limit_per_target().toString());
                 }
-                if(yamlGuardObject.getGuards().getFirst().getLimit_constraints().getFirst().getTime_window()!=null){
-                    yamlSpecs.put("twValue", yamlGuardObject.getGuards().getFirst().getLimit_constraints().getFirst().getTime_window().get("value"));
-                    yamlSpecs.put("twUnits", yamlGuardObject.getGuards().getFirst().getLimit_constraints().getFirst().getTime_window().get("units"));
+                if (constraints.getTime_window() != null) {
+                    yamlSpecs.put("twValue", constraints.getTime_window().get("value"));
+                    yamlSpecs.put("twUnits", constraints.getTime_window().get("units"));
+                }
+
+                if (constraints.getMaxVnfCount() != null) {
+                    yamlSpecs.put("max", constraints.getMaxVnfCount().toString());
                 }
-                yamlSpecs.put("guardActiveStart", yamlGuardObject.getGuards().getFirst().getLimit_constraints().getFirst().getActive_time_range().get("start"));
-                yamlSpecs.put("guardActiveEnd", yamlGuardObject.getGuards().getFirst().getLimit_constraints().getFirst().getActive_time_range().get("end"));
-                String xacmlPolicyContent = SafePolicyBuilder.generateXacmlGuard(xacmlTemplateContent,yamlSpecs, yamlGuardObject.getGuards().getFirst().getLimit_constraints().getFirst().getBlacklist(), yamlGuardObject.getGuards().getFirst().getMatch_parameters().getTargets());
-               // Convert the  Policy into Stream input to Policy Adapter.
-                Object policy = XACMLPolicyScanner.readPolicy(new ByteArrayInputStream(xacmlPolicyContent.getBytes(StandardCharsets.UTF_8)));
+                if (constraints.getMinVnfCount() != null) {
+                    yamlSpecs.put("min", constraints.getMinVnfCount().toString());
+                }
+
+                yamlSpecs.put("guardActiveStart", constraints.getActive_time_range().get("start"));
+                yamlSpecs.put("guardActiveEnd", constraints.getActive_time_range().get("end"));
+                String xacmlPolicyContent = SafePolicyBuilder.generateXacmlGuard(xacmlTemplateContent, yamlSpecs,
+                        constraints.getBlacklist(), guard.getMatch_parameters().getTargets());
+
+                // Convert the Policy into Stream input to Policy Adapter.
+                Object policy = XACMLPolicyScanner
+                        .readPolicy(new ByteArrayInputStream(xacmlPolicyContent.getBytes(StandardCharsets.UTF_8)));
+
                 return (PolicyType) policy;
             } catch (IOException e) {
-                LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Error while creating the policy " + e.getMessage() , e);
+                LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Error while creating the policy " + e.getMessage(),
+                        e);
             }
         } catch (BuilderException e) {
-            LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Error while creating the policy " + e.getMessage() ,e);
+            LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Error while creating the policy " + e.getMessage()e);
             throw e;
         }
         return null;
     }
 
     private DecisionSettings findDecisionSettingsBySettingId(String settingId) {
-        DecisionSettings decisionSetting = null;
-
-        EntityManager em = XACMLPapServlet.getEmf().createEntityManager();
-        Query getDecisionSettings = em.createNamedQuery("DecisionSettings.findAll");
-        List<?> decisionSettingsList = getDecisionSettings.getResultList();
-
-        for (Object id : decisionSettingsList) {
-            decisionSetting = (DecisionSettings) id;
-            if (decisionSetting.getXacmlId().equals(settingId)) {
-                break;
-            }
-        }
-        return decisionSetting;
+        return (DecisionSettings) commonClassDao.getEntityItem(DecisionSettings.class, "xacml_id", settingId);
     }
 
     private void createRule(PolicyType decisionPolicy, boolean permitRule) {
@@ -431,7 +488,7 @@ public class DecisionPolicy extends Policy {
         dynamicFieldOneRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField1();
         dynamicFieldTwoRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField2();
 
-        if(policyAdapter.getRuleProvider()!=null && policyAdapter.getRuleProvider().equals(AAFPROVIDER)){
+        if (policyAdapter.getRuleProvider() != null && policyAdapter.getRuleProvider().equals(AAFPROVIDER)) {
             // Values for AAF Provider are here for XML Creation.
             ConditionType condition = new ConditionType();
             ApplyType decisionApply = new ApplyType();
@@ -470,7 +527,7 @@ public class DecisionPolicy extends Policy {
             targetInRule.getAnyOf().add(anyOfInRule);
 
             rule.setTarget(targetInRule);
-            if(!permitRule){
+            if (!permitRule) {
                 AdviceExpressionsType adviceExpressions = new AdviceExpressionsType();
                 AdviceExpressionType adviceExpression = new AdviceExpressionType();
                 adviceExpression.setAdviceId(AAFPROVIDER);
@@ -491,7 +548,7 @@ public class DecisionPolicy extends Policy {
             decisionPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
             policyAdapter.setPolicyData(decisionPolicy);
 
-        }else if (dynamicLabelRuleAlgorithms != null && !dynamicLabelRuleAlgorithms.isEmpty()) {
+        } else if (dynamicLabelRuleAlgorithms != null && !dynamicLabelRuleAlgorithms.isEmpty()) {
             boolean isCompound = false;
             ConditionType condition = new ConditionType();
             int index = dynamicFieldOneRuleAlgorithms.size() - 1;
@@ -513,7 +570,8 @@ public class DecisionPolicy extends Policy {
 
                 // if rule algorithm not a compound
                 if (!isCompound) {
-                    condition.setExpression(new ObjectFactory().createApply(getInnerDecisionApply(dynamicLabelRuleAlgorithms.get(index))));
+                    condition.setExpression(new ObjectFactory()
+                            .createApply(getInnerDecisionApply(dynamicLabelRuleAlgorithms.get(index))));
                 }
             }
             if (!permitRule) {
@@ -537,7 +595,8 @@ public class DecisionPolicy extends Policy {
             policyAdapter.setPolicyData(decisionPolicy);
 
         } else {
-            PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + "Unsupported data object."+ policyAdapter.getData().getClass().getCanonicalName());
+            PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + "Unsupported data object."
+                    + policyAdapter.getData().getClass().getCanonicalName());
         }
 
     }
@@ -630,93 +689,55 @@ public class DecisionPolicy extends Policy {
         // check the index for the label.
         for (String labelAttr : dynamicLabelRuleAlgorithms) {
             if (labelAttr.equals(value1Label)) {
-                String value1 = dynamicFieldOneRuleAlgorithms.get(index);
-                populateDataTypeList(value1);
+                String attributeId = dynamicFieldOneRuleAlgorithms.get(index);
+                populateDataTypeList(attributeId);
 
                 // check if the row contains label again
                 for (String labelValue : dynamicLabelRuleAlgorithms) {
-                    if (labelValue.equals(value1)) {
+                    if (labelValue.equals(attributeId)) {
                         return getCompoundDecisionApply(index);
                     }
                 }
 
                 // Getting the values from the form.
                 String functionKey = dynamicFieldComboRuleAlgorithms.get(index);
-                String value2 = dynamicFieldTwoRuleAlgorithms.get(index);
+                String attributeValue = dynamicFieldTwoRuleAlgorithms.get(index);
                 decisionApply.setFunctionId(getFunctionDefinitionId(functionKey));
                 // if two text field are rule attributes.
-                if ((value1.contains(RULE_VARIABLE)) && (value2.contains(RULE_VARIABLE))) {
-                    ApplyType innerDecisionApply1 = new ApplyType();
-                    ApplyType  innerDecisionApply2      = new  ApplyType();
-                    AttributeDesignatorType  attributeDesignator1        = new AttributeDesignatorType();
-                    AttributeDesignatorType  attributeDesignator2        = new AttributeDesignatorType();
-                    //If selected function is Integer function set integer functionID
-                    if(functionKey.toLowerCase().contains("integer")){
-                        innerDecisionApply1.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY );
-                        innerDecisionApply2.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
-                        attributeDesignator1.setDataType(INTEGER_DATATYPE);
-                        attributeDesignator2.setDataType(INTEGER_DATATYPE);
-                    } else{
-                        //If selected function is not a Integer function set String functionID
-                        innerDecisionApply1.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
-                        innerDecisionApply2.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
-                        attributeDesignator1.setDataType(STRING_DATATYPE);
-                        attributeDesignator2.setDataType(STRING_DATATYPE);
-                    }
-                    attributeDesignator1.setCategory(CATEGORY_RESOURCE);
-                    attributeDesignator2.setCategory(CATEGORY_RESOURCE);
-                    //Here set actual field values
-                    attributeDesignator1.setAttributeId(value1.  contains("resource:")?value1.substring( 9):value1.substring(8));
-                    attributeDesignator2.setAttributeId(value1.  contains("resource:")?value1.substring( 9):value1.substring(8));
-                    innerDecisionApply1.getExpression().add(new ObjectFactory().createAttributeDesignator( attributeDesignator1));
-                    innerDecisionApply2.getExpression().add(new ObjectFactory().createAttributeDesignator( attributeDesignator2));
-                    decisionApply.getExpression().add(new ObjectFactory().createApply(innerDecisionApply1));
-                    decisionApply.getExpression().add(new ObjectFactory().createApply(innerDecisionApply2));
+                if ((attributeId.contains(RULE_VARIABLE)) && (attributeValue.contains(RULE_VARIABLE))) {
+                    applyTwoTextFieldRuleAttribute(decisionApply, attributeId, functionKey);
                 } else {
                     // if either of one text field is rule attribute.
-                    if (!value1.startsWith("S_")) {
-                        ApplyType innerDecisionApply = new ApplyType();
-                        AttributeDesignatorType attributeDesignator = new AttributeDesignatorType();
-                        AttributeValueType decisionConditionAttributeValue = new AttributeValueType();
-
-                        if (functionKey.toLowerCase().contains("integer")) {
-                            innerDecisionApply.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
-                            decisionConditionAttributeValue.setDataType(INTEGER_DATATYPE);
-                            attributeDesignator.setDataType(INTEGER_DATATYPE);
-                        } else {
-                            innerDecisionApply.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
-                            decisionConditionAttributeValue.setDataType(STRING_DATATYPE);
-                            attributeDesignator.setDataType(STRING_DATATYPE);
-                        }
-
-                        String attributeId = null;
-                        String attributeValue = null;
-
-                        // Find which textField has rule attribute and set it as
-                        // attributeId and the other as attributeValue.
-                        attributeId = value1;
-                        attributeValue = value2;
+                    if (!attributeId.startsWith("S_")) {
+                        ApplyType innerDecisionApply = generateApplyTypeDataType(functionKey);
+                        AttributeDesignatorType attributeDesignator = generateAttributeDesignatorDataType(functionKey);
+                        AttributeValueType decisionConditionAttributeValue =
+                                generateAttributeValueTypeDataType(functionKey);
 
                         if (attributeId != null) {
                             attributeDesignator.setCategory(CATEGORY_RESOURCE);
                             attributeDesignator.setAttributeId(attributeId);
                         }
                         decisionConditionAttributeValue.getContent().add(attributeValue);
-                        innerDecisionApply.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator));
-                        decisionApply.getExpression().add(new ObjectFactory().createAttributeValue(decisionConditionAttributeValue));
+                        innerDecisionApply.getExpression()
+                                .add(new ObjectFactory().createAttributeDesignator(attributeDesignator));
+                        decisionApply.getExpression()
+                                .add(new ObjectFactory().createAttributeValue(decisionConditionAttributeValue));
                         decisionApply.getExpression().add(new ObjectFactory().createApply(innerDecisionApply));
                     } else {
-                        value1 = value1.substring(2, value1.length());
+                        attributeId = attributeId.substring(2, attributeId.length());
                         VariableReferenceType variableReferenceType = new VariableReferenceType();
-                        variableReferenceType.setVariableId(value1);
+                        variableReferenceType.setVariableId(attributeId);
 
                         String dataType = dataTypeList.get(index);
 
                         AttributeValueType decisionConditionAttributeValue = new AttributeValueType();
                         decisionConditionAttributeValue.setDataType(dataType);
-                        decisionConditionAttributeValue.getContent().add(value2);
-                        decisionApply.getExpression().add(new ObjectFactory().createVariableReference(variableReferenceType));
-                        decisionApply.getExpression().add(new ObjectFactory().createAttributeValue(decisionConditionAttributeValue));
+                        decisionConditionAttributeValue.getContent().add(attributeValue);
+                        decisionApply.getExpression()
+                                .add(new ObjectFactory().createVariableReference(variableReferenceType));
+                        decisionApply.getExpression()
+                                .add(new ObjectFactory().createAttributeValue(decisionConditionAttributeValue));
                     }
                 }
             }
@@ -753,12 +774,13 @@ public class DecisionPolicy extends Policy {
 
     private void populateDataTypeList(String value1) {
         String dataType = null;
-        if(value1.contains("S_")) {
+        if (value1.contains("S_")) {
             value1 = value1.substring(2, value1.length());
             DecisionSettings decisionSettings = findDecisionSettingsBySettingId(value1.substring(2, value1.length()));
             if (decisionSettings != null && "string".equals(decisionSettings.getDatatypeBean().getShortName())) {
                 dataType = STRING_DATATYPE;
-            } else if (decisionSettings != null && "boolean".equals(decisionSettings.getDatatypeBean().getShortName())) {
+            } else if (decisionSettings != null
+                    && "boolean".equals(decisionSettings.getDatatypeBean().getShortName())) {
                 dataType = BOOLEAN_DATATYPE;
             } else {
                 dataType = INTEGER_DATATYPE;
@@ -770,7 +792,6 @@ public class DecisionPolicy extends Policy {
         dataTypeList.add(dataType);
     }
 
-
     private String getDataType(String key) {
 
         DecisionSettings decisionSettings = findDecisionSettingsBySettingId(key);
@@ -792,12 +813,67 @@ public class DecisionPolicy extends Policy {
         return policyAdapter.getData();
     }
 
-    public String getFunctionDefinitionId(String key){
-        FunctionDefinition object = (FunctionDefinition) commonClassDao.getDataById(FunctionDefinition.class, "shortname", key);
-        if(object != null){
+    public String getFunctionDefinitionId(String key) {
+        FunctionDefinition object =
+                (FunctionDefinition) commonClassDao.getEntityItem(FunctionDefinition.class, "short_name", key);
+        if (object != null) {
             return object.getXacmlid();
         }
         return null;
     }
 
+    private AttributeDesignatorType generateAttributeDesignatorDataType(String functionKey) {
+        AttributeDesignatorType attributeDesignator = new AttributeDesignatorType();
+        switch (functionKey.toLowerCase()) {
+            case "integer":
+                attributeDesignator.setDataType(INTEGER_DATATYPE);
+                break;
+            default:
+                attributeDesignator.setDataType(STRING_DATATYPE);
+        }
+        return attributeDesignator;
+    }
+
+    private ApplyType generateApplyTypeDataType(String functionKey) {
+        ApplyType applyType = new ApplyType();
+        switch (functionKey.toLowerCase()) {
+            case "integer":
+                applyType.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
+                break;
+            default:
+                applyType.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
+        }
+        return applyType;
+    }
+
+    private AttributeValueType generateAttributeValueTypeDataType(String functionKey) {
+        AttributeValueType applyType = new AttributeValueType();
+        switch (functionKey.toLowerCase()) {
+            case "integer":
+                applyType.setDataType(INTEGER_DATATYPE);
+                break;
+            default:
+                applyType.setDataType(STRING_DATATYPE);
+        }
+        return applyType;
+    }
+
+    private void applyTwoTextFieldRuleAttribute(ApplyType decisionApply, String value1, String functionKey) {
+        decisionApply.getExpression()
+                .add(new ObjectFactory().createApply(generateApplyTypeDataType(value1, functionKey)));
+        decisionApply.getExpression()
+                .add(new ObjectFactory().createApply(generateApplyTypeDataType(value1, functionKey)));
+    }
+
+    private ApplyType generateApplyTypeDataType(String value1, String functionKey) {
+        ApplyType innerApply = generateApplyTypeDataType(functionKey);
+        AttributeDesignatorType attributeDesignator = generateAttributeDesignatorDataType(functionKey);
+
+        attributeDesignator.setCategory(CATEGORY_RESOURCE);
+        // Here set actual field values
+        attributeDesignator.setAttributeId(value1.contains("resource:") ? value1.substring(9) : value1.substring(8));
+        innerApply.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator));
+        return innerApply;
+    }
+
 }