aboutsummaryrefslogtreecommitdiffstats
path: root/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components
diff options
context:
space:
mode:
Diffstat (limited to 'ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components')
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ActionPolicy.java626
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/AutoPushPolicy.java170
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ClosedLoopPolicy.java552
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ConfigPolicy.java693
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsParamPolicy.java896
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsRawPolicy.java661
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateClosedLoopPerformanceMetrics.java506
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateNewMicroSerivceModel.java305
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/DecisionPolicy.java633
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/FirewallConfigPolicy.java1871
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/MicroServiceConfigPolicy.java561
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/Policy.java455
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDao.java3936
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDaoTransaction.java202
-rw-r--r--ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/package-info.java27
15 files changed, 12094 insertions, 0 deletions
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ActionPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ActionPolicy.java
new file mode 100644
index 000000000..b6e003c91
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ActionPolicy.java
@@ -0,0 +1,626 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Query;
+
+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.ObligationExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionsType;
+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 org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.pap.xacml.rest.util.JPAUtils;
+import org.openecomp.policy.rest.jpa.ActionPolicyDict;
+import org.openecomp.policy.rest.jpa.Datatype;
+import org.openecomp.policy.rest.jpa.FunctionDefinition;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class ActionPolicy extends Policy {
+
+ /**
+ * Config Fields
+ */
+ private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+ public static final String JSON_CONFIG = "JSON";
+ public static final String XML_CONFIG = "XML";
+ public static final String PROPERTIES_CONFIG = "PROPERTIES";
+ public static final String OTHER_CONFIG = "OTHER";
+
+ public static final String PDP_ACTION = "PDP";
+ public static final String PEP_ACTION = "PEP";
+ public static final String TYPE_ACTION = "REST";
+
+ public static final String GET_METHOD = "GET";
+ public static final String PUT_METHOD = "PUT";
+ public static final String POST_METHOD = "POST";
+
+ public static final String PERFORMER_ATTRIBUTEID = "performer";
+ public static final String TYPE_ATTRIBUTEID = "type";
+ public static final String METHOD_ATTRIBUTEID = "method";
+ public static final String HEADERS_ATTRIBUTEID = "headers";
+ public static final String URL_ATTRIBUTEID = "url";
+ public static final String BODY_ATTRIBUTEID = "body";
+
+ List<String> dynamicLabelRuleAlgorithms = new LinkedList<String>();
+ List<String> dynamicFieldFunctionRuleAlgorithms = new LinkedList<String>();
+ List<String> dynamicFieldOneRuleAlgorithms = new LinkedList<String>();
+ List<String> dynamicFieldTwoRuleAlgorithms = new LinkedList<String>();
+
+ protected Map<String, String> dropDownMap = new HashMap<String, String>();
+
+ public ActionPolicy() {
+ super();
+ }
+
+ public ActionPolicy(PolicyRestAdapter policyAdapter){
+ this.policyAdapter = policyAdapter;
+ }
+
+ @Override
+ public Map<String, String> savePolicies() throws Exception {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ if(isPolicyExists()){
+ successMap.put("EXISTS", "This Policy already exist on the PAP");
+ return successMap;
+ }
+
+ if(!isPreparedToSave()){
+ //Prep and configure the policy for saving
+ prepareToSave();
+ }
+
+ // Until here we prepared the data and here calling the method to create xml.
+ Path newPolicyPath = null;
+ newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+ successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );
+ if (successMap.containsKey("success")) {
+ Path finalPolicyPath = getFinalPolicyPath();
+ policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+ }
+ 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
+ @Override
+ public boolean prepareToSave() throws Exception{
+
+ if(isPreparedToSave()){
+ //we have already done this
+ return true;
+ }
+
+ int version = 0;
+ String policyID = policyAdapter.getPolicyID();
+
+ if (policyAdapter.isEditPolicy()) {
+ version = policyAdapter.getHighestVersion() + 1;
+ } else {
+ version = 1;
+ }
+
+ // Create the Instance for pojo, PolicyType object is used in marshalling.
+ if (policyAdapter.getPolicyType().equals("Action")) {
+ PolicyType policyConfig = new PolicyType();
+
+ policyConfig.setVersion(Integer.toString(version));
+ policyConfig.setPolicyId(policyID);
+ policyConfig.setTarget(new TargetType());
+ policyAdapter.setData(policyConfig);
+ }
+
+ if (policyAdapter.getData() != null) {
+
+ // Save off everything
+ // making ready all the required elements to generate the action policy xml.
+ // Get the uniqueness for policy name.
+ Path newFile = getNextFilename(Paths.get(policyAdapter.getParentPath().toString()), policyAdapter.getPolicyType(), policyAdapter.getPolicyName(), version);
+ if (newFile == null) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Policy already Exists, cannot create the policy.");
+ PolicyLogger.error("Policy already Exists, cannot create the policy.");
+ setPolicyExists(true);
+ return false;
+ }
+ policyName = newFile.getFileName().toString();
+
+ // Action body is optional so checking value provided or not
+ //String actionBodyString = policyAdapter.getActionBody();
+ String comboDictValue = policyAdapter.getActionAttribute();
+ String actionBody = getActionPolicyDict(comboDictValue).getBody();
+ if(!(actionBody==null || "".equals(actionBody))){
+ saveActionBody(policyName, actionBody);
+ }
+
+ // Make sure the filename ends with an extension
+ if (policyName.endsWith(".xml") == false) {
+ policyName = policyName + ".xml";
+ }
+
+ PolicyType actionPolicy = (PolicyType) policyAdapter.getData();
+
+ actionPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+ actionPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+
+ AllOfType allOf = new AllOfType();
+
+ Map<String, String> dynamicFieldComponentAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+
+ // If there is any dynamic field attributes create the matches here
+ for (String keyField : dynamicFieldComponentAttributes.keySet()) {
+ String key = keyField;
+ String value = dynamicFieldComponentAttributes.get(key);
+ MatchType dynamicMatch = createDynamicMatch(key, value);
+ allOf.getMatch().add(dynamicMatch);
+ }
+
+ AnyOfType anyOf = new AnyOfType();
+ anyOf.getAllOf().add(allOf);
+
+ TargetType target = new TargetType();
+ target.getAnyOf().add(anyOf);
+
+ // Adding the target to the policy element
+ actionPolicy.setTarget(target);
+
+ RuleType rule = new RuleType();
+ rule.setRuleId(policyAdapter.getRuleID());
+
+ rule.setEffect(EffectType.PERMIT);
+ rule.setTarget(new TargetType());
+
+ dynamicLabelRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmLabels();
+ dynamicFieldFunctionRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmCombo();
+ dynamicFieldOneRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField1();
+ dynamicFieldTwoRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField2();
+ //dropDownMap = policyAdapter.getDropDownMap();
+ dropDownMap = createDropDownMap();
+
+ // Rule attributes are optional and dynamic so check and add them to condition.
+ if (dynamicLabelRuleAlgorithms != null && dynamicLabelRuleAlgorithms.size() > 0) {
+ boolean isCompound = false;
+ ConditionType condition = new ConditionType();
+ int index = dynamicFieldOneRuleAlgorithms.size() - 1;
+
+ for (String labelAttr : dynamicLabelRuleAlgorithms) {
+ // if the rule algorithm as a label means it is a compound
+ if (dynamicFieldOneRuleAlgorithms.get(index).toString().equals(labelAttr)) {
+ ApplyType actionApply = new ApplyType();
+
+ String selectedFunction = (String) dynamicFieldFunctionRuleAlgorithms.get(index).toString();
+ String value1 = (String) dynamicFieldOneRuleAlgorithms.get(index).toString();
+ String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+ actionApply.setFunctionId(dropDownMap.get(selectedFunction));
+ actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value1)));
+ actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value2)));
+ condition.setExpression(new ObjectFactory().createApply(actionApply));
+ isCompound = true;
+ }
+
+ }
+ // if rule algorithm not a compound
+ if (!isCompound) {
+ condition.setExpression(new ObjectFactory().createApply(getInnerActionApply(dynamicLabelRuleAlgorithms.get(index).toString())));
+ }
+ rule.setCondition(condition);
+ }
+ // set the obligations to rule
+ rule.setObligationExpressions(getObligationExpressions());
+ actionPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+ policyAdapter.setPolicyData(actionPolicy);
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + "Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ }
+
+ setPreparedToSave(true);
+ return true;
+ }
+
+ // Saving the json Configurations file if exists at server location for action policy.
+ private void saveActionBody(String policyName, String actionBodyData) {
+ int version = 0;
+ int highestVersion = 0;
+ String domain = getParentPathSubScopeDir();
+ String path = domain.replace('\\', '.');
+ String removeExtension = policyName.substring(0, policyName.indexOf(".xml"));
+ String removeVersion = removeExtension.substring(0, removeExtension.indexOf("."));
+ if (policyAdapter.isEditPolicy()) {
+ highestVersion = policyAdapter.getHighestVersion();
+ if(highestVersion != 0){
+ version = highestVersion + 1;
+ }
+ } else {
+ version = 1;
+ }
+ if(path.contains("/")){
+ path = domain.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ try {
+
+ File file = new File(ACTION_HOME + File.separator + path + "." + removeVersion + "." + version + ".json");
+
+ if (logger.isDebugEnabled())
+ logger.debug("The action body is at " + file.getAbsolutePath());
+
+ // if file doesn't exists, then create it
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+ File configHomeDir = new File(ACTION_HOME);
+ File[] listOfFiles = configHomeDir.listFiles();
+ if (listOfFiles != null){
+ for(File eachFile : listOfFiles){
+ if(eachFile.isFile()){
+ String fileNameWithoutExtension = FilenameUtils.removeExtension(eachFile.getName());
+ String actionFileNameWithoutExtension = FilenameUtils.removeExtension(path + "." + policyName);
+ if (fileNameWithoutExtension.equals(actionFileNameWithoutExtension)){
+ //delete the file
+ if (logger.isInfoEnabled())
+ logger.info("Deleting action body is at " + eachFile.getAbsolutePath());
+ eachFile.delete();
+ }
+ }
+ }
+ }
+ FileWriter fw = new FileWriter(file.getAbsoluteFile());
+ BufferedWriter bw = new BufferedWriter(fw);
+ bw.write(actionBodyData);
+ bw.close();
+
+ if (logger.isInfoEnabled()) {
+ logger.info("Action Body is succesfully saved at " + file.getAbsolutePath());
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ // Data required for obligation part is setting here.
+ private ObligationExpressionsType getObligationExpressions() {
+
+ // TODO: add code to get all these values from dictionary
+ ObligationExpressionsType obligations = new ObligationExpressionsType();
+
+ ObligationExpressionType obligation = new ObligationExpressionType();
+ String comboDictValue = policyAdapter.getActionAttribute();
+ obligation.setObligationId(comboDictValue);
+ obligation.setFulfillOn(EffectType.PERMIT);
+
+ // Add Action Assignment:
+ AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+ assignment1.setAttributeId(PERFORMER_ATTRIBUTEID);
+ assignment1.setCategory(CATEGORY_RECIPIENT_SUBJECT);
+
+ AttributeValueType actionNameAttributeValue = new AttributeValueType();
+ actionNameAttributeValue.setDataType(STRING_DATATYPE);
+ actionNameAttributeValue.getContent().add(performer.get(policyAdapter.getActionPerformer()));
+
+ assignment1.setExpression(new ObjectFactory().createAttributeValue(actionNameAttributeValue));
+ obligation.getAttributeAssignmentExpression().add(assignment1);
+
+ // Add Type Assignment:
+ AttributeAssignmentExpressionType assignmentType = new AttributeAssignmentExpressionType();
+ assignmentType.setAttributeId(TYPE_ATTRIBUTEID);
+ assignmentType.setCategory(CATEGORY_RESOURCE);
+
+ AttributeValueType typeAttributeValue = new AttributeValueType();
+ typeAttributeValue.setDataType(STRING_DATATYPE);
+ String actionDictType = getActionPolicyDict(comboDictValue).getType();
+ typeAttributeValue.getContent().add(actionDictType);
+
+ assignmentType.setExpression(new ObjectFactory().createAttributeValue(typeAttributeValue));
+ obligation.getAttributeAssignmentExpression().add(assignmentType);
+
+ // Add Rest_URL Assignment:
+ AttributeAssignmentExpressionType assignmentURL = new AttributeAssignmentExpressionType();
+ assignmentURL.setAttributeId(URL_ATTRIBUTEID);
+ assignmentURL.setCategory(CATEGORY_RESOURCE);
+
+ AttributeValueType actionURLAttributeValue = new AttributeValueType();
+ actionURLAttributeValue.setDataType(URI_DATATYPE);
+ String actionDictUrl = getActionPolicyDict(comboDictValue).getUrl();
+ actionURLAttributeValue.getContent().add(actionDictUrl);
+
+ assignmentURL.setExpression(new ObjectFactory().createAttributeValue(actionURLAttributeValue));
+ obligation.getAttributeAssignmentExpression().add(assignmentURL);
+
+ // Add Method Assignment:
+ AttributeAssignmentExpressionType assignmentMethod = new AttributeAssignmentExpressionType();
+ assignmentMethod.setAttributeId(METHOD_ATTRIBUTEID);
+ assignmentMethod.setCategory(CATEGORY_RESOURCE);
+
+ AttributeValueType methodAttributeValue = new AttributeValueType();
+ methodAttributeValue.setDataType(STRING_DATATYPE);
+ String actionDictMethod = getActionPolicyDict(comboDictValue).getMethod();
+ methodAttributeValue.getContent().add(actionDictMethod);
+
+ assignmentMethod.setExpression(new ObjectFactory().createAttributeValue(methodAttributeValue));
+ obligation.getAttributeAssignmentExpression().add(assignmentMethod);
+
+ // Add JSON_URL Assignment:
+ String actionBody = getActionPolicyDict(comboDictValue).getBody();
+ if (!actionBody.equals(null)) {
+ //if(!(actionBody==null || "".equals(actionBody))){
+ AttributeAssignmentExpressionType assignmentJsonURL = new AttributeAssignmentExpressionType();
+ assignmentJsonURL.setAttributeId(BODY_ATTRIBUTEID);
+ assignmentJsonURL.setCategory(CATEGORY_RESOURCE);
+
+ AttributeValueType jsonURLAttributeValue = new AttributeValueType();
+ jsonURLAttributeValue.setDataType(URI_DATATYPE);
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());;
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex1 = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex1, policyDir.length());
+ logger.info("print the main domain value"+policyDir);
+ String path = policyDir.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ jsonURLAttributeValue.getContent().add(CONFIG_URL + "/Action/" + path + "." +FilenameUtils.removeExtension(policyName) + ".json");
+
+ assignmentJsonURL.setExpression(new ObjectFactory().createAttributeValue(jsonURLAttributeValue));
+ obligation.getAttributeAssignmentExpression().add(assignmentJsonURL);
+ }
+
+ if(!getActionPolicyDict(comboDictValue).getHeader().equals(null)){
+ String headerVal = getActionPolicyDict(comboDictValue).getHeader();
+ if(headerVal != null && !headerVal.equals("")){
+ // parse it on : to get number of headers
+ String[] result = headerVal.split(":");
+ System.out.println(Arrays.toString(result));
+ for (String eachString : result){
+ // parse each value on =
+ String[] textFieldVals = eachString.split("=");
+ obligation.getAttributeAssignmentExpression().add(addDynamicHeaders(textFieldVals[0], textFieldVals[1]));
+ }
+ }
+
+ }
+
+ obligations.getObligationExpression().add(obligation);
+ return obligations;
+ }
+
+
+ // if compound setting the inner apply here
+ protected ApplyType getInnerActionApply(String value1Label) {
+ ApplyType actionApply = new ApplyType();
+ int index = 0;
+ // check the index for the label.
+ for (String labelAttr : dynamicLabelRuleAlgorithms) {
+ if (labelAttr.equals(value1Label)) {
+ String value1 = dynamicFieldOneRuleAlgorithms.get(index).toString();
+ // check if the row contains label again
+ for (String labelValue : dynamicLabelRuleAlgorithms) {
+ if (labelValue.equals(value1)) {
+ return getCompoundApply(index);
+ }
+ }
+
+ // Getting the values from the form.
+ String functionKey = dynamicFieldFunctionRuleAlgorithms.get(index).toString();
+ String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+ actionApply.setFunctionId(dropDownMap.get(functionKey));
+ // if two text field are rule attributes.
+ if ((value1.contains(RULE_VARIABLE)) && (value2.contains(RULE_VARIABLE))) {
+ ApplyType innerActionApply1 = new ApplyType();
+ ApplyType innerActionApply2 = new ApplyType();
+ AttributeDesignatorType attributeDesignator1 = new AttributeDesignatorType();
+ AttributeDesignatorType attributeDesignator2 = new AttributeDesignatorType();
+ // If selected function is Integer function set integer functionID
+ if (functionKey.toLowerCase().contains("integer")) {
+ innerActionApply1.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
+ innerActionApply2.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
+ innerActionApply1.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
+ innerActionApply2.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));
+
+ innerActionApply1.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator1));
+ innerActionApply2.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator2));
+
+ actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply1));
+ actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply2));
+
+ } else {// if either of one text field is rule attribute.
+ ApplyType innerActionApply = new ApplyType();
+ AttributeDesignatorType attributeDesignator = new AttributeDesignatorType();
+ AttributeValueType actionConditionAttributeValue = new AttributeValueType();
+
+ if (functionKey.toLowerCase().contains("integer")) {
+ innerActionApply.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
+ actionConditionAttributeValue.setDataType(INTEGER_DATATYPE);
+ attributeDesignator.setDataType(INTEGER_DATATYPE);
+ } else {
+ innerActionApply.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
+ actionConditionAttributeValue.setDataType(STRING_DATATYPE);
+ attributeDesignator.setDataType(STRING_DATATYPE);
+ }
+
+ String attributeId = null;
+ String attributeValue = null;
+
+ // Find which textField has rule attribute and set it as
+ attributeId = value1;
+ attributeValue = value2;
+
+ if (attributeId != null) {
+ attributeDesignator.setCategory(CATEGORY_RESOURCE);
+ attributeDesignator.setAttributeId(attributeId);
+ }
+ actionConditionAttributeValue.getContent().add(attributeValue);
+ innerActionApply.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator));
+ // Decide the order of element based the values.
+ if (attributeId.equals(value1)) {
+ actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply));
+ actionApply.getExpression().add(new ObjectFactory().createAttributeValue(actionConditionAttributeValue));
+ } else {
+ actionApply.getExpression().add(new ObjectFactory().createAttributeValue(actionConditionAttributeValue));
+ actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply));
+ }
+ }
+ }
+ index++;
+ }
+ return actionApply;
+ }
+
+ // if the rule algorithm is multiple compound one setting the apply
+ protected ApplyType getCompoundApply(int index) {
+ ApplyType actionApply = new ApplyType();
+ String selectedFunction = dynamicFieldFunctionRuleAlgorithms.get(index).toString();
+ String value1 = dynamicFieldOneRuleAlgorithms.get(index).toString();
+ String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+ actionApply.setFunctionId(dropDownMap.get(selectedFunction));
+ actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value1)));
+ actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value2)));
+ return actionApply;
+ }
+
+ // Adding the dynamic headers if any
+ private AttributeAssignmentExpressionType addDynamicHeaders(String header, String value) {
+ AttributeAssignmentExpressionType assignmentHeaders = new AttributeAssignmentExpressionType();
+ assignmentHeaders.setAttributeId("headers:" + header);
+ assignmentHeaders.setCategory(CATEGORY_RESOURCE);
+
+ AttributeValueType headersAttributeValue = new AttributeValueType();
+ headersAttributeValue.setDataType(STRING_DATATYPE);
+ headersAttributeValue.getContent().add(value);
+
+ assignmentHeaders.setExpression(new ObjectFactory().createAttributeValue(headersAttributeValue));
+ return assignmentHeaders;
+ }
+
+ private Map<String,String> createDropDownMap(){
+ JPAUtils jpaUtils = null;
+ try {
+ jpaUtils = JPAUtils.getJPAUtilsInstance(policyAdapter.getEntityManagerFactory());
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ Map<Datatype, List<FunctionDefinition>> functionMap = jpaUtils.getFunctionDatatypeMap();
+ Map<String, String> dropDownMap = new HashMap<String, String>();
+ for (Datatype id : functionMap.keySet()) {
+ List<FunctionDefinition> functionDefinitions = (List<FunctionDefinition>) functionMap
+ .get(id);
+ for (FunctionDefinition functionDef : functionDefinitions) {
+ dropDownMap.put(functionDef.getShortname(),functionDef.getXacmlid());
+ }
+ }
+
+ return dropDownMap;
+ }
+
+ private ActionPolicyDict getActionPolicyDict(String attributeName){
+ ActionPolicyDict retObj = new ActionPolicyDict();
+ //EntityManagerFactory emf = policyAdapter.getEntityManagerFactory();
+ //EntityManager em = emf.createEntityManager();
+ EntityManager em = policyAdapter.getEntityManagerFactory().createEntityManager();
+ Query getActionPolicyDicts = em.createNamedQuery("ActionPolicyDict.findAll");
+ List<?> actionPolicyDicts = getActionPolicyDicts.getResultList();
+
+ for (Object id : actionPolicyDicts) {
+ //ActionPolicyDict actionPolicyList = actionPolicyDicts.getItem(id).getEntity();
+ ActionPolicyDict actionPolicy = (ActionPolicyDict) id;
+ if(attributeName.equals(actionPolicy.getAttributeName())){
+ retObj = actionPolicy;
+ break;
+ }
+ }
+
+ try{
+ em.getTransaction().commit();
+ } catch(Exception e){
+ try{
+ em.getTransaction().rollback();
+ } catch(Exception e2){
+ e2.printStackTrace();
+ }
+ }
+ em.close();
+
+ return retObj;
+ }
+
+ @Override
+ public Object getCorrectPolicyDataObject() {
+ return policyAdapter.getPolicyData();
+ }
+
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/AutoPushPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/AutoPushPolicy.java
new file mode 100644
index 000000000..61498e2ac
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/AutoPushPolicy.java
@@ -0,0 +1,170 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.nio.file.Paths;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import org.openecomp.policy.xacml.api.pap.EcompPDPGroup;
+import org.openecomp.policy.xacml.api.pap.PAPPolicyEngine;
+
+import com.att.research.xacml.api.pap.PAPEngine;
+import com.att.research.xacml.api.pap.PDPPolicy;
+import org.openecomp.policy.xacml.std.pap.StdPDPGroup;
+import org.openecomp.policy.xacml.std.pap.StdPDPPolicy;
+/**
+ * Auto Push Policy based on the property file properties.
+ *
+ * @version 0.1
+ */
+public class AutoPushPolicy {
+
+ private static final Logger logger = FlexLogger.getLogger(AutoPushPolicy.class);
+
+ private String filePath = null;
+ private Properties properties;
+ private Long newModified;
+ private Long oldModified;
+ private File propFile;
+
+
+ /**
+ * Constructor Pass in the property file path.
+ */
+ public AutoPushPolicy(String file){
+ filePath = file;
+ properties = new Properties();
+ propFile = Paths.get(filePath).toFile();
+ readFile();
+ }
+
+ /**
+ * Checks Policy with all the Groups which has set such Property.
+ * Else returns Empty Set.
+ *
+ * @param policyToCreateUpdate
+ * @param papEngine
+ */
+ public Set<StdPDPGroup> checkGroupsToPush(String policyToCreateUpdate, PAPPolicyEngine papEngine) {
+ Set<StdPDPGroup> changedGroups= new HashSet<StdPDPGroup>();
+ // Check if the file has been modified. then re-load the properties file.
+ newModified = propFile.lastModified();
+ try {
+ if(newModified!=oldModified){
+ // File has been updated.
+ readFile();
+ }
+ // Read the File name as its made.
+ String gitPath = PolicyDBDao.getGitPath();
+ String policyId = policyToCreateUpdate.substring(policyToCreateUpdate.indexOf(gitPath)+gitPath.length()+1);
+ String policyName = policyId.substring(policyId.lastIndexOf(File.separator)+1,policyId.lastIndexOf("."));
+ policyName = policyName.substring(0,policyName.lastIndexOf("."));
+ policyId = policyId.replace("/", ".");
+ if(policyId.contains("\\")){
+ policyId = policyId.replace("\\", ".");
+ }
+ logger.info("Policy ID : " + policyId);
+ logger.info("Policy Name : " + policyName);
+ // Read in Groups
+ for(EcompPDPGroup pdpGroup: papEngine.getEcompPDPGroups()){
+ String groupName = pdpGroup.getName();
+ Boolean typeFlag = false;
+ Boolean scopeFlag = false;
+ if(properties.containsKey(groupName + ".policyType")){
+ String type= properties.getProperty(groupName + ".policyType").replaceAll(" ","");
+ if(type.equals("")){
+ type = " ";
+ }
+ typeFlag = policyName.contains(type);
+ }
+ if(properties.containsKey(groupName + ".policyScope")){
+ String scope = properties.getProperty(groupName + ".policyScope").replaceAll(" ", "");
+ if(scope.equals("")){
+ scope = " ";
+ }
+ scopeFlag = policyId.contains(scope);
+ }
+ if(typeFlag || scopeFlag){
+ StdPDPGroup group = addToGroup(policyId,policyName, policyToCreateUpdate, (StdPDPGroup)pdpGroup);
+ changedGroups.add(group);
+ }
+ }
+ } catch (Exception e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while processing the auto push for " + policyToCreateUpdate +"\n " + e.getMessage());
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "AutoPushPolicy", "Error while processing the auto push for " + policyToCreateUpdate);
+ }
+ return changedGroups;
+ }
+
+ private void readFile(){
+ try {
+ properties.load(new FileInputStream(propFile));
+ oldModified = propFile.lastModified();
+ } catch (Exception e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while loading in the auto push properties file. " + propFile.toString());
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "AutoPushPolicy", "Error while loading in the auto push properties file.");
+ }
+ }
+
+ private StdPDPGroup addToGroup(String policyId, String policyName, String policyToCreateUpdate, StdPDPGroup pdpGroup) throws Exception{
+ // Add to group. Send Notification.
+ StdPDPPolicy policy = new StdPDPPolicy(policyId, true, policyName, Paths.get(policyToCreateUpdate).toUri());
+ //Get the current policies from the Group and Add the new one
+ Set<PDPPolicy> currentPoliciesInGroup = pdpGroup.getPolicies();
+ Set<PDPPolicy> policies = new HashSet<PDPPolicy>();
+ if(policy!=null){
+ policies.add(policy);
+ }
+ pdpGroup.copyPolicyToFile(policyId, new FileInputStream(Paths.get(policyToCreateUpdate).toFile()));
+ //If the selected policy is in the group we must remove it because the name is default
+ Iterator<PDPPolicy> policyIterator = policies.iterator();
+ while (policyIterator.hasNext()) {
+ PDPPolicy selPolicy = policyIterator.next();
+ for (PDPPolicy existingPolicy : currentPoliciesInGroup) {
+ if (existingPolicy.getId().equals(selPolicy.getId())) {
+ pdpGroup.removePolicyFromGroup(existingPolicy);
+ logger.debug("Removing policy: " + existingPolicy);
+ break;
+ }
+ }
+ }
+ if(currentPoliciesInGroup!=null){
+ policies.addAll(currentPoliciesInGroup);
+ }
+ pdpGroup.setPolicies(policies);
+ return pdpGroup;
+ }
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ClosedLoopPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ClosedLoopPolicy.java
new file mode 100644
index 000000000..8c3e34d6e
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ClosedLoopPolicy.java
@@ -0,0 +1,552 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.json.stream.JsonGenerationException;
+
+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.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.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 org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class ClosedLoopPolicy extends Policy {
+
+ /**
+ * Config Fields
+ */
+ private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+ public ClosedLoopPolicy() {
+ super();
+ }
+
+ public ClosedLoopPolicy(PolicyRestAdapter policyAdapter){
+ this.policyAdapter = policyAdapter;
+ }
+
+ //save configuration of the policy based on the policyname
+ private void saveConfigurations(String policyName, String prevPolicyName, String jsonBody) {
+ String domain = getParentPathSubScopeDir();
+ String path = domain.replace('\\', '.');
+ if(path.contains("/")){
+ path = domain.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ try {
+ String body = jsonBody;
+ try {
+ try{
+ //Remove the trapMaxAge in Verification Signature
+ body = body.replace(",\"trapMaxAge\":null", "");
+ }catch(Exception e){
+ logger.debug("No Trap Max Age in JSON body");
+ }
+ this.policyAdapter.setJsonBody(body);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ System.out.println(body);
+ if(policyName.endsWith(".xml")){
+ policyName = policyName.substring(0, policyName.lastIndexOf(".xml"));
+ }
+ PrintWriter out = new PrintWriter(CONFIG_HOME + File.separator+path + "."+ policyName +".json");
+ out.println(body);
+ out.close();
+
+ } catch (JsonGenerationException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ //Utility to read json data from the existing file to a string
+ static String readFile(String path, Charset encoding) throws IOException {
+
+ byte[] encoded = Files.readAllBytes(Paths.get(path));
+ return new String(encoded, encoding);
+
+ }
+
+ //create the configuration file based on the policy name on adding the extension as .json
+ private String getConfigFile(String filename) {
+ filename = FilenameUtils.removeExtension(filename);
+ if (filename.endsWith(".xml")) {
+ filename = filename.substring(0, filename.length() - 4);
+ }
+ filename = filename + ".json";
+ return filename;
+ }
+
+ @Override
+ public Map<String, String> savePolicies() throws Exception {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ if(isPolicyExists()){
+ successMap.put("EXISTS", "This Policy already exist on the PAP");
+ return successMap;
+ }
+
+ if(!isPreparedToSave()){
+ prepareToSave();
+ }
+
+ // Until here we prepared the data and here calling the method to create xml.
+ Path newPolicyPath = null;
+ newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+
+ successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject());
+ if (successMap.containsKey("success")) {
+ Path finalPolicyPath = getFinalPolicyPath();
+ policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+ }
+ 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
+ @Override
+ public boolean prepareToSave() throws Exception{
+
+ if(isPreparedToSave()){
+ //we have already done this
+ return true;
+ }
+
+ int version = 0;
+ String policyID = policyAdapter.getPolicyID();
+
+ if (policyAdapter.isEditPolicy()) {
+ version = policyAdapter.getHighestVersion() + 1;
+ } else {
+ version = 1;
+ }
+
+ // Create the Instance for pojo, PolicyType object is used in marshalling.
+ if (policyAdapter.getPolicyType().equals("Config")) {
+ PolicyType policyConfig = new PolicyType();
+
+ policyConfig.setVersion(Integer.toString(version));
+ policyConfig.setPolicyId(policyID);
+ policyConfig.setTarget(new TargetType());
+ policyAdapter.setData(policyConfig);
+ }
+
+ if (policyAdapter.getData() != null) {
+
+ //delete the closed loop draft file and configuration file, if validation is success after editing the draft policy
+ String prevPolicyName = null;
+ if(policyAdapter.isEditPolicy()){
+ prevPolicyName = "Config_Fault_" + policyAdapter.getPolicyName() + "." + policyAdapter.getHighestVersion() + ".xml";
+
+ if (policyAdapter.isDraft()) {
+ policyName = "Config_Fault_" + policyAdapter.getPolicyName() + "_Draft";
+ } else {
+ policyName = "Config_Fault_" + policyAdapter.getPolicyName();
+ }
+
+ //delete the closed loop draft configuration file, if validation is success after editing the draft policy
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath());
+ String policyDir = policyAdapter.getParentPath();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ logger.info("print the main domain value"+policyDir);
+ String path = policyDir.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ String fileName = FilenameUtils.removeExtension(policyName);
+
+ final String tempPath = path;
+ String fileLocation = null;
+ if (fileName != null && fileName.contains("Config_Fault_")) {
+ fileLocation = CONFIG_HOME;
+ }
+ // Get the file from the saved location
+ File dir = new File(fileLocation);
+ File[] listOfFiles = dir.listFiles();
+ for (File file : listOfFiles) {
+ String configFile = null;
+ if(!policyAdapter.isDraft()){
+ configFile = fileName + "_Draft";
+ }else{
+ configFile = fileName;
+ }
+ if (file.isFile() && file.getName().contains( tempPath + "." + configFile)) {
+ try {
+ if (file.delete() == false) {
+ throw new Exception(
+ "No known error, Delete failed");
+ }
+ } catch (Exception e) {
+ logger.error("Failed to Delete file: "
+ + e.getLocalizedMessage());
+ }
+ }
+ }
+ }
+
+ // Save off everything
+ // making ready all the required elements to generate the action policy xml.
+ // Get the uniqueness for policy name.
+ String policyName1 = null;
+ if(policyAdapter.isDraft()){
+ policyName1 = policyAdapter.getPolicyName() + "_Draft";
+ }else{
+ policyName1 = policyAdapter.getPolicyName();
+ }
+
+ Path newFile = this.getNextLoopFilename(Paths.get(policyAdapter.getParentPath()), policyAdapter.getPolicyType(), policyAdapter.getConfigPolicyType(), policyName1, version);
+ if (newFile == null) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("File already exists, cannot create the policy.");
+ PolicyLogger.error("File already exists, cannot create the policy.");
+ setPolicyExists(true);
+ return false;
+ }
+
+ policyName = newFile.getFileName().toString();
+
+ // Save the Configurations file with the policy name with extention based on selection.
+ String jsonBody = policyAdapter.getJsonBody();
+ saveConfigurations(policyName, prevPolicyName, jsonBody);
+
+ // Make sure the filename ends with an extension
+ if (policyName.endsWith(".xml") == false) {
+ policyName = policyName + ".xml";
+ }
+
+ PolicyType faultPolicy = (PolicyType) policyAdapter.getData();
+
+ faultPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+ faultPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+
+ AllOfType allOfOne = new AllOfType();
+ File policyFilePath = new File(policyAdapter.getParentPath().toString(), policyName);
+ String policyDir = policyFilePath.getParentFile().getName();
+ String fileName = FilenameUtils.removeExtension(policyName);
+ fileName = policyDir + "." + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+ allOfOne.getMatch().add(createMatch("PolicyName", name));
+ AllOfType allOf = new AllOfType();
+ // Adding the matches to AllOfType element
+ // Match for Ecomp
+ allOf.getMatch().add(createMatch("ECOMPName", policyAdapter.getEcompName()));
+ // Match for riskType
+ allOf.getMatch().add(
+ createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+ // Match for riskLevel
+ allOf.getMatch().add(
+ createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+ // Match for riskguard
+ allOf.getMatch().add(
+ createDynamicMatch("guard", policyAdapter.getGuard()));
+ // Match for ttlDate
+ allOf.getMatch().add(
+ createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+
+ AnyOfType anyOf = new AnyOfType();
+ anyOf.getAllOf().add(allOfOne);
+ anyOf.getAllOf().add(allOf);
+
+ TargetType target = new TargetType();
+ ((TargetType) target).getAnyOf().add(anyOf);
+ // Adding the target to the policy element
+ faultPolicy.setTarget((TargetType) target);
+
+ RuleType rule = new RuleType();
+ rule.setRuleId(policyAdapter.getRuleID());
+ rule.setEffect(EffectType.PERMIT);
+
+ // Create Target in Rule
+ AllOfType allOfInRule = new AllOfType();
+
+ // Creating match for ACCESS in rule target
+ MatchType accessMatch = new MatchType();
+ AttributeValueType accessAttributeValue = new AttributeValueType();
+ accessAttributeValue.setDataType(STRING_DATATYPE);
+ accessAttributeValue.getContent().add("ACCESS");
+ accessMatch.setAttributeValue(accessAttributeValue);
+ AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+ URI accessURI = null;
+ try {
+ accessURI = new URI(ACTION_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getStackTrace());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "CreateClosedLoopPolicy", "Exception creating ACCESS URI");
+ }
+ accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+ accessAttributeDesignator.setDataType(STRING_DATATYPE);
+ accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+ accessMatch.setAttributeDesignator(accessAttributeDesignator);
+ accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ // Creating Config Match in rule Target
+ MatchType closedMatch = new MatchType();
+ AttributeValueType closedAttributeValue = new AttributeValueType();
+ closedAttributeValue.setDataType(STRING_DATATYPE);
+ closedAttributeValue.getContent().add("Config");
+ closedMatch.setAttributeValue(closedAttributeValue);
+ AttributeDesignatorType closedAttributeDesignator = new AttributeDesignatorType();
+ URI closedURI = null;
+ try {
+ closedURI = new URI(RESOURCE_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getStackTrace());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "CreateClosedLoopPolicy", "Exception creating closed URI");
+ }
+ closedAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+ closedAttributeDesignator.setDataType(STRING_DATATYPE);
+ closedAttributeDesignator.setAttributeId(new IdentifierImpl(closedURI).stringValue());
+ closedMatch.setAttributeDesignator(closedAttributeDesignator);
+ closedMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ allOfInRule.getMatch().add(accessMatch);
+ allOfInRule.getMatch().add(closedMatch);
+
+ AnyOfType anyOfInRule = new AnyOfType();
+ anyOfInRule.getAllOf().add(allOfInRule);
+
+ TargetType targetInRule = new TargetType();
+ targetInRule.getAnyOf().add(anyOfInRule);
+
+ rule.setTarget(targetInRule);
+ rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+ faultPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+ policyAdapter.setPolicyData(faultPolicy);
+
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ PolicyLogger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ }
+
+ setPreparedToSave(true);
+ return true;
+ }
+
+ // Data required for Advice part is setting here.
+ private AdviceExpressionsType getAdviceExpressions(int version, String fileName) {
+ AdviceExpressionsType advices = new AdviceExpressionsType();
+ AdviceExpressionType advice = new AdviceExpressionType();
+ advice.setAdviceId("faultID");
+ advice.setAppliesTo(EffectType.PERMIT);
+ // For Configuration
+ AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+ assignment1.setAttributeId("type");
+ assignment1.setCategory(CATEGORY_RESOURCE);
+ assignment1.setIssuer("");
+
+ AttributeValueType configNameAttributeValue = new AttributeValueType();
+ configNameAttributeValue.setDataType(STRING_DATATYPE);
+ configNameAttributeValue.getContent().add("Configuration");
+ assignment1.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue));
+
+ advice.getAttributeAssignmentExpression().add(assignment1);
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ // For Config file Url if configurations are provided.
+ AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+ assignment2.setAttributeId("URLID");
+ assignment2.setCategory(CATEGORY_RESOURCE);
+ assignment2.setIssuer("");
+
+ AttributeValueType AttributeValue = new AttributeValueType();
+ AttributeValue.setDataType(URI_DATATYPE);
+ String policyDir1 = policyAdapter.getParentPath().toString();
+ int startIndex1 = policyDir1.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+ logger.info("print the main domain value"+policyDir1);
+ String path = policyDir1.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir1.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+
+ String content = CONFIG_URL +"/Config/" + path + "." + getConfigFile(policyName);
+ System.out.println("URL value :" + content);
+ AttributeValue.getContent().add(content);
+ assignment2.setExpression(new ObjectFactory().createAttributeValue(AttributeValue));
+
+ advice.getAttributeAssignmentExpression().add(assignment2);
+ AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+ assignment3.setAttributeId("PolicyName");
+ assignment3.setCategory(CATEGORY_RESOURCE);
+ assignment3.setIssuer("");
+
+ AttributeValueType attributeValue3 = new AttributeValueType();
+ attributeValue3.setDataType(STRING_DATATYPE);
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ StringTokenizer tokenizer = null;
+ StringBuffer buffer = new StringBuffer();
+ if (policyDir.contains("\\")) {
+ tokenizer = new StringTokenizer(policyDir, "\\");
+ } else {
+ tokenizer = new StringTokenizer(policyDir, "/");
+ }
+ if (tokenizer != null) {
+ while (tokenizer.hasMoreElements()) {
+ String value = tokenizer.nextToken();
+ buffer.append(value);
+ buffer.append(".");
+ }
+ }
+ fileName = FilenameUtils.removeExtension(fileName);
+ fileName = buffer.toString() + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+ attributeValue3.getContent().add(name);
+ assignment3.setExpression(new ObjectFactory().createAttributeValue(attributeValue3));
+ advice.getAttributeAssignmentExpression().add(assignment3);
+
+ AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+ assignment4.setAttributeId("VersionNumber");
+ assignment4.setCategory(CATEGORY_RESOURCE);
+ assignment4.setIssuer("");
+
+ AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+ configNameAttributeValue4.setDataType(STRING_DATATYPE);
+ configNameAttributeValue4.getContent().add(Integer.toString(version));
+ assignment4.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue4));
+
+ advice.getAttributeAssignmentExpression().add(assignment4);
+
+ AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+ assignment5.setAttributeId("matching:" + this.ECOMPID);
+ assignment5.setCategory(CATEGORY_RESOURCE);
+ assignment5.setIssuer("");
+
+ AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+ configNameAttributeValue5.setDataType(STRING_DATATYPE);
+ configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+ assignment5.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue5));
+
+ advice.getAttributeAssignmentExpression().add(assignment5);
+
+ //Risk Attributes
+ AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+ assignment6.setAttributeId("RiskType");
+ assignment6.setCategory(CATEGORY_RESOURCE);
+ assignment6.setIssuer("");
+
+ AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+ configNameAttributeValue6.setDataType(STRING_DATATYPE);
+ configNameAttributeValue6.getContent().add(policyAdapter.getRiskType());
+ assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+
+ advice.getAttributeAssignmentExpression().add(assignment6);
+
+ AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+ assignment7.setAttributeId("RiskLevel");
+ assignment7.setCategory(CATEGORY_RESOURCE);
+ assignment7.setIssuer("");
+
+ AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+ configNameAttributeValue7.setDataType(STRING_DATATYPE);
+ configNameAttributeValue7.getContent().add(policyAdapter.getRiskLevel());
+ assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+ advice.getAttributeAssignmentExpression().add(assignment7);
+
+ AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+ assignment8.setAttributeId("guard");
+ assignment8.setCategory(CATEGORY_RESOURCE);
+ assignment8.setIssuer("");
+
+ AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+ configNameAttributeValue8.setDataType(STRING_DATATYPE);
+ configNameAttributeValue8.getContent().add(policyAdapter.getGuard());
+ assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+ advice.getAttributeAssignmentExpression().add(assignment8);
+
+ AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+ assignment9.setAttributeId("TTLDate");
+ assignment9.setCategory(CATEGORY_RESOURCE);
+ assignment9.setIssuer("");
+
+ AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+ configNameAttributeValue9.setDataType(STRING_DATATYPE);
+ configNameAttributeValue9.getContent().add(policyAdapter.getTtlDate());
+ assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+ advice.getAttributeAssignmentExpression().add(assignment9);
+
+
+
+ advices.getAdviceExpression().add(advice);
+ return advices;
+ }
+
+ @Override
+ public Object getCorrectPolicyDataObject() {
+ return policyAdapter.getPolicyData();
+ }
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ConfigPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ConfigPolicy.java
new file mode 100644
index 000000000..a339b1564
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ConfigPolicy.java
@@ -0,0 +1,693 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringReader;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Scanner;
+import java.util.StringTokenizer;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+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.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.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 org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class ConfigPolicy extends Policy {
+
+ /**
+ * Config Fields
+ */
+ private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+ public static final String JSON_CONFIG = "JSON";
+ public static final String XML_CONFIG = "XML";
+ public static final String PROPERTIES_CONFIG = "PROPERTIES";
+ public static final String OTHER_CONFIG = "OTHER";
+
+ private String configBodyData;
+
+ public ConfigPolicy() {
+ super();
+ }
+
+ public ConfigPolicy(PolicyRestAdapter policyAdapter){
+ this.policyAdapter = policyAdapter;
+ }
+
+ // Saving the Configurations file at server location for config policy.
+ protected void saveConfigurations(String policyName) {
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ logger.info("print the main domain value"+policyDir);
+ String path = policyDir.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+
+ try {
+ File file;
+ String configFileName = getConfigFile(policyName);
+ if(CONFIG_HOME.contains("\\"))
+ {
+ file = new File(CONFIG_HOME + "\\" + path + "."+ configFileName);
+ }
+ else
+ {
+ file = new File(CONFIG_HOME + "/" + path + "."+ configFileName);
+ }
+
+ // if file doesnt exists, then create it
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+
+
+ File configHomeDir = new File(CONFIG_HOME);
+ File[] listOfFiles = configHomeDir.listFiles();
+ if (listOfFiles != null){
+ for(File eachFile : listOfFiles){
+ if(eachFile.isFile()){
+ String fileNameWithoutExtension = FilenameUtils.removeExtension(eachFile.getName());
+ String configFileNameWithoutExtension = FilenameUtils.removeExtension(path + "." + configFileName);
+ if (fileNameWithoutExtension.equals(configFileNameWithoutExtension)){
+ //delete the file
+ eachFile.delete();
+ }
+ }
+ }
+ }
+
+ FileWriter fw = new FileWriter(file.getAbsoluteFile());
+ BufferedWriter bw = new BufferedWriter(fw);
+ bw.write(configBodyData);
+ bw.close();
+ if (logger.isDebugEnabled()) {
+ logger.debug("Configuration is succesfully saved");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Here we are adding the extension for the configurations file based on the
+ // config type selection for saving.
+ private String getConfigFile(String filename) {
+ filename = FilenameUtils.removeExtension(filename);
+ if (filename.endsWith(".xml")) {
+ filename = filename.substring(0, filename.length() - 4);
+ }
+ String id = policyAdapter.getConfigType();
+
+ if (id != null) {
+ if (id.equalsIgnoreCase(JSON_CONFIG)) {
+ filename = filename + ".json";
+ }
+ if (id.equalsIgnoreCase(XML_CONFIG)) {
+ filename = filename + ".xml";
+ }
+ if (id.equalsIgnoreCase(PROPERTIES_CONFIG)) {
+ filename = filename + ".properties";
+ }
+ if (id.equalsIgnoreCase(OTHER_CONFIG)) {
+ filename = filename + ".txt";
+ }
+ }
+ return filename;
+ }
+
+ // Validations for Config form
+ /*
+ * FORM VALIDATION WILL BE DONE BY THE PAP-ADMIN before creating JSON object...
+ * BODY VALIDATION WILL BE DONE BY THE PAP-REST after receiving and deserializing the JSON object
+ */
+ public boolean validateConfigForm() {
+
+ isValidForm = true;
+
+ /*
+ * Validate Text Area Body
+ */
+ configBodyData = policyAdapter.getConfigBodyData();
+ String id = policyAdapter.getConfigType();
+ if (id != null) {
+ if (id.equals(JSON_CONFIG)) {
+ if (!isJSONValid(configBodyData)) {
+ isValidForm = false;
+ }
+ } else if (id.equals(XML_CONFIG)) {
+ if (!isXMLValid(configBodyData)) {
+ isValidForm = false;
+ }
+ } else if (id.equals(PROPERTIES_CONFIG)) {
+ if (!isPropValid(configBodyData)||configBodyData.equals("")) {
+ isValidForm = false;
+ }
+ } else if (id.equals(OTHER_CONFIG)) {
+ if (configBodyData.equals("")) {
+ isValidForm = false;
+ }
+ }
+ }
+ return isValidForm;
+
+ }
+
+ // Validation for XML.
+ private boolean isXMLValid(String data) {
+
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ factory.setValidating(false);
+ factory.setNamespaceAware(true);
+ try {
+ SAXParser parser = factory.newSAXParser();
+ XMLReader reader = parser.getXMLReader();
+ reader.setErrorHandler(new XMLErrorHandler());
+ reader.parse(new InputSource(new StringReader(data)));
+ } catch (ParserConfigurationException e) {
+ return false;
+ } catch (SAXException e) {
+ return false;
+ } catch (IOException e) {
+ return false;
+ }
+ return true;
+
+ }
+
+ // Validation for Properties file.
+ public boolean isPropValid(String prop) {
+
+ Scanner scanner = new Scanner(prop);
+ while (scanner.hasNextLine()) {
+ String line = scanner.nextLine();
+ line.replaceAll("\\s+", "");
+ if (line.startsWith("#")) {
+ continue;
+ } else {
+ if (line.contains("=")) {
+ String[] parts = line.split("=");
+ if (parts.length < 2) {
+ scanner.close();
+ return false;
+ }
+ } else {
+ scanner.close();
+ return false;
+ }
+ }
+ }
+ scanner.close();
+ return true;
+
+ }
+
+ public class XMLErrorHandler implements ErrorHandler {
+
+ public void warning(SAXParseException e) throws SAXException {
+ System.out.println(e.getMessage());
+ }
+
+ public void error(SAXParseException e) throws SAXException {
+ System.out.println(e.getMessage());
+ }
+
+ public void fatalError(SAXParseException e) throws SAXException {
+ System.out.println(e.getMessage());
+ }
+
+ }
+
+ @Override
+ public Map<String, String> savePolicies() throws Exception {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ if(isPolicyExists()){
+ successMap.put("EXISTS", "This Policy already exist on the PAP");
+ return successMap;
+ }
+
+ if(!isPreparedToSave()){
+ //Prep and configure the policy for saving
+ prepareToSave();
+ }
+
+ // Until here we prepared the data and here calling the method to create xml.
+ Path newPolicyPath = null;
+ newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+ successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );
+ if (successMap.containsKey("success")) {
+ Path finalPolicyPath = getFinalPolicyPath();
+ policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+ }
+ 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
+ @Override
+ public boolean prepareToSave() throws Exception{
+
+ if(isPreparedToSave()){
+ //we have already done this
+ return true;
+ }
+
+ int version = 0;
+ String policyID = policyAdapter.getPolicyID();
+
+ if (policyAdapter.isEditPolicy()) {
+ version = policyAdapter.getHighestVersion() + 1;
+ } else {
+ version = 1;
+ }
+
+ // Create the Instance for pojo, PolicyType object is used in marshalling.
+ if (policyAdapter.getPolicyType().equals("Config")) {
+ PolicyType policyConfig = new PolicyType();
+
+ policyConfig.setVersion(Integer.toString(version));
+ policyConfig.setPolicyId(policyID);
+ policyConfig.setTarget(new TargetType());
+ policyAdapter.setData(policyConfig);
+ }
+
+ if (policyAdapter.getData() != null) {
+
+ // Save off everything
+ // making ready all the required elements to generate the action policy xml.
+ // Get the uniqueness for policy name.
+ Path newFile = getNextFilename(Paths.get(policyAdapter.getParentPath().toString()), policyAdapter.getPolicyType(), policyAdapter.getPolicyName(), version);
+ if (newFile == null) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("File already exists");
+ PolicyLogger.error("File alrady exists");
+ setPolicyExists(true);
+ return false;
+ }
+ policyName = newFile.getFileName().toString();
+
+ // Body is optional so checking.
+ configBodyData = policyAdapter.getConfigBodyData();
+ if (!configBodyData.equals("")) {
+ // Save the Configurations file with the policy name with extention based on selection.
+ saveConfigurations(policyName);
+ }
+
+ // Make sure the filename ends with an extension
+ if (policyName.endsWith(".xml") == false) {
+ policyName = policyName + ".xml";
+ }
+
+
+ PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+
+ configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+ configPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+ AllOfType allOfOne = new AllOfType();
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ logger.info("print the main domain value "+policyDir);
+ String path = policyDir.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ String fileName = FilenameUtils.removeExtension(policyName);
+ fileName = path + "." + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+ allOfOne.getMatch().add(createMatch("PolicyName", name));
+ AllOfType allOf = new AllOfType();
+
+ // Adding the matches to AllOfType element Match for Ecomp
+ allOf.getMatch().add(createMatch("ECOMPName", policyAdapter.getEcompName()));
+ // Match for riskType
+ allOf.getMatch().add(
+ createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+ // Match for riskLevel
+ allOf.getMatch().add(
+ createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+ // Match for riskguard
+ allOf.getMatch().add(
+ createDynamicMatch("guard", policyAdapter.getGuard()));
+ // Match for ttlDate
+ allOf.getMatch().add(
+ createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+ // Match for ConfigName
+ allOf.getMatch().add(createMatch("ConfigName", policyAdapter.getConfigName()));
+
+ Map<String, String> dynamicFieldConfigAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+
+ // If there is any dynamic field create the matches here
+ for (String keyField : dynamicFieldConfigAttributes.keySet()) {
+ String key = keyField;
+ String value = dynamicFieldConfigAttributes.get(key);
+ MatchType dynamicMatch = createDynamicMatch(key, value);
+ allOf.getMatch().add(dynamicMatch);
+ }
+
+ AnyOfType anyOf = new AnyOfType();
+ anyOf.getAllOf().add(allOfOne);
+ anyOf.getAllOf().add(allOf);
+
+ TargetType target = new TargetType();
+ ((TargetType) target).getAnyOf().add(anyOf);
+
+ // Adding the target to the policy element
+ configPolicy.setTarget((TargetType) target);
+
+ RuleType rule = new RuleType();
+ rule.setRuleId(policyAdapter.getRuleID());
+
+ rule.setEffect(EffectType.PERMIT);
+
+ // Create Target in Rule
+ AllOfType allOfInRule = new AllOfType();
+
+ // Creating match for ACCESS in rule target
+ MatchType accessMatch = new MatchType();
+ AttributeValueType accessAttributeValue = new AttributeValueType();
+ accessAttributeValue.setDataType(STRING_DATATYPE);
+ accessAttributeValue.getContent().add("ACCESS");
+ accessMatch.setAttributeValue(accessAttributeValue);
+ AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+ URI accessURI = null;
+ try {
+ accessURI = new URI(ACTION_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "ConfigPolicy", "Exception creating ACCESS URI");
+ }
+ accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+ accessAttributeDesignator.setDataType(STRING_DATATYPE);
+ accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+ accessMatch.setAttributeDesignator(accessAttributeDesignator);
+ accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ // Creating Config Match in rule Target
+ MatchType configMatch = new MatchType();
+ AttributeValueType configAttributeValue = new AttributeValueType();
+ configAttributeValue.setDataType(STRING_DATATYPE);
+ configAttributeValue.getContent().add("Config");
+ configMatch.setAttributeValue(configAttributeValue);
+ AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+ URI configURI = null;
+ try {
+ configURI = new URI(RESOURCE_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "ConfigPolicy", "Exception creating Config URI");
+ }
+ configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+ configAttributeDesignator.setDataType(STRING_DATATYPE);
+ configAttributeDesignator.setAttributeId(new IdentifierImpl(configURI).stringValue());
+ configMatch.setAttributeDesignator(configAttributeDesignator);
+ configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ allOfInRule.getMatch().add(accessMatch);
+ allOfInRule.getMatch().add(configMatch);
+
+ AnyOfType anyOfInRule = new AnyOfType();
+ anyOfInRule.getAllOf().add(allOfInRule);
+
+ TargetType targetInRule = new TargetType();
+ targetInRule.getAnyOf().add(anyOfInRule);
+
+ rule.setTarget(targetInRule);
+ rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+ configPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+ policyAdapter.setPolicyData(configPolicy);
+
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ PolicyLogger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ }
+ setPreparedToSave(true);
+ return true;
+ }
+
+ // Data required for Advice part is setting here.
+ private AdviceExpressionsType getAdviceExpressions(int version, String fileName) {
+ AdviceExpressionsType advices = new AdviceExpressionsType();
+ AdviceExpressionType advice = new AdviceExpressionType();
+ advice.setAdviceId("configID");
+ advice.setAppliesTo(EffectType.PERMIT);
+
+ // For Configuration
+ AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+ assignment1.setAttributeId("type");
+ assignment1.setCategory(CATEGORY_RESOURCE);
+ assignment1.setIssuer("");
+
+ AttributeValueType configNameAttributeValue = new AttributeValueType();
+ configNameAttributeValue.setDataType(STRING_DATATYPE);
+ configNameAttributeValue.getContent().add("Configuration");
+ assignment1.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue));
+
+ advice.getAttributeAssignmentExpression().add(assignment1);
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+
+ // For Config file Url if configurations are provided.
+ if (policyAdapter.getConfigType() != null) {
+ AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+ assignment2.setAttributeId("URLID");
+ assignment2.setCategory(CATEGORY_RESOURCE);
+ assignment2.setIssuer("");
+
+ AttributeValueType AttributeValue = new AttributeValueType();
+ AttributeValue.setDataType(URI_DATATYPE);
+ String policyDir1 = policyAdapter.getParentPath().toString();
+ int startIndex1 = policyDir1.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+ logger.info("print the main domain value"+policyDir1);
+ String path = policyDir1.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir1.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+
+ String content = "$URL" + "/Config/" + path + "." + getConfigFile(policyName);
+ System.out.println("URL value :" + content);
+ AttributeValue.getContent().add(content);
+ assignment2.setExpression(new ObjectFactory().createAttributeValue(AttributeValue));
+
+ advice.getAttributeAssignmentExpression().add(assignment2);
+ AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+ assignment3.setAttributeId("PolicyName");
+ assignment3.setCategory(CATEGORY_RESOURCE);
+ assignment3.setIssuer("");
+
+ AttributeValueType attributeValue3 = new AttributeValueType();
+ attributeValue3.setDataType(STRING_DATATYPE);
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ StringTokenizer tokenizer = null;
+ StringBuffer buffer = new StringBuffer();
+ if (policyDir.contains("\\")) {
+ tokenizer = new StringTokenizer(policyDir, "\\");
+ } else {
+ tokenizer = new StringTokenizer(policyDir, "/");
+ }
+ if (tokenizer != null) {
+ while (tokenizer.hasMoreElements()) {
+ String value = tokenizer.nextToken();
+ buffer.append(value);
+ buffer.append(".");
+ }
+ }
+ fileName = FilenameUtils.removeExtension(fileName);
+ fileName = buffer.toString() + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+ attributeValue3.getContent().add(name);
+ assignment3.setExpression(new ObjectFactory().createAttributeValue(attributeValue3));
+ advice.getAttributeAssignmentExpression().add(assignment3);
+
+ AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+ assignment4.setAttributeId("VersionNumber");
+ assignment4.setCategory(CATEGORY_RESOURCE);
+ assignment4.setIssuer("");
+
+ AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+ configNameAttributeValue4.setDataType(STRING_DATATYPE);
+ configNameAttributeValue4.getContent().add(Integer.toString(version));
+ assignment4.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue4));
+
+ advice.getAttributeAssignmentExpression().add(assignment4);
+
+ AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+ assignment5.setAttributeId("matching:" + this.ECOMPID);
+ assignment5.setCategory(CATEGORY_RESOURCE);
+ assignment5.setIssuer("");
+
+ AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+ configNameAttributeValue5.setDataType(STRING_DATATYPE);
+ configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+ assignment5.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue5));
+
+ advice.getAttributeAssignmentExpression().add(assignment5);
+
+ AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+ assignment6.setAttributeId("matching:" + this.CONFIGID);
+ assignment6.setCategory(CATEGORY_RESOURCE);
+ assignment6.setIssuer("");
+
+ AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+ configNameAttributeValue6.setDataType(STRING_DATATYPE);
+ configNameAttributeValue6.getContent().add(policyAdapter.getConfigName());
+ assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+
+ advice.getAttributeAssignmentExpression().add(assignment6);
+
+ Map<String, String> dynamicFieldConfigAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+ for (String keyField : dynamicFieldConfigAttributes.keySet()) {
+ String key = keyField;
+ String value = dynamicFieldConfigAttributes.get(key);
+ AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+ assignment7.setAttributeId("matching:" + key);
+ assignment7.setCategory(CATEGORY_RESOURCE);
+ assignment7.setIssuer("");
+
+ AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+ configNameAttributeValue7.setDataType(STRING_DATATYPE);
+ configNameAttributeValue7.getContent().add(value);
+ assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+ advice.getAttributeAssignmentExpression().add(assignment7);
+ }
+ }
+
+ //Risk Attributes
+ AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+ assignment8.setAttributeId("RiskType");
+ assignment8.setCategory(CATEGORY_RESOURCE);
+ assignment8.setIssuer("");
+
+ AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+ configNameAttributeValue8.setDataType(STRING_DATATYPE);
+ configNameAttributeValue8.getContent().add(policyAdapter.getRiskType());
+ assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+ advice.getAttributeAssignmentExpression().add(assignment8);
+
+ AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+ assignment9.setAttributeId("RiskLevel");
+ assignment9.setCategory(CATEGORY_RESOURCE);
+ assignment9.setIssuer("");
+
+ AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+ configNameAttributeValue9.setDataType(STRING_DATATYPE);
+ configNameAttributeValue9.getContent().add(policyAdapter.getRiskLevel());
+ assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+ advice.getAttributeAssignmentExpression().add(assignment9);
+
+ AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+ assignment10.setAttributeId("guard");
+ assignment10.setCategory(CATEGORY_RESOURCE);
+ assignment10.setIssuer("");
+
+ AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+ configNameAttributeValue10.setDataType(STRING_DATATYPE);
+ configNameAttributeValue10.getContent().add(policyAdapter.getGuard());
+ assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+ advice.getAttributeAssignmentExpression().add(assignment10);
+
+ AttributeAssignmentExpressionType assignment11 = new AttributeAssignmentExpressionType();
+ assignment11.setAttributeId("TTLDate");
+ assignment11.setCategory(CATEGORY_RESOURCE);
+ assignment11.setIssuer("");
+
+ AttributeValueType configNameAttributeValue11 = new AttributeValueType();
+ configNameAttributeValue11.setDataType(STRING_DATATYPE);
+ configNameAttributeValue11.getContent().add(policyAdapter.getTtlDate());
+ assignment11.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue11));
+
+ advice.getAttributeAssignmentExpression().add(assignment11);
+
+
+ advices.getAdviceExpression().add(advice);
+ return advices;
+ }
+
+ @Override
+ public Object getCorrectPolicyDataObject() {
+ return policyAdapter.getPolicyData();
+ }
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsParamPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsParamPolicy.java
new file mode 100644
index 000000000..6e18da524
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsParamPolicy.java
@@ -0,0 +1,896 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+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.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.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 org.apache.commons.io.FilenameUtils;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.rest.XACMLRestProperties;
+
+import com.att.research.xacml.std.IdentifierImpl;
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class CreateBrmsParamPolicy extends Policy {
+ /**
+ * Config Fields
+ */
+ private static final Logger logger = FlexLogger
+ .getLogger(CreateBrmsParamPolicy.class);
+
+ /*
+ * These are the parameters needed for DB access from the PAP
+ */
+ private static String papDbDriver = null;
+ private static String papDbUrl = null;
+ private static String papDbUser = null;
+ private static String papDbPassword = null;
+
+ public CreateBrmsParamPolicy() {
+ super();
+ }
+
+ public CreateBrmsParamPolicy(PolicyRestAdapter policyAdapter) {
+ this.policyAdapter = policyAdapter;
+ this.policyAdapter.setConfigType(policyAdapter.getConfigType());
+
+ }
+
+ public String expandConfigBody(String ruleContents,
+ Map<String, String> brmsParamBody
+ ) {
+
+ Set<String> keySet= new HashSet<String>();
+
+ Map<String,String> copyMap=new HashMap<>();
+ copyMap.putAll(brmsParamBody);
+ copyMap.put("policyName", policyAdapter.getPolicyName());
+ copyMap.put("policyScope", policyAdapter.getPolicyScope());
+ copyMap.put("policyVersion",policyAdapter.getHighestVersion().toString());
+
+ //Finding all the keys in the Map data-structure.
+ keySet= copyMap.keySet();
+ Iterator<String> iterator = keySet.iterator();
+ Pattern p;
+ Matcher m;
+ while(iterator.hasNext()) {
+ //Converting the first character of the key into a lower case.
+ String input= iterator.next();
+ String output = Character.toLowerCase(input.charAt(0)) +
+ (input.length() > 1 ? input.substring(1) : "");
+ //Searching for a pattern in the String using the key.
+ p=Pattern.compile("\\$\\{"+output+"\\}");
+ m=p.matcher(ruleContents);
+ //Replacing the value with the inputs provided by the user in the editor.
+ String finalInput = copyMap.get(input);
+ if(finalInput.contains("$")){
+ finalInput = finalInput.replace("$", "\\$");
+ }
+ ruleContents=m.replaceAll(finalInput);
+ }
+ System.out.println(ruleContents);
+ return ruleContents;
+ }
+
+ // Saving the Configurations file at server location for config policy.
+ protected void saveConfigurations(String policyName, String prevPolicyName,
+ String ruleBody) {
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath()
+ .toString());
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString())
+ + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ logger.info("print the main domain value" + policyDir);
+ String path = policyDir.replace('\\', '.');
+ if (path.contains("/")) {
+ path = policyDir.replace('/', '.');
+ logger.info("print the path:" + path);
+ }
+
+
+ String configFileName = getConfigFile(policyName);
+ try{
+ // Getting the previous policy Config Json file to be used for
+ // updating the dictionary tables
+ if (policyAdapter.isEditPolicy()) {
+
+ String prevConfigFileName = getConfigFile(prevPolicyName);
+
+ File oldFile;
+ if (CONFIG_HOME.contains("\\")) {
+ oldFile = new File(CONFIG_HOME + "\\" + path + "."
+ + prevConfigFileName);
+ } else {
+ oldFile = new File(CONFIG_HOME + "/" + path + "."
+ + prevConfigFileName);
+ }
+
+ String filepath = oldFile.toString();
+
+ String prevJsonBody = readFile(filepath, StandardCharsets.UTF_8);
+ policyAdapter.setPrevJsonBody(prevJsonBody);
+ }
+
+ File configHomeDir = new File(CONFIG_HOME);
+ File[] listOfFiles = configHomeDir.listFiles();
+ if (listOfFiles != null) {
+ for (File eachFile : listOfFiles) {
+ if (eachFile.isFile()) {
+ String fileNameWithoutExtension = FilenameUtils
+ .removeExtension(eachFile.getName());
+ String configFileNameWithoutExtension = FilenameUtils
+ .removeExtension(configFileName);
+ if (fileNameWithoutExtension
+ .equals(configFileNameWithoutExtension)) {
+ // delete the file
+ eachFile.delete();
+ }
+ }
+ }
+ }
+ }
+ catch(IOException e){
+
+ }
+ try {
+
+ if (policyName.endsWith(".xml")) {
+ policyName = policyName.substring(0,
+ policyName.lastIndexOf(".xml"));
+ }
+ PrintWriter out = new PrintWriter(CONFIG_HOME + File.separator
+ + path + "." + policyName + ".txt");
+ String expandedBody=expandConfigBody(ruleBody,policyAdapter.getBrmsParamBody());
+ out.println(expandedBody);
+ out.close();
+
+ } catch (Exception e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "CreateBrmsParamPolicy", "Exception saving configuration file");
+ }
+ }
+
+ // Utility to read json data from the existing file to a string
+ static String readFile(String path, Charset encoding) throws IOException {
+
+ byte[] encoded = Files.readAllBytes(Paths.get(path));
+ return new String(encoded, encoding);
+
+ }
+
+ // Here we are adding the extension for the configurations file based on the
+ // config type selection for saving.
+ private String getConfigFile(String filename) {
+ filename = FilenameUtils.removeExtension(filename);
+ if (filename.endsWith(".txt")) {
+ filename = filename.substring(0, filename.length() - 3);
+ }
+
+ filename = filename + ".txt";
+ return filename;
+ }
+
+ // Validations for Config form
+ public boolean validateConfigForm() {
+
+ // Validating mandatory Fields.
+ isValidForm = true;
+ return isValidForm;
+
+ }
+
+ @Override
+ public Map<String, String> savePolicies() throws Exception {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ if(isPolicyExists()){
+ successMap.put("EXISTS", "This Policy already exist on the PAP");
+ return successMap;
+ }
+
+ if (!isPreparedToSave()) {
+ prepareToSave();
+ }
+ // Until here we prepared the data and here calling the method to create
+ // xml.
+ Path newPolicyPath = null;
+ newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(),
+ policyName);
+
+ Boolean dbIsUpdated = true;
+
+ successMap = new HashMap<String, String>();
+ if (dbIsUpdated) {
+ successMap = createPolicy(newPolicyPath,
+ getCorrectPolicyDataObject());
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Failed to Update the Database Dictionary Tables.");
+ PolicyLogger.error("Failed to Update the Database Dictionary Tables.");
+
+ // remove the new json file
+ String jsonBody = policyAdapter.getPrevJsonBody();
+ saveConfigurations(policyName, "", jsonBody);
+ successMap.put("error", "DB UPDATE");
+ }
+
+ if (successMap.containsKey("success")) {
+ Path finalPolicyPath = getFinalPolicyPath();
+ policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+ }
+ return successMap;
+ }
+
+ private String getValueFromDictionary(String templateName){
+
+ Connection con = null;
+ Statement st = null;
+ ResultSet rs = null;
+
+ /*
+ * Retrieve the property values for db access from the xacml.pap.properties
+ */
+ papDbDriver = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_DRIVER);
+ papDbUrl = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_URL);
+ papDbUser = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_USER);
+ papDbPassword = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_PASSWORD);
+
+ String ruleTemplate=null;
+
+ try {
+ //Get DB Connection
+ Class.forName(papDbDriver);
+ con = DriverManager.getConnection(papDbUrl,papDbUser,papDbPassword);
+ st = con.createStatement();
+
+ String queryString="select rule from BRMSParamTemplate where param_template_name=\"";
+ queryString=queryString+templateName+"\"";
+
+ rs = st.executeQuery(queryString);
+ if(rs.next()){
+ ruleTemplate=rs.getString("rule");
+ }
+ rs.close();
+ }catch (ClassNotFoundException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "CreateBrmsParamPolicy", "Exception querying BRMSParamTemplate");
+ System.out.println(e.getMessage());
+
+ } catch (SQLException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "CreateBrmsParamPolicy", "Exception querying BRMSParamTemplate");
+ System.out.println(e.getMessage());
+ } finally {
+ try{
+ if (con!=null) con.close();
+ if (rs!=null) rs.close();
+ if (st!=null) st.close();
+ } catch (Exception ex){}
+ }
+ return ruleTemplate;
+
+ }
+
+ protected Map<String, String> findType(String rule) {
+ Map<String, String> mapFieldType= new HashMap<String,String>();
+ if(rule!=null){
+ try {
+ String params = "";
+ Boolean flag = false;
+ Boolean comment = false;
+ String lines[] = rule.split("\n");
+ for(String line : lines){
+ if (line.isEmpty() || line.startsWith("//")) {
+ continue;
+ }
+ if (line.startsWith("/*")) {
+ comment = true;
+ continue;
+ }
+ if (line.contains("//")) {
+ if(!(line.contains("http://") || line.contains("https://"))){
+ line = line.split("\\/\\/")[0];
+ }
+ }
+ if (line.contains("/*")) {
+ comment = true;
+ if (line.contains("*/")) {
+ try {
+ comment = false;
+ line = line.split("\\/\\*")[0]
+ + line.split("\\*\\/")[1].replace("*/", "");
+ } catch (Exception e) {
+ line = line.split("\\/\\*")[0];
+ }
+ } else {
+ line = line.split("\\/\\*")[0];
+ }
+ }
+ if (line.contains("*/")) {
+ comment = false;
+ try {
+ line = line.split("\\*\\/")[1].replace("*/", "");
+ } catch (Exception e) {
+ line = "";
+ }
+ }
+ if (comment) {
+ continue;
+ }
+ if (flag) {
+ params = params + line;
+ }
+ if (line.contains("declare Params")) {
+ params = params + line;
+ flag = true;
+ }
+ if (line.contains("end") && flag) {
+ break;
+ }
+ }
+ params = params.replace("declare Params", "").replace("end", "")
+ .replaceAll("\\s+", "");
+ String[] components = params.split(":");
+ String caption = "";
+ for (int i = 0; i < components.length; i++) {
+ String type = "";
+ if (i == 0) {
+ caption = components[i];
+ }
+ if(caption.equals("")){
+ break;
+ }
+ String nextComponent = "";
+ try {
+ nextComponent = components[i + 1];
+ } catch (Exception e) {
+ nextComponent = components[i];
+ }
+ //If the type is of type String then we add the UI Item and type to the map.
+ if (nextComponent.startsWith("String")) {
+ type = "String";
+ mapFieldType.put(caption, type);
+ caption = nextComponent.replace("String", "");
+ } else if (nextComponent.startsWith("int")) {
+ type = "int";
+ mapFieldType.put(caption, type);
+ caption = nextComponent.replace("int", "");
+ }
+ }
+ } catch (Exception e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+ PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "CreateBrmsParamPolicy", "Exception parsing file in findType");
+ }
+ }
+ return mapFieldType;
+ }
+
+ // 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 Exception {
+
+ if (isPreparedToSave()) {
+ // we have already done this
+ return true;
+ }
+
+ int version = 0;
+ String policyID = policyAdapter.getPolicyID();
+
+ if (policyAdapter.isEditPolicy()) {
+ // version = Integer.parseInt(policyAdapter.getVersion()) + 1;
+ version = policyAdapter.getHighestVersion() + 1;
+ } else {
+ version = 1;
+ }
+
+ // Create the Instance for pojo, PolicyType object is used in
+ // marshalling.
+ if (policyAdapter.getPolicyType().equals("Config")) {
+ PolicyType policyConfig = new PolicyType();
+
+ policyConfig.setVersion(Integer.toString(version));
+ policyConfig.setPolicyId(policyID);
+ policyConfig.setTarget(new TargetType());
+ policyAdapter.setData(policyConfig);
+ }
+
+ if (policyAdapter.getData() != null) {
+
+ // Save off everything
+ // making ready all the required elements to generate the action
+ // policy xml.
+ // Get the uniqueness for policy name.
+ String prevPolicyName = null;
+ if (policyAdapter.isEditPolicy()) {
+ prevPolicyName = "Config_BRMS_Param_" + policyAdapter.getPolicyName()
+ + "." + policyAdapter.getHighestVersion() + ".xml";
+ }
+
+ Path newFile = getNextFilename(
+ Paths.get(policyAdapter.getParentPath().toString()),
+ (policyAdapter.getPolicyType() + "_BRMS_Param"),
+ policyAdapter.getPolicyName(), version);
+
+ if (newFile == null) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Policy already Exists, cannot create the policy.");
+ PolicyLogger.error("Policy already Exists, cannot create the policy.");
+ setPolicyExists(true);
+ return false;
+ }
+ policyName = newFile.getFileName().toString();
+
+
+ Map<String,String> ruleAndUIValue= policyAdapter.getBrmsParamBody();
+ String tempateValue= ruleAndUIValue.get("templateName");
+ String valueFromDictionary= getValueFromDictionary(tempateValue);
+
+ //Get the type of the UI Fields.
+ Map<String,String> typeOfUIField=findType(valueFromDictionary);
+ String generatedRule=null;
+ String body = "";
+
+ try {
+
+ try {
+ body = "/* Autogenerated Code Please Don't change/remove this comment section. This is for the UI purpose. \n\t " +
+ "<$%BRMSParamTemplate=" + tempateValue + "%$> \n */ \n";
+ body = body + valueFromDictionary + "\n";
+ generatedRule = "rule \"Params\" \n\tsalience 1000 \n\twhen\n\tthen\n\t\tParams params = new Params();";
+
+ //We first read the map data structure(ruleAndUIValue) received from the PAP-ADMIN
+ //We ignore if the key is "templateName as we are interested only in the UI fields and its value.
+ //We have one more map data structure(typeOfUIField) created by parsing the Drools rule.
+ //From the type of the UI field(String/int) we structure whether to put the "" or not.
+ for (Map.Entry<String, String> entry : ruleAndUIValue.entrySet()) {
+ if(entry.getKey()!="templateName")
+ {
+ for(Map.Entry<String, String> fieldType:typeOfUIField.entrySet())
+ {
+ if(fieldType.getKey().equalsIgnoreCase(entry.getKey()))
+ {
+ String key = entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1);
+ if(fieldType.getValue()=="String")
+ {
+ //Type is String
+ generatedRule = generatedRule + "\n\t\tparams.set"
+ + key + "(\""
+ + entry.getValue() + "\");";
+ }
+ else{
+ generatedRule = generatedRule + "\n\t\tparams.set"
+ + key + "("
+ + entry.getValue() + ");";
+ }
+ }
+ }
+ }
+ }
+
+ generatedRule = generatedRule
+ + "\n\t\tinsert(params);\nend";
+ logger.info("New rule generated with :" + generatedRule);
+ body = body + generatedRule;
+ } catch (Exception e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "CreateBrmsParamPolicy", "Exception saving policy");
+ }
+ }
+ catch (Exception e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "CreateBrmsParamPolicy", "Exception saving policy");
+ }
+
+ saveConfigurations(policyName,prevPolicyName,body);
+
+ // Make sure the filename ends with an extension
+ if (policyName.endsWith(".xml") == false) {
+ policyName = policyName + ".xml";
+ }
+
+ PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+
+ configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+ configPolicy.setRuleCombiningAlgId(policyAdapter
+ .getRuleCombiningAlgId());
+
+ AllOfType allOfOne = new AllOfType();
+ File policyFilePath = new File(policyAdapter.getParentPath()
+ .toString(), policyName);
+ String policyDir = policyFilePath.getParentFile().getName();
+ String fileName = FilenameUtils.removeExtension(policyName);
+ fileName = policyDir + "." + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1,
+ fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1,
+ fileName.length());
+ }
+ allOfOne.getMatch().add(createMatch("PolicyName", name));
+
+
+ AllOfType allOf = new AllOfType();
+
+ // Match for ECOMPName
+ allOf.getMatch().add(
+ createMatch("ECOMPName", policyAdapter.getEcompName()));
+ allOf.getMatch().add(
+ createMatch("ConfigName", policyAdapter.getConfigName()));
+ // Match for riskType
+ allOf.getMatch().add(
+ createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+ // Match for riskLevel
+ allOf.getMatch().add(
+ createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+ // Match for riskguard
+ allOf.getMatch().add(
+ createDynamicMatch("guard", policyAdapter.getGuard()));
+ // Match for ttlDate
+ allOf.getMatch().add(
+ createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+ AnyOfType anyOf = new AnyOfType();
+ anyOf.getAllOf().add(allOfOne);
+ anyOf.getAllOf().add(allOf);
+
+ TargetType target = new TargetType();
+ ((TargetType) target).getAnyOf().add(anyOf);
+
+ // Adding the target to the policy element
+ configPolicy.setTarget((TargetType) target);
+
+ RuleType rule = new RuleType();
+ rule.setRuleId(policyAdapter.getRuleID());
+
+ rule.setEffect(EffectType.PERMIT);
+
+ // Create Target in Rule
+ AllOfType allOfInRule = new AllOfType();
+
+ // Creating match for ACCESS in rule target
+ MatchType accessMatch = new MatchType();
+ AttributeValueType accessAttributeValue = new AttributeValueType();
+ accessAttributeValue.setDataType(STRING_DATATYPE);
+ accessAttributeValue.getContent().add("ACCESS");
+ accessMatch.setAttributeValue(accessAttributeValue);
+ AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+ URI accessURI = null;
+ try {
+ accessURI = new URI(ACTION_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE
+ //+ e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateBrmsParamPolicy", "Exception creating ACCESS URI");
+ }
+ accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+ accessAttributeDesignator.setDataType(STRING_DATATYPE);
+ accessAttributeDesignator.setAttributeId(new IdentifierImpl(
+ accessURI).stringValue());
+ accessMatch.setAttributeDesignator(accessAttributeDesignator);
+ accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ // Creating Config Match in rule Target
+ MatchType configMatch = new MatchType();
+ AttributeValueType configAttributeValue = new AttributeValueType();
+ configAttributeValue.setDataType(STRING_DATATYPE);
+
+ configAttributeValue.getContent().add("Config");
+
+ configMatch.setAttributeValue(configAttributeValue);
+ AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+ URI configURI = null;
+ try {
+ configURI = new URI(RESOURCE_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE
+ //+ e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateBrmsParamPolicy", "Exception creating Config URI");
+ }
+
+ configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+ configAttributeDesignator.setDataType(STRING_DATATYPE);
+ configAttributeDesignator.setAttributeId(new IdentifierImpl(
+ configURI).stringValue());
+ configMatch.setAttributeDesignator(configAttributeDesignator);
+ configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ allOfInRule.getMatch().add(accessMatch);
+ allOfInRule.getMatch().add(configMatch);
+
+ AnyOfType anyOfInRule = new AnyOfType();
+ anyOfInRule.getAllOf().add(allOfInRule);
+
+ TargetType targetInRule = new TargetType();
+ targetInRule.getAnyOf().add(anyOfInRule);
+
+ rule.setTarget(targetInRule);
+ rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+ configPolicy
+ .getCombinerParametersOrRuleCombinerParametersOrVariableDefinition()
+ .add(rule);
+ policyAdapter.setPolicyData(configPolicy);
+
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Unsupported data object."
+ //+ policyAdapter.getData().getClass().getCanonicalName());
+ PolicyLogger.error("Unsupported data object."
+ + policyAdapter.getData().getClass().getCanonicalName());
+ }
+ setPreparedToSave(true);
+ return true;
+ }
+
+ // Data required for Advice part is setting here.
+ private AdviceExpressionsType getAdviceExpressions(int version,
+ String fileName) {
+
+ //Policy Config ID Assignment
+ AdviceExpressionsType advices = new AdviceExpressionsType();
+ AdviceExpressionType advice = new AdviceExpressionType();
+ advice.setAdviceId("BRMSPARAMID");
+ advice.setAppliesTo(EffectType.PERMIT);
+ // For Configuration
+ AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+ assignment1.setAttributeId("type");
+ assignment1.setCategory(CATEGORY_RESOURCE);
+ assignment1.setIssuer("");
+ AttributeValueType configNameAttributeValue = new AttributeValueType();
+ configNameAttributeValue.setDataType(STRING_DATATYPE);
+ configNameAttributeValue.getContent().add("Configuration");
+ assignment1.setExpression(new ObjectFactory()
+ .createAttributeValue(configNameAttributeValue));
+ advice.getAttributeAssignmentExpression().add(assignment1);
+
+ // For Config file Url if configurations are provided.
+ // URL ID Assignment
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath()
+ .toString());
+ AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+ assignment2.setAttributeId("URLID");
+ assignment2.setCategory(CATEGORY_RESOURCE);
+ assignment2.setIssuer("");
+ AttributeValueType AttributeValue = new AttributeValueType();
+ AttributeValue.setDataType(URI_DATATYPE);
+ String policyDir1 = policyAdapter.getParentPath().toString();
+ int startIndex1 = policyDir1.indexOf(gitPath.toString())
+ + gitPath.toString().length() + 1;
+ policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+ logger.info("print the main domain value" + policyDir1);
+ String path = policyDir1.replace('\\', '.');
+ if (path.contains("/")) {
+ path = policyDir1.replace('/', '.');
+ logger.info("print the path:" + path);
+ }
+ String content = CONFIG_URL + "/Config/" + path + "."
+ + getConfigFile(policyName);
+
+ AttributeValue.getContent().add(content);
+ assignment2.setExpression(new ObjectFactory()
+ .createAttributeValue(AttributeValue));
+ advice.getAttributeAssignmentExpression().add(assignment2);
+
+ // Policy Name Assignment
+ AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+ assignment3.setAttributeId("PolicyName");
+ assignment3.setCategory(CATEGORY_RESOURCE);
+ assignment3.setIssuer("");
+ AttributeValueType attributeValue3 = new AttributeValueType();
+ attributeValue3.setDataType(STRING_DATATYPE);
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString())
+ + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ StringTokenizer tokenizer = null;
+ StringBuffer buffer = new StringBuffer();
+ if (policyDir.contains("\\")) {
+ tokenizer = new StringTokenizer(policyDir, "\\");
+ } else {
+ tokenizer = new StringTokenizer(policyDir, "/");
+ }
+ if (tokenizer != null) {
+ while (tokenizer.hasMoreElements()) {
+ String value = tokenizer.nextToken();
+ buffer.append(value);
+ buffer.append(".");
+ }
+ }
+ fileName = FilenameUtils.removeExtension(fileName);
+ fileName = buffer.toString() + fileName + ".xml";
+ System.out.println(fileName);
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1,
+ fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1,
+ fileName.length());
+ }
+ System.out.println(name);
+ attributeValue3.getContent().add(name);
+ assignment3.setExpression(new ObjectFactory()
+ .createAttributeValue(attributeValue3));
+ advice.getAttributeAssignmentExpression().add(assignment3);
+
+ // Version Number Assignment
+ AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+ assignment4.setAttributeId("VersionNumber");
+ assignment4.setCategory(CATEGORY_RESOURCE);
+ assignment4.setIssuer("");
+ AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+ configNameAttributeValue4.setDataType(STRING_DATATYPE);
+ configNameAttributeValue4.getContent().add(Integer.toString(version));
+ assignment4.setExpression(new ObjectFactory()
+ .createAttributeValue(configNameAttributeValue4));
+ advice.getAttributeAssignmentExpression().add(assignment4);
+
+ // Ecomp Name Assignment
+ AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+ assignment5.setAttributeId("matching:" + this.ECOMPID);
+ assignment5.setCategory(CATEGORY_RESOURCE);
+ assignment5.setIssuer("");
+ AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+ configNameAttributeValue5.setDataType(STRING_DATATYPE);
+ configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+ assignment5.setExpression(new ObjectFactory()
+ .createAttributeValue(configNameAttributeValue5));
+ advice.getAttributeAssignmentExpression().add(assignment5);
+
+
+ //Config Name Assignment
+ AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+ assignment6.setAttributeId("matching:" + this.CONFIGID);
+ assignment6.setCategory(CATEGORY_RESOURCE);
+ assignment6.setIssuer("");
+ AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+ configNameAttributeValue6.setDataType(STRING_DATATYPE);
+ configNameAttributeValue6.getContent().add(policyAdapter.getConfigName());
+ assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+ advice.getAttributeAssignmentExpression().add(assignment6);
+
+ Map<String, String> dynamicFieldConfigAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+ for (String keyField : dynamicFieldConfigAttributes.keySet()) {
+ String key = keyField;
+ String value = dynamicFieldConfigAttributes.get(key);
+ AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+ assignment7.setAttributeId("key:" + key);
+ assignment7.setCategory(CATEGORY_RESOURCE);
+ assignment7.setIssuer("");
+
+ AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+ configNameAttributeValue7.setDataType(STRING_DATATYPE);
+ configNameAttributeValue7.getContent().add(value);
+ assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+ advice.getAttributeAssignmentExpression().add(assignment7);
+ }
+
+ //Risk Attributes
+ AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+ assignment8.setAttributeId("RiskType");
+ assignment8.setCategory(CATEGORY_RESOURCE);
+ assignment8.setIssuer("");
+
+ AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+ configNameAttributeValue8.setDataType(STRING_DATATYPE);
+ configNameAttributeValue8.getContent().add(policyAdapter.getRiskType());
+ assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+ advice.getAttributeAssignmentExpression().add(assignment8);
+
+ AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+ assignment9.setAttributeId("RiskLevel");
+ assignment9.setCategory(CATEGORY_RESOURCE);
+ assignment9.setIssuer("");
+
+ AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+ configNameAttributeValue9.setDataType(STRING_DATATYPE);
+ configNameAttributeValue9.getContent().add(policyAdapter.getRiskLevel());
+ assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+ advice.getAttributeAssignmentExpression().add(assignment9);
+
+ AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+ assignment10.setAttributeId("guard");
+ assignment10.setCategory(CATEGORY_RESOURCE);
+ assignment10.setIssuer("");
+
+ AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+ configNameAttributeValue10.setDataType(STRING_DATATYPE);
+ configNameAttributeValue10.getContent().add(policyAdapter.getGuard());
+ assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+ advice.getAttributeAssignmentExpression().add(assignment10);
+
+ AttributeAssignmentExpressionType assignment11 = new AttributeAssignmentExpressionType();
+ assignment11.setAttributeId("TTLDate");
+ assignment11.setCategory(CATEGORY_RESOURCE);
+ assignment11.setIssuer("");
+
+ AttributeValueType configNameAttributeValue11 = new AttributeValueType();
+ configNameAttributeValue11.setDataType(STRING_DATATYPE);
+ configNameAttributeValue11.getContent().add(policyAdapter.getTtlDate());
+ assignment11.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue11));
+
+ advice.getAttributeAssignmentExpression().add(assignment11);
+
+ advices.getAdviceExpression().add(advice);
+ return advices;
+ }
+
+ @Override
+ public Object getCorrectPolicyDataObject() {
+ return policyAdapter.getData();
+ }
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsRawPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsRawPolicy.java
new file mode 100644
index 000000000..d77abf0f1
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsRawPolicy.java
@@ -0,0 +1,661 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+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.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.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 org.apache.commons.io.FilenameUtils;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+
+public class CreateBrmsRawPolicy extends Policy {
+ /**
+ * Config Fields
+ */
+ private static final Logger logger = FlexLogger
+ .getLogger(CreateBrmsRawPolicy.class);
+
+ public static final String JSON_CONFIG = "JSON";
+ public static final String XML_CONFIG = "XML";
+ public static final String PROPERTIES_CONFIG = "PROPERTIES";
+ public static final String OTHER_CONFIG = "OTHER";
+
+ public CreateBrmsRawPolicy() {
+ super();
+ }
+
+ public CreateBrmsRawPolicy(PolicyRestAdapter policyAdapter) {
+ this.policyAdapter = policyAdapter;
+ this.policyAdapter.setConfigType(policyAdapter.getConfigType());
+
+ }
+
+ // Saving the Configurations file at server location for config policy.
+ protected void saveConfigurations(String policyName, String prevPolicyName,
+ String jsonBody) {
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath()
+ .toString());
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString())
+ + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ logger.info("print the main domain value" + policyDir);
+ String path = policyDir.replace('\\', '.');
+ if (path.contains("/")) {
+ path = policyDir.replace('/', '.');
+ logger.info("print the path:" + path);
+ }
+
+ try {
+ String configFileName = getConfigFile(policyName);
+
+ File file;
+ if (CONFIG_HOME.contains("\\")) {
+ file = new File(CONFIG_HOME + "\\" + path + "."
+ + configFileName);
+ } else {
+ file = new File(CONFIG_HOME + "/" + path + "." + configFileName);
+ }
+
+ // if file doesnt exists, then create it
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+
+ // Getting the previous policy Config Json file to be used for
+ // updating the dictionary tables
+ if (policyAdapter.isEditPolicy()) {
+
+ String prevConfigFileName = getConfigFile(prevPolicyName);
+
+ File oldFile;
+ if (CONFIG_HOME.contains("\\")) {
+ oldFile = new File(CONFIG_HOME + "\\" + path + "."
+ + prevConfigFileName);
+ } else {
+ oldFile = new File(CONFIG_HOME + "/" + path + "."
+ + prevConfigFileName);
+ }
+
+ String filepath = oldFile.toString();
+
+ String prevJsonBody = readFile(filepath, StandardCharsets.UTF_8);
+ policyAdapter.setPrevJsonBody(prevJsonBody);
+ }
+
+ File configHomeDir = new File(CONFIG_HOME);
+ File[] listOfFiles = configHomeDir.listFiles();
+ if (listOfFiles != null) {
+ for (File eachFile : listOfFiles) {
+ if (eachFile.isFile()) {
+ String fileNameWithoutExtension = FilenameUtils
+ .removeExtension(eachFile.getName());
+ String configFileNameWithoutExtension = FilenameUtils
+ .removeExtension(configFileName);
+ if (fileNameWithoutExtension
+ .equals(configFileNameWithoutExtension)) {
+ // delete the file
+ eachFile.delete();
+ }
+ }
+ }
+ }
+
+ /*FileWriter fw = new FileWriter(file.getAbsoluteFile());
+ BufferedWriter bw = new BufferedWriter(fw);
+ bw.write(jsonBody);
+ bw.close();
+ if (logger.isDebugEnabled()) {
+ logger.debug("Configuration is succesfully saved");
+ }*/
+
+ try {
+
+ if (policyName.endsWith(".xml")) {
+ policyName = policyName.substring(0,
+ policyName.lastIndexOf(".xml"));
+ }
+ PrintWriter out = new PrintWriter(CONFIG_HOME + File.separator
+ + path + "." + policyName + ".txt");
+ out.println(jsonBody);
+ out.close();
+
+ } catch (Exception e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "CreateBrmsRawPolicy", "Exception saving configurations file");
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Utility to read json data from the existing file to a string
+ static String readFile(String path, Charset encoding) throws IOException {
+
+ byte[] encoded = Files.readAllBytes(Paths.get(path));
+ return new String(encoded, encoding);
+
+ }
+
+ // Here we are adding the extension for the configurations file based on the
+ // config type selection for saving.
+ private String getConfigFile(String filename) {
+ filename = FilenameUtils.removeExtension(filename);
+ if (filename.endsWith(".txt")) {
+ filename = filename.substring(0, filename.length() - 3);
+ }
+
+ filename = filename + ".txt";
+ return filename;
+ }
+
+ // Validations for Config form
+ public boolean validateConfigForm() {
+
+ // Validating mandatory Fields.
+ isValidForm = true;
+ return isValidForm;
+
+ }
+
+ @Override
+ public Map<String, String> savePolicies() throws Exception {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ if(isPolicyExists()){
+ successMap.put("EXISTS", "This Policy already exist on the PAP");
+ return successMap;
+ }
+
+ if (!isPreparedToSave()) {
+ prepareToSave();
+ }
+ // Until here we prepared the data and here calling the method to create
+ // xml.
+ Path newPolicyPath = null;
+ newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(),
+ policyName);
+
+ Boolean dbIsUpdated = true;
+
+ successMap = new HashMap<String, String>();
+ if (dbIsUpdated) {
+ successMap = createPolicy(newPolicyPath,
+ getCorrectPolicyDataObject());
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Failed to Update the Database Dictionary Tables.");
+ PolicyLogger.error("Failed to Update the Database Dictionary Tables.");
+
+ // remove the new json file
+ String jsonBody = policyAdapter.getPrevJsonBody();
+ saveConfigurations(policyName, "", jsonBody);
+ successMap.put("error", "DB UPDATE");
+ }
+
+ if (successMap.containsKey("success")) {
+ Path finalPolicyPath = getFinalPolicyPath();
+ policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+ }
+ 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
+ @Override
+ public boolean prepareToSave() throws Exception {
+
+ if (isPreparedToSave()) {
+ // we have already done this
+ return true;
+ }
+
+ int version = 0;
+ String policyID = policyAdapter.getPolicyID();
+
+ if (policyAdapter.isEditPolicy()) {
+ // version = Integer.parseInt(policyAdapter.getVersion()) + 1;
+ version = policyAdapter.getHighestVersion() + 1;
+ } else {
+ version = 1;
+ }
+
+ // Create the Instance for pojo, PolicyType object is used in
+ // marshalling.
+ if (policyAdapter.getPolicyType().equals("Config")) {
+ PolicyType policyConfig = new PolicyType();
+
+ policyConfig.setVersion(Integer.toString(version));
+ policyConfig.setPolicyId(policyID);
+ policyConfig.setTarget(new TargetType());
+ policyAdapter.setData(policyConfig);
+ }
+
+ if (policyAdapter.getData() != null) {
+
+ // Save off everything
+ // making ready all the required elements to generate the action
+ // policy xml.
+ // Get the uniqueness for policy name.
+ String prevPolicyName = null;
+ if (policyAdapter.isEditPolicy()) {
+ prevPolicyName = "Config_BRMS_Raw_" + policyAdapter.getPolicyName()
+ + "." + policyAdapter.getHighestVersion() + ".xml";
+ }
+ //if (!policyAdapter.isEditPolicy()) {
+ Path newFile = getNextFilename(
+ Paths.get(policyAdapter.getParentPath().toString()),
+ (policyAdapter.getPolicyType() + "_BRMS_Raw"),
+ policyAdapter.getPolicyName(), version);
+
+ if (newFile == null) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("File already exists, cannot create the policy.");
+ PolicyLogger.error("File already exists, cannot create the policy.");
+ setPolicyExists(true);
+ return false;
+ }
+ policyName = newFile.getFileName().toString();
+ //}
+
+ //String jsonBody = policyAdapter.getJsonBody();
+ String configBody=policyAdapter.getConfigBodyData();
+ saveConfigurations(policyName, prevPolicyName, configBody);
+
+ // Make sure the filename ends with an extension
+ if (policyName.endsWith(".xml") == false) {
+ policyName = policyName + ".xml";
+ }
+
+ PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+
+ configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+ configPolicy.setRuleCombiningAlgId(policyAdapter
+ .getRuleCombiningAlgId());
+
+ AllOfType allOfOne = new AllOfType();
+ File policyFilePath = new File(policyAdapter.getParentPath()
+ .toString(), policyName);
+ String policyDir = policyFilePath.getParentFile().getName();
+ String fileName = FilenameUtils.removeExtension(policyName);
+ fileName = policyDir + "." + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1,
+ fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1,
+ fileName.length());
+ }
+ allOfOne.getMatch().add(createMatch("PolicyName", name));
+
+
+ AllOfType allOf = new AllOfType();
+
+ // Match for ECOMPName
+ allOf.getMatch().add(
+ createMatch("ECOMPName", policyAdapter.getEcompName()));
+ allOf.getMatch().add(
+ createMatch("ConfigName", policyAdapter.getConfigName()));
+ // Match for riskType
+ allOf.getMatch().add(
+ createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+ // Match for riskLevel
+ allOf.getMatch().add(
+ createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+ // Match for riskguard
+ allOf.getMatch().add(
+ createDynamicMatch("guard", policyAdapter.getGuard()));
+ // Match for ttlDate
+ allOf.getMatch().add(
+ createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+ AnyOfType anyOf = new AnyOfType();
+ anyOf.getAllOf().add(allOfOne);
+ anyOf.getAllOf().add(allOf);
+
+ TargetType target = new TargetType();
+ ((TargetType) target).getAnyOf().add(anyOf);
+
+ // Adding the target to the policy element
+ configPolicy.setTarget((TargetType) target);
+
+ RuleType rule = new RuleType();
+ rule.setRuleId(policyAdapter.getRuleID());
+
+ rule.setEffect(EffectType.PERMIT);
+
+ // Create Target in Rule
+ AllOfType allOfInRule = new AllOfType();
+
+ // Creating match for ACCESS in rule target
+ MatchType accessMatch = new MatchType();
+ AttributeValueType accessAttributeValue = new AttributeValueType();
+ accessAttributeValue.setDataType(STRING_DATATYPE);
+ accessAttributeValue.getContent().add("ACCESS");
+ accessMatch.setAttributeValue(accessAttributeValue);
+ AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+ URI accessURI = null;
+ try {
+ accessURI = new URI(ACTION_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE
+ //+ e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateBrmsRawPolicy", "Exception creating ACCESS URI");
+ }
+ accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+ accessAttributeDesignator.setDataType(STRING_DATATYPE);
+ accessAttributeDesignator.setAttributeId(new IdentifierImpl(
+ accessURI).stringValue());
+ accessMatch.setAttributeDesignator(accessAttributeDesignator);
+ accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ // Creating Config Match in rule Target
+ MatchType configMatch = new MatchType();
+ AttributeValueType configAttributeValue = new AttributeValueType();
+ configAttributeValue.setDataType(STRING_DATATYPE);
+
+ configAttributeValue.getContent().add("Config");
+
+ configMatch.setAttributeValue(configAttributeValue);
+ AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+ URI configURI = null;
+ try {
+ configURI = new URI(RESOURCE_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE
+ //+ e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateBrmsRawPolicy", "Exception creating Config URI");
+ }
+
+ configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+ configAttributeDesignator.setDataType(STRING_DATATYPE);
+ configAttributeDesignator.setAttributeId(new IdentifierImpl(
+ configURI).stringValue());
+ configMatch.setAttributeDesignator(configAttributeDesignator);
+ configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ allOfInRule.getMatch().add(accessMatch);
+ allOfInRule.getMatch().add(configMatch);
+
+ AnyOfType anyOfInRule = new AnyOfType();
+ anyOfInRule.getAllOf().add(allOfInRule);
+
+ TargetType targetInRule = new TargetType();
+ targetInRule.getAnyOf().add(anyOfInRule);
+
+ rule.setTarget(targetInRule);
+ rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+ configPolicy
+ .getCombinerParametersOrRuleCombinerParametersOrVariableDefinition()
+ .add(rule);
+ policyAdapter.setPolicyData(configPolicy);
+
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Unsupported data object."
+ //+ policyAdapter.getData().getClass().getCanonicalName());
+ PolicyLogger.error("Unsupported data object."
+ + policyAdapter.getData().getClass().getCanonicalName());
+ }
+ setPreparedToSave(true);
+ return true;
+ }
+
+ // Data required for Advice part is setting here.
+ private AdviceExpressionsType getAdviceExpressions(int version,
+ String fileName) {
+
+ // Policy Config ID Assignment
+ AdviceExpressionsType advices = new AdviceExpressionsType();
+ AdviceExpressionType advice = new AdviceExpressionType();
+ advice.setAdviceId("BRMSRAWID");
+ advice.setAppliesTo(EffectType.PERMIT);
+ // For Configuration
+ AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+ assignment1.setAttributeId("type");
+ assignment1.setCategory(CATEGORY_RESOURCE);
+ assignment1.setIssuer("");
+ AttributeValueType configNameAttributeValue = new AttributeValueType();
+ configNameAttributeValue.setDataType(STRING_DATATYPE);
+ configNameAttributeValue.getContent().add("Configuration");
+ assignment1.setExpression(new ObjectFactory()
+ .createAttributeValue(configNameAttributeValue));
+ advice.getAttributeAssignmentExpression().add(assignment1);
+
+ // For Config file Url if configurations are provided.
+ // URL ID Assignment
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath()
+ .toString());
+ AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+ assignment2.setAttributeId("URLID");
+ assignment2.setCategory(CATEGORY_RESOURCE);
+ assignment2.setIssuer("");
+ AttributeValueType AttributeValue = new AttributeValueType();
+ AttributeValue.setDataType(URI_DATATYPE);
+ String policyDir1 = policyAdapter.getParentPath().toString();
+ int startIndex1 = policyDir1.indexOf(gitPath.toString())
+ + gitPath.toString().length() + 1;
+ policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+ logger.info("print the main domain value" + policyDir1);
+ String path = policyDir1.replace('\\', '.');
+ if (path.contains("/")) {
+ path = policyDir1.replace('/', '.');
+ logger.info("print the path:" + path);
+ }
+ String content = CONFIG_URL + "/Config/" + path + "."
+ + getConfigFile(policyName);
+
+ AttributeValue.getContent().add(content);
+ assignment2.setExpression(new ObjectFactory()
+ .createAttributeValue(AttributeValue));
+ advice.getAttributeAssignmentExpression().add(assignment2);
+
+ // Policy Name Assignment
+ AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+ assignment3.setAttributeId("PolicyName");
+ assignment3.setCategory(CATEGORY_RESOURCE);
+ assignment3.setIssuer("");
+ AttributeValueType attributeValue3 = new AttributeValueType();
+ attributeValue3.setDataType(STRING_DATATYPE);
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString())
+ + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ StringTokenizer tokenizer = null;
+ StringBuffer buffer = new StringBuffer();
+ if (policyDir.contains("\\")) {
+ tokenizer = new StringTokenizer(policyDir, "\\");
+ } else {
+ tokenizer = new StringTokenizer(policyDir, "/");
+ }
+ if (tokenizer != null) {
+ while (tokenizer.hasMoreElements()) {
+ String value = tokenizer.nextToken();
+ buffer.append(value);
+ buffer.append(".");
+ }
+ }
+ fileName = FilenameUtils.removeExtension(fileName);
+ fileName = buffer.toString() + fileName + ".xml";
+ System.out.println(fileName);
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1,
+ fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1,
+ fileName.length());
+ }
+ System.out.println(name);
+ attributeValue3.getContent().add(name);
+ assignment3.setExpression(new ObjectFactory()
+ .createAttributeValue(attributeValue3));
+ advice.getAttributeAssignmentExpression().add(assignment3);
+
+ // Version Number Assignment
+ AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+ assignment4.setAttributeId("VersionNumber");
+ assignment4.setCategory(CATEGORY_RESOURCE);
+ assignment4.setIssuer("");
+ AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+ configNameAttributeValue4.setDataType(STRING_DATATYPE);
+ configNameAttributeValue4.getContent().add(Integer.toString(version));
+ assignment4.setExpression(new ObjectFactory()
+ .createAttributeValue(configNameAttributeValue4));
+ advice.getAttributeAssignmentExpression().add(assignment4);
+
+ // Ecomp Name Assignment
+ AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+ assignment5.setAttributeId("matching:" + this.ECOMPID);
+ assignment5.setCategory(CATEGORY_RESOURCE);
+ assignment5.setIssuer("");
+ AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+ configNameAttributeValue5.setDataType(STRING_DATATYPE);
+ configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+ assignment5.setExpression(new ObjectFactory()
+ .createAttributeValue(configNameAttributeValue5));
+ advice.getAttributeAssignmentExpression().add(assignment5);
+
+
+ //Config Name Assignment
+ AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+ assignment6.setAttributeId("matching:" + this.CONFIGID);
+ assignment6.setCategory(CATEGORY_RESOURCE);
+ assignment6.setIssuer("");
+ AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+ configNameAttributeValue6.setDataType(STRING_DATATYPE);
+ configNameAttributeValue6.getContent().add(policyAdapter.getConfigName());
+ assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+ advice.getAttributeAssignmentExpression().add(assignment6);
+
+ Map<String, String> dynamicFieldConfigAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+ for (String keyField : dynamicFieldConfigAttributes.keySet()) {
+ String key = keyField;
+ String value = dynamicFieldConfigAttributes.get(key);
+ AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+ assignment7.setAttributeId("key:" + key);
+ assignment7.setCategory(CATEGORY_RESOURCE);
+ assignment7.setIssuer("");
+
+ AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+ configNameAttributeValue7.setDataType(STRING_DATATYPE);
+ configNameAttributeValue7.getContent().add(value);
+ assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+ advice.getAttributeAssignmentExpression().add(assignment7);
+ }
+
+ //Risk Attributes
+ AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+ assignment8.setAttributeId("RiskType");
+ assignment8.setCategory(CATEGORY_RESOURCE);
+ assignment8.setIssuer("");
+
+ AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+ configNameAttributeValue8.setDataType(STRING_DATATYPE);
+ configNameAttributeValue8.getContent().add(policyAdapter.getRiskType());
+ assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+ advice.getAttributeAssignmentExpression().add(assignment8);
+
+ AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+ assignment9.setAttributeId("RiskLevel");
+ assignment9.setCategory(CATEGORY_RESOURCE);
+ assignment9.setIssuer("");
+
+ AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+ configNameAttributeValue9.setDataType(STRING_DATATYPE);
+ configNameAttributeValue9.getContent().add(policyAdapter.getRiskLevel());
+ assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+ advice.getAttributeAssignmentExpression().add(assignment9);
+
+ AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+ assignment10.setAttributeId("guard");
+ assignment10.setCategory(CATEGORY_RESOURCE);
+ assignment10.setIssuer("");
+
+ AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+ configNameAttributeValue10.setDataType(STRING_DATATYPE);
+ configNameAttributeValue10.getContent().add(policyAdapter.getGuard());
+ assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+ advice.getAttributeAssignmentExpression().add(assignment10);
+
+ AttributeAssignmentExpressionType assignment11 = new AttributeAssignmentExpressionType();
+ assignment11.setAttributeId("TTLDate");
+ assignment11.setCategory(CATEGORY_RESOURCE);
+ assignment11.setIssuer("");
+
+ AttributeValueType configNameAttributeValue11 = new AttributeValueType();
+ configNameAttributeValue11.setDataType(STRING_DATATYPE);
+ configNameAttributeValue11.getContent().add(policyAdapter.getTtlDate());
+ assignment11.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue11));
+
+ advice.getAttributeAssignmentExpression().add(assignment11);
+
+ advices.getAdviceExpression().add(advice);
+ return advices;
+ }
+
+ @Override
+ public Object getCorrectPolicyDataObject() {
+ return policyAdapter.getData();
+ }
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateClosedLoopPerformanceMetrics.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateClosedLoopPerformanceMetrics.java
new file mode 100644
index 000000000..578efc228
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateClosedLoopPerformanceMetrics.java
@@ -0,0 +1,506 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.json.stream.JsonGenerationException;
+
+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.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.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 org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class CreateClosedLoopPerformanceMetrics extends Policy {
+
+ /**
+ * Config Fields
+ */
+ private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+ public CreateClosedLoopPerformanceMetrics() {
+ super();
+ }
+
+ public CreateClosedLoopPerformanceMetrics(PolicyRestAdapter policyAdapter){
+ this.policyAdapter = policyAdapter;
+ }
+
+ //save configuration of the policy based on the policyname
+ private void saveConfigurations(String policyName, String prevPolicyName, String jsonBody) {
+ String domain = getParentPathSubScopeDir();
+ String path = domain.replace('\\', '.');
+ if(path.contains("/")){
+ path = domain.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ try {
+ String body = null;
+ try {
+ body = jsonBody;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ System.out.println(body);
+ if(policyName.endsWith(".xml")){
+ policyName = policyName.substring(0, policyName.lastIndexOf(".xml"));
+ }
+ PrintWriter out = new PrintWriter(CONFIG_HOME + File.separator+path + "."+ policyName +".json");
+ out.println(body);
+ out.close();
+
+ } catch (JsonGenerationException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ //getting the policy name and setting to configuration on adding .json
+ private String getConfigFile(String filename) {
+ filename = FilenameUtils.removeExtension(filename);
+ if (filename.endsWith(".xml")) {
+ filename = filename.substring(0, filename.length() - 4);
+ }
+ filename = filename +".json";
+ return filename;
+ }
+
+ @Override
+ public Map<String, String> savePolicies() throws Exception {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ if(isPolicyExists()){
+ successMap.put("EXISTS", "This Policy already exist on the PAP");
+ return successMap;
+ }
+
+ if(!isPreparedToSave()){
+ //Prep and configure the policy for saving
+ prepareToSave();
+ }
+
+ // Until here we prepared the data and here calling the method to create xml.
+ Path newPolicyPath = null;
+ newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+ successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );
+ if (successMap.containsKey("success")) {
+ Path finalPolicyPath = getFinalPolicyPath();
+ policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+ }
+ 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
+ @Override
+ public boolean prepareToSave() throws Exception{
+
+ if(isPreparedToSave()){
+ //we have already done this
+ return true;
+ }
+
+ int version = 0;
+ String policyID = policyAdapter.getPolicyID();
+
+ if (policyAdapter.isEditPolicy()) {
+ version = policyAdapter.getHighestVersion() + 1;
+ } else {
+ version = 1;
+ }
+
+ // Create the Instance for pojo, PolicyType object is used in marshalling.
+ if (policyAdapter.getPolicyType().equals("Config")) {
+ PolicyType policyConfig = new PolicyType();
+
+ policyConfig.setVersion(Integer.toString(version));
+ policyConfig.setPolicyId(policyID);
+ policyConfig.setTarget(new TargetType());
+ policyAdapter.setData(policyConfig);
+ }
+
+ if (policyAdapter.getData() != null) {
+
+ // Save off everything
+ // making ready all the required elements to generate the action policy xml.
+ // Get the uniqueness for policy name.
+ String prevPolicyName = null;
+ if(policyAdapter.isEditPolicy()){
+ prevPolicyName = "Config_PM_" + policyAdapter.getPolicyName() + "." + policyAdapter.getHighestVersion() + ".xml";
+ }
+
+ Path newFile = this.getNextLoopFilename(Paths.get(policyAdapter.getParentPath()), policyAdapter.getPolicyType(), policyAdapter.getConfigPolicyType(), policyAdapter.getPolicyName(), version);
+
+ if (newFile == null) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("File already exists, cannot create the policy.");
+ PolicyLogger.error("File already exists, cannot create the policy.");
+ setPolicyExists(true);
+ return false;
+ }
+
+ policyName = newFile.getFileName().toString();
+
+ // Save the Configurations file with the policy name with extention based on selection.
+ String jsonBody = policyAdapter.getJsonBody();
+ saveConfigurations(policyName, prevPolicyName, jsonBody);
+
+ // Make sure the filename ends with an extension
+ if (policyName.endsWith(".xml") == false) {
+ policyName = policyName + ".xml";
+ }
+
+
+ PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+
+ configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+ configPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+
+ AllOfType allOfOne = new AllOfType();
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ logger.info("print the main domain value "+policyDir);
+ String path = policyDir.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ String fileName = FilenameUtils.removeExtension(policyName);
+ fileName = path + "." + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+ allOfOne.getMatch().add(createMatch("PolicyName", name));
+ AllOfType allOf = new AllOfType();
+
+ // Adding the matches to AllOfType element Match for Ecomp
+ allOf.getMatch().add(createMatch("ECOMPName", policyAdapter.getEcompName()));
+ // Match for riskType
+ allOf.getMatch().add(
+ createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+ // Match for riskLevel
+ allOf.getMatch().add(
+ createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+ // Match for riskguard
+ allOf.getMatch().add(
+ createDynamicMatch("guard", policyAdapter.getGuard()));
+ // Match for ttlDate
+ allOf.getMatch().add(
+ createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+ // Match for ServiceType
+ allOf.getMatch().add(createMatch("ServiceType", policyAdapter.getServiceType()));
+
+ AnyOfType anyOf = new AnyOfType();
+ anyOf.getAllOf().add(allOfOne);
+ anyOf.getAllOf().add(allOf);
+
+ TargetType target = new TargetType();
+ ((TargetType) target).getAnyOf().add(anyOf);
+
+ // Adding the target to the policy element
+ configPolicy.setTarget((TargetType) target);
+
+ RuleType rule = new RuleType();
+ rule.setRuleId(policyAdapter.getRuleID());
+
+ rule.setEffect(EffectType.PERMIT);
+
+ // Create Target in Rule
+ AllOfType allOfInRule = new AllOfType();
+
+ // Creating match for ACCESS in rule target
+ MatchType accessMatch = new MatchType();
+ AttributeValueType accessAttributeValue = new AttributeValueType();
+ accessAttributeValue.setDataType(STRING_DATATYPE);
+ accessAttributeValue.getContent().add("ACCESS");
+ accessMatch.setAttributeValue(accessAttributeValue);
+ AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+ URI accessURI = null;
+ try {
+ accessURI = new URI(ACTION_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateClosedLoopPerformanceMetrics", "Exception creating ACCESS URI");
+ }
+ accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+ accessAttributeDesignator.setDataType(STRING_DATATYPE);
+ accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+ accessMatch.setAttributeDesignator(accessAttributeDesignator);
+ accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ // Creating Config Match in rule Target
+ MatchType configMatch = new MatchType();
+ AttributeValueType configAttributeValue = new AttributeValueType();
+ configAttributeValue.setDataType(STRING_DATATYPE);
+ configAttributeValue.getContent().add("Config");
+ configMatch.setAttributeValue(configAttributeValue);
+ AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+ URI configURI = null;
+ try {
+ configURI = new URI(RESOURCE_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateClosedLoopPerformanceMetrics", "Exception creating Config URI");
+ }
+ configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+ configAttributeDesignator.setDataType(STRING_DATATYPE);
+ configAttributeDesignator.setAttributeId(new IdentifierImpl(configURI).stringValue());
+ configMatch.setAttributeDesignator(configAttributeDesignator);
+ configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ allOfInRule.getMatch().add(accessMatch);
+ allOfInRule.getMatch().add(configMatch);
+
+ AnyOfType anyOfInRule = new AnyOfType();
+ anyOfInRule.getAllOf().add(allOfInRule);
+
+ TargetType targetInRule = new TargetType();
+ targetInRule.getAnyOf().add(anyOfInRule);
+
+ rule.setTarget(targetInRule);
+ rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+ configPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+ policyAdapter.setPolicyData(configPolicy);
+
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ PolicyLogger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ }
+ setPreparedToSave(true);
+ return true;
+ }
+
+ // Data required for Advice part is setting here.
+ @SuppressWarnings("static-access")
+ private AdviceExpressionsType getAdviceExpressions(int version, String fileName) {
+ AdviceExpressionsType advices = new AdviceExpressionsType();
+ AdviceExpressionType advice = new AdviceExpressionType();
+ advice.setAdviceId("PMID");
+ advice.setAppliesTo(EffectType.PERMIT);
+ // For Configuration
+ AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+ assignment1.setAttributeId("type");
+ assignment1.setCategory(CATEGORY_RESOURCE);
+ assignment1.setIssuer("");
+
+ AttributeValueType configNameAttributeValue = new AttributeValueType();
+ configNameAttributeValue.setDataType(STRING_DATATYPE);
+ configNameAttributeValue.getContent().add("Configuration");
+ assignment1.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue));
+
+ advice.getAttributeAssignmentExpression().add(assignment1);
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ // For Config file Url if configurations are provided.
+ AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+ assignment2.setAttributeId("URLID");
+ assignment2.setCategory(CATEGORY_RESOURCE);
+ assignment2.setIssuer("");
+
+ AttributeValueType AttributeValue = new AttributeValueType();
+ AttributeValue.setDataType(URI_DATATYPE);
+ String policyDir1 = policyAdapter.getParentPath().toString();
+ int startIndex1 = policyDir1.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+ logger.info("print the main domain value"+policyDir1);
+ String path = policyDir1.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir1.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ String content = CONFIG_URL +"/Config/" + path + "." + getConfigFile(policyName);
+ System.out.println("URL value :" + content);
+ AttributeValue.getContent().add(content);
+ assignment2.setExpression(new ObjectFactory().createAttributeValue(AttributeValue));
+
+ advice.getAttributeAssignmentExpression().add(assignment2);
+ AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+ assignment3.setAttributeId("PolicyName");
+ assignment3.setCategory(CATEGORY_RESOURCE);
+ assignment3.setIssuer("");
+
+ AttributeValueType attributeValue3 = new AttributeValueType();
+ attributeValue3.setDataType(STRING_DATATYPE);
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ StringTokenizer tokenizer = null;
+ StringBuffer buffer = new StringBuffer();
+ if (policyDir.contains("\\")) {
+ tokenizer = new StringTokenizer(policyDir, "\\");
+ } else {
+ tokenizer = new StringTokenizer(policyDir, "/");
+ }
+ if (tokenizer != null) {
+ while (tokenizer.hasMoreElements()) {
+ String value = tokenizer.nextToken();
+ buffer.append(value);
+ buffer.append(".");
+ }
+ }
+ fileName = FilenameUtils.removeExtension(fileName);
+ fileName = buffer.toString() + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+ attributeValue3.getContent().add(name);
+ assignment3.setExpression(new ObjectFactory().createAttributeValue(attributeValue3));
+ advice.getAttributeAssignmentExpression().add(assignment3);
+
+ AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+ assignment4.setAttributeId("VersionNumber");
+ assignment4.setCategory(CATEGORY_RESOURCE);
+ assignment4.setIssuer("");
+
+ AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+ configNameAttributeValue4.setDataType(STRING_DATATYPE);
+ configNameAttributeValue4.getContent().add(Integer.toString(version));
+ assignment4.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue4));
+
+ advice.getAttributeAssignmentExpression().add(assignment4);
+
+ AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+ assignment5.setAttributeId("matching:" + this.ECOMPID);
+ assignment5.setCategory(CATEGORY_RESOURCE);
+ assignment5.setIssuer("");
+
+ AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+ configNameAttributeValue5.setDataType(STRING_DATATYPE);
+ configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+ assignment5.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue5));
+
+ advice.getAttributeAssignmentExpression().add(assignment5);
+
+ AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+ assignment6.setAttributeId("matching:" + this.CLOSEDLOOPID);
+ assignment6.setCategory(CATEGORY_RESOURCE);
+ assignment6.setIssuer("");
+
+ AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+ configNameAttributeValue6.setDataType(STRING_DATATYPE);
+ configNameAttributeValue6.getContent().add(policyAdapter.getServiceType());
+ assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+
+ advice.getAttributeAssignmentExpression().add(assignment6);
+
+ //Risk Attributes
+ AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+ assignment7.setAttributeId("RiskType");
+ assignment7.setCategory(CATEGORY_RESOURCE);
+ assignment7.setIssuer("");
+
+ AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+ configNameAttributeValue7.setDataType(STRING_DATATYPE);
+ configNameAttributeValue7.getContent().add(policyAdapter.getRiskType());
+ assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+ advice.getAttributeAssignmentExpression().add(assignment7);
+
+ AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+ assignment8.setAttributeId("RiskLevel");
+ assignment8.setCategory(CATEGORY_RESOURCE);
+ assignment8.setIssuer("");
+
+ AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+ configNameAttributeValue8.setDataType(STRING_DATATYPE);
+ configNameAttributeValue8.getContent().add(policyAdapter.getRiskLevel());
+ assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+ advice.getAttributeAssignmentExpression().add(assignment8);
+
+ AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+ assignment9.setAttributeId("guard");
+ assignment9.setCategory(CATEGORY_RESOURCE);
+ assignment9.setIssuer("");
+
+ AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+ configNameAttributeValue9.setDataType(STRING_DATATYPE);
+ configNameAttributeValue9.getContent().add(policyAdapter.getGuard());
+ assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+ advice.getAttributeAssignmentExpression().add(assignment9);
+
+ AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+ assignment10.setAttributeId("TTLDate");
+ assignment10.setCategory(CATEGORY_RESOURCE);
+ assignment10.setIssuer("");
+
+ AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+ configNameAttributeValue10.setDataType(STRING_DATATYPE);
+ configNameAttributeValue10.getContent().add(policyAdapter.getTtlDate());
+ assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+ advice.getAttributeAssignmentExpression().add(assignment10);
+
+ advices.getAdviceExpression().add(advice);
+ return advices;
+ }
+
+ @Override
+ public Object getCorrectPolicyDataObject() {
+ // TODO Auto-generated method stub
+ return policyAdapter.getPolicyData();
+ }
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateNewMicroSerivceModel.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateNewMicroSerivceModel.java
new file mode 100644
index 000000000..73479fd2b
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateNewMicroSerivceModel.java
@@ -0,0 +1,305 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+//import org.eclipse.emf.common.util.URI;
+//import org.eclipse.emf.ecore.EPackage;
+//import org.eclipse.emf.ecore.resource.Resource;
+//import org.eclipse.emf.ecore.resource.ResourceSet;
+//import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+//import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.rest.jpa.MicroServiceModels;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.openecomp.policy.rest.util.MSAttributeObject;
+import org.openecomp.policy.rest.util.MSModelUtitils;
+
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class CreateNewMicroSerivceModel {
+ private static final Logger logger = FlexLogger.getLogger(CreateNewMicroSerivceModel.class);
+ private MicroServiceModels newModel = null;
+ private HashMap<String,MSAttributeObject > classMap = new HashMap<String,MSAttributeObject>();
+ private String directory;
+
+ /*
+ * These are the parameters needed for DB access from the PAP
+ */
+ private static String papDbDriver = null;
+ private static String papDbUrl = null;
+ private static String papDbUser = null;
+ private static String papDbPassword = null;
+
+ MSModelUtitils utils = new MSModelUtitils();
+
+ public CreateNewMicroSerivceModel(String fileName, String serviceName, String string, String version) {
+ super();
+ }
+
+ public CreateNewMicroSerivceModel(String importFile, String modelName, String description, String version, String randomID) {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ this.newModel = new MicroServiceModels();
+ this.newModel.setDescription(description);
+ this.newModel.setVersion(version);
+ this.newModel.setModelName(modelName);
+ UserInfo userInfo = new UserInfo();
+ userInfo.setUserLoginId("API");
+ this.newModel.setUserCreatedBy(userInfo);
+ String cleanUpFile = null;
+
+ HashMap<String, MSAttributeObject> tempMap = new HashMap<String, MSAttributeObject>();
+ //Need to delete the file
+ if (importFile.contains(".zip")){
+ extractFolder(randomID + ".zip");
+ File directory = new File("ExtractDir" + File.separator + randomID);
+ List<File> fileList = listModelFiles(directory.toString());
+ //get all the files from a directory
+ File[] fList = directory.listFiles();
+ for (File file : fileList){
+ if (file.isFile()){
+ tempMap = utils.processEpackage(file.getAbsolutePath());
+ classMap.putAll(tempMap);
+ }
+ }
+ cleanUpFile = "ExtractDir" + File.separator + randomID + ".zip";
+ try {
+ FileUtils.deleteDirectory(new File("ExtractDir" + File.separator + randomID));
+ FileUtils.deleteDirectory(new File(randomID));
+ File deleteFile = new File(cleanUpFile);
+ FileUtils.forceDelete(deleteFile);
+ } catch (IOException e) {
+ logger.error("Failed to unzip model file " + randomID);
+ }
+ }else {
+ tempMap = utils.processEpackage("ExtractDir" + File.separator + randomID+".xmi");
+ classMap.putAll(tempMap);
+ cleanUpFile = "ExtractDir" + File.separator + randomID+".xmi";
+ File deleteFile = new File(cleanUpFile);
+ deleteFile.delete();
+ }
+
+ // addValuesToNewModel();
+
+
+ }
+
+ private List<File> listModelFiles(String directoryName) {
+ File directory = new File(directoryName);
+ List<File> resultList = new ArrayList<File>();
+ File[] fList = directory.listFiles();
+ for (File file : fList) {
+ if (file.isFile()) {
+ resultList.add(file);
+ } else if (file.isDirectory()) {
+ resultList.addAll(listModelFiles(file.getAbsolutePath()));
+ }
+ }
+ return resultList;
+ }
+
+ private void extractFolder(String zipFile) {
+ int BUFFER = 2048;
+ File file = new File(zipFile);
+
+ ZipFile zip;
+ try {
+ zip = new ZipFile("ExtractDir" + File.separator +file);
+ String newPath = zipFile.substring(0, zipFile.length() - 4);
+ this.directory = "ExtractDir" + File.separator + zipFile.substring(0, zipFile.length() - 4);
+ new File(newPath).mkdir();
+ Enumeration zipFileEntries = zip.entries();
+
+ // Process each entry
+ while (zipFileEntries.hasMoreElements())
+ {
+ // grab a zip file entry
+ ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
+ String currentEntry = entry.getName();
+ File destFile = new File("ExtractDir" + File.separator + newPath + File.separator + currentEntry);
+ File destinationParent = destFile.getParentFile();
+
+ destinationParent.mkdirs();
+
+ if (!entry.isDirectory())
+ {
+ BufferedInputStream is = new BufferedInputStream(zip
+ .getInputStream(entry));
+ int currentByte;
+
+ byte data[] = new byte[BUFFER];
+
+ FileOutputStream fos = new FileOutputStream(destFile);
+ BufferedOutputStream dest = new BufferedOutputStream(fos,
+ BUFFER);
+
+ while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
+ dest.write(data, 0, currentByte);
+ }
+ dest.flush();
+ dest.close();
+ is.close();
+ }
+
+ if (currentEntry.endsWith(".zip"))
+ {
+ extractFolder(destFile.getAbsolutePath());
+ }
+ }
+ } catch (IOException e) {
+ logger.error("Failed to unzip model file " + zipFile);
+ }
+ }
+
+ public Map<String, String> addValuesToNewModel() {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ MSAttributeObject mainClass = null;
+ ArrayList<String> dependency = null;
+ String subAttribute = null;
+
+ if (!classMap.containsKey(this.newModel.getModelName())){
+ logger.error("Model Provided does not contain the service name provided in request. Unable to import new model");
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, "AddValuesToNewModel", "Unable to pull out required values, file missing service name provided in request");
+ successMap.put("error", "MISSING");
+ return successMap;
+ }
+ mainClass = classMap.get(this.newModel.getModelName());
+ String dependTemp = StringUtils.replaceEach(mainClass.getDependency(), new String[]{"[", "]", " "}, new String[]{"", "", ""});
+ this.newModel.setDependency(dependTemp);
+ if (!this.newModel.getDependency().equals("")){
+ dependency = new ArrayList<String>(Arrays.asList(dependTemp.split(",")));
+ dependency = utils.getFullDependencyList(dependency, classMap);
+ if (!dependency.isEmpty()){
+ for (String element : dependency){
+ MSAttributeObject temp = new MSAttributeObject();
+ if (classMap.containsKey(element)){
+ temp = classMap.get(element);
+ mainClass.addAllRefAttribute(temp.getRefAttribute());
+ mainClass.addAllAttribute(temp.getAttribute());
+ }
+ }
+ }
+ }
+ subAttribute = utils.createSubAttributes(dependency, classMap, this.newModel.getModelName());
+
+ this.newModel.setSub_attributes(subAttribute);
+ this.newModel.setAttributes(mainClass.getAttribute().toString().replace("{", "").replace("}", ""));
+ this.newModel.setRef_attributes(mainClass.getRefAttribute().toString().replace("{", "").replace("}", ""));
+ successMap.put("success", "success");
+ return successMap;
+
+ }
+
+ public Map<String, String> saveImportService(){
+ Map<String, String> successMap = new HashMap<String,String>();
+
+ Connection con = null;
+ Statement st = null;
+ ResultSet rs = null;
+ String modelName = this.newModel.getModelName();
+ String imported_by = "API";////////////////////////////////////////////
+ String version = this.newModel.getVersion();
+ String insertQuery = null;
+ int ID = 0;
+
+ /*
+ * Retrieve the property values for db access from the xacml.pap.properties
+ */
+ papDbDriver = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_DRIVER);
+ papDbUrl = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_URL);
+ papDbUser = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_USER);
+ papDbPassword = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_PASSWORD);
+
+ try {
+ //Get DB Connection
+ Class.forName(papDbDriver);
+ con = DriverManager.getConnection(papDbUrl,papDbUser,papDbPassword);
+ st = con.createStatement();
+ String queryString ="SELECT * FROM MicroServiceModels WHERE modelName='" + modelName + "' AND version='" + version+ "';";
+ rs = st.executeQuery(queryString);
+
+ if(rs.next()){
+ successMap.put("DBError", "EXISTS");
+ logger.error("Import new service failed. Service already exists");
+ }else{
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM MicroServiceModels;");
+ if(rs.next()){
+ ID = rs.getInt("ID");
+ ID++;
+ }
+
+ insertQuery = "INSERT INTO MicroServiceModels (ID, modelName, Dependency, DESCRIPTION, attributes, ref_attributes, sub_attributes, version, imported_by) "
+ + "VALUES("+ID+",'"+modelName+"','"+ this.newModel.getDependency()+"','"+this.newModel.getDescription()+"','"+this.newModel.getAttributes()+
+ "','"+this.newModel.getRef_attributes()+"','"+this.newModel.getSub_attributes()+"','"+version+"','"+imported_by+"')";
+ st.executeUpdate(insertQuery);
+ successMap.put("success", "success");
+ }
+ rs.close();
+ }catch (ClassNotFoundException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "saveImportService", "Exception querying MicroServiceModels");
+ successMap.put("DBError", "Error Query");
+ } catch (SQLException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "saveImportService", "Exception querying MicroServiceModels");
+ successMap.put("DBError", "Error Query");
+ } finally {
+ try{
+ if (con!=null) con.close();
+ if (rs!=null) rs.close();
+ if (st!=null) st.close();
+ } catch (Exception ex){}
+ }
+
+ return successMap;
+ }
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/DecisionPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/DecisionPolicy.java
new file mode 100644
index 000000000..822768f6d
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/DecisionPolicy.java
@@ -0,0 +1,633 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+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.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.io.FilenameUtils;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.pap.xacml.rest.util.JPAUtils;
+import org.openecomp.policy.rest.jpa.Datatype;
+import org.openecomp.policy.rest.jpa.DecisionSettings;
+import org.openecomp.policy.rest.jpa.FunctionDefinition;
+import org.openecomp.policy.xacml.std.pip.engines.aaf.AAFEngine;
+
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class DecisionPolicy extends Policy {
+
+ /**
+ * Config Fields
+ */
+ private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+ public static final String JSON_CONFIG = "JSON";
+ public static final String XML_CONFIG = "XML";
+ public static final String PROPERTIES_CONFIG = "PROPERTIES";
+ public static final String OTHER_CONFIG = "OTHER";
+
+ public static final String PDP_ACTION = "PDP";
+ public static final String PEP_ACTION = "PEP";
+ public static final String TYPE_ACTION = "REST";
+
+ public static final String GET_METHOD = "GET";
+ public static final String PUT_METHOD = "PUT";
+ public static final String POST_METHOD = "POST";
+
+ public static final String PERFORMER_ATTRIBUTEID = "performer";
+ public static final String TYPE_ATTRIBUTEID = "type";
+ public static final String METHOD_ATTRIBUTEID = "method";
+ public static final String HEADERS_ATTRIBUTEID = "headers";
+ public static final String URL_ATTRIBUTEID = "url";
+ public static final String BODY_ATTRIBUTEID = "body";
+
+ public static final String FUNCTION_NOT = "urn:oasis:names:tc:xacml:1.0:function:not";
+
+ private static final String AAFProvider = "AAF";
+ //private static final String CustomProvider = "Custom";
+
+ List<String> dynamicLabelRuleAlgorithms = new LinkedList<String>();
+ List<String> dynamicFieldComboRuleAlgorithms = new LinkedList<String>();
+ List<String> dynamicFieldOneRuleAlgorithms = new LinkedList<String>();
+ List<String> dynamicFieldTwoRuleAlgorithms = new LinkedList<String>();
+ //List<Object> dynamicVariableList = new LinkedList<Object>();
+ List<String> dataTypeList = new LinkedList<String>();
+
+ protected Map<String, String> dropDownMap = new HashMap<String, String>();
+
+
+ public DecisionPolicy() {
+ super();
+ }
+
+ public DecisionPolicy(PolicyRestAdapter policyAdapter){
+ this.policyAdapter = policyAdapter;
+ }
+
+ @Override
+ public Map<String, String> savePolicies() throws Exception {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ if(isPolicyExists()){
+ successMap.put("EXISTS", "This Policy already exist on the PAP");
+ return successMap;
+ }
+
+ if(!isPreparedToSave()){
+ //Prep and configure the policy for saving
+ prepareToSave();
+ }
+
+ // Until here we prepared the data and here calling the method to create xml.
+ Path newPolicyPath = null;
+ newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+ successMap = createPolicy(newPolicyPath, getCorrectPolicyDataObject());
+ if (successMap.containsKey("success")) {
+ Path finalPolicyPath = getFinalPolicyPath();
+ policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+ }
+ 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
+ @Override
+ public boolean prepareToSave() throws Exception{
+
+ if(isPreparedToSave()){
+ //we have already done this
+ return true;
+ }
+
+ int version = 0;
+ String policyID = policyAdapter.getPolicyID();
+
+ if (policyAdapter.isEditPolicy()) {
+ version = policyAdapter.getHighestVersion() + 1;
+ } else {
+ version = 1;
+ }
+
+ // Create the Instance for pojo, PolicyType object is used in marshalling.
+ if (policyAdapter.getPolicyType().equals("Decision")) {
+ PolicyType policyConfig = new PolicyType();
+
+ policyConfig.setVersion(Integer.toString(version));
+ policyConfig.setPolicyId(policyID);
+ policyConfig.setTarget(new TargetType());
+ policyAdapter.setData(policyConfig);
+ }
+
+ if (policyAdapter.getData() != null) {
+
+ // Save off everything
+ // making ready all the required elements to generate the action policy xml.
+ // Get the uniqueness for policy name.
+ Path newFile = getNextFilename(Paths.get(policyAdapter.getParentPath().toString()), policyAdapter.getPolicyType(), policyAdapter.getPolicyName(), version);
+ if (newFile == null) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("File already exists, cannot create the policy.");
+ PolicyLogger.error("File already exists, cannot create the policy.");
+ setPolicyExists(true);
+ return false;
+ }
+ policyName = newFile.getFileName().toString();
+
+ // Make sure the filename ends with an extension
+ if (policyName.endsWith(".xml") == false) {
+ policyName = policyName + ".xml";
+ }
+
+ PolicyType decisionPolicy = (PolicyType) policyAdapter.getData();
+
+ decisionPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+ decisionPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+ AllOfType allOfOne = new AllOfType();
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ logger.info("print the main domain value "+policyDir);
+ String path = policyDir.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ String fileName = FilenameUtils.removeExtension(policyName);
+ fileName = path + "." + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+ allOfOne.getMatch().add(createMatch("PolicyName", name));
+
+ AllOfType allOf = new AllOfType();
+
+ // Match for Ecomp
+ allOf.getMatch().add(createMatch("ECOMPName", (policyAdapter.getEcompName())));
+
+ Map<String, String> dynamicFieldComponentAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+ if(policyAdapter.getProviderComboBox()!=null && policyAdapter.getProviderComboBox().equals(AAFProvider)){
+ dynamicFieldComponentAttributes = new HashMap<String,String>();
+ }
+
+ // If there is any dynamic field attributes create the matches here
+ for (String keyField : dynamicFieldComponentAttributes.keySet()) {
+ String key = keyField;
+ String value = dynamicFieldComponentAttributes.get(key);
+ MatchType dynamicMatch = createDynamicMatch(key, value);
+ allOf.getMatch().add(dynamicMatch);
+ }
+
+ AnyOfType anyOf = new AnyOfType();
+ anyOf.getAllOf().add(allOfOne);
+ anyOf.getAllOf().add(allOf);
+
+ TargetType target = new TargetType();
+ target.getAnyOf().add(anyOf);
+ decisionPolicy.setTarget(target);
+
+ Map<String, String> dynamicFieldDecisionSettings = policyAdapter.getDynamicSettingsMap();
+
+ //dynamicVariableList = policyAdapter.getDynamicVariableList();
+ if(policyAdapter.getProviderComboBox()!=null && policyAdapter.getProviderComboBox().equals(AAFProvider)){
+ dynamicFieldDecisionSettings = new HashMap<String,String>();
+ }
+
+ // settings are dynamic so check how many rows are added and add all
+ for (String keyField : dynamicFieldDecisionSettings.keySet()) {
+ String key = keyField;
+ String value = dynamicFieldDecisionSettings.get(key);
+ //String dataType = (String) dynamicVariableList.get(counter);
+ String dataType = getDataType(key);
+ VariableDefinitionType dynamicVariable = createDynamicVariable(key, value, dataType);
+ decisionPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(dynamicVariable);
+ }
+
+ createRule(decisionPolicy, true);
+ createRule(decisionPolicy, false);
+ }
+
+ setPreparedToSave(true);
+ return true;
+ }
+
+ private DecisionSettings findDecisionSettingsBySettingId(String settingId) {
+ DecisionSettings decisionSetting = null;
+
+ EntityManager em = policyAdapter.getEntityManagerFactory().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;
+ }
+
+ private void createRule(PolicyType decisionPolicy, boolean permitRule) {
+ RuleType rule = new RuleType();
+
+ rule.setRuleId(policyAdapter.getRuleID());
+
+ if (permitRule) {
+ rule.setEffect(EffectType.PERMIT);
+ } else {
+ rule.setEffect(EffectType.DENY);
+ }
+ rule.setTarget(new TargetType());
+
+ // Create Target in Rule
+ AllOfType allOfInRule = new AllOfType();
+
+ // Creating match for ACCESS in rule target
+ MatchType accessMatch = new MatchType();
+ AttributeValueType accessAttributeValue = new AttributeValueType();
+ accessAttributeValue.setDataType(STRING_DATATYPE);
+ accessAttributeValue.getContent().add("DECIDE");
+ accessMatch.setAttributeValue(accessAttributeValue);
+ AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+ URI accessURI = null;
+ try {
+ accessURI = new URI(ACTION_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "DecisionPolicy", "Exception creating ACCESS URI");
+ }
+ accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+ accessAttributeDesignator.setDataType(STRING_DATATYPE);
+ accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+ accessMatch.setAttributeDesignator(accessAttributeDesignator);
+ accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ dynamicLabelRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmLabels();
+ dynamicFieldComboRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmCombo();
+ dynamicFieldOneRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField1();
+ dynamicFieldTwoRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField2();
+ dropDownMap = createDropDownMap();
+
+ if(policyAdapter.getProviderComboBox()!=null && policyAdapter.getProviderComboBox().equals(AAFProvider)){
+ // Values for AAF Provider are here for XML Creation.
+ ConditionType condition = new ConditionType();
+ ApplyType decisionApply = new ApplyType();
+ String selectedFunction = "boolean-equal";
+
+ AttributeValueType value1 = new AttributeValueType();
+ value1.setDataType(BOOLEAN_DATATYPE);
+ value1.getContent().add("true");
+
+ AttributeDesignatorType value2 = new AttributeDesignatorType();
+ value2.setAttributeId(AAFEngine.AAF_RESULT);
+ value2.setCategory(CATEGORY_RESOURCE);
+ value2.setDataType(BOOLEAN_DATATYPE);
+ value2.setMustBePresent(false);
+
+ ApplyType innerDecisionApply = new ApplyType();
+ innerDecisionApply.setFunctionId(FUNCTION_BOOLEAN_ONE_AND_ONLY);
+ innerDecisionApply.getExpression().add(new ObjectFactory().createAttributeDesignator(value2));
+
+ decisionApply.setFunctionId(dropDownMap.get(selectedFunction));
+ decisionApply.getExpression().add(new ObjectFactory().createAttributeValue(value1));
+ decisionApply.getExpression().add(new ObjectFactory().createApply(innerDecisionApply));
+ condition.setExpression(new ObjectFactory().createApply(decisionApply));
+ if (!permitRule) {
+ ApplyType notOuterApply = new ApplyType();
+ notOuterApply.setFunctionId(FUNCTION_NOT);
+ notOuterApply.getExpression().add(condition.getExpression());
+ condition.setExpression(new ObjectFactory().createApply(notOuterApply));
+ }
+ rule.setCondition(condition);
+ allOfInRule.getMatch().add(accessMatch);
+
+ AnyOfType anyOfInRule = new AnyOfType();
+ anyOfInRule.getAllOf().add(allOfInRule);
+
+ TargetType targetInRule = new TargetType();
+ targetInRule.getAnyOf().add(anyOfInRule);
+
+ rule.setTarget(targetInRule);
+ if(!permitRule){
+ AdviceExpressionsType adviceExpressions = new AdviceExpressionsType();
+ AdviceExpressionType adviceExpression = new AdviceExpressionType();
+ adviceExpression.setAdviceId(AAFProvider);
+ adviceExpression.setAppliesTo(EffectType.DENY);
+ AttributeAssignmentExpressionType assignment = new AttributeAssignmentExpressionType();
+ assignment.setAttributeId("aaf.response");
+ assignment.setCategory(CATEGORY_RESOURCE);
+ AttributeDesignatorType value = new AttributeDesignatorType();
+ value.setAttributeId(AAFEngine.AAF_RESPONSE);
+ value.setCategory(CATEGORY_RESOURCE);
+ value.setDataType(STRING_DATATYPE);
+ value.setMustBePresent(false);
+ assignment.setExpression(new ObjectFactory().createAttributeDesignator(value));
+ adviceExpression.getAttributeAssignmentExpression().add(assignment);
+ adviceExpressions.getAdviceExpression().add(adviceExpression);
+ rule.setAdviceExpressions(adviceExpressions);
+ }
+ decisionPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+ policyAdapter.setPolicyData(decisionPolicy);
+
+ }else if (dynamicLabelRuleAlgorithms != null && dynamicLabelRuleAlgorithms.size() > 0) {
+ boolean isCompound = false;
+ ConditionType condition = new ConditionType();
+ int index = dynamicFieldOneRuleAlgorithms.size() - 1;
+
+ for (String labelAttr : dynamicLabelRuleAlgorithms) {
+ // if the rule algorithm as a label means it is a compound
+ if (dynamicFieldOneRuleAlgorithms.get(index).toString().equals(labelAttr)) {
+ ApplyType decisionApply = new ApplyType();
+
+ String selectedFunction = (String) dynamicFieldComboRuleAlgorithms.get(index).toString();
+ String value1 = (String) dynamicFieldOneRuleAlgorithms.get(index).toString();
+ String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+ decisionApply.setFunctionId(dropDownMap.get(selectedFunction));
+ decisionApply.getExpression().add(new ObjectFactory().createApply(getInnerDecisionApply(value1)));
+ decisionApply.getExpression().add(new ObjectFactory().createApply(getInnerDecisionApply(value2)));
+ condition.setExpression(new ObjectFactory().createApply(decisionApply));
+ isCompound = true;
+ }
+
+ // if rule algorithm not a compound
+ if (!isCompound) {
+ condition.setExpression(new ObjectFactory().createApply(getInnerDecisionApply(dynamicLabelRuleAlgorithms.get(index).toString())));
+ }
+ }
+ if (!permitRule) {
+ ApplyType notOuterApply = new ApplyType();
+ notOuterApply.setFunctionId(FUNCTION_NOT);
+ notOuterApply.getExpression().add(condition.getExpression());
+ condition.setExpression(new ObjectFactory().createApply(notOuterApply));
+ }
+ rule.setCondition(condition);
+ allOfInRule.getMatch().add(accessMatch);
+
+ AnyOfType anyOfInRule = new AnyOfType();
+ anyOfInRule.getAllOf().add(allOfInRule);
+
+ TargetType targetInRule = new TargetType();
+ targetInRule.getAnyOf().add(anyOfInRule);
+
+ rule.setTarget(targetInRule);
+
+ decisionPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+ policyAdapter.setPolicyData(decisionPolicy);
+
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Unsupported data object."+ policyAdapter.getData().getClass().getCanonicalName());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + "Unsupported data object."+ policyAdapter.getData().getClass().getCanonicalName());
+ }
+
+ }
+
+ // if compound setting the inner apply here
+ protected ApplyType getInnerDecisionApply(String value1Label) {
+ ApplyType decisionApply = new ApplyType();
+ int index = 0;
+ // check the index for the label.
+ for (String labelAttr : dynamicLabelRuleAlgorithms) {
+ if (labelAttr.equals(value1Label)) {
+ String value1 = (String) dynamicFieldOneRuleAlgorithms.get(index).toString();
+ populateDataTypeList(value1);
+
+ // check if the row contains label again
+ for (String labelValue : dynamicLabelRuleAlgorithms) {
+ if (labelValue.equals(value1)) {
+ return getCompoundDecisionApply(index);
+ }
+ }
+
+ // Getting the values from the form.
+ String functionKey = (String) dynamicFieldComboRuleAlgorithms.get(index).toString();
+ String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+ decisionApply.setFunctionId(dropDownMap.get(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));
+ } 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 != 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));
+ decisionApply.getExpression().add(new ObjectFactory().createApply(innerDecisionApply));
+ } else {
+ value1 = value1.substring(2, value1.length());
+ VariableReferenceType variableReferenceType = new VariableReferenceType();
+ variableReferenceType.setVariableId(value1);
+
+ 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));
+ }
+ }
+ }
+ index++;
+ }
+ return decisionApply;
+ }
+
+ // if the rule algorithm is multiple compound one setting the apply
+ protected ApplyType getCompoundDecisionApply(int index) {
+ ApplyType decisionApply = new ApplyType();
+ String selectedFunction = dynamicFieldComboRuleAlgorithms.get(index).toString();
+ String value1 = dynamicFieldOneRuleAlgorithms.get(index).toString();
+ String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+ decisionApply.setFunctionId(dropDownMap.get(selectedFunction));
+ decisionApply.getExpression().add(new ObjectFactory().createApply(getInnerDecisionApply(value1)));
+ decisionApply.getExpression().add(new ObjectFactory().createApply(getInnerDecisionApply(value2)));
+ return decisionApply;
+ }
+
+ private VariableDefinitionType createDynamicVariable(String key, String value, String dataType) {
+ VariableDefinitionType dynamicVariable = new VariableDefinitionType();
+ AttributeValueType dynamicAttributeValue = new AttributeValueType();
+
+ dynamicAttributeValue.setDataType(dataType);
+ dynamicAttributeValue.getContent().add(value);
+
+ dynamicVariable.setVariableId(key);
+ dynamicVariable.setExpression(new ObjectFactory().createAttributeValue(dynamicAttributeValue));
+
+ return dynamicVariable;
+
+ }
+
+ private void populateDataTypeList(String value1) {
+
+ ///String value1 = dynamicFieldDecisionOneRuleAlgorithms.get(index).getValue().toString();
+ String dataType = null;
+
+ if(value1.contains("S_")) {
+ value1 = value1.substring(2, value1.length());
+ DecisionSettings decisionSettings = findDecisionSettingsBySettingId(value1);
+ if (decisionSettings != null && decisionSettings.getDatatypeBean().getShortName().equals("string")) {
+ dataType = STRING_DATATYPE;
+ } else if (decisionSettings != null && decisionSettings.getDatatypeBean().getShortName().equals("boolean")) {
+ dataType = BOOLEAN_DATATYPE;
+ } else {
+ dataType = INTEGER_DATATYPE;
+ }
+ } else {
+ dataType = "OTHER";
+ }
+
+ dataTypeList.add(dataType);
+ }
+
+ private Map<String,String> createDropDownMap(){
+ JPAUtils jpaUtils = null;
+ try {
+ jpaUtils = JPAUtils.getJPAUtilsInstance(policyAdapter.getEntityManagerFactory());
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ Map<Datatype, List<FunctionDefinition>> functionMap = jpaUtils.getFunctionDatatypeMap();
+ Map<String, String> dropDownMap = new HashMap<String, String>();
+ for (Datatype id : functionMap.keySet()) {
+ List<FunctionDefinition> functionDefinitions = (List<FunctionDefinition>) functionMap
+ .get(id);
+ for (FunctionDefinition functionDef : functionDefinitions) {
+ dropDownMap.put(functionDef.getShortname(),functionDef.getXacmlid());
+ }
+ }
+
+ return dropDownMap;
+ }
+
+ private String getDataType(String key) {
+
+ DecisionSettings decisionSettings = findDecisionSettingsBySettingId(key);
+ String dataType = null;
+
+ if (decisionSettings != null && decisionSettings.getDatatypeBean().getShortName().equals("string")) {
+ dataType = STRING_DATATYPE;
+ } else if (decisionSettings != null && decisionSettings.getDatatypeBean().getShortName().equals("boolean")) {
+ dataType = BOOLEAN_DATATYPE;
+ } else {
+ dataType = INTEGER_DATATYPE;
+ }
+
+ return dataType;
+ }
+
+ @Override
+ public Object getCorrectPolicyDataObject() {
+ return policyAdapter.getData();
+ }
+
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/FirewallConfigPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/FirewallConfigPolicy.java
new file mode 100644
index 000000000..ad7525b85
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/FirewallConfigPolicy.java
@@ -0,0 +1,1871 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringReader;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonException;
+import javax.json.JsonObject;
+import javax.json.JsonReader;
+import javax.json.JsonString;
+import javax.json.JsonValue;
+
+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.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.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 org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.std.IdentifierImpl;
+import com.att.research.xacml.util.XACMLProperties;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.github.fge.jackson.JsonLoader;
+import com.github.fge.jsonpatch.JsonPatch;
+import com.github.fge.jsonpatch.diff.JsonDiff;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class FirewallConfigPolicy extends Policy {
+ /**
+ * Config Fields
+ */
+ private static final Logger logger = FlexLogger.getLogger(FirewallConfigPolicy.class);
+
+ public static final String JSON_CONFIG = "JSON";
+ public static final String XML_CONFIG = "XML";
+ public static final String PROPERTIES_CONFIG = "PROPERTIES";
+ public static final String OTHER_CONFIG = "OTHER";
+
+ /*
+ * These are the parameters needed for DB access from the PAP
+ */
+ private static String papDbDriver = null;
+ private static String papDbUrl = null;
+ private static String papDbUser = null;
+ private static String papDbPassword = null;
+
+ public FirewallConfigPolicy() {
+ super();
+ }
+
+ public FirewallConfigPolicy(PolicyRestAdapter policyAdapter) {
+ this.policyAdapter = policyAdapter;
+ this.policyAdapter.setConfigType(policyAdapter.getConfigType());
+
+ }
+
+ // Saving the Configurations file at server location for config policy.
+ protected void saveConfigurations(String policyName, String prevPolicyName, String jsonBody) {
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ logger.info("print the main domain value"+policyDir);
+ String path = policyDir.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+
+ try {
+ String configFileName = getConfigFile(policyName);
+
+ File file;
+ if(CONFIG_HOME.contains("\\"))
+ {
+ file = new File(CONFIG_HOME + "\\" + path + "."+ configFileName);
+ }
+ else
+ {
+ file = new File(CONFIG_HOME + "/" + path + "."+ configFileName);
+ }
+
+ // if file doesnt exists, then create it
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+
+ //Getting the previous policy Config Json file to be used for updating the dictionary tables
+ if (policyAdapter.isEditPolicy()) {
+
+ String prevConfigFileName = getConfigFile(prevPolicyName);
+
+ File oldFile;
+ if(CONFIG_HOME.contains("\\"))
+ {
+ oldFile = new File(CONFIG_HOME + "\\" + path + "."+ prevConfigFileName);
+ }
+ else
+ {
+ oldFile = new File(CONFIG_HOME + "/" + path + "."+ prevConfigFileName);
+ }
+
+ String filepath = oldFile.toString();
+
+ String prevJsonBody = readFile(filepath, StandardCharsets.UTF_8);
+ policyAdapter.setPrevJsonBody(prevJsonBody);
+ }
+
+
+ File configHomeDir = new File(CONFIG_HOME);
+ File[] listOfFiles = configHomeDir.listFiles();
+ if (listOfFiles != null){
+ for(File eachFile : listOfFiles){
+ if(eachFile.isFile()){
+ String fileNameWithoutExtension = FilenameUtils.removeExtension(eachFile.getName());
+ String configFileNameWithoutExtension = FilenameUtils.removeExtension(configFileName);
+ if (fileNameWithoutExtension.equals(configFileNameWithoutExtension)){
+ //delete the file
+ eachFile.delete();
+ }
+ }
+ }
+ }
+
+ FileWriter fw = new FileWriter(file.getAbsoluteFile());
+ BufferedWriter bw = new BufferedWriter(fw);
+ bw.write(jsonBody);
+ bw.close();
+ if (logger.isDebugEnabled()) {
+ logger.debug("Configuration is succesfully saved");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ //Utility to read json data from the existing file to a string
+ static String readFile(String path, Charset encoding) throws IOException {
+
+ byte[] encoded = Files.readAllBytes(Paths.get(path));
+ return new String(encoded, encoding);
+
+ }
+
+ // Here we are adding the extension for the configurations file based on the
+ // config type selection for saving.
+ private String getConfigFile(String filename) {
+ filename = FilenameUtils.removeExtension(filename);
+ if (filename.endsWith(".json")) {
+ filename = filename.substring(0, filename.length() - 4);
+ }
+
+ filename=filename+".json";
+ return filename;
+ }
+
+
+ // Validations for Config form
+ public boolean validateConfigForm() {
+
+ // Validating mandatory Fields.
+ isValidForm = true;
+ return isValidForm;
+
+ }
+
+ @Override
+ public Map<String, String> savePolicies() throws Exception {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ if(isPolicyExists()){
+ successMap.put("EXISTS", "This Policy already exist on the PAP");
+ return successMap;
+ }
+
+ if(!isPreparedToSave()){
+ prepareToSave();
+ }
+
+ // Until here we prepared the data and here calling the method to create xml.
+ Path newPolicyPath = null;
+ newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+ Boolean dbIsUpdated = false;
+ if (policyAdapter.getApiflag().equalsIgnoreCase("admin")){
+ dbIsUpdated = true;
+ } else {
+ if (policyAdapter.isEditPolicy()) {
+ dbIsUpdated = updateFirewallDictionaryData(policyAdapter.getJsonBody(), policyAdapter.getPrevJsonBody());
+ } else {
+ dbIsUpdated = insertFirewallDicionaryData(policyAdapter.getJsonBody());
+ }
+ }
+
+ if(dbIsUpdated) {
+ successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Failed to Update the Database Dictionary Tables.");
+ PolicyLogger.error("Failed to Update the Database Dictionary Tables.");
+
+ //remove the new json file
+ String jsonBody = policyAdapter.getPrevJsonBody();
+ if (jsonBody!=null){
+ saveConfigurations(policyName, "", jsonBody);
+ } else {
+ saveConfigurations(policyName, "", "");
+ }
+ successMap.put("fwdberror", "DB UPDATE");
+ }
+
+ if (successMap.containsKey("success")) {
+ Path finalPolicyPath = getFinalPolicyPath();
+ policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+ }
+ 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
+ @Override
+ public boolean prepareToSave() throws Exception{
+
+ if(isPreparedToSave()){
+ //we have already done this
+ return true;
+ }
+
+ int version = 0;
+ String policyID = policyAdapter.getPolicyID();
+
+ if (policyAdapter.isEditPolicy()) {
+ version = policyAdapter.getHighestVersion() + 1;
+ } else {
+ version = 1;
+ }
+
+ // Create the Instance for pojo, PolicyType object is used in marshalling.
+ if (policyAdapter.getPolicyType().equals("Config")) {
+ PolicyType policyConfig = new PolicyType();
+
+ policyConfig.setVersion(Integer.toString(version));
+ policyConfig.setPolicyId(policyID);
+ policyConfig.setTarget(new TargetType());
+ policyAdapter.setData(policyConfig);
+ }
+
+ if (policyAdapter.getData() != null) {
+
+ // Save off everything
+ // making ready all the required elements to generate the action policy xml.
+ // Get the uniqueness for policy name.
+ String prevPolicyName = null;
+ if(policyAdapter.isEditPolicy()){
+ prevPolicyName = "Config_FW_" + policyAdapter.getPolicyName() + "." + policyAdapter.getHighestVersion() + ".xml";
+ }
+
+ Path newFile = getNextFilename(Paths.get(policyAdapter.getParentPath().toString()),
+ (policyAdapter.getPolicyType() + "_FW"), policyAdapter.getPolicyName(), version);
+
+ if (newFile == null) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Policy already Exists, cannot create the policy.");
+ PolicyLogger.error("Policy already Exists, cannot create the policy.");
+ setPolicyExists(true);
+ return false;
+ }
+ policyName = newFile.getFileName().toString();
+
+ String jsonBody = policyAdapter.getJsonBody();
+ saveConfigurations(policyName, prevPolicyName, jsonBody);
+
+ // Make sure the filename ends with an extension
+ if (policyName.endsWith(".xml") == false) {
+ policyName = policyName + ".xml";
+ }
+
+ PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+
+ configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+ configPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+
+ AllOfType allOfOne = new AllOfType();
+ File policyFilePath = new File(policyAdapter.getParentPath().toString(), policyName);
+ String policyDir = policyFilePath.getParentFile().getName();
+ String fileName = FilenameUtils.removeExtension(policyName);
+ fileName = policyDir + "." + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+ allOfOne.getMatch().add(createMatch("PolicyName", name));
+ AllOfType allOf = new AllOfType();
+
+ // Match for ConfigName
+ allOf.getMatch().add(createMatch("ConfigName", policyAdapter.getConfigName()));
+ // Match for riskType
+ allOf.getMatch().add(
+ createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+ // Match for riskLevel
+ allOf.getMatch().add(
+ createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+ // Match for riskguard
+ allOf.getMatch().add(
+ createDynamicMatch("guard", policyAdapter.getGuard()));
+ // Match for ttlDate
+ allOf.getMatch().add(
+ createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+ AnyOfType anyOf = new AnyOfType();
+ anyOf.getAllOf().add(allOfOne);
+ anyOf.getAllOf().add(allOf);
+
+ TargetType target = new TargetType();
+ ((TargetType) target).getAnyOf().add(anyOf);
+
+ // Adding the target to the policy element
+ configPolicy.setTarget((TargetType) target);
+
+ RuleType rule = new RuleType();
+ rule.setRuleId(policyAdapter.getRuleID());
+
+ rule.setEffect(EffectType.PERMIT);
+
+ // Create Target in Rule
+ AllOfType allOfInRule = new AllOfType();
+
+ // Creating match for ACCESS in rule target
+ MatchType accessMatch = new MatchType();
+ AttributeValueType accessAttributeValue = new AttributeValueType();
+ accessAttributeValue.setDataType(STRING_DATATYPE);
+ accessAttributeValue.getContent().add("ACCESS");
+ accessMatch.setAttributeValue(accessAttributeValue);
+ AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+ URI accessURI = null;
+ try {
+ accessURI = new URI(ACTION_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "FirewallConfigPolicy", "Exception creating ACCESS URI");
+ }
+ accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+ accessAttributeDesignator.setDataType(STRING_DATATYPE);
+ accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+ accessMatch.setAttributeDesignator(accessAttributeDesignator);
+ accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ // Creating Config Match in rule Target
+ MatchType configMatch = new MatchType();
+ AttributeValueType configAttributeValue = new AttributeValueType();
+ configAttributeValue.setDataType(STRING_DATATYPE);
+
+ configAttributeValue.getContent().add("Config");
+
+ configMatch.setAttributeValue(configAttributeValue);
+ AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+ URI configURI = null;
+ try {
+ configURI = new URI(RESOURCE_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "FirewallConfigPolicy", "Exception creating Config URI");
+ }
+
+ configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+ configAttributeDesignator.setDataType(STRING_DATATYPE);
+ configAttributeDesignator.setAttributeId(new IdentifierImpl(configURI).stringValue());
+ configMatch.setAttributeDesignator(configAttributeDesignator);
+ configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ allOfInRule.getMatch().add(accessMatch);
+ allOfInRule.getMatch().add(configMatch);
+
+ AnyOfType anyOfInRule = new AnyOfType();
+ anyOfInRule.getAllOf().add(allOfInRule);
+
+ TargetType targetInRule = new TargetType();
+ targetInRule.getAnyOf().add(anyOfInRule);
+
+ rule.setTarget(targetInRule);
+ rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+ configPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+ policyAdapter.setPolicyData(configPolicy);
+
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ PolicyLogger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ }
+ setPreparedToSave(true);
+ return true;
+ }
+
+ // Data required for Advice part is setting here.
+ private AdviceExpressionsType getAdviceExpressions(int version, String fileName) {
+
+ //Firewall Config ID Assignment
+ AdviceExpressionsType advices = new AdviceExpressionsType();
+ AdviceExpressionType advice = new AdviceExpressionType();
+ advice.setAdviceId("firewallConfigID");
+ advice.setAppliesTo(EffectType.PERMIT);
+ // For Configuration
+ AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+ assignment1.setAttributeId("type");
+ assignment1.setCategory(CATEGORY_RESOURCE);
+ assignment1.setIssuer("");
+ AttributeValueType configNameAttributeValue = new AttributeValueType();
+ configNameAttributeValue.setDataType(STRING_DATATYPE);
+ configNameAttributeValue.getContent().add("Configuration");
+ assignment1.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue));
+ advice.getAttributeAssignmentExpression().add(assignment1);
+
+ // For Config file Url if configurations are provided.
+ //URL ID Assignment
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+ assignment2.setAttributeId("URLID");
+ assignment2.setCategory(CATEGORY_RESOURCE);
+ assignment2.setIssuer("");
+ AttributeValueType AttributeValue = new AttributeValueType();
+ AttributeValue.setDataType(URI_DATATYPE);
+ String policyDir1 = policyAdapter.getParentPath().toString();
+ int startIndex1 = policyDir1.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+ logger.info("print the main domain value"+policyDir1);
+ String path = policyDir1.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir1.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ String content = CONFIG_URL + "/Config/" + path + "." + getConfigFile(policyName);
+
+ AttributeValue.getContent().add(content);
+ assignment2.setExpression(new ObjectFactory().createAttributeValue(AttributeValue));
+ advice.getAttributeAssignmentExpression().add(assignment2);
+
+ //Policy Name Assignment
+ AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+ assignment3.setAttributeId("PolicyName");
+ assignment3.setCategory(CATEGORY_RESOURCE);
+ assignment3.setIssuer("");
+ AttributeValueType attributeValue3 = new AttributeValueType();
+ attributeValue3.setDataType(STRING_DATATYPE);
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ StringTokenizer tokenizer = null;
+ StringBuffer buffer = new StringBuffer();
+ if (policyDir.contains("\\")) {
+ tokenizer = new StringTokenizer(policyDir, "\\");
+ } else {
+ tokenizer = new StringTokenizer(policyDir, "/");
+ }
+ if (tokenizer != null) {
+ while (tokenizer.hasMoreElements()) {
+ String value = tokenizer.nextToken();
+ buffer.append(value);
+ buffer.append(".");
+ }
+ }
+ fileName = FilenameUtils.removeExtension(fileName);
+ fileName = buffer.toString() + fileName + ".xml";
+ System.out.println(fileName);
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+ System.out.println(name);
+ attributeValue3.getContent().add(name);
+ assignment3.setExpression(new ObjectFactory().createAttributeValue(attributeValue3));
+ advice.getAttributeAssignmentExpression().add(assignment3);
+
+ //Version Number Assignment
+ AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+ assignment4.setAttributeId("VersionNumber");
+ assignment4.setCategory(CATEGORY_RESOURCE);
+ assignment4.setIssuer("");
+ AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+ configNameAttributeValue4.setDataType(STRING_DATATYPE);
+ configNameAttributeValue4.getContent().add(Integer.toString(version));
+ assignment4.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue4));
+ advice.getAttributeAssignmentExpression().add(assignment4);
+
+ //Ecomp Name Assignment
+ AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+ assignment5.setAttributeId("matching:" + this.ECOMPID);
+ assignment5.setCategory(CATEGORY_RESOURCE);
+ assignment5.setIssuer("");
+ AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+ configNameAttributeValue5.setDataType(STRING_DATATYPE);
+ assignment5.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue5));
+ advice.getAttributeAssignmentExpression().add(assignment5);
+
+ //Config Name Assignment
+ AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+ assignment6.setAttributeId("matching:" + this.CONFIGID);
+ assignment6.setCategory(CATEGORY_RESOURCE);
+ assignment6.setIssuer("");
+ AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+ configNameAttributeValue6.setDataType(STRING_DATATYPE);
+ configNameAttributeValue6.getContent().add(policyAdapter.getConfigName());
+ assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+ advice.getAttributeAssignmentExpression().add(assignment6);
+
+ //Risk Attributes
+ AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+ assignment7.setAttributeId("RiskType");
+ assignment7.setCategory(CATEGORY_RESOURCE);
+ assignment7.setIssuer("");
+
+ AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+ configNameAttributeValue7.setDataType(STRING_DATATYPE);
+ configNameAttributeValue7.getContent().add(policyAdapter.getRiskType());
+ assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+ advice.getAttributeAssignmentExpression().add(assignment7);
+
+ AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+ assignment8.setAttributeId("RiskLevel");
+ assignment8.setCategory(CATEGORY_RESOURCE);
+ assignment8.setIssuer("");
+
+ AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+ configNameAttributeValue8.setDataType(STRING_DATATYPE);
+ configNameAttributeValue8.getContent().add(policyAdapter.getRiskLevel());
+ assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+ advice.getAttributeAssignmentExpression().add(assignment8);
+
+ AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+ assignment9.setAttributeId("guard");
+ assignment9.setCategory(CATEGORY_RESOURCE);
+ assignment9.setIssuer("");
+
+ AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+ configNameAttributeValue9.setDataType(STRING_DATATYPE);
+ configNameAttributeValue9.getContent().add(policyAdapter.getGuard());
+ assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+ advice.getAttributeAssignmentExpression().add(assignment9);
+
+ AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+ assignment10.setAttributeId("TTLDate");
+ assignment10.setCategory(CATEGORY_RESOURCE);
+ assignment10.setIssuer("");
+
+ AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+ configNameAttributeValue10.setDataType(STRING_DATATYPE);
+ configNameAttributeValue10.getContent().add(policyAdapter.getTtlDate());
+ assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+ advice.getAttributeAssignmentExpression().add(assignment10);
+
+ int index = 0;
+
+ advices.getAdviceExpression().add(advice);
+ return advices;
+ }
+
+
+ private Boolean insertFirewallDicionaryData (String jsonBody) throws SQLException {
+
+
+ JsonObject json = null;
+ if (jsonBody != null) {
+
+ //Read jsonBody to JsonObject
+ json = stringToJson(jsonBody);
+
+ JsonArray firewallRules = null;
+ JsonArray serviceGroup = null;
+ JsonArray addressGroup = null;
+ String securityZone=null;
+
+ Connection con = null;
+ Statement st = null;
+ ResultSet rs = null;
+
+ /*
+ * Retrieve the property values for db access from the xacml.pap.properties
+ */
+ papDbDriver = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_DRIVER);
+ papDbUrl = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_URL);
+ papDbUser = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_USER);
+ papDbPassword = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_PASSWORD);
+
+ //insert data into tables
+ try {
+ //Get DB Connection
+ Class.forName(papDbDriver);
+ con = DriverManager.getConnection(papDbUrl,papDbUser,papDbPassword);
+ st = con.createStatement();
+
+ firewallRules = json.getJsonArray("firewallRuleList");
+ serviceGroup = json.getJsonArray("serviceGroups");
+ addressGroup = json.getJsonArray("addressGroups");
+ securityZone=json.getString("primaryParentZoneId").toString();
+
+ logger.info("Parent child: securityZone from JSON: "+securityZone);
+ String insertQuery = null;
+
+ //Inserting childPolicy and its parent to the FWChildToParent DB table
+ if(securityZone!=null){
+ //Its a child Policy.
+ //Retrieve the parent name from the securityZone Id
+ String retrieveParentQuery= "select parent from fwparent where securityZone='";
+
+ retrieveParentQuery=retrieveParentQuery+securityZone+"';";
+ logger.info("Parent child: Query to retrieve parent "+retrieveParentQuery);
+ rs = st.executeQuery(retrieveParentQuery);
+
+ String parent=null;
+ if(rs.next()){
+ parent = rs.getString("parent");
+ }
+ rs.close();
+
+
+ String insertQueryChildTable="INSERT INTO FWChildToParent(child, parent) VALUES ('";
+ insertQueryChildTable=insertQueryChildTable+policyAdapter.getPolicyName()+"','"+parent+"');";
+ logger.info("Parent child: Insert child and parent to DB: "+insertQueryChildTable);
+ st.executeUpdate(insertQueryChildTable);
+
+ }
+
+ /*
+ * Inserting firewallRuleList data into the Terms, SecurityZone, and Action tables
+ */
+ if (firewallRules != null) {
+
+ int termID = 0;
+ int zoneID = 0;
+ int actionID = 0;
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM TERM;");
+ if(rs.next()){
+ termID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ZONE;");
+ if(rs.next()){
+ zoneID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ACTIONLIST;");
+ if(rs.next()){
+ actionID = rs.getInt("ID");
+ }
+ rs.close();
+
+ int i = 0;
+ for(JsonValue jsonValue : firewallRules) {
+
+ //increment ID Primary Keys
+ termID = termID + 1;
+ zoneID = zoneID + 1;
+ actionID = actionID + 1;
+
+ /*
+ * Populate ArrayLists with values from the JSON
+ */
+ //create the JSON object from the JSON Array for each iteration through the for loop
+ JsonObject ruleListobj = firewallRules.getJsonObject(i);
+
+ //get values from JSON fields of firewallRulesList Array
+ String ruleName = ruleListobj.get("ruleName").toString();
+ String action = ruleListobj.get("action").toString();
+ String description = ruleListobj.get("description").toString();
+
+ rs = st.executeQuery("SELECT * FROM TERM WHERE TERMNAME = "+ ruleName + ";");
+
+ if (rs.next()) {
+ st.executeUpdate("DELETE FROM TERM WHERE TERMNAME = "+ ruleName + ";");
+ }
+ rs.close();
+
+ //getting fromZone Array field from the firewallRulesList
+ JsonArray fromZoneArray = ruleListobj.getJsonArray("fromZones");
+ String fromZoneString = null;
+
+ int fromZoneIndex = 0;
+ for (JsonValue fromZoneJsonValue : fromZoneArray) {
+ String value = fromZoneArray.get(fromZoneIndex).toString();
+ value = value.replace("\"", "");
+
+ if (fromZoneString != null) {
+ fromZoneString = fromZoneString.concat(",").concat(value);
+
+ } else {
+ fromZoneString = value;
+ }
+
+ fromZoneIndex++;
+
+ }
+ String fromZoneInsert = "'"+fromZoneString+"'";
+
+ //getting toZone Array field from the firewallRulesList
+ JsonArray toZoneArray = ruleListobj.getJsonArray("toZones");
+ String toZoneString = null;
+
+ int toZoneIndex = 0;
+ for (JsonValue toZoneJsonValue : toZoneArray) {
+ String value = toZoneArray.get(toZoneIndex).toString();
+ value = value.replace("\"", "");
+
+ if (toZoneString != null) {
+ toZoneString = toZoneString.concat(",").concat(value);
+
+ } else {
+ toZoneString = value;
+ }
+
+ toZoneIndex++;
+
+ }
+ String toZoneInsert = "'"+toZoneString+"'";
+
+ //getting sourceList Array fields from the firewallRulesList
+ JsonArray srcListArray = ruleListobj.getJsonArray("sourceList");
+ String srcListString = null;
+
+ int srcListIndex = 0;
+ for (JsonValue srcListJsonValue : srcListArray) {
+ JsonObject srcListObj = srcListArray.getJsonObject(srcListIndex);
+ String type = srcListObj.get("type").toString().replace("\"", "");
+
+ String value = null;
+ if(type.equals("REFERENCE")||type.equals("GROUP")){
+ value = srcListObj.get("name").toString();
+ } else if (type.equalsIgnoreCase("ANY")){
+ value = null;
+ } else {
+ value = srcListObj.get("value").toString();
+ }
+
+ if (value!=null){
+ value = value.replace("\"", "");
+ }
+
+ if (srcListString != null) {
+ srcListString = srcListString.concat(",").concat(value);
+
+ } else {
+ srcListString = value;
+ }
+
+ srcListIndex++;
+
+ }
+ String srcListInsert = "'"+srcListString+"'";
+
+ //getting destinationList Array fields from the firewallRulesList
+ JsonArray destListArray = ruleListobj.getJsonArray("destinationList");
+ String destListString = null;
+
+ int destListIndex = 0;
+ for (JsonValue destListJsonValue : destListArray) {
+ JsonObject destListObj = destListArray.getJsonObject(destListIndex);
+ String type = destListObj.get("type").toString().replace("\"", "");
+
+ String value = null;
+ if(type.equals("REFERENCE")||type.equals("GROUP")){
+ value = destListObj.get("name").toString();
+ } else if (type.equalsIgnoreCase("ANY")){
+ value = null;
+ } else {
+ value = destListObj.get("value").toString();
+ }
+
+ if (value!=null){
+ value = value.replace("\"", "");
+ }
+
+ if (destListString != null) {
+ destListString = destListString.concat(",").concat(value);
+ } else {
+ destListString = value;
+ }
+
+ destListIndex++;
+ }
+ String destListInsert = "'"+destListString+"'";
+
+ //getting destServices Array fields from the firewallRulesList
+ JsonArray destServicesArray = ruleListobj.getJsonArray("destServices");
+ String destPortListString = null;
+
+ int destPortListIndex = 0;
+ for (JsonValue destListJsonValue : destServicesArray) {
+ JsonObject destServicesObj = destServicesArray.getJsonObject(destPortListIndex);
+ String type = destServicesObj.get("type").toString().replace("\"", "");
+
+ String value = null;
+ if(type.equals("REFERENCE")||type.equals("GROUP")){
+ value = destServicesObj.get("name").toString();
+ } else if (type.equalsIgnoreCase("ANY")){
+ value = null;
+ } else {
+ value = destServicesObj.get("value").toString();
+ }
+
+ if (value!=null){
+ value = value.replace("\"", "");
+ }
+
+ if (destPortListString != null) {
+ destPortListString = destPortListString.concat(",").concat(value);
+ } else {
+ destPortListString = value;
+ }
+
+ destPortListIndex++;
+ }
+ String destPortListInsert = "'"+destPortListString+"'";
+
+ /*
+ * Create Queries to INSERT data into database tables and execute
+ */
+ String termSql = "INSERT INTO Term (ID, TERMNAME, SRCIPLIST, DESTIPLIST, PROTOCOLLIST, PORTLIST, SRCPORTLIST,"
+ + " DESTPORTLIST, ACTION, DESCRIPTION, FROMZONE, TOZONE, CREATED_BY, MODIFIED_DATE) VALUES ("+termID+","
+ +ruleName+","+srcListInsert+","+destListInsert+","+ "null"+","+"null"+","+"null"+","+destPortListInsert+","
+ +action+","+description+","+fromZoneInsert+","+toZoneInsert+",'API',"+ "null"+ "); ";
+ termSql = termSql.replace('"', '\'');
+ st.addBatch(termSql);
+
+ String actionSql = "INSERT INTO ACTIONLIST (ID, ACTIONNAME, DESCRIPTION) VALUES ("+actionID+","+action+","+action+"); ";
+ actionSql = actionSql.replace('"', '\'');
+ st.addBatch(actionSql);
+
+ st.executeBatch();
+
+ i++;
+ }
+
+ }
+
+ /*
+ * Inserting serviceGroups data into the ServiceGroup, ServiceList, ProtocolList, and PortList tables
+ */
+ if (serviceGroup != null) {
+
+ int serviceGroupID = 0;
+ int serviceListID = 0;
+ int protocolID = 0;
+ int portID = 0;
+
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM SERVICEGROUP;");
+ if(rs.next()){
+ serviceGroupID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM GROUPSERVICELIST;");
+ if(rs.next()){
+ serviceListID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PROTOCOLLIST;");
+ if(rs.next()){
+ protocolID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PORTLIST;");
+ if(rs.next()){
+ portID = rs.getInt("ID");
+ }
+ rs.close();
+
+ int i = 0;
+ for(JsonValue jsonValue : serviceGroup) {
+
+ /*
+ * Populate ArrayLists with values from the JSON
+ */
+ //create the JSON object from the JSON Array for each iteration through the for loop
+ JsonObject svcGroupListobj = serviceGroup.getJsonObject(i);
+
+ String serviceListName = svcGroupListobj.get("name").toString();
+
+ String description = null;
+ if (svcGroupListobj.containsKey("description")){
+ description = svcGroupListobj.get("description").toString();
+ }
+
+ //getting members Array from the serviceGroup
+ JsonArray membersArray = svcGroupListobj.getJsonArray("members");
+
+ //String type = svcGroupListobj.get("type").toString();
+ Boolean isServiceGroup = false;
+ if (membersArray!=null){
+ String membersType = membersArray.getJsonObject(0).get("type").toString();
+ if (membersType.contains("REFERENCE")) {
+ isServiceGroup = true;
+ }
+ }
+
+ //Insert values into GROUPSERVICELIST table if name begins with Group
+ if (isServiceGroup) {
+
+ //increment ID Primary Keys
+ serviceListID = serviceListID + 1;
+
+ String name = null;
+
+ int membersIndex = 0;
+ for (JsonValue membersValue : membersArray) {
+ JsonObject membersObj = membersArray.getJsonObject(membersIndex);
+ //String value = membersObj.get("name").toString();
+ String type = membersObj.get("type").toString().replace("\"", "");
+
+ String value = null;
+ if(type.equals("REFERENCE")||type.equals("GROUP")||type.equals("SERVICE")){
+ value = membersObj.get("name").toString();
+ } else if (type.equalsIgnoreCase("ANY")){
+ value = null;
+ } else {
+ value = membersObj.get("value").toString();
+ }
+
+ if(value != null){
+ value = value.replace("\"", "");
+ }
+
+ if (name != null) {
+ name = name.concat(",").concat(value);
+ } else {
+ name = value;
+ }
+
+ membersIndex++;
+ }
+ String nameInsert = "'"+name+"'";
+
+ insertQuery = "INSERT INTO GROUPSERVICELIST (ID, NAME, SERVICELIST) "
+ + "VALUES("+serviceListID+","+serviceListName+","+nameInsert+")";
+
+ //Replace double quote with single quote
+ insertQuery = insertQuery.replace('"', '\'');
+
+ //Execute the queries to Insert data
+ st.executeUpdate(insertQuery);
+
+ } else { //Insert JSON data serviceList table, protollist table, and portlist table
+
+ //increment ID Primary Keys
+ protocolID = protocolID + 1;
+ portID = portID + 1;
+ serviceGroupID = serviceGroupID + 1;
+
+ String type = svcGroupListobj.get("type").toString();
+ String transportProtocol = svcGroupListobj.get("transportProtocol").toString();
+ String ports = svcGroupListobj.get("ports").toString();
+
+ /*
+ * Create Queries to INSERT data into database table and execute
+ */
+ String serviceSql = "INSERT INTO SERVICEGROUP (ID, NAME, DESCRIPTION, TYPE, TRANSPORTPROTOCOL, APPPROTOCOL, PORTS) "
+ + "VALUES("+serviceGroupID+","+serviceListName+","+description+","+type+","
+ + transportProtocol+","+"null,"+ports+"); ";
+ serviceSql = serviceSql.replace('"', '\'');
+ st.addBatch(serviceSql);
+
+ String protSql = "INSERT INTO PROTOCOLLIST (ID, PROTOCOLNAME, DESCRIPTION) VALUES("+protocolID+","+transportProtocol+","+transportProtocol+"); ";
+ protSql = protSql.replace('"', '\'');
+ st.addBatch(protSql);
+
+ String portSql = "INSERT INTO PORTLIST (ID, PORTNAME, DESCRIPTION) VALUES("+portID+","+ports+","+ports+");";
+ portSql = portSql.replace('"', '\'');
+ st.addBatch(portSql);
+
+ st.executeBatch();
+
+ }
+
+
+
+ i++;
+ }
+ }
+
+ /*
+ * Inserting addressGroup data into the ADDRESSGROUP table
+ */
+ if (addressGroup != null) {
+ int prefixID = 0;
+ int addressID = 0;
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PREFIXLIST;");
+ if(rs.next()){
+ prefixID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ADDRESSGROUP;");
+ if(rs.next()){
+ addressID = rs.getInt("ID");
+ }
+ rs.close();
+
+
+ int i = 0;
+ for(JsonValue jsonValue : addressGroup) {
+
+ /*
+ * Populate ArrayLists with values from the JSON
+ */
+ //create the JSON object from the JSON Array for each iteration through the for loop
+ JsonObject addressGroupObj = addressGroup.getJsonObject(i);
+
+ //create JSON array for members
+ JsonArray membersArray = addressGroupObj.getJsonArray("members");
+ String addressGroupName = addressGroupObj.get("name").toString();
+
+ String description = null;
+ if (addressGroupObj.containsKey("description")){
+ description = addressGroupObj.get("description").toString();
+ }
+
+ String prefixIP = null;
+ String type = null;
+
+ int membersIndex = 0;
+ for (JsonValue membersValue : membersArray) {
+ JsonObject membersObj = membersArray.getJsonObject(membersIndex);
+ //String value = membersObj.get("value").toString();
+ type = membersObj.get("type").toString().replace("\"", "");
+
+ String value = null;
+ if(type.equals("REFERENCE")||type.equals("GROUP")||type.equals("SERVICE")){
+ value = membersObj.get("name").toString();
+ } else if (type.equalsIgnoreCase("ANY")){
+ value = null;
+ } else {
+ value = membersObj.get("value").toString();
+ }
+
+ if(value != null){
+ value = value.replace("\"", "");
+ }
+
+ if (prefixIP != null) {
+ prefixIP = prefixIP.concat(",").concat(value);
+ } else {
+ prefixIP = value;
+ }
+
+ membersIndex++;
+ }
+ String prefixList = "'"+prefixIP+"'";
+
+ Boolean isAddressGroup = type.contains("REFERENCE");
+
+ if (isAddressGroup) {
+ //increment ID Primary Keys
+ addressID = addressID + 1;
+
+ insertQuery = "INSERT INTO ADDRESSGROUP (ID, NAME, DESCRIPTION, PREFIXLIST) "
+ + "VALUES("+addressID+","+addressGroupName+","+description+","+prefixList+")";
+ } else {
+ //increment ID Primary Key
+ prefixID = prefixID + 1;
+
+ insertQuery = "INSERT INTO PREFIXLIST (ID, PL_NAME, PL_VALUE, DESCRIPTION) "
+ + "VALUES("+prefixID+","+addressGroupName+","+prefixList+","+description+")";
+
+ }
+
+
+ //Replace double quote with single quote
+ insertQuery = insertQuery.replace('"', '\'');
+
+ //Execute the queries to Insert data
+ st.executeUpdate(insertQuery);
+
+ i++;
+ }
+
+ }
+
+ /*
+ * Remove duplicate values from 'lookup' dictionary tables
+ */
+ //ProtocolList Table
+ String protoDelete = "DELETE FROM protocollist USING protocollist, protocollist p1 "
+ + "WHERE protocollist.id > p1.id AND protocollist.protocolname = p1.protocolname;";
+ st.addBatch(protoDelete);
+
+ //PortList Table
+ String portListDelete = "DELETE FROM portlist USING portlist, portlist p1 "
+ + "WHERE portlist.id > p1.id AND portlist.portname = p1.portname; ";
+ st.addBatch(portListDelete);
+
+ //PrefixList Table
+ String prefixListDelete = "DELETE FROM prefixlist USING prefixlist, prefixlist p1 "
+ + "WHERE prefixlist.id > p1.id AND prefixlist.pl_name = p1.pl_name AND "
+ + "prefixlist.pl_value = p1.pl_value AND prefixlist.description = p1.description; ";
+ st.addBatch(prefixListDelete);
+
+ //GroupServiceList
+ String groupServiceDelete = "DELETE FROM groupservicelist USING groupservicelist, groupservicelist g1 "
+ + "WHERE groupservicelist.id > g1.id AND groupservicelist.name = g1.name AND "
+ + "groupservicelist.serviceList = g1.serviceList; ";
+ st.addBatch(groupServiceDelete);
+
+ st.executeBatch();
+
+ } catch (ClassNotFoundException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "FirewallConfigPolicy", "Exception building Firewall queries ");
+ System.out.println(e.getMessage());
+ return false;
+
+ } catch (SQLException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "FirewallConfigPolicy", "Exception executing Firewall queries");
+ System.out.println(e.getMessage());
+ return false;
+ } catch (Exception e) {
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "FirewallConfigPolicy", "Exception getting Json values");
+ System.out.println(e.getMessage());
+ return false;
+ } finally {
+ try{
+ if (con!=null) con.close();
+ if (rs!=null) rs.close();
+ if (st!=null) st.close();
+ } catch (Exception ex){}
+ }
+ return true;
+
+ } else {
+ return false;
+ }
+
+ }
+
+
+ private Boolean updateFirewallDictionaryData(String jsonBody, String prevJsonBody) {
+
+ JsonObject oldJson = null;
+ JsonObject newJson = null;
+
+ if (jsonBody != null || prevJsonBody != null) {
+
+ oldJson = stringToJson(prevJsonBody);
+ newJson = stringToJson(jsonBody);
+
+ //if no changes to the json then return true
+ if (oldJson.equals(newJson)) {
+ return true;
+ }
+
+ JsonArray firewallRules = null;
+ JsonArray serviceGroup = null;
+ JsonArray addressGroup = null;
+
+ firewallRules = newJson.getJsonArray("firewallRuleList");
+ serviceGroup = newJson.getJsonArray("serviceGroups");
+ addressGroup = newJson.getJsonArray("addressGroups");
+
+ Connection con = null;
+ Statement st = null;
+ ResultSet rs = null;
+
+ /*
+ * Retrieve the property values for db access from the xacml.pap.properties
+ */
+ papDbDriver = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_DRIVER);
+ papDbUrl = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_URL);
+ papDbUser = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_USER);
+ papDbPassword = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_PASSWORD);
+
+ //insert data into tables
+ try {
+
+ //Get DB Connection
+ Class.forName(papDbDriver);
+ con = DriverManager.getConnection(papDbUrl,papDbUser,papDbPassword);
+ st = con.createStatement();
+
+ JsonNode jsonDiff = createPatch(jsonBody, prevJsonBody);
+
+ int i = 0;
+ for (JsonNode node : jsonDiff) {
+ //String path = jsonDiff.get(i).asText();
+ String jsonpatch = jsonDiff.get(i).toString();
+
+ JsonObject patchObj = stringToJson(jsonpatch);
+
+ String path = patchObj.get("path").toString().replace('"', ' ').trim();
+
+ if (path.contains("firewallRuleList")) {
+ int termID = 0;
+ int zoneID = 0;
+ int actionID = 0;
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM TERM;");
+ if(rs.next()){
+ termID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ZONE;");
+ if(rs.next()){
+ zoneID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ACTIONLIST;");
+ if(rs.next()){
+ actionID = rs.getInt("ID");
+ }
+ rs.close();
+
+ String insertQuery = null;
+
+ /*
+ * Inserting firewallRuleList data into the Terms, SecurityZone, and Action tables
+ */
+ int ri = 0;
+ for(JsonValue jsonValue : firewallRules) {
+
+ //increment ID Primary Keys
+ termID = termID + 1;
+ zoneID = zoneID + 1;
+ actionID = actionID + 1;
+
+ /*
+ * Populate ArrayLists with values from the JSON
+ */
+ //create the JSON object from the JSON Array for each iteration through the for loop
+ JsonObject ruleListobj = firewallRules.getJsonObject(ri);
+
+ //get values from JSON fields of firewallRulesList Array
+ String ruleName = ruleListobj.get("ruleName").toString().replace('"', '\'');
+ String action = ruleListobj.get("action").toString().replace('"', '\'');
+ String description = ruleListobj.get("description").toString().replace('"', '\'');
+
+ rs = st.executeQuery("SELECT * FROM TERM WHERE TERMNAME = "+ ruleName + ";");
+
+ if (rs.next()) {
+ st.executeUpdate("DELETE FROM TERM WHERE TERMNAME = "+ ruleName + ";");
+ }
+ rs.close();
+
+ //getting fromZone Array field from the firewallRulesList
+ JsonArray fromZoneArray = ruleListobj.getJsonArray("fromZones");
+ String fromZoneString = null;
+
+ int fromZoneIndex = 0;
+ for (JsonValue fromZoneJsonValue : fromZoneArray) {
+ String value = fromZoneArray.get(fromZoneIndex).toString();
+ value = value.replace("\"", "");
+
+ if (fromZoneString != null) {
+ fromZoneString = fromZoneString.concat(",").concat(value);
+
+ } else {
+ fromZoneString = value;
+ }
+
+ fromZoneIndex++;
+
+ }
+ String fromZoneInsert = "'"+fromZoneString+"'";
+
+ //getting toZone Array field from the firewallRulesList
+ JsonArray toZoneArray = ruleListobj.getJsonArray("toZones");
+ String toZoneString = null;
+
+ int toZoneIndex = 0;
+ for (JsonValue toZoneJsonValue : toZoneArray) {
+ String value = toZoneArray.get(toZoneIndex).toString();
+ value = value.replace("\"", "");
+
+ if (toZoneString != null) {
+ toZoneString = toZoneString.concat(",").concat(value);
+
+ } else {
+ toZoneString = value;
+ }
+
+ toZoneIndex++;
+
+ }
+ String toZoneInsert = "'"+toZoneString+"'";
+ //getting sourceList Array fields from the firewallRulesList
+ JsonArray srcListArray = ruleListobj.getJsonArray("sourceList");
+ String srcListString = null;
+
+ int srcListIndex = 0;
+ for (JsonValue srcListJsonValue : srcListArray) {
+ JsonObject srcListObj = srcListArray.getJsonObject(srcListIndex);
+ String type = srcListObj.get("type").toString().replace("\"", "");
+
+ String value = null;
+ if(type.equals("REFERENCE")||type.equals("GROUP")){
+ value = srcListObj.get("name").toString();
+ } else if (type.equalsIgnoreCase("ANY")){
+ value = null;
+ } else {
+ value = srcListObj.get("value").toString();
+ }
+
+ if(value != null){
+ value = value.replace("\"", "");
+ }
+
+ if (srcListString != null) {
+ srcListString = srcListString.concat(",").concat(value);
+
+ } else {
+ srcListString = value;
+ }
+
+ srcListIndex++;
+
+ }
+ String srcListInsert = "'"+srcListString+"'";
+
+ //getting destinationList Array fields from the firewallRulesList
+ JsonArray destListArray = ruleListobj.getJsonArray("destinationList");
+ String destListString = null;
+
+ int destListIndex = 0;
+ for (JsonValue destListJsonValue : destListArray) {
+ JsonObject destListObj = destListArray.getJsonObject(destListIndex);
+ String type = destListObj.get("type").toString().replace("\"", "");
+
+ String value = null;
+ if(type.equals("REFERENCE")||type.equals("GROUP")){
+ value = destListObj.get("name").toString();
+ } else if (type.equalsIgnoreCase("ANY")){
+ value = null;
+ } else {
+ value = destListObj.get("value").toString();
+ }
+
+ if(value != null){
+ value = value.replace("\"", "");
+ }
+
+ if (destListString != null) {
+ destListString = destListString.concat(",").concat(value);
+ } else {
+ destListString = value;
+ }
+
+ destListIndex++;
+ }
+ String destListInsert = "'"+destListString+"'";
+
+ //getting destServices Array fields from the firewallRulesList
+ JsonArray destServicesArray = ruleListobj.getJsonArray("destServices");
+ String destPortListString = null;
+
+ int destPortListIndex = 0;
+ for (JsonValue destListJsonValue : destServicesArray) {
+ JsonObject destServicesObj = destServicesArray.getJsonObject(destPortListIndex);
+ String type = destServicesObj.get("type").toString().replace("\"", "");
+
+ String value = null;
+ if(type.equals("REFERENCE")||type.equals("GROUP")){
+ value = destServicesObj.get("name").toString();
+ } else if (type.equalsIgnoreCase("ANY")){
+ value = null;
+ } else {
+ value = destServicesObj.get("value").toString();
+ }
+
+ if(value != null){
+ value = value.replace("\"", "");
+ }
+
+ if (destPortListString != null) {
+ destPortListString = destPortListString.concat(",").concat(value);
+ } else {
+ destPortListString = value;
+ }
+
+ destPortListIndex++;
+ }
+ String destPortListInsert = "'"+destPortListString+"'";
+
+ /*
+ * Create Queries to INSERT data into database tables and execute
+ */
+
+ //Insert Into Terms table
+ String termSql = "INSERT INTO Term (ID, TERMNAME, SRCIPLIST, DESTIPLIST, PROTOCOLLIST, PORTLIST, SRCPORTLIST,"
+ + " DESTPORTLIST, ACTION, DESCRIPTION, FROMZONE, TOZONE, CREATED_BY, MODIFIED_DATE) VALUES ("+termID+","
+ +ruleName+","+srcListInsert+","+destListInsert+","+ "null"+","+"null"+","+"null"+","+destPortListInsert+","
+ +action+","+description+","+fromZoneInsert+","+toZoneInsert+",'API',"+ "null"+ "); ";
+
+ termSql = termSql.replace('"', '\'');
+ st.addBatch(termSql);
+
+ rs = st.executeQuery("SELECT * FROM ACTIONLIST WHERE ACTIONNAME = " + action + ";");
+
+ String actionSql = null;
+ if (rs.next()) {
+ //do nothing
+ } else {
+ actionSql = "INSERT INTO ACTIONLIST (ID, ACTIONNAME, DESCRIPTION) VALUES ("+actionID+","+action+","+action+") ";
+ actionSql = actionSql.replace('"', '\'');
+ st.addBatch(actionSql);
+ }
+
+ st.executeBatch();
+
+ ri++;
+ }
+
+ }
+
+ if (path.contains("serviceGroups")) {
+ int serviceGroupID = 0;
+ int serviceListID = 0;
+ int protocolID = 0;
+ int portID = 0;
+
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM SERVICEGROUP;");
+ if(rs.next()){
+ serviceGroupID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM GROUPSERVICELIST;");
+ if(rs.next()){
+ serviceListID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PROTOCOLLIST;");
+ if(rs.next()){
+ protocolID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PORTLIST;");
+ if(rs.next()){
+ portID = rs.getInt("ID");
+ }
+ rs.close();
+
+ String insertQuery = null;
+
+ /*
+ * Inserting serviceGroups data into the ServiceGroup, ServiceList, ProtocolList, and PortList tables
+ */
+ int si = 0;
+ for(JsonValue jsonValue : serviceGroup) {
+
+ /*
+ * Populate ArrayLists with values from the JSON
+ */
+ //create the JSON object from the JSON Array for each iteration through the for loop
+ JsonObject svcGroupListobj = serviceGroup.getJsonObject(si);
+
+ String groupName = svcGroupListobj.get("name").toString().replace('"', '\'');
+
+ String description = null;
+ if (svcGroupListobj.containsKey("description")){
+ description = svcGroupListobj.get("description").toString().replace('"', '\'');
+ }
+
+ JsonArray membersArray = svcGroupListobj.getJsonArray("members");
+
+ Boolean isServiceGroup = false;
+ if (membersArray!=null){
+ String membersType = membersArray.getJsonObject(0).get("type").toString();
+ if (membersType.contains("REFERENCE")) {
+ isServiceGroup = true;
+ }
+ }
+
+ //Insert values into GROUPSERVICELIST table if name begins with Group
+ if (isServiceGroup) {
+
+ rs = st.executeQuery("SELECT * FROM GROUPSERVICELIST WHERE NAME = "+ groupName + ";");
+
+ if (rs.next()) {
+ st.executeUpdate("DELETE FROM GROUPSERVICELIST WHERE NAME = "+ groupName + ";");
+ }
+ rs.close();
+ //increment ID Primary Keys
+ serviceListID = serviceListID + 1;
+
+ String name = null;
+ int membersIndex = 0;
+ for (JsonValue membersValue : membersArray) {
+ JsonObject membersObj = membersArray.getJsonObject(membersIndex);
+ String type = membersObj.get("type").toString().replace("\"", "");
+
+ String value = null;
+ if(type.equals("REFERENCE")||type.equals("GROUP")||type.equals("SERVICE")){
+ value = membersObj.get("name").toString();
+ } else if (type.equalsIgnoreCase("ANY")){
+ value = null;
+ } else {
+ value = membersObj.get("value").toString();
+ }
+
+ if(value != null){
+ value = value.replace("\"", "");
+ }
+
+ if (name != null) {
+ name = name.concat(",").concat(value);
+ } else {
+ name = value;
+ }
+
+ membersIndex++;
+ }
+ String nameInsert = "'"+name+"'";
+
+ insertQuery = "INSERT INTO GROUPSERVICELIST (ID, NAME, SERVICELIST) "
+ + "VALUES("+serviceListID+","+groupName+","+nameInsert+")";
+
+ //Replace double quote with single quote
+ insertQuery = insertQuery.replace('"', '\'');
+
+ //Execute the queries to Insert data
+ st.executeUpdate(insertQuery);
+
+ } else { //Insert JSON data serviceGroup table, protocollist table, and portlist table
+
+ //increment ID Primary Keys
+ protocolID = protocolID + 1;
+ portID = portID + 1;
+ serviceGroupID = serviceGroupID + 1;
+
+ String type = svcGroupListobj.get("type").toString().replace('"', '\'');
+ String transportProtocol = svcGroupListobj.get("transportProtocol").toString().replace('"', '\'');
+ String ports = svcGroupListobj.get("ports").toString().replace('"', '\'');
+
+ rs = st.executeQuery("SELECT * FROM SERVICEGROUP WHERE NAME = "+ groupName + ";");
+
+ if (rs.next()) {
+ st.executeUpdate("DELETE FROM SERVICEGROUP WHERE NAME = "+ groupName + ";");
+ }
+ rs.close();
+
+ String svcGroupSql = "INSERT INTO SERVICEGROUP (ID, NAME, DESCRIPTION, TYPE, TRANSPORTPROTOCOL, APPPROTOCOL, PORTS) "
+ + "VALUES("+serviceGroupID+","+groupName+","+description+","+type+","
+ + transportProtocol+","+"null,"+ports+"); ";
+ svcGroupSql = svcGroupSql.replace('"', '\'');
+ st.addBatch(svcGroupSql);
+
+ rs = st.executeQuery("SELECT * FROM PROTOCOLLIST WHERE PROTOCOLNAME = " + transportProtocol + ";");
+
+ String protoSql = null;
+ if (rs.next()) {
+ //do nothing
+ } else {
+ protoSql = "INSERT INTO PROTOCOLLIST (ID, PROTOCOLNAME, DESCRIPTION) "
+ + "VALUES("+protocolID+","+transportProtocol+","+transportProtocol+"); ";
+ protoSql = protoSql.replace('"', '\'');
+ st.addBatch(protoSql);
+
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT * FROM PORTLIST WHERE PORTNAME = " + ports + ";");
+
+ String portSql = null;
+ if (rs.next()) {
+ //do nothing
+ } else {
+ portSql = "INSERT INTO PORTLIST (ID, PORTNAME, DESCRIPTION) VALUES("+portID+","+ports+","+ports+"); ";
+ portSql = portSql.replace('"', '\'');
+ st.addBatch(portSql);
+ }
+ rs.close();
+
+ st.executeBatch();
+
+ }
+
+
+ si++;
+ }
+
+ }
+
+ if (path.contains("addressGroups")) {
+ /*
+ * Inserting addressGroup data into the ADDRESSGROUP table
+ */
+ int prefixID = 0;
+ int addressID = 0;
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PREFIXLIST;");
+ if(rs.next()){
+ prefixID = rs.getInt("ID");
+ }
+ rs.close();
+
+ rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ADDRESSGROUP;");
+ if(rs.next()){
+ addressID = rs.getInt("ID");
+ }
+ rs.close();
+
+ String insertQuery = null;
+
+ int ai = 0;
+ for(JsonValue jsonValue : addressGroup) {
+
+ /*
+ * Populate ArrayLists with values from the JSON
+ */
+ //create the JSON object from the JSON Array for each iteration through the for loop
+ JsonObject addressGroupObj = addressGroup.getJsonObject(ai);
+
+ //create JSON array for members
+ JsonArray membersArray = addressGroupObj.getJsonArray("members");
+ String addressGroupName = addressGroupObj.get("name").toString().replace('"', '\'');
+
+ String description = null;
+ if (addressGroupObj.containsKey("description")){
+ description = addressGroupObj.get("description").toString().replace('"', '\'');
+ }
+
+ String prefixIP = null;
+ String type = null;
+ int membersIndex = 0;
+ for (JsonValue membersValue : membersArray) {
+ JsonObject membersObj = membersArray.getJsonObject(membersIndex);
+ type = membersObj.get("type").toString().replace("\"", "");
+
+ String value = null;
+ if(type.equals("REFERENCE")||type.equals("GROUP")||type.equals("SERVICE")){
+ value = membersObj.get("name").toString();
+ } else if (type.equalsIgnoreCase("ANY")){
+ value = null;
+ } else {
+ value = membersObj.get("value").toString();
+ }
+
+ if(value != null){
+ value = value.replace("\"", "");
+ }
+
+ if (prefixIP != null) {
+ prefixIP = prefixIP.concat(",").concat(value);
+ } else {
+ prefixIP = value;
+ }
+
+ membersIndex++;
+ }
+ String prefixList = "'"+prefixIP+"'";
+
+ Boolean isAddressGroup = type.contains("REFERENCE");
+
+ if (isAddressGroup) {
+
+ rs = st.executeQuery("SELECT * FROM ADDRESSGROUP WHERE NAME = "+ addressGroupName + ";");
+
+ if (rs.next()) {
+ st.executeUpdate("DELETE FROM ADDRESSGROUP WHERE NAME = "+ addressGroupName + ";");
+ }
+ rs.close();
+ //increment ID Primary Keys
+ addressID = addressID + 1;
+
+ insertQuery = "INSERT INTO ADDRESSGROUP (ID, NAME, DESCRIPTION, PREFIXLIST) "
+ + "VALUES("+addressID+","+addressGroupName+","+description+","+prefixList+")";
+
+
+
+ } else {
+
+ rs = st.executeQuery("SELECT * FROM PREFIXLIST WHERE PL_NAME = "+ addressGroupName + ";");
+
+ if (rs.next()) {
+ st.executeUpdate("DELETE FROM PREFIXLIST WHERE PL_NAME = "+ addressGroupName + ";");
+ }
+ rs.close();
+ //increment ID Primary Key
+ prefixID = prefixID + 1;
+
+ insertQuery = "INSERT INTO PREFIXLIST (ID, PL_NAME, PL_VALUE, DESCRIPTION) "
+ + "VALUES("+prefixID+","+addressGroupName+","+prefixList+","+description+")";
+
+ }
+
+
+ //Replace double quote with single quote
+ insertQuery = insertQuery.replace('"', '\'');
+
+ //Execute the queries to Insert data
+ st.executeUpdate(insertQuery);
+
+ ai++;
+ }
+
+ }
+
+ i++;
+ }
+
+ /*
+ * Remove duplicate values from 'lookup' dictionary tables
+ */
+ //ProtocolList Table
+ String protoDelete = "DELETE FROM protocollist USING protocollist, protocollist p1 "
+ + "WHERE protocollist.id > p1.id AND protocollist.protocolname = p1.protocolname;";
+ st.addBatch(protoDelete);
+
+ //PortList Table
+ String portListDelete = "DELETE FROM portlist USING portlist, portlist p1 "
+ + "WHERE portlist.id > p1.id AND portlist.portname = p1.portname; ";
+ st.addBatch(portListDelete);
+
+ //PrefixList Table
+ String prefixListDelete = "DELETE FROM prefixlist USING prefixlist, prefixlist p1 "
+ + "WHERE prefixlist.id > p1.id AND prefixlist.pl_name = p1.pl_name AND "
+ + "prefixlist.pl_value = p1.pl_value AND prefixlist.description = p1.description; ";
+ st.addBatch(prefixListDelete);
+
+ //GroupServiceList
+ String groupServiceDelete = "DELETE FROM groupservicelist USING groupservicelist, groupservicelist g1 "
+ + "WHERE groupservicelist.id > g1.id AND groupservicelist.name = g1.name AND "
+ + "groupservicelist.serviceList = g1.serviceList; ";
+ st.addBatch(groupServiceDelete);
+
+ st.executeBatch();
+
+ } catch (ClassNotFoundException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "FirewallConfigPolicy", "Exception building Firewall queries");
+ System.out.println(e.getMessage());
+ return false;
+
+ } catch (SQLException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "FirewallConfigPolicy", "Exception executing Firewall queries");
+ System.out.println(e.getMessage());
+ return false;
+ } finally {
+ try{
+ if (con!=null) con.close();
+ if (rs!=null) rs.close();
+ if (st!=null) st.close();
+ } catch (Exception ex){}
+ }
+ return true;
+
+ } else {
+ return false;
+ }
+
+}
+
+ private JsonObject stringToJson(String jsonString) {
+
+ JsonObject json = null;
+ if (jsonString != null) {
+
+ //Read jsonBody to JsonObject
+ StringReader in = null;
+
+ in = new StringReader(jsonString);
+
+ JsonReader jsonReader = Json.createReader(in);
+ json = jsonReader.readObject();
+ }
+
+ return json;
+ }
+
+
+ private JsonNode createPatch(String json, String oldJson) {
+ JsonNode oldJason = null;
+ JsonNode updatedJason = null;
+
+ try {
+ oldJason = JsonLoader.fromString(oldJson);
+ updatedJason = JsonLoader.fromString(json);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ JsonPatch jsonPatch = JsonDiff.asJsonPatch(oldJason, updatedJason);
+ JsonNode patchNode = JsonDiff.asJson(oldJason, updatedJason);
+ System.out.println("Sending Patch:" + jsonPatch);
+ return patchNode;
+
+ }
+
+ @Override
+ public Object getCorrectPolicyDataObject() {
+ return policyAdapter.getPolicyData();
+ }
+
+}
+
+
+
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/MicroServiceConfigPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/MicroServiceConfigPolicy.java
new file mode 100644
index 000000000..c65b0be9d
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/MicroServiceConfigPolicy.java
@@ -0,0 +1,561 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.json.stream.JsonGenerationException;
+
+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.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.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 org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class MicroServiceConfigPolicy extends Policy {
+
+ /**
+ * Config Fields
+ */
+ private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+ public MicroServiceConfigPolicy() {
+ super();
+ }
+
+ public MicroServiceConfigPolicy(PolicyRestAdapter policyAdapter){
+ this.policyAdapter = policyAdapter;
+ }
+
+ //save configuration of the policy based on the policyname
+ private void saveConfigurations(String policyName, String prevPolicyName, String jsonBody) {
+ String domain = getParentPathSubScopeDir();
+ String path = domain.replace('\\', '.');
+ if(path.contains("/")){
+ path = domain.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ try {
+ String body = null;
+ try {
+ body = jsonBody;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ System.out.println(body);
+ if(policyName.endsWith(".xml")){
+ policyName = policyName.substring(0, policyName.lastIndexOf(".xml"));
+ }
+ PrintWriter out = new PrintWriter(CONFIG_HOME + File.separator+path + "."+ policyName +".json");
+ out.println(body);
+ out.close();
+
+ } catch (JsonGenerationException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ //getting the policy name and setting to configuration on adding .json
+ private String getConfigFile(String filename) {
+ filename = FilenameUtils.removeExtension(filename);
+ if (filename.endsWith(".xml")) {
+ filename = filename.substring(0, filename.length() - 4);
+ }
+ filename = filename +".json";
+ return filename;
+ }
+
+ @Override
+ public Map<String, String> savePolicies() throws Exception {
+
+ Map<String, String> successMap = new HashMap<String,String>();
+ if(isPolicyExists()){
+ successMap.put("EXISTS", "This Policy already exist on the PAP");
+ return successMap;
+ }
+
+ if(!isPreparedToSave()){
+ //Prep and configure the policy for saving
+ prepareToSave();
+ }
+
+ // Until here we prepared the data and here calling the method to create xml.
+ Path newPolicyPath = null;
+ newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+ successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );
+ if (successMap.containsKey("success")) {
+ Path finalPolicyPath = getFinalPolicyPath();
+ policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+ }
+ 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
+ @Override
+ public boolean prepareToSave() throws Exception{
+
+ if(isPreparedToSave()){
+ //we have already done this
+ return true;
+ }
+
+ int version = 0;
+ String policyID = policyAdapter.getPolicyID();
+
+ if (policyAdapter.isEditPolicy()) {
+ version = policyAdapter.getHighestVersion() + 1;
+ } else {
+ version = 1;
+ }
+
+ // Create the Instance for pojo, PolicyType object is used in marshalling.
+ if (policyAdapter.getPolicyType().equals("Config")) {
+ PolicyType policyConfig = new PolicyType();
+
+ policyConfig.setVersion(Integer.toString(version));
+ policyConfig.setPolicyId(policyID);
+ policyConfig.setTarget(new TargetType());
+ policyAdapter.setData(policyConfig);
+ }
+
+ if (policyAdapter.getData() != null) {
+
+ // Save off everything
+ // making ready all the required elements to generate the action policy xml.
+ // Get the uniqueness for policy name.
+ String prevPolicyName = null;
+ if(policyAdapter.isEditPolicy()){
+ prevPolicyName = "Config_MS_" + policyAdapter.getPolicyName() + "." + policyAdapter.getHighestVersion() + ".xml";
+ }
+
+ Path newFile = this.getNextLoopFilename(Paths.get(policyAdapter.getParentPath()), policyAdapter.getPolicyType(),
+ policyAdapter.getConfigPolicyType(), policyAdapter.getPolicyName(), version);
+
+ if (newFile == null) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Policy already Exists, cannot create the policy.");
+ PolicyLogger.error("Policy already Exists, cannot create the policy.");
+ setPolicyExists(true);
+ return false;
+ }
+
+ policyName = newFile.getFileName().toString();
+
+ // Save the Configurations file with the policy name with extention based on selection.
+ String jsonBody = policyAdapter.getJsonBody();
+ saveConfigurations(policyName, prevPolicyName, jsonBody);
+
+ // Make sure the filename ends with an extension
+ if (policyName.endsWith(".xml") == false) {
+ policyName = policyName + ".xml";
+ }
+
+
+ PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+
+ configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+ configPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+
+ AllOfType allOfOne = new AllOfType();
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ logger.info("print the main domain value "+policyDir);
+ String path = policyDir.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ String fileName = FilenameUtils.removeExtension(policyName);
+ fileName = path + "." + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+
+ // Match for policyName
+ allOfOne.getMatch().add(createMatch("PolicyName", name));
+
+ AllOfType allOf = new AllOfType();
+
+ // Adding the matches to AllOfType element Match for Ecomp
+ allOf.getMatch().add(createMatch("ECOMPName", policyAdapter.getEcompName()));
+ // Match for ConfigName
+ allOf.getMatch().add(createMatch("ConfigName", policyAdapter.getConfigName()));
+ // Match for Service
+ allOf.getMatch().add(createDynamicMatch("service", policyAdapter.getServiceType()));
+ // Match for uuid
+ allOf.getMatch().add(createDynamicMatch("uuid", policyAdapter.getUuid()));
+ // Match for location
+ allOf.getMatch().add(createDynamicMatch("location", policyAdapter.getLocation()));
+ // Match for riskType
+ allOf.getMatch().add(
+ createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+ // Match for riskLevel
+ allOf.getMatch().add(
+ createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+ // Match for riskguard
+ allOf.getMatch().add(
+ createDynamicMatch("guard", policyAdapter.getGuard()));
+ // Match for ttlDate
+ allOf.getMatch().add(
+ createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+
+ AnyOfType anyOf = new AnyOfType();
+ anyOf.getAllOf().add(allOfOne);
+ anyOf.getAllOf().add(allOf);
+
+ TargetType target = new TargetType();
+ ((TargetType) target).getAnyOf().add(anyOf);
+
+ // Adding the target to the policy element
+ configPolicy.setTarget((TargetType) target);
+
+ RuleType rule = new RuleType();
+ rule.setRuleId(policyAdapter.getRuleID());
+
+ rule.setEffect(EffectType.PERMIT);
+
+ // Create Target in Rule
+ AllOfType allOfInRule = new AllOfType();
+
+ // Creating match for ACCESS in rule target
+ MatchType accessMatch = new MatchType();
+ AttributeValueType accessAttributeValue = new AttributeValueType();
+ accessAttributeValue.setDataType(STRING_DATATYPE);
+ accessAttributeValue.getContent().add("ACCESS");
+ accessMatch.setAttributeValue(accessAttributeValue);
+ AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+ URI accessURI = null;
+ try {
+ accessURI = new URI(ACTION_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "MicroServiceConfigPolicy", "Exception creating ACCESS URI");
+ }
+ accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+ accessAttributeDesignator.setDataType(STRING_DATATYPE);
+ accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+ accessMatch.setAttributeDesignator(accessAttributeDesignator);
+ accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ // Creating Config Match in rule Target
+ MatchType configMatch = new MatchType();
+ AttributeValueType configAttributeValue = new AttributeValueType();
+ configAttributeValue.setDataType(STRING_DATATYPE);
+ configAttributeValue.getContent().add("Config");
+ configMatch.setAttributeValue(configAttributeValue);
+ AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+ URI configURI = null;
+ try {
+ configURI = new URI(RESOURCE_ID);
+ } catch (URISyntaxException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+ PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "MicroServiceConfigPolicy", "Exception creating Config URI");
+ }
+ configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+ configAttributeDesignator.setDataType(STRING_DATATYPE);
+ configAttributeDesignator.setAttributeId(new IdentifierImpl(configURI).stringValue());
+ configMatch.setAttributeDesignator(configAttributeDesignator);
+ configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+ allOfInRule.getMatch().add(accessMatch);
+ allOfInRule.getMatch().add(configMatch);
+
+ AnyOfType anyOfInRule = new AnyOfType();
+ anyOfInRule.getAllOf().add(allOfInRule);
+
+ TargetType targetInRule = new TargetType();
+ targetInRule.getAnyOf().add(anyOfInRule);
+
+ rule.setTarget(targetInRule);
+ rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+ configPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+ policyAdapter.setPolicyData(configPolicy);
+
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ PolicyLogger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+ }
+ setPreparedToSave(true);
+ return true;
+ }
+
+ // Data required for Advice part is setting here.
+ private AdviceExpressionsType getAdviceExpressions(int version, String fileName) {
+ AdviceExpressionsType advices = new AdviceExpressionsType();
+ AdviceExpressionType advice = new AdviceExpressionType();
+ advice.setAdviceId("MSID");
+ advice.setAppliesTo(EffectType.PERMIT);
+ // For Configuration
+ AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+ assignment1.setAttributeId("type");
+ assignment1.setCategory(CATEGORY_RESOURCE);
+ assignment1.setIssuer("");
+
+ AttributeValueType configNameAttributeValue = new AttributeValueType();
+ configNameAttributeValue.setDataType(STRING_DATATYPE);
+ configNameAttributeValue.getContent().add("Configuration");
+ assignment1.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue));
+
+ advice.getAttributeAssignmentExpression().add(assignment1);
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ // For Config file Url if configurations are provided.
+ AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+ assignment2.setAttributeId("URLID");
+ assignment2.setCategory(CATEGORY_RESOURCE);
+ assignment2.setIssuer("");
+
+ AttributeValueType AttributeValue = new AttributeValueType();
+ AttributeValue.setDataType(URI_DATATYPE);
+ String policyDir1 = policyAdapter.getParentPath().toString();
+ int startIndex1 = policyDir1.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+ logger.info("print the main domain value"+policyDir1);
+ String path = policyDir1.replace('\\', '.');
+ if(path.contains("/")){
+ path = policyDir1.replace('/', '.');
+ logger.info("print the path:" +path);
+ }
+ String content = CONFIG_URL +"/Config/" + path + "." + getConfigFile(policyName);
+ System.out.println("URL value :" + content);
+ AttributeValue.getContent().add(content);
+ assignment2.setExpression(new ObjectFactory().createAttributeValue(AttributeValue));
+
+ advice.getAttributeAssignmentExpression().add(assignment2);
+ AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+ assignment3.setAttributeId("PolicyName");
+ assignment3.setCategory(CATEGORY_RESOURCE);
+ assignment3.setIssuer("");
+
+ AttributeValueType attributeValue3 = new AttributeValueType();
+ attributeValue3.setDataType(STRING_DATATYPE);
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+ StringTokenizer tokenizer = null;
+ StringBuffer buffer = new StringBuffer();
+ if (policyDir.contains("\\")) {
+ tokenizer = new StringTokenizer(policyDir, "\\");
+ } else {
+ tokenizer = new StringTokenizer(policyDir, "/");
+ }
+ if (tokenizer != null) {
+ while (tokenizer.hasMoreElements()) {
+ String value = tokenizer.nextToken();
+ buffer.append(value);
+ buffer.append(".");
+ }
+ }
+ fileName = FilenameUtils.removeExtension(fileName);
+ fileName = buffer.toString() + fileName + ".xml";
+ String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+ if ((name == null) || (name.equals(""))) {
+ name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+ }
+ attributeValue3.getContent().add(name);
+ assignment3.setExpression(new ObjectFactory().createAttributeValue(attributeValue3));
+ advice.getAttributeAssignmentExpression().add(assignment3);
+
+ AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+ assignment4.setAttributeId("VersionNumber");
+ assignment4.setCategory(CATEGORY_RESOURCE);
+ assignment4.setIssuer("");
+
+ AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+ configNameAttributeValue4.setDataType(STRING_DATATYPE);
+ configNameAttributeValue4.getContent().add(Integer.toString(version));
+ assignment4.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue4));
+
+ advice.getAttributeAssignmentExpression().add(assignment4);
+
+ AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+ assignment5.setAttributeId("matching:" + this.ECOMPID);
+ assignment5.setCategory(CATEGORY_RESOURCE);
+ assignment5.setIssuer("");
+
+ AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+ configNameAttributeValue5.setDataType(STRING_DATATYPE);
+ configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+ assignment5.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue5));
+
+ advice.getAttributeAssignmentExpression().add(assignment5);
+
+ AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+ assignment6.setAttributeId("matching:" + this.CONFIGID);
+ assignment6.setCategory(CATEGORY_RESOURCE);
+ assignment6.setIssuer("");
+
+ AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+ configNameAttributeValue6.setDataType(STRING_DATATYPE);
+ configNameAttributeValue6.getContent().add(policyAdapter.getConfigName());
+ assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+
+ advice.getAttributeAssignmentExpression().add(assignment6);
+ AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+ assignment7.setAttributeId("matching:service");
+ assignment7.setCategory(CATEGORY_RESOURCE);
+ assignment7.setIssuer("");
+
+ AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+ configNameAttributeValue7.setDataType(STRING_DATATYPE);
+ configNameAttributeValue7.getContent().add(policyAdapter.getServiceType());
+ assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+ advice.getAttributeAssignmentExpression().add(assignment7);
+
+ AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+ assignment8.setAttributeId("matching:uuid");
+ assignment8.setCategory(CATEGORY_RESOURCE);
+ assignment8.setIssuer("");
+
+ AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+ configNameAttributeValue8.setDataType(STRING_DATATYPE);
+ configNameAttributeValue8.getContent().add(policyAdapter.getUuid());
+ assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+ advice.getAttributeAssignmentExpression().add(assignment8);
+
+ AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+ assignment9.setAttributeId("matching:Location");
+ assignment9.setCategory(CATEGORY_RESOURCE);
+ assignment9.setIssuer("");
+
+ AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+ configNameAttributeValue9.setDataType(STRING_DATATYPE);
+ configNameAttributeValue9.getContent().add(policyAdapter.getLocation());
+ assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+ advice.getAttributeAssignmentExpression().add(assignment9);
+
+ AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+ assignment10.setAttributeId("Priority");
+ assignment10.setCategory(CATEGORY_RESOURCE);
+ assignment10.setIssuer("");
+
+ AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+ configNameAttributeValue10.setDataType(STRING_DATATYPE);
+ configNameAttributeValue10.getContent().add(policyAdapter.getPriority());
+ assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+ advice.getAttributeAssignmentExpression().add(assignment10);
+
+ //Risk Attributes
+ AttributeAssignmentExpressionType assignment11 = new AttributeAssignmentExpressionType();
+ assignment11.setAttributeId("RiskType");
+ assignment11.setCategory(CATEGORY_RESOURCE);
+ assignment11.setIssuer("");
+
+ AttributeValueType configNameAttributeValue11 = new AttributeValueType();
+ configNameAttributeValue11.setDataType(STRING_DATATYPE);
+ configNameAttributeValue11.getContent().add(policyAdapter.getRiskType());
+ assignment11.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue11));
+
+ advice.getAttributeAssignmentExpression().add(assignment11);
+
+ AttributeAssignmentExpressionType assignment12 = new AttributeAssignmentExpressionType();
+ assignment12.setAttributeId("RiskLevel");
+ assignment12.setCategory(CATEGORY_RESOURCE);
+ assignment12.setIssuer("");
+
+ AttributeValueType configNameAttributeValue12 = new AttributeValueType();
+ configNameAttributeValue12.setDataType(STRING_DATATYPE);
+ configNameAttributeValue12.getContent().add(policyAdapter.getRiskLevel());
+ assignment12.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue12));
+
+ advice.getAttributeAssignmentExpression().add(assignment12);
+
+ AttributeAssignmentExpressionType assignment13 = new AttributeAssignmentExpressionType();
+ assignment13.setAttributeId("guard");
+ assignment13.setCategory(CATEGORY_RESOURCE);
+ assignment13.setIssuer("");
+
+ AttributeValueType configNameAttributeValue13 = new AttributeValueType();
+ configNameAttributeValue13.setDataType(STRING_DATATYPE);
+ configNameAttributeValue13.getContent().add(policyAdapter.getRiskLevel());
+ assignment13.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue13));
+
+ advice.getAttributeAssignmentExpression().add(assignment13);
+
+ AttributeAssignmentExpressionType assignment14 = new AttributeAssignmentExpressionType();
+ assignment14.setAttributeId("TTLDate");
+ assignment14.setCategory(CATEGORY_RESOURCE);
+ assignment14.setIssuer("");
+
+ AttributeValueType configNameAttributeValue14 = new AttributeValueType();
+ configNameAttributeValue14.setDataType(STRING_DATATYPE);
+ configNameAttributeValue14.getContent().add(policyAdapter.getTtlDate());
+ assignment14.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue14));
+
+ advice.getAttributeAssignmentExpression().add(assignment14);
+
+ advices.getAdviceExpression().add(advice);
+ return advices;
+ }
+
+ @Override
+ public Object getCorrectPolicyDataObject() {
+ return policyAdapter.getPolicyData();
+ }
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/Policy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/Policy.java
new file mode 100644
index 000000000..09c90de68
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/Policy.java
@@ -0,0 +1,455 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.json.Json;
+import javax.json.JsonReader;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.rest.XACMLRestProperties;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.std.IdentifierImpl;
+import org.openecomp.policy.xacml.util.XACMLPolicyWriter;
+import com.att.research.xacml.util.XACMLProperties;
+import com.att.research.xacmlatt.pdp.policy.PolicyDef;
+import com.att.research.xacmlatt.pdp.policy.dom.DOMPolicyDef;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public abstract class Policy {
+
+ /**
+ * Common Fields
+ */
+ public static final String GET_INT_TYPE = "Integer";
+ public static final String GET_STRING_TYPE = "String";
+
+ public static final String ECOMPID = "ECOMPName";
+ public static final String CONFIGID = "ConfigName";
+ public static final String CLOSEDLOOPID = "ServiceType";
+
+ public static final String CONFIG_POLICY = "Config";
+ public static final String ACTION_POLICY = "Action";
+ public static final String DECISION_POLICY = "Decision";
+
+ protected String policyName = null;
+ private static final Logger logger = FlexLogger.getLogger(Policy.class);
+
+ boolean isValidForm = true;
+
+ private Path finalPolicyPath = null;
+
+ private boolean preparedToSave = false;
+
+ private boolean policyExists = false;
+
+ public Path getFinalPolicyPath() {
+ return finalPolicyPath;
+ }
+
+ public void setFinalPolicyPath(Path finalPolicyPath) {
+ this.finalPolicyPath = finalPolicyPath;
+ }
+
+ // Constants Used in XML Creation
+ public static final String CATEGORY_RECIPIENT_SUBJECT = "urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject";
+ public static final String CATEGORY_RESOURCE = "urn:oasis:names:tc:xacml:3.0:attribute-category:resource";
+ public static final String CATEGORY_ACTION = "urn:oasis:names:tc:xacml:3.0:attribute-category:action";
+ public static final String CATEGORY_ACCESS_SUBJECT = "urn:oasis:names:tc:xacml:1.0:subject-category:access-subject";
+ public static final String ACTION_ID = "urn:oasis:names:tc:xacml:1.0:action:action-id";
+ public static final String SUBJECT_ID = "urn:oasis:names:tc:xacml:1.0:subject:subject-id";
+ public static final String RESOURCE_ID = "urn:oasis:names:tc:xacml:1.0:resource:resource-id";
+ public static final String FUNTION_INTEGER_ONE_AND_ONLY = "urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only";
+ public static final String FUNCTION_STRING_ONE_AND_ONLY = "urn:oasis:names:tc:xacml:1.0:function:string-one-and-only";
+ public static final String FUNCTION_BOOLEAN_ONE_AND_ONLY = "urn:oasis:names:tc:xacml:1.0:function:boolean-one-and-only";
+ public static final String FUNCTION_STRING_EQUAL = "urn:oasis:names:tc:xacml:1.0:function:string-equal";
+ public static final String FUNCTION_STRING_REGEX_MATCH = "org.openecomp.function.regex-match";
+ public static final String FUNCTION_STRING_EQUAL_IGNORE = "urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case";
+ public static final String INTEGER_DATATYPE = "http://www.w3.org/2001/XMLSchema#integer";
+ public static final String BOOLEAN_DATATYPE = "http://www.w3.org/2001/XMLSchema#boolean";
+ public static final String STRING_DATATYPE = "http://www.w3.org/2001/XMLSchema#string";
+ public static final String URI_DATATYPE = "http://www.w3.org/2001/XMLSchema#anyURI";
+ public static final String RULE_VARIABLE = "var:";
+ public static final String EMPTY_STRING = "";
+ private static final String String = null;
+
+ public static String CONFIG_HOME = null;
+ public static String ACTION_HOME = null;
+ public static String CONFIG_URL = null;
+
+ protected Map<String, String> performer = new HashMap<String, String>();
+
+ private static String actionHome = null;
+ private static String configHome = null;
+
+ public PolicyRestAdapter policyAdapter = null;
+ String ruleID = "";
+
+ public Policy() {
+ CONFIG_HOME = getConfigHome();
+ ACTION_HOME = getActionHome();
+ CONFIG_URL = "$URL";
+ performer.put("PDP", "PDPAction");
+ performer.put("PEP", "PEPAction");
+ }
+
+ //Each policy type seems to either use policyData or data field policy adapter when
+ //getting the xml to save the policy. Instead of keep this hardcoded in the save method,
+ //this method makes it usable outside.
+ /**
+ * Return the data field of the PolicyAdapter that will be used when saving this policy
+ * with the savePolicies method.
+ * @return Either the PolicyAdapter.getData() or PolicyAdapter.getPolicyData()
+ */
+ public abstract Object getCorrectPolicyDataObject();
+ public abstract Map<String, String> savePolicies() throws Exception;
+
+ //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
+ public abstract boolean prepareToSave() throws Exception;
+
+
+ // create match for ecomp and config name
+ protected MatchType createMatch(String key, String value) {
+ MatchType match = new MatchType();
+
+ AttributeValueType attributeValue = new AttributeValueType();
+ attributeValue.setDataType(STRING_DATATYPE);
+ attributeValue.getContent().add(value);
+ match.setAttributeValue(attributeValue);
+ AttributeDesignatorType attributeDesignator = new AttributeDesignatorType();
+ URI uri = null;
+ try {
+ uri = new URI(key);
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ }
+ attributeDesignator.setCategory(CATEGORY_ACCESS_SUBJECT);
+ attributeDesignator.setDataType(STRING_DATATYPE);
+ attributeDesignator.setAttributeId(new IdentifierImpl(uri).stringValue());
+ match.setAttributeDesignator(attributeDesignator);
+ match.setMatchId(FUNCTION_STRING_REGEX_MATCH);
+ return match;
+ }
+
+ // Creating the match for dynamically added components.
+ protected MatchType createDynamicMatch(String key, String value) {
+ MatchType dynamicMatch = new MatchType();
+ AttributeValueType dynamicAttributeValue = new AttributeValueType();
+ //Attribute attribute = findAttributeByAttributeId(key);
+ String dataType = null;
+ // if (value.matches("[0-9]+")) {
+ // dataType = INTEGER_DATATYPE;
+ // } else {
+ // dataType = STRING_DATATYPE;
+ // }
+ dataType = STRING_DATATYPE;
+ dynamicAttributeValue.setDataType(dataType);
+ dynamicAttributeValue.getContent().add(value);
+ dynamicMatch.setAttributeValue(dynamicAttributeValue);
+
+ AttributeDesignatorType dynamicAttributeDesignator = new AttributeDesignatorType();
+
+ URI dynamicURI = null;
+ try {
+ dynamicURI = new URI(key);
+ } catch (URISyntaxException e) {
+ e.printStackTrace();// log msg
+ }
+ dynamicAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+ dynamicAttributeDesignator.setDataType(dataType);
+ dynamicAttributeDesignator.setAttributeId(new IdentifierImpl(dynamicURI).stringValue());
+ dynamicMatch.setAttributeDesignator(dynamicAttributeDesignator);
+ dynamicMatch.setMatchId(FUNCTION_STRING_REGEX_MATCH);
+
+ return dynamicMatch;
+ }
+
+ //validation for numeric
+ protected boolean isNumeric(String str)
+ {
+ for (char c : str.toCharArray())
+ {
+ if (!Character.isDigit(c)) return false;
+ }
+ return true;
+ }
+
+ // Validation for json.
+ protected static boolean isJSONValid(String data) {
+ try {
+ new JSONObject(data);
+ InputStream stream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
+ JsonReader jsonReader = Json.createReader(stream);
+ System.out.println("Json Value is: " + jsonReader.read().toString() );
+ } catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+
+ // the Policy Name as Unique One throws error
+ protected Path getNextFilename(Path parent, String policyType, String polcyFileName, Integer version) {
+ policyType = FilenameUtils.removeExtension(policyType);
+ polcyFileName = FilenameUtils.removeExtension(polcyFileName);
+ Path newFile = null;
+ String policyDir = EMPTY_STRING;
+ String absolutePath = parent.toString();
+ if (absolutePath != null && !absolutePath.equals(EMPTY_STRING)) {
+ policyDir = absolutePath.substring(absolutePath.lastIndexOf("\\") + 1, absolutePath.length());
+ if (policyDir == null || policyDir.equals(EMPTY_STRING)) {
+ policyDir = absolutePath.substring(absolutePath.lastIndexOf("/") + 1, absolutePath.length());
+ }
+ }
+
+ String fileName = "default";
+ if (policyDir != null && !policyDir.equals(EMPTY_STRING)) {
+ fileName = policyType + "_" + String.format(polcyFileName) + "." + version + ".xml";
+ }
+ if (fileName != null) {
+ newFile = Paths.get(parent.toString(), fileName);
+ }
+ if (Files.notExists(newFile)) {
+ return newFile;
+ }
+ return null;
+ }
+
+ protected Path getNextLoopFilename(Path parentPath, String policyType,
+ String policyConfigType, String policyFileName, Integer version) {
+ policyType = FilenameUtils.removeExtension(policyType);
+ policyConfigType = FilenameUtils.removeExtension(policyConfigType);
+ policyFileName = FilenameUtils.removeExtension(policyFileName);
+ Path newFile = null;
+ String policyDir = EMPTY_STRING;
+ String absolutePath = parentPath.toString();
+ if (absolutePath != null && !absolutePath.equals(EMPTY_STRING)) {
+ policyDir = absolutePath.substring(absolutePath.lastIndexOf("\\") + 1, absolutePath.length());
+ if (policyDir == null || policyDir.equals(EMPTY_STRING)) {
+ policyDir = absolutePath.substring(absolutePath.lastIndexOf("/") + 1, absolutePath.length());
+ }
+ }
+
+ String fileName = "default";
+ if (policyDir != null && !policyDir.equals(EMPTY_STRING)) {
+ if(policyConfigType.equals("ClosedLoop_PM")){
+ fileName = policyType + "_" + "PM" + "_" +java.lang.String.format(policyFileName) + "." +version +".xml";
+ }else if(policyConfigType.equals("ClosedLoop_Fault")){
+ fileName = policyType + "_" + "Fault" + "_" +java.lang.String.format(policyFileName) + "." + version + ".xml";
+ }else if(policyConfigType.equals("ClosedLoop_Fault")){
+ fileName = policyType + "_" + "Fault" + "_" +java.lang.String.format(policyFileName) + "." + version + ".xml";
+ }else if(policyConfigType.equals("DCAE Micro Service")){
+ fileName = policyType + "_" + "MS" + "_" + java.lang.String.format(policyFileName) + "." + version + ".xml";
+ }
+ }
+ if (fileName != null) {
+ newFile = Paths.get(parentPath.toString(), fileName);
+ }
+ if (Files.notExists(newFile)) {
+ return newFile;
+ }
+ return null;
+ }
+
+
+ //create policy once all the validations are completed
+ protected Map<String, String> createPolicy(final Path policyPath, final Object policyData) {
+ Map<String, String> success = new HashMap<String, String>();
+ //
+ // Is the root a PolicySet or Policy?
+ //
+
+ if (policyData instanceof PolicyType) {
+ //
+ // Write it out
+ //
+ //Does not need to be XACMLPolicyWriterWithPapNotify since it is already in the PAP
+ //and this transaction is intercepted up stream.
+ InputStream inputStream = XACMLPolicyWriter.getXmlAsInputStream((PolicyType) policyData);
+ try {
+ PolicyDef policyDef = DOMPolicyDef.load(inputStream);
+ if (policyDef != null) {
+ //This is does not need to be XACMLPolicyWriterWithPapNotification since it is already in the PAP
+ //and the transaction was intercepted up stream
+ finalPolicyPath = XACMLPolicyWriter.writePolicyFile(policyPath, (PolicyType) policyData);
+ this.setFinalPolicyPath(finalPolicyPath);
+ } else{
+ success.put("validation", "PolicyDef Validation Failed");
+ }
+ } catch (Exception e) {
+ success.put("error", "Validation Failed");
+ }
+
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Unknown data type sent back.");
+ PolicyLogger.error("Unknown data type sent back.");
+ return success;
+ }
+ //
+ // Did it get written?
+ //
+ if (finalPolicyPath == null || !Files.exists(finalPolicyPath)) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Failed to write policy file.");
+ PolicyLogger.error("Failed to write policy file.");
+ return success;
+ }
+ try {
+ success.put("success", "success");
+ } finally {
+ // vaadin framework will handle exception.
+ }
+ return success;
+ }
+
+ public static String getConfigHome(){
+ try {
+ loadWebapps();
+ } catch (Exception e) {
+ return null;
+ }
+ return configHome;
+ }
+
+ public static String getActionHome(){
+ try {
+ loadWebapps();
+ } catch (Exception e) {
+ return null;
+ }
+ return actionHome;
+ }
+
+ private static void loadWebapps() throws Exception{
+ if(actionHome == null || configHome == null){
+ Path webappsPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS));
+ //Sanity Check
+ if (webappsPath == null) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Invalid Webapps Path Location property : " + XACMLRestProperties.PROP_PAP_WEBAPPS);
+ PolicyLogger.error("Invalid Webapps Path Location property : " + XACMLRestProperties.PROP_PAP_WEBAPPS);
+ throw new Exception("Invalid Webapps Path Location property : " + XACMLRestProperties.PROP_PAP_WEBAPPS);
+ }
+ Path webappsPathConfig;
+ Path webappsPathAction;
+ if(webappsPath.toString().contains("\\"))
+ {
+ webappsPathConfig = Paths.get(webappsPath.toString()+"\\Config");
+ webappsPathAction = Paths.get(webappsPath.toString()+"\\Action");
+ }
+ else
+ {
+ webappsPathConfig = Paths.get(webappsPath.toString()+"/Config");
+ webappsPathAction = Paths.get(webappsPath.toString()+"/Action");
+ }
+ if (Files.notExists(webappsPathConfig))
+ {
+ try {
+ Files.createDirectories(webappsPathConfig);
+ } catch (IOException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to create config directory: "
+ //+ webappsPathConfig.toAbsolutePath().toString(), e);
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "Policy", "Failed to create config directory");
+ }
+ }
+ if (Files.notExists(webappsPathAction))
+ {
+ try {
+ Files.createDirectories(webappsPathAction);
+ } catch (IOException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to create config directory: "
+ //+ webappsPathAction.toAbsolutePath().toString(), e);
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "Policy", "Failed to create config directory");
+ }
+ }
+ actionHome = webappsPathAction.toString();
+ configHome = webappsPathConfig.toString();
+ }
+ }
+
+ protected String getParentPathSubScopeDir() {
+
+ final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+ String policyDir = policyAdapter.getParentPath().toString();
+ int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+ policyDir = policyDir.substring(startIndex, policyDir.length());
+
+ return policyDir;
+ }
+
+
+ public boolean validateConfigForm() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ /**
+ * @return the preparedToSave
+ */
+ public boolean isPreparedToSave() {
+ return preparedToSave;
+ }
+
+ /**
+ * @param preparedToSave the preparedToSave to set
+ */
+ protected void setPreparedToSave(boolean preparedToSave) {
+ this.preparedToSave = preparedToSave;
+ }
+
+ public boolean isPolicyExists() {
+ return policyExists;
+ }
+
+ public void setPolicyExists(boolean policyExists) {
+ this.policyExists = policyExists;
+ }
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDao.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDao.java
new file mode 100644
index 000000000..bdd7534d8
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDao.java
@@ -0,0 +1,3936 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.InvalidPathException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.Key;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Base64;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.LockModeType;
+import javax.persistence.PersistenceException;
+import javax.persistence.Query;
+import javax.persistence.RollbackException;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.XACMLPapServlet;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.rest.jpa.ActionBodyEntity;
+import org.openecomp.policy.rest.jpa.ConfigurationDataEntity;
+import org.openecomp.policy.rest.jpa.DatabaseLockEntity;
+import org.openecomp.policy.rest.jpa.GroupEntity;
+import org.openecomp.policy.rest.jpa.PdpEntity;
+import org.openecomp.policy.rest.jpa.PolicyDBDaoEntity;
+import org.openecomp.policy.rest.jpa.PolicyEntity;
+import org.openecomp.policy.rest.jpa.PolicyVersion;
+import org.openecomp.policy.rest.util.Webapps;
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+
+import org.xml.sax.InputSource;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import org.openecomp.policy.xacml.api.pap.EcompPDP;
+import org.openecomp.policy.xacml.api.pap.EcompPDPGroup;
+import org.openecomp.policy.xacml.api.pap.PAPPolicyEngine;
+
+import com.att.research.xacml.api.pap.PAPEngine;
+import com.att.research.xacml.api.pap.PAPException;
+import com.att.research.xacml.api.pap.PDP;
+//import com.att.research.xacml.api.pap.PDPGroup;
+import com.att.research.xacml.api.pap.PDPPolicy;
+import org.openecomp.policy.xacml.std.pap.StdPDPGroup;
+import org.openecomp.policy.xacml.std.pap.StdPDPPolicy;
+import org.openecomp.policy.xacml.util.XACMLPolicyScanner;
+import org.openecomp.policy.xacml.util.XACMLPolicyWriter;
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.w3c.dom.Document;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class PolicyDBDao {
+ private static final Logger logger = FlexLogger.getLogger(PolicyDBDao.class);
+ private List<?> otherServers;
+ private EntityManagerFactory emf;
+ private static PolicyDBDao currentInstance = null;
+ private PAPPolicyEngine papEngine;
+
+ public static final String JSON_CONFIG = "JSON";
+ public static final String XML_CONFIG = "XML";
+ public static final String PROPERTIES_CONFIG = "PROPERTIES";
+ public static final String OTHER_CONFIG = "OTHER";
+ public static final String AUDIT_USER = "audit";
+
+ /**
+ * Get an instance of a PolicyDBDao. It creates one if it does not exist.
+ * Only one instance is allowed to be created per server.
+ * @param emf The EntityFactoryManager to be used for database connections
+ * @return The new instance of PolicyDBDao or throw exception if the given emf is null.
+ * @throws IllegalStateException if a PolicyDBDao has already been constructed. Call getPolicyDBDaoInstance() to get this.
+ */
+ public static PolicyDBDao getPolicyDBDaoInstance(EntityManagerFactory emf) throws Exception{
+ logger.debug("getPolicyDBDaoInstance(EntityManagerFactory emf) as getPolicyDBDaoInstance("+emf+") called");
+ if(currentInstance == null){
+ if(emf != null){
+ currentInstance = new PolicyDBDao(emf);
+ return currentInstance;
+ }
+ throw new IllegalStateException("The EntityManagerFactory is Null");
+ }
+ return currentInstance;
+ }
+
+ /**
+ * Gets the current instance of PolicyDBDao.
+ * @return The instance of PolicyDBDao or throws exception if the given instance is null.
+ * @throws IllegalStateException if a PolicyDBDao instance is null. Call createPolicyDBDaoInstance(EntityManagerFactory emf) to get this.
+ */
+ public static PolicyDBDao getPolicyDBDaoInstance() throws Exception{
+ logger.debug("getPolicyDBDaoInstance() as getPolicyDBDaoInstance() called");
+ if(currentInstance != null){
+ return currentInstance;
+ }
+ throw new IllegalStateException("The PolicyDBDao.currentInstance is Null. Use getPolicyDBDao(EntityManagerFactory emf)");
+ }
+ public void setPapEngine(PAPPolicyEngine papEngine2){
+ this.papEngine = (PAPPolicyEngine) papEngine2;
+ }
+ private PolicyDBDao(EntityManagerFactory emf){
+ logger.debug("PolicyDBDao(EntityManagerFactory emf) as PolicyDBDao("+emf+") called");
+ this.emf = emf;
+
+ //not needed in this release
+ if(!register()){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("This server's PolicyDBDao instance could not be registered and may not reveive updates");
+ PolicyLogger.error("This server's PolicyDBDao instance could not be registered and may not reveive updates");
+ }
+
+ otherServers = getRemotePolicyDBDaoList();
+ if(logger.isDebugEnabled()){
+ logger.debug("Number of remote PolicyDBDao instances: "+otherServers.size());
+ }
+ if(otherServers.size() < 1){
+ logger.warn("List of PolicyDBDao servers is empty or could not be retrieved");
+ }
+ //otherServers = new LinkedList();
+ //otherServers.add((Object)"http://localhost:8071/pap/");
+ }
+
+ //not static because we are going to be using the instance's emf
+ //waitTime in ms to wait for lock, or -1 to wait forever (no)
+ private void startTransactionSynced(EntityManager entityMgr,int waitTime){
+ logger.debug("\n\nstartTransactionSynced(EntityManager entityMgr,int waitTime) as "
+ + "\n startTransactionSynced("+entityMgr+","+waitTime+") called\n\n");
+ DatabaseLockEntity lock = null;
+
+ entityMgr.setProperty("javax.persistence.query.timeout", waitTime);
+ entityMgr.getTransaction().begin();
+
+ if(logger.isDebugEnabled()){
+ Map<String,Object> properties = entityMgr.getProperties();
+ logger.debug("\n\nstartTransactionSynced():"
+ + "\n entityManager.getProperties() = " + properties
+ + "\n\n");
+ }
+ try{
+ if(logger.isDebugEnabled()){
+ logger.debug("\n\nstartTransactionSynced():"
+ + "\n ATTEMPT to get the DB lock"
+ + "\n\n");
+ }
+ lock = entityMgr.find(DatabaseLockEntity.class, 1, LockModeType.PESSIMISTIC_WRITE);
+ if(logger.isDebugEnabled()){
+ logger.debug("\n\nstartTransactionSynced():"
+ + "\n GOT the DB lock"
+ + "\n\n");
+ }
+ } catch(Exception e){
+ System.out.println("Could not get lock entity");
+ e.printStackTrace();
+ }
+ if(lock == null){
+ throw new IllegalStateException("The lock row does not exist in the table. Please create a primary key with value = 1.");
+ }
+
+ }
+ /**
+ * Gets the list of other registered PolicyDBDaos from the database
+ * @return List (type PolicyDBDaoEntity) of other PolicyDBDaos
+ */
+ private List<?> getRemotePolicyDBDaoList(){
+ logger.debug("getRemotePolicyDBDaoList() as getRemotePolicyDBDaoList() called");
+ List<?> policyDBDaoEntityList = new LinkedList<Object>();
+ EntityManager em = emf.createEntityManager();
+ startTransactionSynced(em, 1000);
+ try{
+ Query getPolicyDBDaoEntityQuery = em.createNamedQuery("PolicyDBDaoEntity.findAll");
+ policyDBDaoEntityList = getPolicyDBDaoEntityQuery.getResultList();
+
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on: getPolicyDBDaoEntityQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception querying for other registered PolicyDBDaos");
+ logger.warn("List of remote PolicyDBDaos will be empty");
+ }
+ try{
+ em.getTransaction().commit();
+ } catch(Exception e){
+ try{
+ em.getTransaction().rollback();
+ } catch(Exception e2){
+
+ }
+ }
+ em.close();
+ return policyDBDaoEntityList;
+ }
+
+ public PolicyDBDaoTransaction getNewTransaction(){
+ logger.debug("getNewTransaction() as getNewTransaction() called");
+ return (PolicyDBDaoTransaction)(new PolicyDBDaoTransactionInstance());
+ }
+
+ /*
+ * Because the normal transactions are not used in audits, we can use the same transaction
+ * mechanism to get a transaction and obtain the emlock and the DB lock. We just need to
+ * provide different transaction timeout values in ms because the audit will run longer
+ * than normal transactions.
+ */
+ public PolicyDBDaoTransaction getNewAuditTransaction(){
+ logger.debug("getNewAuditTransaction() as getNewAuditTransaction() called");
+ //Use the standard transaction wait time in ms
+ int auditWaitMs = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_TRANS_WAIT));
+ //Use the (extended) audit timeout time in ms
+ int auditTimeoutMs = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_AUDIT_TIMEOUT));
+ return (PolicyDBDaoTransaction)(new PolicyDBDaoTransactionInstance(auditTimeoutMs, auditWaitMs));
+ }
+
+
+ /**
+ * Checks if two strings are equal. Null strings ARE allowed.
+ * @param one A String or null to compare
+ * @param two A String or null to compare
+ */
+ private static boolean stringEquals(String one, String two){
+ logger.debug("stringEquals(String one, String two) as stringEquals("+one+", "+two+") called");
+ if(one == null && two == null){
+ return true;
+ }
+ if(one == null || two == null){
+ return false;
+ }
+ return one.equals(two);
+ }
+
+ /**
+ * Computes the scope in dotted format based on an absolute path and a path that divides the scope.
+ * @param fullPath An absolute path including scope folders and other folders(does not have to be absolute, must just contain scope and other folders before)
+ * @param pathToExclude The path that acts as a division between the scope and the other folders
+ * @return The scope in dotted format (org.openecomp)
+ */
+ private static String computeScope(String fullPath, String pathToExclude){
+ logger.debug("computeScope(String fullPath, String pathToExclude) as computeScope("+fullPath+", "+pathToExclude+") called");
+ int excludeIndex = fullPath.indexOf(pathToExclude);
+ String scopePath = fullPath.substring(excludeIndex+pathToExclude.length());
+ String scope = scopePath.replace('\\', '.');
+ scope = scope.replace('/', '.');
+ if(scope.charAt(0) == '.'){
+ scope = scope.substring(1);
+ }
+ if(scope.charAt(scope.length()-1) == '.'){
+ scope = scope.substring(0, scope.length()-1);
+ }
+ return scope;
+ }
+
+ /**
+ * Returns the url of this local pap server, removing the username and password, if they are present
+ * @return The url of this local pap server
+ */
+ private String[] getPapUrlUserPass(){
+ logger.debug("getPapUrl() as getPapUrl() called");
+ String url = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_URL);
+ if(url == null){
+ return null;
+ }
+ return splitPapUrlUserPass(url);
+
+
+ }
+ private String[] splitPapUrlUserPass(String url){
+ String[] urlUserPass = new String[3];
+ String[] commaSplit = url.split(",");
+ urlUserPass[0] = commaSplit[0];
+ if(commaSplit.length > 2){
+ urlUserPass[1] = commaSplit[1];
+ urlUserPass[2] = commaSplit[2];
+ }
+ if(urlUserPass[1] == null || urlUserPass[1].equals("")){
+ String usernamePropertyValue = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_USERID);
+ if(usernamePropertyValue != null){
+ urlUserPass[1] = usernamePropertyValue;
+ }
+ }
+ if(urlUserPass[2] == null || urlUserPass[2].equals("")){
+ String passwordPropertyValue = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_PASS);
+ if(passwordPropertyValue != null){
+ urlUserPass[2] = passwordPropertyValue;
+ }
+ }
+ //if there is no comma, for some reason there is no username and password, so don't try to cut them off
+ return urlUserPass;
+ }
+
+ private static String encryptPassword(String password) throws Exception{
+ Cipher cipher = Cipher.getInstance("AES");
+ cipher.init(Cipher.ENCRYPT_MODE, aesKey());
+ byte[] encryption = cipher.doFinal(password.getBytes("UTF-8"));
+ System.out.println(encryption);
+ return new String(Base64.getMimeEncoder().encode(encryption),"UTF-8");
+ }
+
+ private static String decryptPassword(String encryptedPassword) throws Exception{
+ Cipher cipher = Cipher.getInstance("AES");
+ cipher.init(Cipher.DECRYPT_MODE, aesKey());
+ byte[] password = cipher.doFinal(Base64.getDecoder().decode(encryptedPassword.getBytes("UTF-8")));
+ return new String(password,"UTF-8");
+ }
+ private static Key aesKey(){
+ byte[] aesValue = (new String("njrmbklcxtoplawf")).getBytes();
+ return new SecretKeySpec(aesValue,"AES");
+ }
+ /**
+ * Register the PolicyDBDao instance in the PolicyDBDaoEntity table
+ * @return Boolean, were we able to register?
+ */
+ private boolean register(){
+ logger.debug("register() as register() called");
+ String[] url = getPapUrlUserPass();
+ EntityManager em = emf.createEntityManager();
+ try{
+ startTransactionSynced(em, 1000);
+ } catch(IllegalStateException e){
+ logger.debug ("\nPolicyDBDao.register() caught an IllegalStateException: \n" +e + "\n");
+ DatabaseLockEntity lock;
+ lock = em.find(DatabaseLockEntity.class, 1);
+ if(lock==null){
+ lock = new DatabaseLockEntity();
+ em.persist(lock);
+ lock.setKey(1);
+ try{
+ em.flush();
+ em.getTransaction().commit();
+ em.close();
+ } catch(Exception e2){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("COULD NOT CREATE DATABASELOCK ROW. WILL TRY ONE MORE TIME \n\n Exception: \n" + e2);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "COULD NOT CREATE DATABASELOCK ROW. WILL TRY ONE MORE TIME");
+ e2.printStackTrace();
+ }
+ em = null;
+ em = emf.createEntityManager();
+ try{
+ startTransactionSynced(em, 1000);
+ } catch(Exception e3){
+ //still not working
+ String msg = "DATABASE LOCKING NOT WORKING. CONCURRENCY CONTROL NOT WORKING";
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(msg);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e3, "PolicyDBDao", msg);
+ throw new IllegalStateException("msg" + "\n" + e3);
+ }
+ }
+ }
+ logger.debug("\nPolicyDBDao.register. Database locking and concurrency control is initialized\n");
+ PolicyDBDaoEntity foundPolicyDBDaoEntity = em.find(PolicyDBDaoEntity.class, url[0]);
+ Query getPolicyDBDaoEntityQuery = em.createQuery("SELECT e FROM PolicyDBDaoEntity e WHERE e.policyDBDaoUrl=:url");
+ getPolicyDBDaoEntityQuery.setParameter("url", url[0]);
+ if(foundPolicyDBDaoEntity == null){
+ //em.getTransaction().begin();
+ PolicyDBDaoEntity newPolicyDBDaoEntity = new PolicyDBDaoEntity();
+ em.persist(newPolicyDBDaoEntity);
+ newPolicyDBDaoEntity.setPolicyDBDaoUrl(url[0]);
+ newPolicyDBDaoEntity.setDescription("PAP server at "+url[0]);
+ newPolicyDBDaoEntity.setUsername(url[1]);
+ try{
+ newPolicyDBDaoEntity.setPassword(encryptPassword(url[2]));
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not encrypt PAP password",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not encrypt PAP password");
+ }
+ /*
+ try{
+ em.getTransaction().commit();
+ } catch(RollbackException e){
+ logger.error("Caught RollbackException during PolicyDBDao Registration on: em.getTransaction().commit()",e);
+ em.close();
+ return false;
+ } catch(Exception e2){
+ logger.error("Caught Exception during PolicyDBDao Registration on: em.getTransaction().commit()",e2);
+ em.close();
+ return false;
+ }
+ */
+ try{
+ em.getTransaction().commit();
+ } catch(Exception e){
+ try{
+ em.getTransaction().rollback();
+ } catch(Exception e2){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not add new PolicyDBDao to the database",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Could not add new PolicyDBDao to the database");
+ }
+ }
+ } else {
+ //em.getTransaction().begin();
+ //just want to update in order to change modified date
+ String encryptedPassword = null;
+ try{
+ encryptedPassword = encryptPassword(url[2]);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not encrypt PAP password",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not encrypt PAP password");
+ }
+ if(url[1] != null && !stringEquals(url[1], foundPolicyDBDaoEntity.getUsername())){
+ foundPolicyDBDaoEntity.setUsername(url[1]);
+ }
+ if(encryptedPassword != null && !stringEquals(encryptedPassword, foundPolicyDBDaoEntity.getPassword())){
+ foundPolicyDBDaoEntity.setPassword(encryptedPassword);
+ }
+ foundPolicyDBDaoEntity.preUpdate();
+ try{
+ em.getTransaction().commit();
+ } catch(Exception e){
+ try{
+ em.getTransaction().rollback();
+ } catch(Exception e2){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not update PolicyDBDao in the database",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Could not update PolicyDBDao in the database");
+ }
+ }
+ /*
+ try{
+ em.getTransaction().commit();
+ } catch(RollbackException e){
+ logger.error("Caught RollbackException during PolicyDBDao Registration on: em.getTransaction().commit()",e);
+ em.close();
+ return false;
+ } catch(Exception e2){
+ logger.error("Caught Exception during PolicyDBDao Registration on: em.getTransaction().commit()",e2);
+ em.getTransaction().rollback();
+ return false;
+ }
+ */
+ }
+ em.close();
+ logger.debug("\nPolicyDBDao.register(). Success!!\n");
+ return true;
+ }
+ public void notifyOthers(long entityId,String entityType){
+ notifyOthers(entityId,entityType,null);
+ }
+ public void notifyOthers(long entityId, String entityType, String newGroupId){
+ logger.debug("notifyOthers(long entityId, String entityType, long newGroupId) as notifyOthers("+entityId+","+entityType+","+newGroupId+") called");
+ LinkedList<Thread> notifyThreads = new LinkedList<Thread>();
+
+ //we're going to run notiftions in parellel threads to speed things up
+ for(Object obj : otherServers){
+
+ Thread newNotifyThread = new Thread(new NotifyOtherThread(obj, entityId, entityType, newGroupId));
+
+ newNotifyThread.start();
+
+ notifyThreads.add(newNotifyThread);
+
+ }
+ //we want to wait for all notifications to complete or timeout before we unlock the interface and allow more changes
+ for(Thread t : notifyThreads){
+ try {
+ t.join();
+ } catch (Exception e) {
+ logger.warn("Could not join a notifcation thread");
+ }
+ }
+
+
+ }
+
+ private class NotifyOtherThread implements Runnable {
+ public NotifyOtherThread(Object obj, long entityId, String entityType, String newGroupId){
+ this.obj = obj;
+ this.entityId = entityId;
+ this.entityType = entityType;
+ this.newGroupId = newGroupId;
+ }
+ private Object obj;
+ private long entityId;
+ private String entityType;
+ private String newGroupId;
+ @Override
+ public void run(){
+ //naming of 'o' is for backwards compatibility with the rest of the function
+ PolicyDBDaoEntity dbdEntity = (PolicyDBDaoEntity)obj;
+ String o = dbdEntity.getPolicyDBDaoUrl();
+ String username = dbdEntity.getUsername();
+ String password;
+ try{
+ password = decryptPassword(dbdEntity.getPassword());
+ } catch(Exception e){
+ //if we can't decrypt, might as well try it anyway
+ password = dbdEntity.getPassword();
+ }
+ Base64.Encoder encoder = Base64.getEncoder();
+ String encoding = encoder.encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8));
+ HttpURLConnection connection = null;
+ UUID requestID = UUID.randomUUID();
+ //loggingContext.setRequestID(requestID.toString());
+ //loggingContext.transactionStarted();
+ URL url;
+ try {
+ String papUrl = getPapUrlUserPass()[0];
+ if(papUrl == null){
+ papUrl = "undefined";
+ }
+ logger.debug("We are going to try to notify "+o);
+ //is this our own url?
+ String ourUrl = o;
+ try{
+ ourUrl = splitPapUrlUserPass((String)o)[0];
+ }catch(Exception e){
+ ourUrl = o;
+ }
+ if(o == null){
+ o = "undefined";
+ }
+ if(papUrl.equals(ourUrl)){
+ logger.debug(((String)o)+" is our url, skipping notify");
+ return;
+ }
+ if(newGroupId == null){
+ url = new URL(((String)o)+"?policydbdaourl="+papUrl+"&entityid="+entityId+"&entitytype="+entityType);
+ } else {
+ url = new URL(((String)o)+"?policydbdaourl="+papUrl+"&entityid="+entityId+"&entitytype="+entityType+"&extradata="+newGroupId);
+ }
+ } catch (MalformedURLException e) {
+ logger.warn("Caught MalformedURLException on: new URL()", e);
+ return;
+ }
+ //
+ // Open up the connection
+ //
+ logger.debug("Connecting with url: "+url);
+ try {
+ connection = (HttpURLConnection)url.openConnection();
+ } catch (Exception e) {
+ logger.warn("Caught exception on: url.openConnection()",e);
+ return;
+ }
+ //
+ // Setup our method and headers
+ //
+ try {
+ connection.setRequestMethod("PUT");
+ } catch (ProtocolException e) {
+ //why would this error ever occur?
+ logger.warn("Caught ProtocolException on connection.setRequestMethod(\"PUT\");",e);
+ return;
+ }
+ connection.setRequestProperty("Authorization", "Basic " + encoding);
+ connection.setRequestProperty("Accept", "text/x-java-properties");
+ connection.setRequestProperty("Content-Type", "text/x-java-properties");
+ connection.setRequestProperty("requestID", requestID.toString());
+ int readTimeout;
+ try{
+ readTimeout = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_NOTIFY_TIMEOUT));
+
+ } catch(Exception e){
+ logger.error("xacml.rest.pap.notify.timeoutms property not set, using a default.");
+ readTimeout = 10000;
+ }
+ connection.setReadTimeout(readTimeout);
+ connection.setConnectTimeout(readTimeout);
+ connection.setUseCaches(false);
+ //
+ // Adding this in. It seems the HttpUrlConnection class does NOT
+ // properly forward our headers for POST re-direction. It does so
+ // for a GET re-direction.
+ //
+ // So we need to handle this ourselves.
+ //
+ connection.setInstanceFollowRedirects(false);
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+ try {
+ connection.connect();
+ } catch (Exception e) {
+ logger.warn("Caught exception on: connection.connect()",e);
+ return;
+ }
+ try {
+ if (connection.getResponseCode() == 200) {
+ logger.info("Received response 200 from pap server on notify");
+ //notified = true;
+ } else {
+ logger.warn("connection response code not 200, received: "+connection.getResponseCode());
+ }
+ } catch (Exception e) {
+ logger.warn("Caught Exception on: connection.getResponseCode() ", e);
+ }
+
+
+ connection.disconnect();
+ }
+ }
+
+ private static String getElementFromXMLString(String element, String xml) {
+ InputSource source = new InputSource(new StringReader(xml));
+
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ String description = "";
+ try{
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(source);
+
+ XPathFactory xpathFactory = XPathFactory.newInstance();
+ XPath xpath = xpathFactory.newXPath();
+
+ if (element.endsWith("/")){
+ element = element.substring(0, element.length() -1);
+ }
+
+ description = xpath.evaluate("/Policy" + element + "/text()", document);
+ }catch(Exception e){
+
+ }
+
+
+ System.out.println("description_" + description);
+ return description;
+ }
+ private static String evaluateXPath(String expression, String xml) {
+ InputSource source = new InputSource(new StringReader(xml));
+
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ String description = "";
+ try{
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(source);
+
+ XPathFactory xpathFactory = XPathFactory.newInstance();
+ XPath xpath = xpathFactory.newXPath();
+
+
+ description = xpath.evaluate(expression, document);
+ }catch(Exception e){
+
+ }
+
+
+ System.out.println("description_" + description);
+ return description;
+ }
+
+ private static String getDescriptionFromXacml(String xacmlData){
+ //FIXME completely untested. Probably not a good idea to use. UPDATE: kind of tested
+ String openTag = "<Description>";
+ String closeTag = "</Description>";
+ int descIndex = xacmlData.indexOf(openTag);
+ int endDescIndex = xacmlData.indexOf(closeTag);
+ String desc = xacmlData.substring(descIndex+openTag.length(),endDescIndex);
+ return desc;
+ }
+ private final String POLICY_NOTIFICATION = "policy";
+ private final String PDP_NOTIFICATION = "pdp";
+ private final String GROUP_NOTIFICATION = "group";
+ public void handleIncomingHttpNotification(String url, String entityId, String entityType, String extraData, XACMLPapServlet xacmlPapServlet){
+ logger.info("DBDao url: " + url + " has reported an update on "+entityType+" entity "+entityId);
+ PolicyDBDaoTransaction transaction = this.getNewTransaction();
+ switch(entityType){
+
+ case POLICY_NOTIFICATION:
+ try{
+ handleIncomingPolicyChange(url, entityId,extraData);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught exception on handleIncomingPolicyChange("+url+", "+entityId+", "+extraData+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught exception on handleIncomingPolicyChange("+url+", "+entityId+", "+extraData+")");
+ }
+ break;
+ case PDP_NOTIFICATION:
+ try{
+ handleIncomingPdpChange(url, entityId, transaction);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught exception on handleIncomingPdpChange("+url+", "+entityId+", "+transaction+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught exception on handleIncomingPdpChange("+url+", "+entityId+", "+transaction+")");
+ }
+ break;
+ case GROUP_NOTIFICATION:
+ try{
+ handleIncomingGroupChange(url, entityId, extraData, transaction, xacmlPapServlet);
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught exception on handleIncomingGroupChange("+url+", "+entityId+", "+extraData+", "+transaction+", "+xacmlPapServlet+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught exception on handleIncomingGroupChange("+url+", "+entityId+", "+extraData+", "+transaction+", "+xacmlPapServlet+")");
+ }
+ break;
+ }
+ //no changes should be being made in this function, we still need to close
+ transaction.rollbackTransaction();
+ }
+ private void handleIncomingGroupChange(String url, String groupId, String extraData,PolicyDBDaoTransaction transaction,XACMLPapServlet xacmlPapServlet) throws PAPException{
+
+ GroupEntity groupRecord = null;
+ long groupIdLong = -1;
+ try{
+ groupIdLong = Long.parseLong(groupId);
+ } catch(NumberFormatException e){
+ throw new IllegalArgumentException("groupId "+groupId+" cannot be parsed into a long");
+ }
+ try{
+ groupRecord = transaction.getGroup(groupIdLong);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to get pdp group record with transaction.getGroup("+groupIdLong+");",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get pdp group record with transaction.getGroup("+groupIdLong+");");
+ throw new PAPException("Could not get local group "+groupIdLong);
+ }
+ if(groupRecord == null){
+ throw new PersistenceException("The group record returned is null");
+ }
+ //compare to local fs
+ //does group folder exist
+ EcompPDPGroup localGroup = null;
+ try {
+ localGroup = papEngine.getGroup(groupRecord.getGroupId());
+ } catch (Exception e) {
+ logger.warn("Caught PAPException trying to get local pdp group with papEngine.getGroup("+groupId+");",e);
+ //throw new PAPException("Could not get local group "+groupId);
+ }
+ if(localGroup == null && extraData != null){
+ //here we can try to load an old group id from the extraData
+ try{
+ localGroup = papEngine.getGroup(extraData);
+ }catch(Exception e){
+ logger.warn("Caught PAPException trying to get local pdp group with papEngine.getGroup("+extraData+");",e);
+ }
+ }
+ if(localGroup != null && groupRecord.isDeleted()){
+ EcompPDPGroup newLocalGroup = null;
+ if(extraData != null){
+ try {
+ newLocalGroup = papEngine.getGroup(extraData);
+ } catch (PAPException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to get new pdp group with papEngine.getGroup("+extraData+");",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get new pdp group with papEngine.getGroup("+extraData+");");
+ //throw new PAPException("Could not get new local group "+newGroupId);
+
+ }
+ }
+ try {
+ papEngine.removeGroup(localGroup, newLocalGroup);
+ } catch (NullPointerException | PAPException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to get remove pdp group with papEngine.removeGroup("+localGroup+", "+newLocalGroup+");",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get remove pdp group with papEngine.removeGroup("+localGroup+", "+newLocalGroup+");");
+ throw new PAPException("Could not remove group "+groupId);
+ }
+ }
+ else if(localGroup == null){
+ //creating a new group
+ try {
+ papEngine.newGroup(groupRecord.getgroupName(), groupRecord.getDescription());
+ } catch (NullPointerException | PAPException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to create pdp group with papEngine.newGroup(groupRecord.getgroupName(), groupRecord.getDescription());",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to create pdp group with papEngine.newGroup(groupRecord.getgroupName(), groupRecord.getDescription());");
+ throw new PAPException("Could not create group "+groupRecord);
+ }
+ try {
+ localGroup = papEngine.getGroup(groupRecord.getGroupId());
+ } catch (PAPException e1) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to get pdp group we just created with papEngine.getGroup(groupRecord.getGroupId());\nAny PDPs or policies in the new group may not have been added",e1);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Caught PAPException trying to get pdp group we just created with papEngine.getGroup(groupRecord.getGroupId());\nAny PDPs or policies in the new group may not have been added");
+ return;
+ //throw new PAPException("Could not get group "+groupRecord);
+ }
+ //add possible pdps to group
+ List<?> pdpsInGroup = transaction.getPdpsInGroup(Long.parseLong(groupRecord.getGroupId()));
+ for(Object pdpO : pdpsInGroup){
+ PdpEntity pdp = (PdpEntity)pdpO;
+ try {
+ papEngine.newPDP(pdp.getPdpId(), localGroup, pdp.getPdpName(), pdp.getDescription(), pdp.getJmxPort());
+ } catch (NullPointerException | PAPException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to get create pdp with papEngine.newPDP(pdp.getPdpId(), localGroup, pdp.getPdpName(), pdp.getDescription(), pdp.getJmxPort());",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get create pdp with papEngine.newPDP(pdp.getPdpId(), localGroup, pdp.getPdpName(), pdp.getDescription(), pdp.getJmxPort());");
+ throw new PAPException("Could not create pdp "+pdp);
+ }
+ }
+ //add possible policies to group (filesystem only, apparently)
+ } else {
+ if(!(localGroup instanceof StdPDPGroup)){
+ throw new PAPException("group is not a StdPDPGroup");
+ }
+ //clone the object
+ //because it will be comparing the new group to its own version
+ StdPDPGroup localGroupClone = new StdPDPGroup(localGroup.getId(),localGroup.isDefaultGroup(),localGroup.getName(),localGroup.getDescription(),((StdPDPGroup)localGroup).getDirectory());
+ localGroupClone.setEcompPdps(localGroup.getEcompPdps());
+ localGroupClone.setPipConfigs(localGroup.getPipConfigs());
+ localGroupClone.setStatus(localGroup.getStatus());
+ //we are updating a group or adding a policy or changing default
+ //set default if it should be
+ if(!localGroupClone.isDefaultGroup() && groupRecord.isDefaultGroup()){
+ try {
+ papEngine.SetDefaultGroup(localGroup);
+ return;
+ } catch (PAPException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to set default group with papEngine.SetDefaultGroup("+localGroupClone+");",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to set default group with papEngine.SetDefaultGroup("+localGroupClone+");");
+ throw new PAPException("Could not set default group to "+localGroupClone);
+ }
+ }
+ boolean needToUpdate = false;
+ if(updateGroupPoliciesInFileSystem(localGroupClone,localGroup, groupRecord, transaction)){
+ needToUpdate = true;
+ }
+ if(!stringEquals(localGroupClone.getId(),groupRecord.getGroupId()) || !stringEquals(localGroupClone.getName(),groupRecord.getgroupName())){
+ //changing ids
+ //we do not want to change the id, the papEngine will do this for us, it needs to know the old id
+ localGroupClone.setName(groupRecord.getgroupName());
+ needToUpdate = true;
+ }
+ if(!stringEquals(localGroupClone.getDescription(),groupRecord.getDescription())){
+ localGroupClone.setDescription(groupRecord.getDescription());
+ needToUpdate = true;
+ }
+ if(needToUpdate){
+ try {
+
+ papEngine.updateGroup(localGroupClone);
+ } catch (PAPException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to update group with papEngine.updateGroup("+localGroupClone+");",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to update group with papEngine.updateGroup("+localGroupClone+");");
+ throw new PAPException("Could not update group "+localGroupClone);
+ }
+ }
+
+ }
+ //call command that corresponds to the change that was made
+ }
+ //this will also handle removes, since incoming pdpGroup has no policies internally, we are just going to add them all in from the db
+ private boolean updateGroupPoliciesInFileSystem(EcompPDPGroup pdpGroup,EcompPDPGroup oldPdpGroup, GroupEntity groupRecord, PolicyDBDaoTransaction transaction) throws PAPException{
+ if(!(pdpGroup instanceof StdPDPGroup)){
+ throw new PAPException("group is not a StdPDPGroup");
+ }
+ StdPDPGroup group = (StdPDPGroup)pdpGroup;
+ //this must always be true since we don't explicitly know when a delete is occuring
+ boolean didUpdate = true;
+ HashMap<String,PDPPolicy> currentPolicySet = new HashMap<String,PDPPolicy>(oldPdpGroup.getPolicies().size());
+ HashSet<PDPPolicy> newPolicySet = new HashSet<PDPPolicy>();
+ for(PDPPolicy pdpPolicy : oldPdpGroup.getPolicies()){
+ currentPolicySet.put(pdpPolicy.getId(), pdpPolicy);
+ }
+ for(PolicyEntity policy : groupRecord.getPolicies()){
+ String pdpPolicyName = getPdpPolicyName(policy.getPolicyName(), policy.getScope());
+ if(group.getPolicy(pdpPolicyName) == null){
+ didUpdate = true;
+ if(currentPolicySet.containsKey(pdpPolicyName)){
+ newPolicySet.add(currentPolicySet.get(pdpPolicyName));
+ } else{
+ InputStream policyStream = new ByteArrayInputStream(policy.getPolicyData().getBytes());
+ group.copyPolicyToFile(pdpPolicyName,policyStream);
+ ((StdPDPPolicy)(group.getPolicy(pdpPolicyName))).setName(removeExtensionAndVersionFromPolicyName(policy.getPolicyName()));
+ try {
+ policyStream.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ if(didUpdate){
+ newPolicySet.addAll(group.getPolicies());
+ group.setPolicies(newPolicySet);
+ }
+ return didUpdate;
+
+ }
+ private String removeExtensionAndVersionFromPolicyName(String originalPolicyName){
+ String policyName = originalPolicyName;
+ try{
+ policyName = removeFileExtension(policyName);
+ policyName = policyName.substring(0,policyName.lastIndexOf('.'));
+ if(isNullOrEmpty(policyName)){
+ throw new Exception();
+ }
+ } catch(Exception e){
+ policyName = originalPolicyName;
+ }
+ return policyName;
+ }
+
+ private void handleIncomingPdpChange(String url, String pdpId, PolicyDBDaoTransaction transaction) throws PAPException{
+ //get pdp
+ long pdpIdLong = -1;
+ try{
+ pdpIdLong = Long.parseLong(pdpId);
+ }catch(NumberFormatException e){
+ throw new IllegalArgumentException("pdpId "+pdpId+" cannot be parsed into a long");
+ }
+ PdpEntity pdpRecord = null;
+ try{
+ pdpRecord = transaction.getPdp(pdpIdLong);
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to get pdp record with transaction.getPdp("+pdpIdLong+");",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get pdp record with transaction.getPdp("+pdpIdLong+");");
+ throw new PAPException("Could not get local pdp "+pdpIdLong);
+ }
+ if(pdpRecord == null){
+ throw new PersistenceException("The pdpRecord returned is null");
+ }
+ PDP localPdp = null;
+ try {
+ localPdp = papEngine.getPDP(pdpRecord.getPdpId());
+ } catch (PAPException e) {
+ logger.warn("Caught PAPException trying to get local pdp with papEngine.getPDP("+pdpId+");",e);
+ }
+ if(localPdp != null && pdpRecord.isDeleted()){
+ try {
+ papEngine.removePDP((EcompPDP) localPdp);
+ } catch (PAPException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to get remove pdp with papEngine.removePDP("+localPdp+");",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get remove pdp with papEngine.removePDP("+localPdp+");");
+ throw new PAPException("Could not remove pdp "+pdpId);
+ }
+ }
+ else if(localPdp == null){
+ //add new pdp
+ //get group
+
+ EcompPDPGroup localGroup = null;
+ try {
+ localGroup = papEngine.getGroup(pdpRecord.getGroup().getGroupId());
+ } catch (PAPException e1) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to get local group to add pdp to with papEngine.getGroup(pdpRecord.getGroup().getGroupId());",e1);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Caught PAPException trying to get local group to add pdp to with papEngine.getGroup(pdpRecord.getGroup().getGroupId());");
+ throw new PAPException("Could not get local group");
+ }
+ try {
+ papEngine.newPDP(pdpRecord.getPdpId(), localGroup, pdpRecord.getPdpName(), pdpRecord.getDescription(), pdpRecord.getJmxPort());
+ } catch (NullPointerException | PAPException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to create pdp with papEngine.newPDP("+pdpRecord.getPdpId()+", "+localGroup+", "+pdpRecord.getPdpName()+", "+pdpRecord.getDescription()+", "+pdpRecord.getJmxPort()+");",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to create pdp with papEngine.newPDP("+pdpRecord.getPdpId()+", "+localGroup+", "+pdpRecord.getPdpName()+", "+pdpRecord.getDescription()+", "+pdpRecord.getJmxPort()+");");
+ throw new PAPException("Could not create pdp "+pdpRecord);
+ }
+ } else {
+ boolean needToUpdate = false;
+ if(!stringEquals(localPdp.getId(),pdpRecord.getPdpId()) || !stringEquals(localPdp.getName(),pdpRecord.getPdpName())){
+ //again, we don't want to change the id, the papEngine will do this
+ localPdp.setName(pdpRecord.getPdpName());
+ needToUpdate = true;
+ }
+ if(!stringEquals(localPdp.getDescription(),pdpRecord.getDescription())){
+ localPdp.setDescription(pdpRecord.getDescription());
+ needToUpdate = true;
+ }
+ String localPdpGroupId = null;
+ try{
+ localPdpGroupId = papEngine.getPDPGroup((EcompPDP) localPdp).getId();
+ } catch(PAPException e){
+ //could be null or something, just warn at this point
+ logger.warn("Caught PAPException trying to get id of local group that pdp is in with localPdpGroupId = papEngine.getPDPGroup(localPdp).getId();",e);
+ //throw new PAPException("Could not get local group");
+ }
+ if(!stringEquals(localPdpGroupId,pdpRecord.getGroup().getGroupId())){
+ EcompPDPGroup newPdpGroup = null;
+ try{
+ newPdpGroup = papEngine.getGroup(pdpRecord.getGroup().getGroupId());
+ }catch(PAPException e){
+ //ok, now we have an issue. Time to stop things
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to get id of local group to move pdp to with papEngine.getGroup(pdpRecord.getGroup().getGroupId());",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get id of local group to move pdp to with papEngine.getGroup(pdpRecord.getGroup().getGroupId());");
+ throw new PAPException("Could not get local group");
+ }
+ try{
+ papEngine.movePDP((EcompPDP) localPdp, newPdpGroup);
+ }catch(PAPException e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to move pdp with papEngine.movePDP(localPdp, newPdpGroup);",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to move pdp with papEngine.movePDP(localPdp, newPdpGroup);");
+ throw new PAPException("Could not move pdp "+localPdp);
+ }
+ }
+ if(((PdpEntity) localPdp).getJmxPort() != pdpRecord.getJmxPort()){
+ ((PdpEntity) localPdp).setJmxPort(pdpRecord.getJmxPort());
+ needToUpdate = true;
+ }
+ if(needToUpdate){
+ try {
+ papEngine.updatePDP((EcompPDP) localPdp);
+ } catch (PAPException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PAPException trying to update pdp with papEngine.updatePdp("+localPdp+");",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to update pdp with papEngine.updatePdp("+localPdp+");");
+ throw new PAPException("Could not update pdp "+localPdp);
+ }
+ }
+ }
+ //compare to local situation
+ //call command to update
+ }
+ private void handleIncomingPolicyChange(String url, String policyId,String oldPathString){
+ EntityManager em = emf.createEntityManager();
+ Query getPolicyEntityQuery = em.createNamedQuery("PolicyEntity.FindById");
+ getPolicyEntityQuery.setParameter("id", Long.valueOf(policyId));
+
+ @SuppressWarnings("unchecked")
+ List<PolicyEntity> policies = getPolicyEntityQuery.getResultList();
+ PolicyEntity policy = null;
+ if (policies.size() > 0){
+ policy = policies.get(0);
+ }
+
+ String policyRepo = buildPolicyScopeDirectory(policy);
+
+ Path policyPath = Paths.get(policyRepo);
+ String action = "unknown action";
+ try {
+
+ if(policy.isDeleted()){
+ logger.debug("Deleting Policy: " + policy.getPolicyName());
+ action = "delete";
+ Path newPath = Paths.get(policyPath.toString(), policy.getPolicyName());
+ Files.deleteIfExists(newPath);
+
+ Path subFile = null;
+
+ if (policy.getConfigurationData()!= null){
+ subFile = getPolicySubFile(policy.getConfigurationData().getConfigurationName(), "Config");
+ }else if(policy.getActionBodyEntity()!= null){
+ subFile = getPolicySubFile(policy.getActionBodyEntity().getActionBodyName(), "Action");
+ }
+
+ if(subFile != null){
+ Files.deleteIfExists(subFile);
+ }
+
+ }else{
+ logger.debug("Updating/Creating Policy: " + policy.getPolicyName());
+ action = "update";
+ Files.createDirectories(policyPath);
+ Path newPath = Paths.get(policyPath.toString(), policy.getPolicyName());
+ Files.deleteIfExists(newPath);
+ if(!isNullOrEmpty(oldPathString)){
+ try{
+ String[] scopeName = getScopeAndNameAndType(oldPathString);
+ Path oldPath = Paths.get(buildPolicyScopeDirectory(scopeName[0]),scopeName[1]);
+ Files.delete(oldPath.toAbsolutePath());
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not delete the old policy before rename: "+oldPathString,e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not delete the old policy before rename: "+oldPathString);
+ }
+ }
+ Object policyData = XACMLPolicyScanner.readPolicy(IOUtils.toInputStream(policy.getPolicyData()));
+ XACMLPolicyWriter.writePolicyFile(newPath, (PolicyType) policyData);
+
+ if (policy.getConfigurationData()!= null){
+ if(!isNullOrEmpty(oldPathString)){
+ try{
+ String[] oldPolicyScopeName = getScopeAndNameAndType(oldPathString);
+ String oldConfigFileName = getConfigFile(oldPolicyScopeName[1],oldPolicyScopeName[0],policy.getConfigurationData().getConfigType());
+ Path oldConfigFilePath = getPolicySubFile(oldConfigFileName, "Config");
+ logger.debug("Trying to delete: "+oldConfigFilePath.toString());
+ Files.delete(oldConfigFilePath);
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not delete the old policy config before rename for policy: "+oldPathString,e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not delete the old policy config before rename for policy: "+oldPathString);
+ }
+ }
+ writePolicySubFile(policy, "Config");
+
+ }else if(policy.getActionBodyEntity()!= null){
+ if(!isNullOrEmpty(oldPathString)){
+ try{
+ String[] oldPolicyScopeName = getScopeAndNameAndType(oldPathString);
+ String oldActionFileName = getConfigFile(oldPolicyScopeName[1],oldPolicyScopeName[0],ConfigPolicy.JSON_CONFIG);
+ Path oldActionFilePath = getPolicySubFile(oldActionFileName, "Action");
+ logger.debug("Trying to delete: "+oldActionFilePath.toString());
+ Files.delete(oldActionFilePath);
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not delete the old policy action body before rename for policy: "+oldPathString,e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not delete the old policy action body before rename for policy: "+oldPathString);
+ }
+ }
+ writePolicySubFile(policy, "Action");
+ }
+
+ }
+ } catch (IOException e1) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Error occurred while performing [" + action + "] of Policy File: " + policy.getPolicyName(), e1);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Error occurred while performing [" + action + "] of Policy File: " + policy.getPolicyName());
+ }
+ }
+
+ //FIXME error correcting and logs
+ private void createGroupsFromDatabase(){
+ //get list of groups
+ boolean foundDefault = false;
+ //need to avoid infinite loop, just in case
+ boolean alreadyRunAdd = false;
+ while(!foundDefault){
+
+ EntityManager em = emf.createEntityManager();
+ Query getGroups = em.createQuery("SELECT g FROM GroupEntity g WHERE g.deleted=:deleted");
+ getGroups.setParameter("deleted", false);
+ List<?> groups = getGroups.getResultList();
+ em.close();
+ //make a folder for each group in pdps folders
+ Path pdpsPath = Paths.get("pdps");
+ try {
+ FileUtils.forceDelete(pdpsPath.toFile());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ FileUtils.forceMkdir(pdpsPath.toFile());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ Properties propertyFileProperties = new Properties();
+ String groupList = "";
+ String defaultGroup = "";
+ for(Object o : groups){
+ GroupEntity group = (GroupEntity)o;
+ Path groupPath = Paths.get(pdpsPath.toString(), group.getGroupId());
+ try {
+ FileUtils.forceMkdir(groupPath.toFile());
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ Properties policyProperties = new Properties();
+ String rootPolicies = "";
+ for(PolicyEntity policy : group.getPolicies()){
+ Path newPolicyPath = Paths.get(groupPath.toString(),getPdpPolicyName(policy.getPolicyName(),policy.getScope()));
+ File newPolicyFile = newPolicyPath.toFile();
+ try {
+ newPolicyFile.createNewFile();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ try {
+ FileOutputStream policyFileStream = new FileOutputStream(newPolicyFile);
+ policyFileStream.write(policy.getPolicyData().getBytes("UTF-8"));
+ policyFileStream.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ policyProperties.setProperty(getPdpPolicyName(policy.getPolicyName(),policy.getScope())+".name",removeExtensionAndVersionFromPolicyName(policy.getPolicyName()));
+ rootPolicies += ",".concat(getPdpPolicyName(policy.getPolicyName(),policy.getScope()));
+ }
+ Path xacmlPolicyPropertiesPath = Paths.get(groupPath.toString(),"xacml.policy.properties");
+ File xacmlPolicyPropertiesFile = xacmlPolicyPropertiesPath.toFile();
+ if(rootPolicies.length() > 0){
+ rootPolicies = rootPolicies.substring(1);
+ }
+ policyProperties.setProperty("xacml.referencedPolicies", "");
+ policyProperties.setProperty("xacml.rootPolicies", rootPolicies);
+
+ try {
+ xacmlPolicyPropertiesFile.createNewFile();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ try {
+ FileOutputStream xacmlPolicyPropertiesFileStream = new FileOutputStream(xacmlPolicyPropertiesFile);
+ //xacmlPolicyPropertiesFileStream.write(xacmlPolicyProperties.getBytes("UTF-8"));
+ policyProperties.store(xacmlPolicyPropertiesFileStream, "");
+ xacmlPolicyPropertiesFileStream.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ em = emf.createEntityManager();
+ Query getPdpsQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.groupEntity=:group AND p.deleted=:deleted");
+ getPdpsQuery.setParameter("group", group);
+ getPdpsQuery.setParameter("deleted", false);
+ List<?> pdps = getPdpsQuery.getResultList();
+ em.close();
+ String pdpLine = "";
+ for(Object o2 : pdps){
+ PdpEntity pdp = (PdpEntity)o2;
+ pdpLine += ",".concat(pdp.getPdpId());
+ propertyFileProperties.setProperty(pdp.getPdpId()+".description",pdp.getDescription());
+ propertyFileProperties.setProperty(pdp.getPdpId()+".jmxport",String.valueOf(pdp.getJmxPort()));
+ propertyFileProperties.setProperty(pdp.getPdpId()+".name",pdp.getPdpName());
+ }
+ if(pdpLine.length() > 0){
+ pdpLine = pdpLine.substring(1);
+ }
+ propertyFileProperties.setProperty(group.getGroupId()+".description", group.getDescription());
+ propertyFileProperties.setProperty(group.getGroupId()+".name", group.getgroupName());
+ propertyFileProperties.setProperty(group.getGroupId()+".pdps",pdpLine);
+ groupList += ",".concat(group.getGroupId());
+ if(group.isDefaultGroup()){
+ defaultGroup = group.getGroupId();
+ foundDefault = true;
+ }
+ }
+ if(!foundDefault && !alreadyRunAdd){
+ alreadyRunAdd = true;
+ //add default group to db
+ try{
+ em = emf.createEntityManager();
+ em.getTransaction().begin();
+ GroupEntity newDefaultGroup = new GroupEntity();
+ em.persist(newDefaultGroup);
+ newDefaultGroup.setDescription("The default group where new PDP's are put.");
+ newDefaultGroup.setGroupId("default");
+ newDefaultGroup.setGroupName("default");
+ newDefaultGroup.setDefaultGroup(true);
+ newDefaultGroup.setCreatedBy("automaticallyAdded");
+ newDefaultGroup.setModifiedBy("automaticallyAdded");
+ em.flush();
+ em.getTransaction().commit();
+ continue;
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not add a new default group to the database",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not add a new default group to the database");
+ }
+ }
+
+ Path xacmlPropertiesPath = Paths.get(pdpsPath.toString(),"xacml.properties");
+ File xacmlPropertiesFile = xacmlPropertiesPath.toFile();
+ if(groupList.length()>0){
+ groupList = groupList.substring(1);
+ }
+ propertyFileProperties.setProperty("xacml.pap.groups",groupList);
+ propertyFileProperties.setProperty("xacml.pap.groups.default",defaultGroup);
+ try {
+ xacmlPropertiesFile.createNewFile();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ try {
+ FileOutputStream xacmlPropertiesFileStream = new FileOutputStream(xacmlPropertiesFile);
+ //xacmlPropertiesFileStream.write(fileContents.getBytes("UTF-8"));
+ propertyFileProperties.store(xacmlPropertiesFileStream, "");
+ xacmlPropertiesFileStream.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ //if we get this far down, something went wrong and we don't want to get stuck in the loop
+ foundDefault = true;
+ }
+ //put policies in group folder
+ //create xacml.policy.properties in each folder with list of policies in that folder
+ //get list of pdps
+ //create xacml.properties with list of groups and pdps and other info
+ }
+
+
+ //FIXME error checking and logging
+ private String getPdpPolicyName(String name, String scope){
+ String finalName = "";
+ finalName += scope;
+ finalName += ".";
+ finalName += removeFileExtension(name);
+ finalName += ".xml";
+ return finalName;
+ }
+ private String removeFileExtension(String fileName){
+ return fileName.substring(0, fileName.lastIndexOf('.'));
+ }
+
+ private String buildPolicyScopeDirectory(PolicyEntity policy){
+ String repo = buildPolicyDirectory();
+
+ String policyScope = policy.getScope();
+ if(policyScope == null){
+ policyScope = "";
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("buildPolicyScopeDirectory("+policy+") computed null policyScope. Using blank.");
+ PolicyLogger.error("buildPolicyScopeDirectory("+policy+") computed null policyScope. Using blank.");
+ } else {
+ policyScope = policyScope.replace(".", FileSystems.getDefault().getSeparator());
+ }
+ if(policyScope == null){
+ policyScope = "";
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("buildPolicyScopeDirectory("+policy+") computed null policyScope. Using blank.");
+ PolicyLogger.error("buildPolicyScopeDirectory("+policy+") computed null policyScope. Using blank.");
+ }
+ if(repo == null){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("buildPolicyScopeDirectory("+policy+") received null repo. Using blank.");
+ PolicyLogger.error("buildPolicyScopeDirectory("+policy+") received null repo. Using blank.");
+ repo = "";
+ }
+ Path returnPath = Paths.get(repo + FileSystems.getDefault().getSeparator() + policyScope);
+ if(returnPath != null){
+ return returnPath.toString();
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("buildPolicyScopeDirectory("+policy+") computed null path");
+ PolicyLogger.error("buildPolicyScopeDirectory("+policy+") received null repo. Using blank.");
+ return "";
+ }
+
+
+ }
+ private String buildPolicyScopeDirectory(String policyScope){
+ String repo = buildPolicyDirectory();
+ policyScope = policyScope.replace(".", FileSystems.getDefault().getSeparator());
+ return repo + FileSystems.getDefault().getSeparator() + policyScope;
+
+ }
+
+ private static String buildPolicyDirectory(){
+ Path workspacePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE), getDefaultWorkspace());
+ Path repositoryPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY));
+ Path gitPath = Paths.get(workspacePath.toString(), repositoryPath.getFileName().toString());
+
+ /*
+ * Getting and Setting the parent path for Admin Console use when reading the policy files
+ */
+ //domain chosen by the client to store the policy action files
+ //String domain = policy.getDomainDir();
+
+
+
+ //getting the fullpath of the gitPath and convert to string
+ String policyDir = gitPath.toAbsolutePath().toString();
+
+
+ if(policyDir.contains("\\")){
+ policyDir = policyDir.replace("XACML-PAP-REST", "XACML-PAP-ADMIN");
+ }else{
+ if (policyDir.contains("pap")){
+ policyDir = policyDir.replace("pap", "console");
+ }
+ }
+ logger.debug("policyDir: " + policyDir);
+ return policyDir;
+ }
+
+ private Path getPolicySubFile(String filename, String subFileType){
+ logger.debug("getPolicySubFile(" + filename + ", " + subFileType + ")");
+ Path filePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS).toString(), subFileType);
+ File file = null;
+
+ filename = FilenameUtils.removeExtension(filename);
+
+ for(File tmpFile : filePath.toFile().listFiles()){
+ if (FilenameUtils.removeExtension(tmpFile.getName()).equals(filename)){
+ file = tmpFile;
+ }
+ }
+
+ Path finalPath = null;
+ if (file!= null){
+ finalPath = Paths.get(file.getAbsolutePath());
+ }
+
+ logger.debug("end of getPolicySubFile: " + finalPath);
+ return finalPath;
+ }
+
+ private boolean writePolicySubFile(PolicyEntity policy, String policyType){
+ logger.info("writePolicySubFile with policyName[" + policy.getPolicyName() + "] and policyType[" + policyType + "]");
+ String type = null;
+ String subTypeName = null;
+ String subTypeBody = null;
+ if (policyType.equalsIgnoreCase("config")){
+ type = "Config";
+ subTypeName = FilenameUtils.removeExtension(policy.getConfigurationData().getConfigurationName());
+ subTypeBody = policy.getConfigurationData().getConfigBody();
+
+ String configType = policy.getConfigurationData().getConfigType();
+
+
+ if (configType != null) {
+ if (configType.equals(JSON_CONFIG)) {
+ subTypeName = subTypeName + ".json";
+ }
+ if (configType.equals(XML_CONFIG)) {
+ subTypeName = subTypeName + ".xml";
+ }
+ if (configType.equals(PROPERTIES_CONFIG)) {
+ subTypeName = subTypeName + ".properties";
+ }
+ if (configType.equals(OTHER_CONFIG)) {
+ subTypeName = subTypeName + ".txt";
+ }
+ }
+
+ }else if (policyType.equalsIgnoreCase("action")){
+ type = "Action";
+ subTypeName = policy.getActionBodyEntity().getActionBodyName();
+ subTypeBody = policy.getActionBodyEntity().getActionBody();
+
+
+ }
+ Path filePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS).toString(), type);
+
+ if(subTypeBody == null){
+ subTypeBody = "";
+ }
+ boolean success = false;
+ try {
+ Files.deleteIfExists(Paths.get(filePath.toString(), subTypeName));
+ File file = Paths.get(filePath.toString(),subTypeName).toFile();
+ file.createNewFile();
+ FileWriter fileWriter = new FileWriter(file, false); // false to overwrite
+ fileWriter.write(subTypeBody);
+ fileWriter.close();
+ success = true;
+
+ } catch (Exception e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Exception occured while creating Configuration File for Policy : " + policy.getPolicyName(), e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception occured while creating Configuration File for Policy : " + policy.getPolicyName());
+ }
+
+ return success;
+
+ }
+
+ private String getPolicySubType(String filename){
+ String type = null;
+
+ if (filename != null) {
+ if (FilenameUtils.getExtension(filename).equalsIgnoreCase("json")) {
+ type = ConfigPolicy.JSON_CONFIG;
+ }
+ if (FilenameUtils.getExtension(filename).equalsIgnoreCase("xml")) {
+ type = ConfigPolicy.XML_CONFIG;
+ }
+ if (FilenameUtils.getExtension(filename).equalsIgnoreCase("properties")) {
+ type = ConfigPolicy.PROPERTIES_CONFIG;
+ }
+ if (FilenameUtils.getExtension(filename).equalsIgnoreCase("txt")) {
+ type = ConfigPolicy.OTHER_CONFIG;
+ }
+ }
+
+ return type;
+
+ }
+
+
+ private void convertFileToDBEntry(Path path){
+ logger.info("convertFileToDBEntry");
+
+ if(path.toString().contains(".git")){
+ return;
+ }
+
+ String filename = path.getFileName().toString();
+ if (filename.contains(".svnignore")){
+ return;
+ }
+
+ String[] scopeAndName = getScopeAndNameAndType(path.toString());
+
+ if(scopeAndName == null){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("convertFileToDBEntry error: getScopeAndNameAndType(" + path.toString() + " is null!");
+ PolicyLogger.error("convertFileToDBEntry error: getScopeAndNameAndType(" + path.toString() + " is null!");
+ return;
+ }
+
+ EntityManager em = emf.createEntityManager();
+ em.getTransaction().begin();
+
+ PolicyEntity policy = new PolicyEntity();
+ em.persist(policy);
+ String policyScope = scopeAndName[0];
+ String policyName = scopeAndName[1];
+ policy.setScope(policyScope);
+ policy.setPolicyName(policyName);
+ policy.setCreatedBy(AUDIT_USER);
+ policy.setModifiedBy(AUDIT_USER);
+
+ String newScope = policyScope.replace(".", File.separator);
+ String newName = FilenameUtils.removeExtension(policyName);
+ int version = 1;
+ try{
+ //we want the last index +1 because we don't want the dot
+ version = Integer.parseInt(newName.substring(newName.lastIndexOf(".")+1));
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not get the policy version number from "+newName);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not get the policy version number from "+newName);
+ }
+ newName = newScope + File.separator + newName.substring(0, newName.lastIndexOf("."));
+
+ Query query = em.createNamedQuery("PolicyVersion.findByPolicyName");
+ query.setParameter("pname", newName);
+
+ List<?> result = query.getResultList();
+ PolicyVersion versionEntity = null;
+
+ if (!result.isEmpty()) {
+ logger.info("Result is not empty");
+ versionEntity = (PolicyVersion) result.get(0);
+ int highestVersion = Math.max(versionEntity.getHigherVersion(),version);
+ versionEntity.setHigherVersion(highestVersion);
+ versionEntity.setActiveVersion(highestVersion);
+ }else{
+ logger.info("result is empty");
+ Calendar calendar = Calendar.getInstance();
+ Timestamp createdDate = new Timestamp(calendar.getTime().getTime());
+
+ versionEntity = new PolicyVersion();
+ em.persist(versionEntity);
+ versionEntity.setPolicyName(newName);
+ versionEntity.setHigherVersion(version);
+ versionEntity.setActiveVersion(version);
+ versionEntity.setCreatedBy(AUDIT_USER);
+ versionEntity.setModifiedBy(AUDIT_USER);
+ versionEntity.setCreatedDate(createdDate);
+ versionEntity.setModifiedDate(createdDate);
+ }
+
+
+ try {
+ String policyContent = new String(Files.readAllBytes(path));
+ policy.setDescription(getElementFromXMLString("/Description", policyContent));
+ policy.setPolicyData(policyContent);
+ } catch (IOException e1) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("convertFileToDBEntry error settingPolicyData: " + e1.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "convertFileToDBEntry error settingPolicyData");
+ em.getTransaction().rollback();
+ em.close();
+ return;
+ }
+
+ if((scopeAndName[2].equalsIgnoreCase("Config"))){
+ String scopeName = scopeAndName[0] + "." + scopeAndName[1];
+ Path subFilePath = getPolicySubFile(scopeName, scopeAndName[2]);
+ try {
+ String content = new String(Files.readAllBytes(subFilePath));
+ String configName = subFilePath.getFileName().toString();
+ ConfigurationDataEntity configData = new ConfigurationDataEntity();
+ em.persist(configData);
+ configData.setConfigurationName(subFilePath.getFileName().toString());
+ configData.setConfigBody(content);
+ configData.setConfigType(getPolicySubType(configName));
+ configData.setCreatedBy(AUDIT_USER);
+ configData.setModifiedBy(AUDIT_USER);
+ policy.setConfigurationData(configData);
+
+ } catch (Exception e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("convertFileToDBEntry error for Config policy: " + e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "convertFileToDBEntry error for Config policy");
+ em.getTransaction().rollback();
+ em.close();
+ return;
+ }
+ }else if(scopeAndName[2].equalsIgnoreCase("Action")){
+ String scopeName = scopeAndName[0] + "." + scopeAndName[1];
+ Path subFilePath = getPolicySubFile(scopeName, scopeAndName[2]);
+ try {
+ String content = new String(Files.readAllBytes(subFilePath));
+ ActionBodyEntity actionBody = new ActionBodyEntity();
+ em.persist(actionBody);
+ actionBody.setActionBodyName(subFilePath.getFileName().toString());
+ actionBody.setActionBody(content);
+ actionBody.setCreatedBy(AUDIT_USER);
+ actionBody.setModifiedBy(AUDIT_USER);
+ policy.setActionBodyEntity(actionBody);
+
+ } catch (Exception e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("convertFileToDBEntry error for Action policy: " + e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "convertFileToDBEntry error for Action policy");
+ em.getTransaction().rollback();
+ em.close();
+ return;
+ }
+ }
+ logger.debug("convertFileToDBEntry commit transaction");
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ private void deleteAllPolicyTables(){
+ EntityManager em = emf.createEntityManager();
+ em.getTransaction().begin();
+ Query deletePolicyEntityTableUpdate = em.createNamedQuery("PolicyEntity.deleteAll");
+ Query deleteActionBodyEntityTableUpdate = em.createNamedQuery("ActionBodyEntity.deleteAll");
+ Query deleteConfigurationDataEntityTableUpdate = em.createNamedQuery("ConfigurationDataEntity.deleteAll");
+ Query deletePolicyVersionEntityTableUpdate = em.createNamedQuery("PolicyVersion.deleteAll");
+ deletePolicyEntityTableUpdate.executeUpdate();
+ deleteActionBodyEntityTableUpdate.executeUpdate();
+ deleteConfigurationDataEntityTableUpdate.executeUpdate();
+ deletePolicyVersionEntityTableUpdate.executeUpdate();
+ em.getTransaction().commit();
+ em.close();
+
+ }
+
+ public void auditLocalDatabase(PAPPolicyEngine papEngine2){
+ logger.debug("PolicyDBDao.auditLocalDatabase() is called");
+ Path webappsPath = Paths.get(buildPolicyDirectory());
+ try{
+ deleteAllGroupTables();
+ deleteAllPolicyTables();
+ Files.createDirectories(webappsPath);
+ Files.walk(webappsPath).filter(Files::isRegularFile).forEach(this::convertFileToDBEntry);
+ auditGroups(papEngine2);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("auditLocalDatabase() error: " + e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "auditLocalDatabase() error");
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Audits and loads the local file system to match the database version.
+ */
+ @SuppressWarnings("unchecked")
+ public void auditLocalFileSystem(){
+ logger.debug("PolicyDBDau.auditLocalFileSystem() is called");
+
+ Path webappsPath = Paths.get(buildPolicyDirectory());
+ Path configFilesPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS).toString(), "Config");
+ Path actionFilesPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS).toString(), "Action");
+ try {
+ Files.createDirectories(configFilesPath);
+ Files.createDirectories(actionFilesPath);
+ FileUtils.cleanDirectory(actionFilesPath.toFile());
+ FileUtils.cleanDirectory(configFilesPath.toFile());
+ if (webappsPath.toFile().exists()){
+ FileUtils.cleanDirectory(webappsPath.toFile());
+ }
+ Path repoWithScope = Paths.get(webappsPath.toString(), XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DOMAIN));
+ Files.createDirectories(repoWithScope);
+ } catch (IOException e2) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Error occurred while creating / clearing Config and Policy filesystem directories", e2);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Error occurred while creating / clearing Config and Policy filesystem directories");
+ }
+
+ List<PolicyEntity> policyEntityList;
+ try{
+ EntityManager em = emf.createEntityManager();
+ Query getPolicyEntitiesQuery = em.createNamedQuery("PolicyEntity.findAllByDeletedFlag");
+ getPolicyEntitiesQuery.setParameter("deleted", false);
+ policyEntityList = getPolicyEntitiesQuery.getResultList();
+ } catch(Exception e){
+ policyEntityList = new LinkedList<PolicyEntity>();
+ }
+
+ for (PolicyEntity policy: policyEntityList){
+ String name = "";
+ try {
+ if (!policy.isDeleted()){
+ name = policy.getPolicyName();
+ String scope = policy.getScope();
+
+ scope = scope.replace(".", "//");
+ if (policy.getConfigurationData()!=null){
+ writePolicySubFile(policy, "Config");
+ }
+ else if(policy.getActionBodyEntity()!=null){
+ writePolicySubFile(policy, "Action");
+ }
+
+
+ Path fileLocation = Paths.get(webappsPath.toString(), scope);
+
+ Files.createDirectories(fileLocation);
+ Path newPath = Paths.get(fileLocation.toString(), name);
+ Object policyData = XACMLPolicyScanner.readPolicy(IOUtils.toInputStream(policy.getPolicyData()));
+ XACMLPolicyWriter.writePolicyFile(newPath, (PolicyType) policyData);
+ }
+ } catch (Exception e1) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Error occurred while creating Policy File: " + name, e1);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Error occurred while creating Policy File: " + name);
+ }
+ }
+ createGroupsFromDatabase();
+ }
+
+ public void deleteAllGroupTables(){
+ logger.debug("PolicyDBDao.deleteAllGroupTables() called");
+ EntityManager em = emf.createEntityManager();
+ em.getTransaction().begin();
+
+ Query deletePdpEntityEntityTableUpdate = em.createNamedQuery("PdpEntity.deleteAll");
+ deletePdpEntityEntityTableUpdate.executeUpdate();
+
+ Query deleteGroupEntityTableUpdate = em.createNamedQuery("GroupEntity.deleteAll");
+ deleteGroupEntityTableUpdate.executeUpdate();
+
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ @SuppressWarnings("unchecked")
+ public void auditGroups(PAPPolicyEngine papEngine2){
+ logger.debug("PolicyDBDao.auditGroups() called");
+
+ EntityManager em = emf.createEntityManager();
+ em.getTransaction().begin();
+ final String AUDIT_STR = "Audit";
+ try{
+
+ Set<EcompPDPGroup> groups = papEngine2.getEcompPDPGroups();
+
+ for (EcompPDPGroup grp : groups){
+ try{
+ GroupEntity groupEntity = new GroupEntity();
+ em.persist(groupEntity);
+ groupEntity.setGroupName(grp.getName());
+ groupEntity.setDescription(grp.getDescription());
+ groupEntity.setDefaultGroup(grp.isDefaultGroup());
+ groupEntity.setCreatedBy(AUDIT_STR);
+ groupEntity.setGroupId(createNewPDPGroupId(grp.getId()));
+ groupEntity.setModifiedBy(AUDIT_STR);
+ Set<EcompPDP> pdps = grp.getEcompPdps();
+
+ for(EcompPDP pdp : pdps){
+ PdpEntity pdpEntity = new PdpEntity();
+ em.persist(pdpEntity);
+ pdpEntity.setGroup(groupEntity);
+ pdpEntity.setJmxPort(pdp.getJmxPort());
+ pdpEntity.setPdpId(pdp.getId());
+ pdpEntity.setPdpName(pdp.getName());
+ pdpEntity.setModifiedBy(AUDIT_STR);
+ pdpEntity.setCreatedBy(AUDIT_STR);
+
+ }
+
+ Set<PDPPolicy> policies = grp.getPolicies();
+
+ for(PDPPolicy policy : policies){
+ try{
+ String[] stringArray = getNameScopeAndVersionFromPdpPolicy(policy.getId());
+ List<PolicyEntity> policyEntityList;
+ Query getPolicyEntitiesQuery = em.createNamedQuery("PolicyEntity.findByNameAndScope");
+ getPolicyEntitiesQuery.setParameter("name", stringArray[0]);
+ getPolicyEntitiesQuery.setParameter("scope", stringArray[1]);
+
+ policyEntityList = getPolicyEntitiesQuery.getResultList();
+ PolicyEntity policyEntity = null;
+ if(policyEntityList.size() < 1){
+ policyEntity = addPolicyThatOnlyExistsInPdpGroup(policy.getId(),Paths.get("pdps",grp.getId(),policy.getId()),em);
+ } else {
+ policyEntity = policyEntityList.get(0);
+ }
+ if(policyEntity != null){
+ groupEntity.addPolicyToGroup(policyEntity);
+ }
+ }catch(Exception e2){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("ERROR: " + e2);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Exception auditGroups inner catch");
+ }
+ }
+ }catch(Exception e1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("ERROR: " + e1);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Exception auditGroups middle catch");
+ }
+ }
+ }catch(Exception e){
+ em.getTransaction().rollback();
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("ERROR: " + e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception auditGroups outer catch");
+ em.close();
+ return;
+ }
+
+ em.getTransaction().commit();
+ em.close();
+
+ }
+
+ private PolicyEntity addPolicyThatOnlyExistsInPdpGroup(String polId, Path path,EntityManager em){
+ String filename = path.getFileName().toString();
+ if (filename.contains(".svnignore")){
+ return null;
+ }
+
+ String[] scopeAndName = getNameScopeAndVersionFromPdpPolicy(polId);
+
+ if(scopeAndName == null){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("convertFileToDBEntry error: getScopeAndNameAndType(" + polId.toString() + " is null!");
+ PolicyLogger.error("convertFileToDBEntry error: getScopeAndNameAndType(" + polId.toString() + " is null!");
+ return null;
+ }
+
+
+ PolicyEntity policy = new PolicyEntity();
+ em.persist(policy);
+ String policyScope = scopeAndName[1];
+ String policyName = scopeAndName[0];
+ policy.setScope(policyScope);
+ policy.setPolicyName(policyName);
+ policy.setCreatedBy(AUDIT_USER);
+ policy.setModifiedBy(AUDIT_USER);
+ policy.setDeleted(true);
+
+ try {
+ String policyContent = new String(Files.readAllBytes(path));
+ policy.setDescription(getElementFromXMLString("/Description", policyContent));
+ policy.setPolicyData(policyContent);
+ em.flush();
+ //em.getTransaction().commit();
+ } catch (IOException e1) {
+ // TODO Auto-generated catch block
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("convertFileToDBEntry error settingPolicyData: " + e1.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "convertFileToDBEntry error settingPolicyData");
+ return null;
+ }
+ //em.close();
+ return policy;
+ }
+
+ private String getConfigFile(String filename, String scope, PolicyRestAdapter policy){
+ if(policy == null){
+ return getConfigFile(filename, scope, (String)null);
+ }
+ return getConfigFile(filename, scope, policy.getConfigType());
+ }
+ //copied from ConfigPolicy.java and modified
+ // Here we are adding the extension for the configurations file based on the
+ // config type selection for saving.
+ private String getConfigFile(String filename, String scope, String configType) {
+ logger.debug("getConfigFile(String filename, String scope, String configType) as getConfigFile("+filename+", "+scope+", "+configType+") called");
+ filename = FilenameUtils.removeExtension(filename);
+// if (filename.endsWith(".xml")) {
+// filename = filename.substring(0, filename.length() - 4);
+// }
+ String id = configType;
+
+ if (id != null) {
+ if (id.equals(ConfigPolicy.JSON_CONFIG) || id.contains("Firewall")) {
+ filename = filename + ".json";
+ }
+ if (id.equals(ConfigPolicy.XML_CONFIG)) {
+ filename = filename + ".xml";
+ }
+ if (id.equals(ConfigPolicy.PROPERTIES_CONFIG)) {
+ filename = filename + ".properties";
+ }
+ if (id.equals(ConfigPolicy.OTHER_CONFIG)) {
+ filename = filename + ".txt";
+ }
+ }
+ return scope + "." + filename;
+ }
+
+ /**
+ * Constructs the file name of a policy.
+ * @param policy The name of a policy (ex: mypolicy1)
+ * @return The file name of the policy (ex: Config_mypolicy1.xml)
+ * @deprecated
+ */
+ @SuppressWarnings("unused")
+ private String getName(PolicyRestAdapter policy){
+ logger.debug("getName(PolicyRestAdapter policy) as getName("+policy+") called");
+ String namePrefix = "";
+ if(policy.getPolicyType().contains("Config")){
+ namePrefix = namePrefix.concat(policy.getPolicyType());
+ if(policy.getConfigType().contains("Firewall")){
+ namePrefix = namePrefix.concat("_FW");
+ }
+ }
+ String concats = namePrefix + "_" +policy.getPolicyName() + ".xml";
+ return concats;
+ }
+
+ private String stripPolicyName(String policyFileName){
+ String policyName = policyFileName;
+ try{
+ policyName = policyName.substring(policyName.indexOf('_')+1);
+ policyName = removeFileExtension(policyName);
+ }catch(Exception e){
+ throw new IllegalArgumentException("Could not get name out of policy file name: "+policyName);
+ }
+ return policyName;
+ }
+ //FIXME error check, logs
+ private String[] getNameScopeAndVersionFromPdpPolicy(String fileName){
+ String[] splitByDots = fileName.split("\\.");
+ if(splitByDots.length < 3){
+ //throw something
+ return null;
+ }
+ String policyName = splitByDots[splitByDots.length-3];
+ String version = splitByDots[splitByDots.length-2];
+ //policy names now include version
+ policyName += "."+version +".xml";
+ String scope = "";
+ for(int i=0;i<splitByDots.length-3;i++){
+ scope += ".".concat(splitByDots[i]);
+ }
+ //remove the first dot
+ if(scope.length() > 0){
+ scope = scope.substring(1);
+ }
+ String[] returnArray = new String[3];
+ returnArray[0] = policyName;
+ returnArray[2] = version;
+ returnArray[1] = scope;
+ return returnArray;
+ }
+
+ /**
+ * Constructs the complete repository path based on the properties files
+ * @return The repository path
+ */
+ public static String getGitPath(){
+ logger.debug("getGitPath() as getGitPath() called");
+ Path workspacePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE), "admin");
+ Path repositoryPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY));
+ Path gitPath = Paths.get(workspacePath.toString(), repositoryPath.getFileName().toString());
+ logger.debug("after gitPath: " + gitPath);
+ return gitPath.toString();
+ }
+
+ //copied from StdEngine.java
+ public static String createNewPDPGroupId(String name) {
+ String id = name;
+ // replace "bad" characters with sequences that will be ok for file names and properties keys.
+ id = id.replace(" ", "_sp_");
+ id = id.replace("\t", "_tab_");
+ id = id.replace("\\", "_bksl_");
+ id = id.replace("/", "_sl_");
+ id = id.replace(":", "_col_");
+ id = id.replace("*", "_ast_");
+ id = id.replace("?", "_q_");
+ id = id.replace("\"", "_quo_");
+ id = id.replace("<", "_lt_");
+ id = id.replace(">", "_gt_");
+ id = id.replace("|", "_bar_");
+ id = id.replace("=", "_eq_");
+ id = id.replace(",", "_com_");
+ id = id.replace(";", "_scom_");
+
+ return id;
+ }
+
+ /**
+ * Checks if any of the given strings are empty or null
+ * @param strings One or more Strings (or nulls) to check if they are null or empty
+ * @return true if one or more of the given strings are empty or null
+ */
+ private static boolean isNullOrEmpty(String... strings){
+ for(String s : strings){
+ if(!(s instanceof String)){
+ return true;
+ }
+ if(s.equals("")){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Computes the scope, name, and type of a policy based on its file path
+ * @param path The file path of the policy (including the xml policy file)
+ * @return A string array of size 3. 1: the scope of the policy 2: the name of the policy (Config_mypol.xml) 3: the type (Config). Or, null if the path can not be parsed.
+ */
+ private static String[] getScopeAndNameAndType(String path){
+ logger.debug("getScopeAndNameAndType(String path) as getScopeAndNameAndType("+path+") called");
+ if(path == null){
+
+ }
+ String gitPath = getGitPath();
+
+ ArrayList<String> gitPathParts = new ArrayList<String>();
+ Iterator<?> gitPathIterator = Paths.get(gitPath).iterator();
+ while(gitPathIterator.hasNext()){
+ gitPathParts.add(gitPathIterator.next().toString());
+ }
+ for(int i=0;i<gitPathParts.size();i++){
+ Path testGitPath = Paths.get("");
+ for(int j=i;j<gitPathParts.size();j++){
+ testGitPath = Paths.get(testGitPath.toString(),gitPathParts.get(j));
+ }
+ if(path.contains(testGitPath.toString())){
+ gitPath = testGitPath.toString();
+ break;
+ }
+ }
+ if(gitPath == null){
+ logger.debug("gitPath is null. Returning");
+ return null;
+ }
+ if(gitPath.length() >= path.length()){
+ logger.debug("gitPath length(): " + gitPath.length() + ">= path.length(): " + path.length() + ". Returning null");
+ return null;
+ }
+ String scopeAndName = path.substring(path.indexOf(gitPath)+gitPath.length());
+
+ logger.debug("scopeAndName: " + scopeAndName);
+ String policyType = null;
+ String[] policyTypes = {"Config_","Action_","Decision_"};
+ for(String pType : policyTypes){
+ if(scopeAndName.contains(pType)){
+ policyType = pType;
+ }
+ }
+ if(policyType == null){
+ return null;
+ }
+ String scope = scopeAndName.substring(0,scopeAndName.indexOf(policyType));
+ String name = scopeAndName.substring(scopeAndName.indexOf(policyType), scopeAndName.length());
+ scope = scope.replace('\\', '.');
+ scope = scope.replace('/', '.');
+ if(scope.length()<1){
+ return null;
+ }
+ if(scope.charAt(0) == '.'){
+ if(scope.length() < 2){
+ logger.debug("getScopeAndNameAndType error: " + scope.length() + " < 2. " + "| scope.charAt(0)==.");
+ return null;
+ }
+ scope = scope.substring(1);
+ }
+ if(scope.charAt(scope.length()-1) == '.'){
+ if(scope.length() < 2){
+ logger.debug("getScopeAndNameAndType error: " + scope.length() + " < 2" + "| scope.charAt(scope.length()-1)==.");
+ return null;
+ }
+ scope = scope.substring(0,scope.length()-1);
+ }
+ if(name.length()<1){
+ logger.debug("getScopeAndNameAndType error: name.length()<1");
+ return null;
+ }
+ if(name.charAt(0) == '.'){
+ if(name.length() < 2){
+ logger.debug("getScopeAndNameAndType error: " + name.length() + " < 2. " + "| scope.charAt(0)==.");
+ return null;
+ }
+ name = name.substring(1);
+ }
+ String[] returnArray = new String[3];
+ returnArray[0] = scope;
+ returnArray[1] = name;
+ //remove the underscore and return it
+ returnArray[2] = policyType.substring(0, policyType.length()-1);
+ return returnArray;
+ }
+
+
+ private class PolicyDBDaoTransactionInstance implements PolicyDBDaoTransaction {
+ private EntityManager em;
+ private final Object emLock = new Object();
+ long policyId;
+ long groupId;
+ long pdpId;
+ String newGroupId;
+ private boolean operationRun = false;
+ private final Thread transactionTimer;
+
+ private PolicyDBDaoTransactionInstance(){
+ //call the constructor with arguments
+ this(Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_TRANS_TIMEOUT)),
+ Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_TRANS_WAIT)));
+ }
+ //timeout is how long the transaction can sit before rolling back
+ //wait time is how long to wait for the transaction to start before throwing an exception
+ private PolicyDBDaoTransactionInstance(int transactionTimeout, int transactionWaitTime){
+ if(logger.isDebugEnabled()){
+ logger.debug("\n\nPolicyDBDaoTransactionInstance() as PolicyDBDaoTransactionInstance() called:"
+ + "\n transactionTimeout = " + transactionTimeout
+ + "\n transactionWaitTime = " + transactionWaitTime + "\n\n");
+ }
+ this.em = emf.createEntityManager();
+ policyId = -1;
+ groupId = -1;
+ pdpId = -1;
+ newGroupId = null;
+ synchronized(emLock){
+ try{
+ startTransactionSynced(this.em,transactionWaitTime);
+ } catch(Exception e){
+ throw new PersistenceException("Could not lock transaction within "+transactionWaitTime+" milliseconds");
+ }
+ }
+ class TransactionTimer implements Runnable {
+
+ private int sleepTime;
+ public TransactionTimer(int timeout){
+ this.sleepTime = timeout;
+ }
+ @Override
+ public void run() {
+ if(logger.isDebugEnabled()){
+ Date date= new java.util.Date();
+ logger.debug("\n\nTransactionTimer.run() - SLEEPING: "
+ + "\n sleepTime (ms) = " + sleepTime
+ + "\n TimeStamp = " + date.getTime()
+ + "\n\n");
+ }
+ try {
+ Thread.sleep(sleepTime);
+ } catch (InterruptedException e) {
+ //probably, the transaction was completed, the last thing we want to do is roll back
+ if(logger.isDebugEnabled()){
+ Date date= new java.util.Date();
+ logger.debug("\n\nTransactionTimer.run() - WAKE Interrupt: "
+ + "\n TimeStamp = " + date.getTime()
+ + "\n\n");
+ }
+ return;
+ }
+ if(logger.isDebugEnabled()){
+ Date date= new java.util.Date();
+ logger.debug("\n\nTransactionTimer.run() - WAKE Timeout: "
+ + "\n TimeStamp = " + date.getTime()
+ + "\n\n");
+ }
+ rollbackTransaction();
+ }
+
+ }
+
+ transactionTimer = new Thread(new TransactionTimer(transactionTimeout),"transactionTimerThread");
+ transactionTimer.start();
+
+
+ }
+
+ private void checkBeforeOperationRun(){
+ checkBeforeOperationRun(false);
+ }
+ private void checkBeforeOperationRun(boolean justCheckOpen){
+ if(!isTransactionOpen()){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("There is no transaction currently open");
+ PolicyLogger.error("There is no transaction currently open");
+ throw new IllegalStateException("There is no transaction currently open");
+ }
+ if(operationRun && !justCheckOpen){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("An operation has already been performed and the current transaction should be committed");
+ PolicyLogger.error("An operation has already been performed and the current transaction should be committed");
+ throw new IllegalStateException("An operation has already been performed and the current transaction should be committed");
+ }
+ operationRun = true;
+ }
+ @Override
+ public void commitTransaction() {
+ synchronized(emLock){
+ logger.debug("commitTransaction() as commitTransaction() called");
+ if(!isTransactionOpen()){
+ logger.warn("There is no open transaction to commit");
+ //throw new IllegalStateException("There is no open transaction to commit");
+ try{
+ em.close();
+ } catch(Exception e){
+ e.printStackTrace();
+ }
+ return;
+ }
+ try{
+ em.getTransaction().commit();
+ } catch(RollbackException e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught RollbackException on em.getTransaction().commit()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught RollbackException on em.getTransaction().commit()");
+ throw new PersistenceException("The commit failed. Message:\n"+e.getMessage());
+ }
+ em.close();
+ //FIXME need to revisit
+ if(policyId >= 0){
+
+ if(newGroupId != null){
+ try{
+ notifyOthers(policyId,POLICY_NOTIFICATION,newGroupId);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+","+newGroupId+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+","+newGroupId+")");
+ }
+ } else {
+ try{
+ notifyOthers(policyId,POLICY_NOTIFICATION);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+")");
+ }
+ }
+ }
+ if(groupId >= 0){
+ //we don't want commit to fail just because this does
+ if(newGroupId != null){
+ try{
+ notifyOthers(groupId,GROUP_NOTIFICATION,newGroupId);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+","+newGroupId+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+","+newGroupId+")");
+ }
+ } else {
+ try{
+ notifyOthers(groupId,GROUP_NOTIFICATION);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+")");
+ }
+ }
+ }
+ if(pdpId >= 0){
+ //we don't want commit to fail just because this does
+ try{
+ notifyOthers(pdpId,PDP_NOTIFICATION);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on notifyOthers("+pdpId+","+PDP_NOTIFICATION+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+pdpId+","+PDP_NOTIFICATION+")");
+ }
+ }
+ }
+ if(transactionTimer instanceof Thread){
+ transactionTimer.interrupt();
+ }
+ }
+
+ @Override
+ public void rollbackTransaction() {
+ logger.debug("rollbackTransaction() as rollbackTransaction() called");
+ synchronized(emLock){
+ if(isTransactionOpen()){
+
+ try{
+ em.getTransaction().rollback();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not rollback transaction");
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not rollback transaction");
+ }
+ try{
+ em.close();
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not close EntityManager");
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not close EntityManager");
+ }
+
+ } else {
+ try{
+ em.close();
+ }catch(Exception e){
+ logger.warn("Could not close already closed transaction");
+ }
+ }
+
+ }
+ if(transactionTimer instanceof Thread){
+ transactionTimer.interrupt();
+ }
+
+
+ }
+
+ private void createPolicy(PolicyRestAdapter policy, String username, String policyScope, String policyName, String policyDataString) {
+ logger.debug("createPolicy(PolicyRestAdapter policy, String username, String policyScope, String policyName, String policyDataString) as createPolicy("+policy+", "+username+", "+policyScope+", "+policyName+", "+policyDataString+") called");
+ synchronized(emLock){
+ checkBeforeOperationRun();
+ //em.getTransaction().begin();
+ //FIXME if the policy is already found but deleted, when we update it should we reset the created by and version number?
+ Query createPolicyQuery = em.createQuery("SELECT p FROM PolicyEntity p WHERE p.scope=:scope AND p.policyName=:policyName");
+ createPolicyQuery.setParameter("scope", policyScope);
+ createPolicyQuery.setParameter("policyName", policyName);
+ //createPolicyQuery.setParameter("deleted", false);
+ List<?> createPolicyQueryList = createPolicyQuery.getResultList();
+ PolicyEntity newPolicyEntity;
+ boolean update;
+ if(createPolicyQueryList.size() < 1){
+ newPolicyEntity = new PolicyEntity();
+ update = false;
+ } else if(createPolicyQueryList.size() > 1){
+ //something went wrong
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
+ PolicyLogger.error("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
+ throw new PersistenceException("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
+ } else {
+ newPolicyEntity = (PolicyEntity)createPolicyQueryList.get(0);
+ update = true;
+ }
+
+ ActionBodyEntity newActionBodyEntity = null;
+ if(policy.getPolicyType().equals("Action")){
+ boolean abupdate = false;
+ if(newPolicyEntity.getActionBodyEntity() == null){
+ newActionBodyEntity = new ActionBodyEntity();
+ }else{
+ newActionBodyEntity = em.find(ActionBodyEntity.class, newPolicyEntity.getActionBodyEntity().getActionBodyId());
+ abupdate = true;
+ }
+
+ if(newActionBodyEntity != null){
+ if(!abupdate){
+ em.persist(newActionBodyEntity);
+ }
+ //build the file path
+ //trim the .xml off the end
+ String policyNameClean = FilenameUtils.removeExtension(policyName);
+ String actionBodyName = policyScope + "." + policyNameClean + ".json";
+ Path actionBodyPath = Paths.get(Webapps.getActionHome(), actionBodyName);
+ if(logger.isDebugEnabled()){
+ logger.debug("\nPolicyDBDao.createPolicy"
+ + "\n actionBodyPath = " + actionBodyPath);
+ }
+ //get the action body
+ String actionBodyString = null;
+ String actionBodyPathStr = null;
+ InputStream fileContentStream = null;
+
+ if (Files.exists(actionBodyPath)) {
+ try {
+ actionBodyPathStr = (actionBodyPath != null ? actionBodyPath.toString() : null);
+ fileContentStream = new FileInputStream(actionBodyPathStr);
+ actionBodyString = IOUtils.toString(fileContentStream);
+ if(logger.isDebugEnabled()){
+ logger.debug("\nPolicyDBDao.createPolicy"
+ + "\n actionBodyPathStr = " + actionBodyPathStr
+ + "\n actionBodyString = " + actionBodyString);
+ }
+ } catch (FileNotFoundException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught FileNotFoundException on new actionBodyPathStr FileInputStream("+actionBodyPathStr+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught FileNotFoundException on new actionBodyPathStr FileInputStream("+actionBodyPathStr+")");
+ throw new IllegalArgumentException("The actionBodyPathStr file path " + actionBodyPathStr + " does not exist"
+ + "\nEXCEPTION: " + e);
+ } catch(IOException e2){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught IOException on actionBodyPath newIOUtils.toString("+fileContentStream+")",e2);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Caught IOException on actionBodyPath newIOUtils.toString("+fileContentStream+")");
+ throw new IllegalArgumentException("The actionBodyPath file path cannot be read" + fileContentStream
+ + "\nEXCEPTION: " + e2);
+ } finally {
+ IOUtils.closeQuietly(fileContentStream);
+ }
+
+ if(actionBodyString == null){
+ throw new IllegalArgumentException("The file path (" + actionBodyPathStr + ") cannot be read");
+ }
+
+ } else {
+ actionBodyString = "{}";
+ }
+
+ newActionBodyEntity.setActionBody(actionBodyString);
+ newActionBodyEntity.setActionBodyName(actionBodyName);
+ newActionBodyEntity.setModifiedBy("PolicyDBDao.createPolicy()");
+ newActionBodyEntity.setDeleted(false);
+ if(!abupdate){
+ newActionBodyEntity.setCreatedBy("PolicyDBDao.createPolicy()");
+ }
+ if(logger.isDebugEnabled()){
+ logger.debug("\nPolicyDBDao.createPolicy"
+ + "\n newActionBodyEntity.getActionBody() = " + newActionBodyEntity.getActionBody()
+ + "\n newActionBodyEntity.getActionBodyName() = " + newActionBodyEntity.getActionBodyName()
+ + "\n newActionBodyEntity.getModifiedBy() = " + newActionBodyEntity.getModifiedBy()
+ + "\n newActionBodyEntity.getCreatedBy() = " + newActionBodyEntity.getCreatedBy()
+ + "\n newActionBodyEntity.isDeleted() = " + newActionBodyEntity.isDeleted()
+ + "\n FLUSHING to DB");
+ }
+ //push the actionBodyEntity to the DB
+ em.flush();
+ }else{
+ //newActionBodyEntity == null
+ //We have a actionBody in the policy but we found no actionBody in the DB
+ String msg = "\n\nPolicyDBDao.createPolicy - Incoming Action policy had an "
+ + "actionBody, but it could not be found in the DB for update."
+ + "\n policyScope = " + policyScope
+ + "\n policyName = " + policyName + "\n\n";
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(msg);
+ PolicyLogger.error("PolicyDBDao.createPolicy - Incoming Action policy had an actionBody, but it could not be found in the DB for update: policyName = " + policyName);
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+ ConfigurationDataEntity newConfigurationDataEntity;
+ if(policy.getPolicyType().equals("Config")){
+ boolean configUpdate;
+ if(newPolicyEntity.getConfigurationData() == null){
+ newConfigurationDataEntity = new ConfigurationDataEntity();
+ configUpdate = false;
+ } else {
+ newConfigurationDataEntity = em.find(ConfigurationDataEntity.class, newPolicyEntity.getConfigurationData().getConfigurationDataId());
+ configUpdate = true;
+ }
+
+ if(newConfigurationDataEntity != null){
+ if(!configUpdate){
+ em.persist(newConfigurationDataEntity);
+ }
+ //ConfigPolicy configPolicy = (ConfigPolicy)policy;
+ if(!stringEquals(newConfigurationDataEntity.getConfigurationName(),getConfigFile(policyName,policyScope,policy))){
+ newConfigurationDataEntity.setConfigurationName(getConfigFile(policyName,policyScope,policy));
+ }
+ if(newConfigurationDataEntity.getConfigType() == null || !newConfigurationDataEntity.getConfigType().equals(policy.getConfigType())){
+ newConfigurationDataEntity.setConfigType(policy.getConfigType());
+ }
+ if(!configUpdate){
+ newConfigurationDataEntity.setCreatedBy(username);
+ }
+ if(newConfigurationDataEntity.getModifiedBy() == null || !newConfigurationDataEntity.getModifiedBy().equals(username)){
+ newConfigurationDataEntity.setModifiedBy(username);
+ }
+ if(newConfigurationDataEntity.getDescription() == null || !newConfigurationDataEntity.getDescription().equals("")){
+ newConfigurationDataEntity.setDescription("");
+ }
+ if(newConfigurationDataEntity.getConfigBody() == null || newConfigurationDataEntity.getConfigBody().isEmpty() ||
+ (!newConfigurationDataEntity.getConfigBody().equals(policy.getConfigBodyData()))){
+ //hopefully one of these won't be null
+ if(policy.getConfigBodyData() == null){
+ newConfigurationDataEntity.setConfigBody(policy.getJsonBody());
+ }else{
+ newConfigurationDataEntity.setConfigBody(policy.getConfigBodyData());
+ }
+ }
+ if(newConfigurationDataEntity.isDeleted() == true){
+ newConfigurationDataEntity.setDeleted(false);
+ }
+
+ em.flush();
+ }else{//newConfigurationDataEntity == null
+ //We have a configurationData body in the policy but we found no configurationData body
+ //in the DB
+ String msg = "\n\nPolicyDBDao.createPolicy - Incoming Config policy had a "
+ + "configurationData body, but it could not be found in the DB for update."
+ + "\n policyScope = " + policyScope
+ + "\n policyName = " + policyName + "\n\n";
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(msg);
+ PolicyLogger.error("PolicyDBDao.createPolicy - Incoming Config policy had a configurationData body, but it could not be found in the DB for update: policyName = " + policyName);
+ throw new IllegalArgumentException(msg);
+ }
+
+ } else {
+ newConfigurationDataEntity = null;
+ }
+ if(!update){
+ em.persist(newPolicyEntity);
+ }
+
+ policyId = newPolicyEntity.getPolicyId();
+ //policy version is now part of policy name
+ /*
+ if(update){
+ try{
+ String versionString = evaluateXPath("Policy/@Version", policyDataString);
+ int versionNum = Integer.parseInt(versionString);
+ if(versionNum < 1){
+ throw new NumberFormatException();
+ }
+ newPolicyEntity.setPolicyVersion(versionNum);
+ } catch(Exception e){
+ if(newPolicyEntity.isDeleted()){
+ newPolicyEntity.resetPolicyVersion();
+ } else {
+ newPolicyEntity.advancePolicyVersion();
+ }
+ }
+
+
+ }
+ */
+ if(!stringEquals(newPolicyEntity.getPolicyName(),policyName)){
+ newPolicyEntity.setPolicyName(policyName);
+ }
+ if(!stringEquals(newPolicyEntity.getCreatedBy(),username)){
+ newPolicyEntity.setCreatedBy(username);
+ }
+ if(!stringEquals(newPolicyEntity.getDescription(),policy.getPolicyDescription())){
+ newPolicyEntity.setDescription(policy.getPolicyDescription());
+ }
+ if(!stringEquals(newPolicyEntity.getModifiedBy(),username)){
+ newPolicyEntity.setModifiedBy(username);
+ }
+ if(!stringEquals(newPolicyEntity.getPolicyData(),policyDataString)){
+ newPolicyEntity.setPolicyData(policyDataString);
+ }
+ if(!stringEquals(newPolicyEntity.getScope(),policyScope)){
+ newPolicyEntity.setScope(policyScope);
+ }
+ if(newPolicyEntity.isDeleted() == true){
+ newPolicyEntity.setDeleted(false);
+ }
+ newPolicyEntity.setConfigurationData(newConfigurationDataEntity);
+ newPolicyEntity.setActionBodyEntity(newActionBodyEntity);
+
+
+ em.flush();
+ this.policyId = newPolicyEntity.getPolicyId();
+ }
+
+ return;
+ }
+
+ @SuppressWarnings("unused")
+ public PolicyEntity getPolicy(int policyID){
+ return getPolicy(policyID,null,null);
+ }
+ public PolicyEntity getPolicy(String policyName,String scope){
+ return getPolicy(-1,policyName,scope);
+ }
+ private PolicyEntity getPolicy(int policyID, String policyName,String scope){
+ logger.debug("getPolicy(int policyId, String policyName) as getPolicy("+policyID+","+policyName+") called");
+ if(policyID < 0 && isNullOrEmpty(policyName,scope)){
+ throw new IllegalArgumentException("policyID must be at least 0 or policyName must be not null or blank");
+ }
+
+ synchronized(emLock){
+ checkBeforeOperationRun(true);
+ //check if group exists
+ String policyId;
+ Query policyQuery;
+ if(!isNullOrEmpty(policyName,scope)){
+ policyId = policyName;
+ policyQuery = em.createQuery("SELECT p FROM PolicyEntity p WHERE p.policyName=:name AND p.scope=:scope");
+ policyQuery.setParameter("name", policyId);
+ policyQuery.setParameter("scope", scope);
+ } else{
+ policyId = String.valueOf(policyID);
+ policyQuery = em.createNamedQuery("PolicyEntity.FindById");
+ policyQuery.setParameter("id", policyId);
+ }
+ List<?> policyQueryList;
+ try{
+ policyQueryList = policyQuery.getResultList();
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to get policy with policyQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get policy with policyQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to get policy "+policyId);
+ }
+ if(policyQueryList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Policy does not exist with id "+policyId);
+ PolicyLogger.error("Policy does not exist with id "+policyId);
+ throw new PersistenceException("Group policy is being added to does not exist with id "+policyId);
+ } else if(policyQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one policy with the id "+policyId+" were found in the database");
+ PolicyLogger.error("Somehow, more than one policy with the id "+policyId+" were found in the database");
+ throw new PersistenceException("Somehow, more than one policy with the id "+policyId+" were found in the database");
+ }
+ return (PolicyEntity)policyQueryList.get(0);
+ }
+ }
+
+ @Override
+ public void renamePolicy(String oldPath, String newPath,String username){
+ String[] oldPolicy = getScopeAndNameAndType(oldPath);
+ String[] newPolicy = getScopeAndNameAndType(newPath);
+ if(oldPolicy == null || newPolicy == null){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Could not parse one or more of the path names: "
+ //+oldPath+", "+newPath);
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW+"Could not parse one or more of the path names: "
+ +oldPath+", "+newPath);
+ throw new IllegalArgumentException("Could not parse one or more of the path names");
+ }
+ synchronized (emLock) {
+ checkBeforeOperationRun();
+
+ PolicyEntity existingPolicy;
+ boolean existingPolicyDeleted = false;
+ List<?> groups = null;
+ try{
+ existingPolicy = getPolicy(newPolicy[1],newPolicy[0]);
+ } catch(Exception e){
+ existingPolicy = null;
+ }
+ if(existingPolicy != null && !existingPolicy.isDeleted()){
+ logger.error("The policy named "+existingPolicy.getPolicyName()+" already exists, cannot rename policy: "+newPolicy);
+ throw new IllegalArgumentException("The policy named "+existingPolicy.getPolicyName()+" already exists, cannot rename policy: "+newPolicy);
+ } else if(existingPolicy != null && existingPolicy.isDeleted()){
+ try{
+ Query getGroups = em.createQuery("SELECT g FROM GroupEntity g JOIN g.policies p WHERE p.policyId=:pid");
+
+ getGroups.setParameter("pid", existingPolicy.getPolicyId());
+ groups = getGroups.getResultList();
+ }catch(Exception e){
+ groups = new LinkedList<GroupEntity>();
+ }
+ for(Object o : groups){
+
+ GroupEntity group = (GroupEntity)o;
+ group.removePolicyFromGroup(existingPolicy);
+ }
+ try{
+ em.flush();
+ }catch(Exception e){
+ logger.error("Error while removing the policy from groups: "+existingPolicy.getPolicyName());
+ }
+ try{
+ em.remove(existingPolicy);
+ em.flush();
+ }catch(Exception e){
+ logger.error("Could not remove the existing deleted policy: "+existingPolicy.getPolicyName());
+ }
+ existingPolicyDeleted = true;
+ //create the new policy
+ //for each of the groups, add the new policy
+ }
+
+ PolicyEntity policyToRename;
+ try{
+ policyToRename = getPolicy(oldPolicy[1],oldPolicy[0]);
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Could not get policy record to rename: "
+ //+oldPolicy[1],e);
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "PolicyDBDao", "Could not get policy record to rename: "
+ +oldPolicy[1]);
+ throw new PersistenceException("Could not get policy record to rename");
+ }
+ String policyDataString = null;
+ InputStream fileContentStream = null;
+ String policyFilePath = Paths.get(oldPath).toAbsolutePath().toString();
+ //I want to try the old path first, then if it doesn't work, try the new path
+ for(int i=0;i<2;i++){
+ try {
+ fileContentStream = new FileInputStream(policyFilePath);
+ policyDataString = IOUtils.toString(fileContentStream);
+ } catch (FileNotFoundException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught FileNotFoundException on new FileInputStream("+policyFilePath+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught FileNotFoundException on new FileInputStream("+policyFilePath+")");
+ //if we can't find the oldPath, we'll try the new path
+ if(i == 0){
+ policyFilePath = Paths.get(newPath).toAbsolutePath().toString();
+ continue;
+ }
+ throw new IllegalArgumentException("The file path does not exist");
+ } catch(IOException e2){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught IOException on newIOUtils.toString("+fileContentStream+")",e2);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Caught IOException on newIOUtils.toString("+fileContentStream+")");
+ throw new IllegalArgumentException("The file path cannot be read");
+ } finally {
+ IOUtils.closeQuietly(fileContentStream);
+ }
+ if(policyDataString == null){
+ throw new IllegalArgumentException("The file path cannot be read");
+ }
+ //escape the loop
+ i=2;
+ }
+ policyToRename.setPolicyName(newPolicy[1]);
+ policyToRename.setPolicyData(policyDataString);
+ policyToRename.setScope(newPolicy[0]);
+ policyToRename.setModifiedBy(username);
+ if(policyToRename.getConfigurationData() != null){
+ //String configType = getPolicySubType(policyToRename.getConfigurationData().getConfigurationName());
+ String configType = policyToRename.getConfigurationData().getConfigType();
+ policyToRename.getConfigurationData().setConfigurationName(getConfigFile(newPolicy[1], newPolicy[0], configType));
+ policyToRename.getConfigurationData().setModifiedBy(username);
+ }
+ if(policyToRename.getActionBodyEntity() != null){
+ String newActionName = newPolicy[0]+"."+removeFileExtension(newPolicy[1])+".json";
+ policyToRename.getActionBodyEntity().setActionBodyName(newActionName);
+ policyToRename.getActionBodyEntity().setModifiedBy(username);
+ }
+ if(existingPolicyDeleted){
+ for(Object o : groups){
+
+ GroupEntity group = (GroupEntity)o;
+ group.addPolicyToGroup(policyToRename);
+ }
+ }
+ em.flush();
+ this.policyId = policyToRename.getPolicyId();
+ this.newGroupId = oldPath;
+ }
+ }
+
+ @Override
+ public GroupEntity getGroup(long groupKey){
+ logger.debug("getGroup(int groupKey) as getGroup("+groupKey+") called");
+ if(groupKey < 0){
+ throw new IllegalArgumentException("groupKey must be at least 0");
+ }
+ synchronized(emLock){
+ checkBeforeOperationRun(true);
+ //check if group exists
+ Query groupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupKey=:groupKey");
+ groupQuery.setParameter("groupKey", groupKey);
+ List<?> groupQueryList;
+ try{
+ groupQueryList = groupQuery.getResultList();
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to get group with groupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get group with groupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to get group "+groupKey);
+ }
+ if(groupQueryList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Group does not exist with groupKey "+groupKey);
+ PolicyLogger.error("Group does not exist with groupKey "+groupKey);
+ throw new PersistenceException("Group does not exist with groupKey "+groupKey);
+ } else if(groupQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one group with the groupKey "+groupKey+" were found in the database");
+ PolicyLogger.error("Somehow, more than one group with the groupKey "+groupKey+" were found in the database");
+ throw new PersistenceException("Somehow, more than one group with the groupKey "+groupKey+" were found in the database");
+ }
+ return (GroupEntity)groupQueryList.get(0);
+ }
+ }
+
+ @Override
+ public GroupEntity getGroup(String groupId){
+ logger.debug("getGroup(String groupId) as getGroup("+groupId+") called");
+ if(isNullOrEmpty(groupId)){
+ throw new IllegalArgumentException("groupId must not be null or empty");
+ }
+ synchronized(emLock){
+ checkBeforeOperationRun(true);
+ //check if group exists
+ Query groupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId");
+ groupQuery.setParameter("groupId", groupId);
+ List<?> groupQueryList;
+ try{
+ groupQueryList = groupQuery.getResultList();
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to get group with groupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get group with groupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to get group "+groupId);
+ }
+ if(groupQueryList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Group does not exist with id "+groupId);
+ PolicyLogger.error("Group does not exist with id "+groupId);
+ throw new PersistenceException("Group does not exist with id "+groupId);
+ } else if(groupQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one group with the id "+groupId+" were found in the database");
+ PolicyLogger.error("Somehow, more than one group with the id "+groupId+" were found in the database");
+ throw new PersistenceException("Somehow, more than one group with the id "+groupId+" were found in the database");
+ }
+ return (GroupEntity)groupQueryList.get(0);
+ }
+ }
+ @Override
+ public List<?> getPdpsInGroup(long groupKey){
+ logger.debug("getPdpsInGroup(int groupKey) as getPdpsInGroup("+groupKey+") called");
+ if(groupKey < 0){
+ throw new IllegalArgumentException("groupId must not be < 0");
+ }
+ synchronized(emLock){
+ checkBeforeOperationRun(true);
+ Query pdpsQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.groupEntity=:group");
+ pdpsQuery.setParameter("group", getGroup(groupKey));
+ return pdpsQuery.getResultList();
+ }
+ }
+ @Override
+ public PdpEntity getPdp(long pdpKey){
+ logger.debug("getPdp(int pdpKey) as getPdp("+pdpKey+") called");
+ if(pdpKey < 0){
+ throw new IllegalArgumentException("pdpKey must be at least 0");
+ }
+ synchronized(emLock){
+ checkBeforeOperationRun(true);
+ //check if group exists
+ Query pdpQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpKey=:pdpKey");
+ pdpQuery.setParameter("pdpKey", pdpKey);
+ List<?> pdpQueryList;
+ try{
+ pdpQueryList = pdpQuery.getResultList();
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to get pdp with pdpQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get pdp with pdpQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to get pdp "+pdpKey);
+ }
+ if(pdpQueryList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Pdp does not exist with pdpKey "+pdpKey);
+ PolicyLogger.error("Pdp does not exist with pdpKey "+pdpKey);
+ throw new PersistenceException("Pdp does not exist with pdpKey "+pdpKey);
+ } else if(pdpQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one pdp with the pdpKey "+pdpKey+" were found in the database");
+ PolicyLogger.error("Somehow, more than one pdp with the pdpKey "+pdpKey+" were found in the database");
+ throw new PersistenceException("Somehow, more than one pdp with the pdpKey "+pdpKey+" were found in the database");
+ }
+ return (PdpEntity)pdpQueryList.get(0);
+ }
+ }
+
+ //FIXME: maybe this should be boolean
+ public void deletePolicy(String policyToDeletes){
+ synchronized(emLock){
+// if(isTransactionOpen()){
+// logger.error("A transaction is already open which has not been committed");
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+ checkBeforeOperationRun();
+ logger.debug("deletePolicy(String policyToDeletes) as deletePolicy("+policyToDeletes+") called");
+ String[] scopeNameAndType = getScopeAndNameAndType(policyToDeletes);
+ if(scopeNameAndType == null){
+ throw new IllegalArgumentException("Could not parse file path");
+ }
+ String realScope = scopeNameAndType[0];
+ String realName = scopeNameAndType[1];
+// if(isTransactionOpen()){
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+ Query deletePolicyQuery = em.createQuery("SELECT p FROM PolicyEntity p WHERE p.scope=:scope AND p.policyName=:policyName AND p.deleted=:deleted");
+ deletePolicyQuery.setParameter("scope",realScope);
+ deletePolicyQuery.setParameter("policyName", realName);
+ deletePolicyQuery.setParameter("deleted", false);
+ List<?> deletePolicyQueryList = deletePolicyQuery.getResultList();
+ if(deletePolicyQueryList.size() < 1){
+ logger.warn("The policy being deleted could not be found.");
+ return;
+ } else if(deletePolicyQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
+ PolicyLogger.error("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
+ throw new PersistenceException("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
+ } else {
+ //em.getTransaction().begin();
+ PolicyEntity policyToDelete = (PolicyEntity)deletePolicyQueryList.get(0);
+ policyToDelete.setDeleted(true);
+ if(policyToDelete.getConfigurationData() != null){
+ ConfigurationDataEntity cde = em.find(ConfigurationDataEntity.class,policyToDelete.getConfigurationData().getConfigurationDataId());
+ if(cde != null){
+ cde.setDeleted(true);
+ }
+ }
+ if(policyToDelete.getActionBodyEntity() != null){
+ ActionBodyEntity abe = em.find(ActionBodyEntity.class,policyToDelete.getActionBodyEntity().getActionBodyId());
+ if(abe != null){
+ abe.setDeleted(true);
+ }
+ }
+
+ em.flush();
+ this.policyId = policyToDelete.getPolicyId();
+
+ }
+ }
+
+ }
+
+
+ @Override
+ public boolean isTransactionOpen() {
+ logger.debug("isTransactionOpen() as isTransactionOpen() called");
+ synchronized(emLock){
+ return em.isOpen() && em.getTransaction().isActive();
+ }
+ }
+
+
+ @Override
+ public void clonePolicy(String oldPolicyPath, String newPolicyPath, String username){
+ String[] oldPolicyData = getScopeAndNameAndType(oldPolicyPath);
+ String[] newPolicyData = getScopeAndNameAndType(newPolicyPath);
+ if(oldPolicyData == null || newPolicyData == null){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Could not parse one or more of the path names: "
+ //+oldPolicyPath+", "+newPolicyPath);
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW+"Could not parse one or more of the path names: "
+ +oldPolicyPath+", "+newPolicyPath);
+ throw new IllegalArgumentException("Could not parse the oldPolicyPath or newPolicyPath");
+ }
+ PolicyEntity oldPolicy;
+ try{
+ oldPolicy = getPolicy(oldPolicyData[1],oldPolicyData[0]);
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Could not get policy record to clone: "
+ //+oldPolicyData[1],e);
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "PolicyDBDao", "Could not get policy record to clone: "
+ +oldPolicyData[1]);
+ throw new PersistenceException("Could not get policy record to clone");
+ }
+ ConfigurationDataEntity clonedConfig = null;
+ if(oldPolicy.getConfigurationData() != null){
+ clonedConfig = new ConfigurationDataEntity();
+ em.persist(clonedConfig);
+ clonedConfig.setConfigBody(oldPolicy.getConfigurationData().getConfigBody());
+ clonedConfig.setConfigType(oldPolicy.getConfigurationData().getConfigType());
+ clonedConfig.setCreatedBy(username);
+ clonedConfig.setConfigurationName(getConfigFile(newPolicyData[1], newPolicyData[0], oldPolicy.getConfigurationData().getConfigType()));
+ clonedConfig.setDescription(oldPolicy.getConfigurationData().getDescription());
+ clonedConfig.setModifiedBy(username);
+ em.flush();
+ }
+ ActionBodyEntity clonedAction = null;
+ if(oldPolicy.getActionBodyEntity() != null){
+ clonedAction = new ActionBodyEntity();
+ em.persist(clonedAction);
+ clonedAction.setActionBody(oldPolicy.getActionBodyEntity().getActionBody());
+ clonedAction.setActionBodyName(newPolicyData[0]+"."+newPolicyData[1]+".json");
+ clonedAction.setCreatedBy(username);
+ clonedAction.setModifiedBy(username);
+ em.flush();
+ }
+
+
+ }
+
+ @Override
+ public void createPolicy(String filePath, String username) {
+ logger.debug("createPolicy(String filePath, String username) as createPolicy("+filePath+","+username+") called");
+ //get just the scope and file name
+ //its actually scope, name, and type now
+ String[] scopeAndName = getScopeAndNameAndType(filePath);
+ if(scopeAndName == null){
+ throw new IllegalArgumentException("The file path could not be parsed");
+ }
+ PolicyRestAdapter policy = new PolicyRestAdapter();
+
+ policy.setPolicyType(scopeAndName[2]);
+ policy.setPolicyDescription("");
+
+ String policyName = scopeAndName[1];
+ try{
+ policyName = stripPolicyName(policyName);
+ }catch(IllegalArgumentException e){
+ if(scopeAndName[2].equals("Config")){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error(e.getMessage());
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception calling stripPolicyName with policy name: "+policyName);
+ throw new IllegalArgumentException(e.getMessage(),e);
+ } else {
+ logger.warn(e.getMessage());
+ }
+ }
+ policy.setPolicyName(policyName);
+ String policyDataString = null;
+ InputStream fileContentStream = null;
+ try {
+ fileContentStream = new FileInputStream(filePath);
+ policyDataString = IOUtils.toString(fileContentStream);
+ } catch (FileNotFoundException e) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught FileNotFoundException on new FileInputStream("+filePath+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught FileNotFoundException on new FileInputStream("+filePath+")");
+ throw new IllegalArgumentException("The file path does not exist");
+ } catch(IOException e2){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught IOException on newIOUtils.toString("+fileContentStream+")",e2);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Caught IOException on newIOUtils.toString("+fileContentStream+")");
+ throw new IllegalArgumentException("The file path cannot be read");
+ } finally {
+ IOUtils.closeQuietly(fileContentStream);
+ }
+ if(policyDataString == null){
+ throw new IllegalArgumentException("The file path cannot be read");
+ }
+ try{
+ String policyDescription = getElementFromXMLString("/Description", policyDataString);
+ if(policyDescription != null){
+ policy.setPolicyDescription(policyDescription);
+ }
+ } catch(Exception e){
+ logger.warn("Could not get description from the policy file");
+ }
+ if(scopeAndName[2].equals("Config")){
+ //this method is not used for config, since there is no way to get config info (could be modified to)
+ String configPath;
+ try{
+ configPath = evaluateXPath("/Policy/Rule/AdviceExpressions/AdviceExpression[contains(@AdviceId,'ID')]/AttributeAssignmentExpression[@AttributeId='URLID']/AttributeValue/text()", policyDataString);
+ if(configPath == null){
+ throw new NullPointerException("configPath is null");
+ }
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not get config file path from policy file",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not get config file path from policy file");
+ throw new IllegalArgumentException("Could not get config file path from policy file");
+ }
+ configPath = processConfigPath(configPath);
+ logger.debug("The location of our config file is: "+configPath);
+ policy.setConfigType(getPolicySubType(configPath));
+ logger.debug("Config type is: "+policy.getConfigType());
+
+ String configDataString = readConfigFile(configPath);
+ policy.setConfigBodyData(configDataString);
+ }
+ createPolicy(policy,username,scopeAndName[0],scopeAndName[1],policyDataString);
+ }
+ private String processConfigPath(String configPath){
+ String webappsPath = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS);
+ if(webappsPath == null){
+ logger.error("Webapps property does not exist");
+ throw new IllegalArgumentException("Webapps property does not exist");
+ }
+ configPath = configPath.replace("$URL", webappsPath);
+ //make sure the correct slashes are in
+ try{
+ configPath = Paths.get(configPath).toString();
+ } catch(InvalidPathException e){
+ logger.error("Invalid config path: "+configPath);
+ throw new IllegalArgumentException("Invalid config path: "+configPath);
+ }
+ return configPath;
+ }
+ private String readConfigFile(String configPath){
+ String configDataString = null;
+ InputStream configContentStream = null;
+ try {
+ configContentStream = new FileInputStream(configPath);
+ configDataString = IOUtils.toString(configContentStream);
+ } catch (FileNotFoundException e) {
+ logger.error("Caught FileNotFoundException on new FileInputStream("+configPath+")",e);
+ throw new IllegalArgumentException("The config file path does not exist");
+ } catch(IOException e2){
+ logger.error("Caught IOException on newIOUtils.toString("+configContentStream+")",e2);
+ throw new IllegalArgumentException("The config file path cannot be read");
+ } finally {
+ IOUtils.closeQuietly(configContentStream);
+ }
+ if(configDataString == null){
+ throw new IllegalArgumentException("The config file path cannot be read");
+ }
+ return configDataString;
+ }
+
+ @Override
+ public void createPolicy(Policy policy, String username){
+ logger.debug("createPolicy(PolicyRestAdapter policy, String username) as createPolicy("+policy+","+username+") called");
+ String policyScope = computeScope(policy.policyAdapter.getParentPath(),policy.policyAdapter.getUserGitPath());
+
+ //Does not need to be XACMLPolicyWriterWithPapNotify since it is already in the PAP
+ //and this transaction is intercepted up stream.
+ InputStream policyXmlStream = XACMLPolicyWriter.getXmlAsInputStream((PolicyType)policy.getCorrectPolicyDataObject());
+ String policyDataString;
+ try {
+ policyDataString = IOUtils.toString(policyXmlStream);
+ } catch (IOException e) {
+ policyDataString = "could not read";
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught IOException on IOUtils.toString("+policyXmlStream+")",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught IOException on IOUtils.toString("+policyXmlStream+")");
+ throw new IllegalArgumentException("Cannot parse the policy xml from the PolicyRestAdapter.");
+ }
+ IOUtils.closeQuietly(policyXmlStream);
+ String configPath = "";
+ if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Config")) {
+ configPath = evaluateXPath("/Policy/Rule/AdviceExpressions/AdviceExpression[contains(@AdviceId,'ID')]/AttributeAssignmentExpression[@AttributeId='URLID']/AttributeValue/text()", policyDataString);
+ } else if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Action")) {
+ configPath = evaluateXPath("/Policy/Rule/ObligationExpressions/ObligationExpression[contains(@ObligationId, " +policy.policyAdapter.getActionAttribute()+ ")]/AttributeAssignmentExpression[@AttributeId='body']/AttributeValue/text()", policyDataString);
+ }
+
+ String prefix = null;
+ if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Config")) {
+
+ prefix = configPath.substring(configPath.indexOf(policyScope+".")+policyScope.concat(".").length(), configPath.indexOf(policy.policyAdapter.getPolicyName()));
+ if(isNullOrEmpty(policy.policyAdapter.getConfigBodyData())){
+ String configData = "";
+ try{
+ String newConfigPath = configPath;
+ try{
+ newConfigPath = processConfigPath(newConfigPath);
+ }catch(Exception e2){
+ logger.error("Could not process config path: "+newConfigPath,e2);
+ }
+ configData = readConfigFile(newConfigPath);
+ }catch(Exception e){
+ logger.error("Could not read config body data for "+configPath,e);
+ }
+ policy.policyAdapter.setConfigBodyData(configData);
+ }
+
+ } else if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Action")) {
+
+ prefix = "Action_";
+
+ } else if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Decision")) {
+
+ prefix = "Decision_";
+ }
+
+ if(!(policy.policyAdapter.getData() instanceof PolicyType)){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The data field is not an instance of PolicyType");
+ PolicyLogger.error("The data field is not an instance of PolicyType");
+ throw new IllegalArgumentException("The data field is not an instance of PolicyType");
+ }
+ String finalName = prefix+policy.policyAdapter.getPolicyName()+"."+((PolicyType)policy.policyAdapter.getData()).getVersion()+".xml";
+ if(policy.policyAdapter.getConfigType() == null || policy.policyAdapter.getConfigType().equals("")){
+ //we need to make it
+ //get the config file extension
+ String ext = "";
+ if (configPath != null) {
+ if (!configPath.equalsIgnoreCase("")) {
+ ext = configPath.substring(configPath.lastIndexOf('.'), configPath.length());;
+ }
+ }
+
+ if(ext.contains("txt")){
+ policy.policyAdapter.setConfigType(OTHER_CONFIG);
+ } else if(ext.contains("json")){
+ policy.policyAdapter.setConfigType(JSON_CONFIG);
+ } else if(ext.contains("xml")){
+ policy.policyAdapter.setConfigType(XML_CONFIG);
+ } else if(ext.contains("properties")){
+ policy.policyAdapter.setConfigType(PROPERTIES_CONFIG);
+ } else {
+ if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Action")){
+ policy.policyAdapter.setConfigType(JSON_CONFIG);
+ }
+ }
+ }
+ createPolicy(policy.policyAdapter, username, policyScope,finalName,policyDataString);
+
+ }
+
+ @Override
+ public void close(){
+ synchronized(emLock){
+ if(em.isOpen()){
+ if(em.getTransaction().isActive()){
+ em.getTransaction().rollback();
+ }
+ em.close();
+ }
+ if(transactionTimer instanceof Thread){
+ transactionTimer.interrupt();
+ }
+ }
+ }
+
+
+
+ @Override
+ public void createGroup(String groupId, String groupName, String groupDescription, String username) {
+ logger.debug("deletePolicy(String policyToDeletes) as createGroup("+groupId+", "+groupName+", "+groupDescription+") called");
+// if(isTransactionOpen()){
+// logger.error("A transaction is already open which has not been committed");
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+ //parameter check
+ if(isNullOrEmpty(groupId, groupName, username)){
+ throw new IllegalArgumentException("groupId, groupName, and username must not be null or empty");
+ }
+ if(!(groupDescription instanceof String)){
+ groupDescription = "";
+ }
+
+ synchronized(emLock){
+ checkBeforeOperationRun();
+ Query checkGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+ checkGroupQuery.setParameter("groupId", groupId);
+ checkGroupQuery.setParameter("deleted", false);
+ List<?> checkGroupQueryList;
+ try{
+ checkGroupQueryList = checkGroupQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on checkGroupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on checkGroupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to check for existing group");
+ }
+ if(checkGroupQueryList.size() > 0){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The group being added already exists with id "+groupId);
+ PolicyLogger.error("The group being added already exists with id "+groupId);
+ throw new PersistenceException("The group being added already exists with id "+groupId);
+ }
+ //em.getTransaction().begin();
+ GroupEntity newGroup = new GroupEntity();
+ em.persist(newGroup);
+ newGroup.setCreatedBy(username);
+ newGroup.setModifiedBy(username);
+ newGroup.setGroupName(groupName);
+ newGroup.setGroupId(groupId);
+ newGroup.setDescription(groupDescription);
+
+ em.flush();
+ this.groupId = newGroup.getGroupKey();
+ }
+ }
+
+ @Override
+ public void updateGroup(EcompPDPGroup group, String username){
+ logger.debug("updateGroup(PDPGroup group) as updateGroup("+group+","+username+") called");
+// if(isTransactionOpen()){
+// logger.error("A transaction is already open which has not been committed");
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+
+ //parameter check
+ if(group == null){
+ throw new IllegalArgumentException("PDPGroup group must not be null");
+ }
+ if(isNullOrEmpty(group.getId(), username)){
+ throw new IllegalArgumentException("group.getId() and username must not be null or empty");
+ }
+
+ synchronized(emLock){
+ checkBeforeOperationRun();
+ Query getGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+ getGroupQuery.setParameter("groupId", group.getId());
+ getGroupQuery.setParameter("deleted", false);
+ List<?> getGroupQueryList;
+ try{
+ getGroupQueryList = getGroupQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on getGroupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getGroupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to get group "+group.getId()+" for editing");
+ }
+ if(getGroupQueryList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The group cannot be found to update with id "+group.getId());
+ PolicyLogger.error("The group cannot be found to update with id "+group.getId());
+ throw new PersistenceException("The group cannot be found to update with id "+group.getId());
+ } else if(getGroupQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
+ PolicyLogger.error("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
+ throw new PersistenceException("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
+ }
+ //em.getTransaction().begin();
+ GroupEntity groupToUpdate = (GroupEntity)getGroupQueryList.get(0);
+ if(!stringEquals(groupToUpdate.getModifiedBy(), username)){
+ groupToUpdate.setModifiedBy(username);
+ }
+ if(group.getDescription() != null && !stringEquals(group.getDescription(),groupToUpdate.getDescription())){
+ groupToUpdate.setDescription(group.getDescription());
+ }
+ //let's find out what policies have been deleted
+ StdPDPGroup oldGroup = null;
+ try {
+ oldGroup = (StdPDPGroup) papEngine.getGroup(group.getId());
+ } catch (PAPException e1) {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("We cannot get the group from the papEngine to delete policies",e1);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "We cannot get the group from the papEngine to delete policies");
+ }
+ if(oldGroup == null){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("We cannot get the group from the papEngine to delete policies");
+ PolicyLogger.error("We cannot get the group from the papEngine to delete policies");
+ } else {
+
+ Set<String> newPolicySet = new HashSet<String>(group.getPolicies().size());
+ //a multiple of n runtime is faster than n^2, so I am using a hashset to do the comparison
+ for(PDPPolicy pol: group.getPolicies()){
+ newPolicySet.add(pol.getId());
+ }
+ for(PDPPolicy pol : oldGroup.getPolicies()){
+ //should be fast since getPolicies uses a HashSet in StdPDPGroup
+ if(!newPolicySet.contains(pol.getId())){
+ String[] scopeAndName = getNameScopeAndVersionFromPdpPolicy(pol.getId());
+ PolicyEntity policyToDelete;
+ try{
+ policyToDelete = getPolicy(scopeAndName[0],scopeAndName[1]);
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Could not get policy to remove: "+pol.getId(),e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not get policy to remove: "+pol.getId());
+ throw new PersistenceException("Could not get policy to remove: "+pol.getId());
+ }
+ groupToUpdate.getPolicies().remove(policyToDelete);
+
+ }
+ }
+ }
+ if(group.getName() != null && !stringEquals(group.getName(),groupToUpdate.getgroupName())){
+ //we need to check if the new id exists in the database
+ String newGroupId = createNewPDPGroupId(group.getName());
+ Query checkGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+ checkGroupQuery.setParameter("groupId", newGroupId);
+ checkGroupQuery.setParameter("deleted", false);
+ List<?> checkGroupQueryList;
+ try{
+ checkGroupQueryList = checkGroupQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on checkGroupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on checkGroupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to check for existing group");
+ }
+ if(checkGroupQueryList.size() != 0){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The new group name already exists, group id "+newGroupId);
+ PolicyLogger.error("The new group name already exists, group id "+newGroupId);
+ throw new PersistenceException("The new group name already exists, group id "+newGroupId);
+ }
+ groupToUpdate.setGroupId(newGroupId);
+ groupToUpdate.setGroupName(group.getName());
+ this.newGroupId = group.getId();
+ }
+
+ em.flush();
+ this.groupId = groupToUpdate.getGroupKey();
+ }
+ }
+
+ @Override
+ public void addPdpToGroup(String pdpID, String groupID, String pdpName, String pdpDescription, int pdpJmxPort, String username) {
+ logger.debug("addPdpToGroup(String pdpID, String groupID, String pdpName, String pdpDescription, int pdpJmxPort, String username) as addPdpToGroup("+pdpID+", "+groupID+", "+pdpName+", "+pdpDescription+", "+pdpJmxPort+", "+username+") called");
+ if(isNullOrEmpty(pdpID, groupID,pdpName,username)){
+ throw new IllegalArgumentException("pdpID, groupID, pdpName, and username must not be null or empty");
+ }
+ if(!(pdpDescription instanceof String)){
+ pdpDescription = "";
+ }
+// if(isTransactionOpen()){
+// logger.error("A transaction is already open which has not been committed");
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+
+ synchronized(emLock){
+ checkBeforeOperationRun();
+ Query checkGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+ checkGroupQuery.setParameter("groupId", groupID);
+ checkGroupQuery.setParameter("deleted", false);
+ List<?> checkGroupQueryList;
+ try{
+ checkGroupQueryList = checkGroupQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to check for existing group on checkGroupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check for existing group on checkGroupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to check for existing group");
+ }
+ if(checkGroupQueryList.size() != 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The group does not exist");
+ PolicyLogger.error("The group does not exist");
+ throw new PersistenceException("The group does not exist");
+ }
+ Query checkDuplicateQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted");
+ checkDuplicateQuery.setParameter("pdpId", pdpID);
+ checkDuplicateQuery.setParameter("deleted", false);
+ List<?> checkDuplicateList;
+ try{
+ checkDuplicateList = checkDuplicateQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to check for duplicate PDP "+pdpID+" on checkDuplicateQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check for duplicate PDP "+pdpID+" on checkDuplicateQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to check for duplicate PDP "+pdpID);
+ }
+ PdpEntity newPdp;
+ if(checkDuplicateList.size() > 0){
+ logger.warn("PDP already exists with id "+pdpID);
+ newPdp = (PdpEntity)checkDuplicateList.get(0);
+ } else {
+ newPdp = new PdpEntity();
+ em.persist(newPdp);
+ }
+
+ newPdp.setCreatedBy(username);
+ newPdp.setDeleted(false);
+ newPdp.setDescription(pdpDescription);
+ newPdp.setGroup((GroupEntity)checkGroupQueryList.get(0));
+ newPdp.setJmxPort(pdpJmxPort);
+ newPdp.setModifiedBy(username);
+ newPdp.setPdpId(pdpID);
+ newPdp.setPdpName(pdpName);
+
+ em.flush();
+ this.pdpId = newPdp.getPdpKey();
+
+ }
+ }
+
+
+ @Override
+ public void updatePdp(EcompPDP pdp, String username){
+ logger.debug("updatePdp(PDP pdp, String username) as updatePdp("+pdp+","+username+") called");
+// if(isTransactionOpen()){
+// logger.error("A transaction is already open which has not been committed");
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+ //parameter check
+ if(pdp == null){
+ throw new IllegalArgumentException("PDP pdp must not be null");
+ }
+ if(isNullOrEmpty(pdp.getId(),username)){
+ throw new IllegalArgumentException("pdp.getId() and username must not be null or empty");
+ }
+
+ synchronized(emLock){
+ checkBeforeOperationRun();
+ Query getPdpQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted");
+ getPdpQuery.setParameter("pdpId", pdp.getId());
+ getPdpQuery.setParameter("deleted", false);
+ List<?> getPdpQueryList;
+ try{
+ getPdpQueryList = getPdpQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on getPdpQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getPdpQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to get PDP "+pdp.getId());
+ }
+ if(getPdpQueryList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The pdp cannot be found to update with id "+pdp.getId());
+ PolicyLogger.error("The pdp cannot be found to update with id "+pdp.getId());
+ throw new PersistenceException("The pdp cannot be found to update with id "+pdp.getId());
+ } else if(getPdpQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
+ PolicyLogger.error("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
+ throw new PersistenceException("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
+ }
+ //em.getTransaction().begin();
+ PdpEntity pdpToUpdate = (PdpEntity)getPdpQueryList.get(0);
+ if(!stringEquals(pdpToUpdate.getModifiedBy(), username)){
+ pdpToUpdate.setModifiedBy(username);
+ }
+ if(pdp.getDescription() != null && !stringEquals(pdp.getDescription(),pdpToUpdate.getDescription())){
+ pdpToUpdate.setDescription(pdp.getDescription());
+ }
+ if(pdp.getName() != null && !stringEquals(pdp.getName(),pdpToUpdate.getPdpName())){
+ pdpToUpdate.setPdpName(pdp.getName());
+ }
+ if(pdp.getJmxPort() != null && !pdp.getJmxPort().equals(pdpToUpdate.getJmxPort())){
+ pdpToUpdate.setJmxPort(pdp.getJmxPort());
+ }
+
+ em.flush();
+ this.pdpId = pdpToUpdate.getPdpKey();
+ }
+ }
+
+ @Override
+ public void movePdp(EcompPDP pdp, EcompPDPGroup group, String username){
+ logger.debug("movePdp(PDP pdp, PDPGroup group, String username) as movePdp("+pdp+","+group+","+username+") called");
+// if(isTransactionOpen()){
+// logger.error("A transaction is already open which has not been committed");
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+ if(pdp == null || group == null){
+ throw new IllegalArgumentException("PDP pdp and PDPGroup group must not be null");
+ }
+ if(isNullOrEmpty(username,pdp.getId(),group.getId())){
+ throw new IllegalArgumentException("pdp.getId(), group.getId(), and username must not be null or empty");
+ }
+
+ synchronized(emLock){
+ checkBeforeOperationRun();
+ //check if pdp exists
+ Query getPdpQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted");
+ getPdpQuery.setParameter("pdpId", pdp.getId());
+ getPdpQuery.setParameter("deleted", false);
+ List<?> getPdpQueryList;
+ try{
+ getPdpQueryList = getPdpQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on getPdpQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getPdpQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to get pdp to move with id "+pdp.getId());
+ }
+ if(getPdpQueryList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The pdp cannot be found to move with id "+pdp.getId());
+ PolicyLogger.error("The pdp cannot be found to move with id "+pdp.getId());
+ throw new PersistenceException("The pdp cannot be found to move with id "+pdp.getId());
+ } else if(getPdpQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
+ PolicyLogger.error("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
+ throw new PersistenceException("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
+ }
+
+ //check if new group exists
+ Query checkGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+ checkGroupQuery.setParameter("groupId", group.getId());
+ checkGroupQuery.setParameter("deleted", false);
+ List<?> checkGroupQueryList;
+ try{
+ checkGroupQueryList = checkGroupQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to get group on checkGroupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get group on checkGroupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to get new group "+group.getId());
+ }
+ if(checkGroupQueryList.size() != 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The group "+group.getId()+" does not exist");
+ PolicyLogger.error("The group "+group.getId()+" does not exist");
+ throw new PersistenceException("The group "+group.getId()+" does not exist");
+ }
+ GroupEntity groupToMoveInto = (GroupEntity)checkGroupQueryList.get(0);
+ //move it
+ //em.getTransaction().begin();
+ PdpEntity pdpToUpdate = (PdpEntity)getPdpQueryList.get(0);
+ pdpToUpdate.setGroup(groupToMoveInto);
+ if(!stringEquals(pdpToUpdate.getModifiedBy(), username)){
+ pdpToUpdate.setModifiedBy(username);
+ }
+
+ em.flush();
+ this.pdpId = pdpToUpdate.getPdpKey();
+ }
+ }
+
+ @Override
+ public void changeDefaultGroup(EcompPDPGroup group, String username){
+ logger.debug("changeDefaultGroup(PDPGroup group, String username) as changeDefaultGroup("+group+","+username+") called");
+// if(isTransactionOpen()){
+// logger.error("A transaction is already open which has not been committed");
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+ //parameter check
+ if(group == null){
+ throw new IllegalArgumentException("PDPGroup group must not be null");
+ }
+ if(isNullOrEmpty(group.getId(),username)){
+ throw new IllegalArgumentException("group.getId() and username must not be null or empty");
+ }
+
+ synchronized(emLock){
+ checkBeforeOperationRun();
+ Query getGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+ getGroupQuery.setParameter("groupId", group.getId());
+ getGroupQuery.setParameter("deleted", false);
+ List<?> getGroupQueryList;
+ try{
+ getGroupQueryList = getGroupQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on getGroupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getGroupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to get group "+group.getId());
+ }
+ if(getGroupQueryList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The group cannot be found to set default with id "+group.getId());
+ PolicyLogger.error("The group cannot be found to set default with id "+group.getId());
+ throw new PersistenceException("The group cannot be found to set default with id "+group.getId());
+ } else if(getGroupQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
+ PolicyLogger.error("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
+ throw new PersistenceException("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
+ }
+ //em.getTransaction().begin();
+ GroupEntity newDefaultGroup = (GroupEntity)getGroupQueryList.get(0);
+ newDefaultGroup.setDefaultGroup(true);
+ if(!stringEquals(newDefaultGroup.getModifiedBy(), username)){
+ newDefaultGroup.setModifiedBy(username);
+ }
+
+ em.flush();
+ this.groupId = newDefaultGroup.getGroupKey();
+ Query setAllGroupsNotDefault = em.createQuery("UPDATE GroupEntity g SET g.defaultGroup=:defaultGroup WHERE g.deleted=:deleted AND g.groupKey<>:groupKey");
+ //not going to set modified by for all groups
+ setAllGroupsNotDefault.setParameter("defaultGroup", false);
+ setAllGroupsNotDefault.setParameter("deleted", false);
+ setAllGroupsNotDefault.setParameter("groupKey", newDefaultGroup.getGroupKey());
+ try{
+ logger.info("set " + setAllGroupsNotDefault.executeUpdate() + " groups as not default");
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception on setAllGroupsNotDefault.executeUpdate()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on setAllGroupsNotDefault.executeUpdate()");
+ throw new PersistenceException("Could not set all other groups default to false");
+ }
+
+ em.flush();
+ }
+ }
+
+
+ @Override
+ public void deleteGroup(EcompPDPGroup group, EcompPDPGroup moveToGroup, String username) throws PAPException {
+ logger.debug("deleteGroup(PDPGroup group, PDPGroup moveToGroup, String username) as deleteGroup("+group+", "+moveToGroup+","+username+") called");
+// if(isTransactionOpen()){
+// logger.error("A transaction is already open which has not been committed");
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+ if(group == null){
+ throw new IllegalArgumentException("PDPGroup group cannot be null");
+ }
+ if(isNullOrEmpty(username,group.getId())){
+ throw new IllegalArgumentException("group.getId() and and username must not be null or empty");
+ }
+
+ if(group.isDefaultGroup()){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The default group "+group.getId()+" was attempted to be deleted. It cannot be.");
+ PolicyLogger.error("The default group "+group.getId()+" was attempted to be deleted. It cannot be.");
+ throw new PAPException("You cannot delete the default group.");
+ }
+ synchronized(emLock){
+ checkBeforeOperationRun();
+ Query deleteGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+ deleteGroupQuery.setParameter("groupId", group.getId());
+ deleteGroupQuery.setParameter("deleted", false);
+ List<?> deleteGroupQueryList;
+ try{
+ deleteGroupQueryList = deleteGroupQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to check if group exists deleteGroupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check if group exists deleteGroupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to check if group exists");
+ }
+ if(deleteGroupQueryList.size() < 1){
+ logger.warn("The group could not be found with id " + group.getId());
+ return;
+ } else if(deleteGroupQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one group with the id "+group.getId()+" were found in the database that are not deleted");
+ PolicyLogger.error("Somehow, more than one group with the id "+group.getId()+" were found in the database that are not deleted");
+ throw new PersistenceException("Somehow, more than one group with the id "+group.getId()+" were found in the database that are not deleted");
+ }
+
+ Query pdpsInGroupQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.groupEntity=:group and p.deleted=:deleted");
+ pdpsInGroupQuery.setParameter("group", ((GroupEntity)deleteGroupQueryList.get(0)));
+ pdpsInGroupQuery.setParameter("deleted", false);
+ List<?> pdpsInGroupList;
+ try{
+ pdpsInGroupList = pdpsInGroupQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to get PDPs in group on pdpsInGroupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get PDPs in group on pdpsInGroupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to get PDPs in group");
+ }
+ //em.getTransaction().begin();
+ if(pdpsInGroupList.size() > 0){
+ if(moveToGroup != null){
+ Query checkMoveToGroupQuery = em.createQuery("SELECT o FROM GroupEntity o WHERE o.groupId=:groupId AND o.deleted=:deleted");
+ checkMoveToGroupQuery.setParameter("groupId", moveToGroup.getId());
+ checkMoveToGroupQuery.setParameter("deleted", false);
+ List<?> checkMoveToGroupList;
+ try{
+ checkMoveToGroupList = checkMoveToGroupQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to check if group exists checkMoveToGroupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check if group exists checkMoveToGroupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to check if group exists");
+ }
+ if(checkMoveToGroupList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("The group could not be found with id " + moveToGroup.getId());
+ PolicyLogger.error("The group could not be found with id " + moveToGroup.getId());
+ throw new PersistenceException("The group could not be found with id " + moveToGroup.getId());
+ } else if(checkMoveToGroupList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one group with the id "+moveToGroup.getId()+" were found in the database that are not deleted");
+ PolicyLogger.error("Somehow, more than one group with the id "+moveToGroup.getId()+" were found in the database that are not deleted");
+ throw new PersistenceException("Somehow, more than one group with the id "+moveToGroup.getId()+" were found in the database that are not deleted");
+ } else {
+ GroupEntity newGroup = (GroupEntity)checkMoveToGroupList.get(0);
+ for(Object pdpObject : pdpsInGroupList){
+ PdpEntity pdp = (PdpEntity)pdpObject;
+ pdp.setGroup(newGroup);
+ if(!stringEquals(pdp.getModifiedBy(),username)){
+ pdp.setModifiedBy(username);
+ }
+ try{
+
+ em.flush();
+ this.newGroupId = newGroup.getGroupId();
+ } catch(PersistenceException e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught PersistenceException trying to set pdp group to null on em.flush()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PersistenceException trying to set pdp group to null on em.flush()");
+ throw new PersistenceException("Query failed trying to set pdp group to ");
+ }
+ }
+ }
+ } else {
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Group "+group.getId()+" is trying to be delted with PDPs. No group was provided to move them to");
+ PolicyLogger.error("Group "+group.getId()+" is trying to be delted with PDPs. No group was provided to move them to");
+ throw new PAPException("Group has PDPs. Must provide a group for them to move to");
+ }
+ }
+
+ //delete group here
+
+ GroupEntity groupToDelete = (GroupEntity)deleteGroupQueryList.get(0);
+ groupToDelete.setDeleted(true);
+ if(!stringEquals(groupToDelete.getModifiedBy(), username)){
+ groupToDelete.setModifiedBy(username);
+ }
+
+ //try{
+
+ em.flush();
+ this.groupId = groupToDelete.getGroupKey();
+ //return;
+ //} catch(PersistenceException pe){
+ //logger.error("Database error while marking policy or config as deleted");
+ //throw new PersistenceException("Database error while marking policy or config as deleted");
+ //}
+ }
+ }
+
+ @Override
+ public void addPolicyToGroup(String groupID, String policyID, String username) {
+ logger.debug("addPolicyToGroup(String groupID, String policyID, String username) as addPolicyToGroup("+groupID+", "+policyID+","+username+") called");
+// if(isTransactionOpen()){
+// logger.error("A transaction is already open which has not been committed");
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+ if(isNullOrEmpty(groupID, policyID, username)){
+ throw new IllegalArgumentException("groupID, policyID, and username must not be null or empty");
+ }
+ synchronized(emLock){
+ checkBeforeOperationRun();
+ //check if group exists
+ Query groupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+ groupQuery.setParameter("groupId", groupID);
+ groupQuery.setParameter("deleted", false);
+ List<?> groupQueryList;
+ try{
+ groupQueryList = groupQuery.getResultList();
+ }catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to check if group exists groupQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check if group exists groupQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to check if group "+groupID+" exists");
+ }
+ if(groupQueryList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Group policy is being added to does not exist with id "+groupID);
+ PolicyLogger.error("Group policy is being added to does not exist with id "+groupID);
+ throw new PersistenceException("Group policy is being added to does not exist with id "+groupID);
+ } else if(groupQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one group with the id "+groupID+" were found in the database that are not deleted");
+ PolicyLogger.error("Somehow, more than one group with the id "+groupID+" were found in the database that are not deleted");
+ throw new PersistenceException("Somehow, more than one group with the id "+groupID+" were found in the database that are not deleted");
+ }
+ //we need to convert the form of the policy id that is used groups into the form that is used
+ //for the database. (com.Config_mypol.1.xml) to (Config_mypol.xml)
+ String[] policyNameScopeAndVersion = getNameScopeAndVersionFromPdpPolicy(policyID);
+ Query policyQuery = em.createQuery("SELECT p FROM PolicyEntity p WHERE p.policyName=:policyName AND p.scope=:scope AND p.deleted=:deleted");
+ policyQuery.setParameter("policyName", policyNameScopeAndVersion[0]);
+ policyQuery.setParameter("scope", policyNameScopeAndVersion[1]);
+ policyQuery.setParameter("deleted", false);
+ List<?> policyQueryList;
+ try{
+ policyQueryList = policyQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to check if policy exists policyQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check if policy exists policyQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to check if policy "+policyNameScopeAndVersion[0]+" exists");
+ }
+ if(policyQueryList.size() < 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Policy being added to the group does not exist with policy id "+policyNameScopeAndVersion[0]);
+ PolicyLogger.error("Policy being added to the group does not exist with policy id "+policyNameScopeAndVersion[0]);
+ throw new PersistenceException("Policy being added to the group does not exist with policy id "+policyNameScopeAndVersion[0]);
+ } else if(policyQueryList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one policy with the id "+policyNameScopeAndVersion[0]+" were found in the database that are not deleted");
+ PolicyLogger.error("Somehow, more than one policy with the id "+policyNameScopeAndVersion[0]+" were found in the database that are not deleted");
+ throw new PersistenceException("Somehow, more than one group with the id "+policyNameScopeAndVersion[0]+" were found in the database that are not deleted");
+ }
+ //em.getTransaction().begin();
+ GroupEntity group = (GroupEntity)groupQueryList.get(0);
+ PolicyEntity policy = (PolicyEntity)policyQueryList.get(0);
+ group.addPolicyToGroup(policy);
+ em.flush();
+ }
+ }
+
+ //this means delete pdp not just remove from group
+ @Override
+ public void removePdpFromGroup(String pdpID, String username) {
+ logger.debug("removePdpFromGroup(String pdpID, String username) as removePdpFromGroup("+pdpID+","+username+") called");
+// if(isTransactionOpen()){
+// logger.error("A transaction is already open which has not been committed");
+// throw new IllegalStateException("A transaction is already open which has not been committed");
+// }
+ if(isNullOrEmpty(pdpID,username)){
+ throw new IllegalArgumentException("pdpID and username must not be null or empty");
+ }
+ synchronized(emLock){
+ checkBeforeOperationRun();
+ Query pdpQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted");
+ pdpQuery.setParameter("pdpId", pdpID);
+ pdpQuery.setParameter("deleted", false);
+ List<?> pdpList;
+ try{
+ pdpList = pdpQuery.getResultList();
+ } catch(Exception e){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Caught Exception trying to check if pdp exists pdpQuery.getResultList()",e);
+ PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check if pdp exists pdpQuery.getResultList()");
+ throw new PersistenceException("Query failed trying to check if pdp "+pdpID+" exists");
+ }
+ if(pdpList.size() > 1){
+ //TODO:EELF Cleanup - Remove logger
+ //logger.error("Somehow, more than one pdp with the id "+pdpID+" were found in the database that are not deleted");
+ PolicyLogger.error("Somehow, more than one pdp with the id "+pdpID+" were found in the database that are not deleted");
+ throw new PersistenceException("Somehow, more than one pdp with the id "+pdpID+" were found in the database that are not deleted");
+ } else if(pdpList.size() < 1){
+ //logger.warn("Pdp being removed does not exist with id "+pdpID);
+ PolicyLogger.error("Pdp being removed does not exist with id "+pdpID);
+ return;
+ }
+ //em.getTransaction().begin();
+ PdpEntity pdp = (PdpEntity)pdpList.get(0);
+ pdp.setGroup(null);
+ if(!stringEquals(pdp.getModifiedBy(),username)){
+ pdp.setModifiedBy(username);
+ }
+ pdp.setDeleted(true);
+
+ em.flush();
+ this.pdpId = pdp.getPdpKey();
+ }
+ }
+ }
+
+
+
+ private static String getDefaultWorkspace(){
+ return "admin";
+ }
+
+ private PolicyDBDao(){
+
+ }
+ public static PolicyDBDaoTestClass getPolicyDBDaoTestClass(){
+ return new PolicyDBDao().new PolicyDBDaoTestClass();
+ }
+ final class PolicyDBDaoTestClass {
+ String[] getScopeAndNameAndType(final String path){
+ return PolicyDBDao.getScopeAndNameAndType(path);
+ }
+ String getGitPath(){
+ return PolicyDBDao.getGitPath();
+ }
+ String getConfigFile(String filename, String scope, PolicyRestAdapter policy){
+ return PolicyDBDao.this.getConfigFile(filename, scope, policy);
+ }
+ String computeScope(String fullPath, String pathToExclude){
+ return PolicyDBDao.computeScope(fullPath, pathToExclude);
+ }
+ String encryptPassword(String password) throws Exception{
+ return PolicyDBDao.encryptPassword(password);
+ }
+ String decryptPassword(String password) throws Exception{
+ return PolicyDBDao.decryptPassword(password);
+ }
+ String getDescriptionFromXacml(String xacmlData){
+ return PolicyDBDao.getDescriptionFromXacml(xacmlData);
+ }
+
+ }
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDaoTransaction.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDaoTransaction.java
new file mode 100644
index 000000000..4e9ddb489
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDaoTransaction.java
@@ -0,0 +1,202 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.PersistenceException;
+
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.rest.jpa.GroupEntity;
+import org.openecomp.policy.rest.jpa.PdpEntity;
+import org.openecomp.policy.xacml.api.pap.EcompPDP;
+import org.openecomp.policy.xacml.api.pap.EcompPDPGroup;
+
+import com.att.research.xacml.api.pap.PAPException;
+//import com.att.research.xacml.api.pap.PDP;
+//import com.att.research.xacml.api.pap.PDPGroup;
+
+public interface PolicyDBDaoTransaction {
+
+ /**
+ * Commits (makes permanent) the current transaction. Also, notifies other PolicyDBDao instances on other PAP servers of the update.
+ * @throws IllegalStateException if the PolicyDBDao transaction has not been used or has been committed already.
+ * @throws PersistenceException if the commit fails for some reason
+ */
+ public void commitTransaction();
+
+ /**
+ * Create or update a policy
+ * @param policy A Policy object representing the policy to store or update
+ * @param username A string of the username you want to be stored for doing this operation
+ * @throws IllegalStateException If a transaction is open that has not yet been committed
+ * @throws PersistenceException If a database error occurs
+ * @throws IllegalArgumentException If the Policy's PolicyRestAdapter contains incorrect data.
+ */
+ public void createPolicy(Policy policy, String username) throws IllegalStateException, PersistenceException, IllegalArgumentException;
+
+ /**
+ * Create or update a policy
+ * @param filePath The file path of the policy xml file
+ * @param username A string of the username you want to be stored for doing this operation
+ * @throws IllegalStateException If a transaction is open that has not yet been committed
+ * @throws PersistenceException If a database error occurs
+ * @throws IllegalArgumentException If the file path is incorrect, or if it refers to a Config policy
+ */
+ public void createPolicy(String filePath, String username) throws IllegalStateException, PersistenceException, IllegalArgumentException;
+
+ /**
+ * Check if the PolicyDBDaoTransaction is currently open
+ * @return False if the PolicyDBDao transaction has not been used or has been committed already, true if it is open.
+ */
+ public boolean isTransactionOpen();
+
+
+
+ /**
+ * Delete an existing policy
+ * @param policyToDelete The file path of the policy to delete
+ * @throws IllegalArgumentException If the file path given can not be parsed
+ * @throws IllegalStateException If a transaction is open that has not yet been committed
+ * @throws PersistenceException If a database error occurs
+ */
+ public void deletePolicy(String policyToDelete) throws IllegalStateException, PersistenceException, IllegalArgumentException;
+
+ /**
+ * Rollback (undo) the current transaction.
+ */
+ public void rollbackTransaction();
+
+ /**
+ * Close the PolicyDBDaoTransaction without rolling back or doing anything. Just used to close the EntityManager
+ */
+ public void close();
+
+
+ /**
+ * Create a new PDP group in the database
+ * @param groupID The ID to name the new group (use PolicyDBDao.createNewPDPGroupId)
+ * @param groupName The name to use for the new group
+ * @param groupDescription Description of the new group (optional)
+ * @param username Username of the user performing the operation
+ * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+ * @throws IllegalStateException If a transaction is already open
+ * @throws PersistenceException If a database error occurs
+ */
+ public void createGroup(String groupID, String groupName, String groupDescription, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+
+ /**
+ * Updates a group in the database with a new name of description
+ * @param group The group with updated information. The id must match an existing group, but the name and description can be changed.
+ * @param username Username of the user performing the operation
+ * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+ * @throws IllegalStateException If a transaction is already open
+ * @throws PersistenceException If a database error occurs or if the group can not be found
+ */
+ public void updateGroup(EcompPDPGroup group, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+
+ /**
+ * Updates a PDP in the database with new information
+ * @param pdp The PDP to update
+ * @param username Username of the user performing the operation
+ * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+ * @throws IllegalStateException If a transaction is already open
+ * @throws PersistenceException If a database error occurs or if the pdp can not be found
+ */
+ public void updatePdp(EcompPDP pdp, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+
+ /**
+ * Change the default group in the database to the group provided.
+ * @param group The new group which should be set as default in the database
+ * @param username Username of the user performing the operation
+ * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+ * @throws IllegalStateException If a transaction is already open
+ * @throws PersistenceException If a database error occurs
+ */
+ public void changeDefaultGroup(EcompPDPGroup group, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+
+ /**
+ * Moves a PDP to a new group.
+ * @param pdp The PDP which is to be moved to a new group
+ * @param group The new group which the PDP should be added to
+ * @param username Username of the user performing the operation
+ * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+ * @throws IllegalStateException If a transaction is already open
+ * @throws PersistenceException If a database error occurs
+ */
+ public void movePdp(EcompPDP pdp, EcompPDPGroup group, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+
+ /**
+ * Add a new PDP to an existing group
+ * @param pdpID The ID to name the new PDP
+ * @param groupID The ID of the existing group to add the PDP to
+ * @param pdpName The name to use for the new PDP
+ * @param pdpDescription Description of the new PDP (optional)
+ * @param pdpJmxPort
+ * @param username Username of the user performing the operation
+ * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+ * @throws IllegalStateException If a transaction is already open
+ * @throws PersistenceException If a database error occurs
+ */
+ public void addPdpToGroup(String pdpID, String groupID, String pdpName, String pdpDescription, int pdpJmxPort, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+
+ /**
+ * Add an existing policy to an existing group
+ * @param group The ID of the existing group to add the policy to
+ * @param policyID The ID of an existing policy
+ * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+ * @throws IllegalStateException If a transaction is already open
+ * @throws PersistenceException If a database error occurs
+ */
+ public void addPolicyToGroup(String group, String policyID, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+
+
+ /**
+ * Delete an existing PDP group
+ * @param group A PDPGroup object representing the group to delete
+ * @param moveToGroup A PDPGroup object representing another existing group which PDPs in the group being deleted should be moved to
+ * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+ * @throws IllegalStateException If a transaction is already open
+ * @throws PersistenceException If a database error occurs
+ * @throws PAPException If an error relating to how groups are handled occurs
+ */
+ public void deleteGroup(EcompPDPGroup group, EcompPDPGroup moveToGroup, String username)throws IllegalArgumentException, IllegalStateException, PersistenceException, PAPException;
+
+ /**
+ * Removes an existing PDP from its group and deletes it.
+ * @param pdpID The ID of the existing PDP which should be deleted
+ * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+ * @throws IllegalStateException If a transaction is already open
+ * @throws PersistenceException If a database error occurs
+ */
+ public void removePdpFromGroup(String pdpID, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+
+ public GroupEntity getGroup(long groupKey);
+ public GroupEntity getGroup(String groupId);
+ public List<?> getPdpsInGroup(long groupKey);
+ public PdpEntity getPdp(long pdpKey);
+
+ void renamePolicy(String oldPath, String newPath,String username);
+
+ void clonePolicy(String oldPolicyPath, String newPolicyPath, String username);
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/package-info.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/package-info.java
new file mode 100644
index 000000000..98e1bd985
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/package-info.java
@@ -0,0 +1,27 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+/**
+ *
+ */
+/**
+ *
+ */
+package org.openecomp.policy.pap.xacml.rest.components;