aboutsummaryrefslogtreecommitdiffstats
path: root/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin
diff options
context:
space:
mode:
Diffstat (limited to 'POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin')
-rw-r--r--POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/CheckPDP.java187
-rw-r--r--POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyAdapter.java112
-rw-r--r--POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyManagerServlet.java1265
-rw-r--r--POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyNotificationMail.java166
-rw-r--r--POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyRestController.java379
-rw-r--r--POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyUserInfoController.java58
-rw-r--r--POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/RESTfulPAPEngine.java528
7 files changed, 2695 insertions, 0 deletions
diff --git a/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/CheckPDP.java b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/CheckPDP.java
new file mode 100644
index 000000000..4f026ff10
--- /dev/null
+++ b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/CheckPDP.java
@@ -0,0 +1,187 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * 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.admin;
+
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Properties;
+
+import org.openecomp.policy.rest.XACMLRestProperties;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class CheckPDP {
+ private static Path pdpPath = null;
+ private static Properties pdpProp = null;
+ private static Long oldModified = null;
+ private static Long newModified = null;
+ private static HashMap<String, String> pdpMap = null;
+ private static final Logger LOGGER = FlexLogger.getLogger(CheckPDP.class);
+
+ public static boolean validateID(String id) {
+ // ReadFile
+ try {
+ readFile();
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+ return false;
+ }
+ // Check ID
+ if (pdpMap.containsKey(id)) {
+ return true;
+ }
+ return false;
+ }
+
+ private static void readFile() throws Exception {
+ String pdpFile = null;
+ try{
+ pdpFile = XACMLProperties.getProperty(XACMLRestProperties.PROP_PDP_IDFILE);
+ }catch (Exception e){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Cannot read the PDP ID File");
+ return;
+ }
+ if (pdpFile == null) {
+ LOGGER.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "PDP File name not Valid : " + pdpFile);
+ throw new Exception(XACMLErrorConstants.ERROR_SYSTEM_ERROR +"PDP File name not Valid : " + pdpFile);
+ }
+ if (pdpPath == null) {
+ pdpPath = Paths.get(pdpFile);
+ if (Files.notExists(pdpPath)) {
+ LOGGER.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "File doesn't exist in the specified Path : " + pdpPath.toString());
+ throw new Exception(XACMLErrorConstants.ERROR_SYSTEM_ERROR +"File doesn't exist in the specified Path : "+ pdpPath.toString());
+ }
+ if (pdpPath.toString().endsWith(".properties")) {
+ readProps();
+ } else {
+ LOGGER.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "Not a .properties file " + pdpFile);
+ throw new Exception(XACMLErrorConstants.ERROR_SYSTEM_ERROR +"Not a .properties file");
+ }
+ }
+ // Check if File is updated recently
+ else {
+ newModified = pdpPath.toFile().lastModified();
+ if (newModified != oldModified) {
+ // File has been updated.
+ readProps();
+ }
+ }
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ private static void readProps() throws Exception {
+ InputStream in;
+ pdpProp = new Properties();
+ try {
+ in = new FileInputStream(pdpPath.toFile());
+ oldModified = pdpPath.toFile().lastModified();
+ pdpProp.load(in);
+ } catch (IOException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+ throw new Exception("Cannot Load the Properties file", e);
+ }
+ // Read the Properties and Load the PDPs and encoding.
+ pdpMap = new HashMap<String, String>();
+ // Check the Keys for PDP_URLs
+ Collection<Object> unsorted = pdpProp.keySet();
+ List<String> sorted = new ArrayList(unsorted);
+ Collections.sort(sorted);
+ for (String propKey : sorted) {
+ if (propKey.startsWith("PDP_URL")) {
+ String check_val = pdpProp.getProperty(propKey);
+ if (check_val == null) {
+ throw new Exception("Properties file doesn't have the PDP_URL parameter");
+ }
+ if (check_val.contains(";")) {
+ List<String> pdp_default = new ArrayList<String>(Arrays.asList(check_val.split("\\s*;\\s*")));
+ int pdpCount = 0;
+ while (pdpCount < pdp_default.size()) {
+ String pdpVal = pdp_default.get(pdpCount);
+ readPDPParam(pdpVal);
+ pdpCount++;
+ }
+ } else {
+ readPDPParam(check_val);
+ }
+ }
+ }
+ if (pdpMap == null || pdpMap.isEmpty()) {
+ LOGGER.debug(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "Cannot Proceed without PDP_URLs");
+ throw new Exception(XACMLErrorConstants.ERROR_SYSTEM_ERROR +"Cannot Proceed without PDP_URLs");
+ }
+ }
+
+ private static void readPDPParam(String pdpVal) throws Exception{
+ if(pdpVal.contains(",")){
+ List<String> pdpValues = new ArrayList<String>(Arrays.asList(pdpVal.split("\\s*,\\s*")));
+ if(pdpValues.size()==3){
+ // 1:2 will be UserID:Password
+ String userID = pdpValues.get(1);
+ String pass = pdpValues.get(2);
+ Base64.Encoder encoder = Base64.getEncoder();
+ // 0 - PDPURL
+ pdpMap.put(pdpValues.get(0), encoder.encodeToString((userID+":"+pass).getBytes(StandardCharsets.UTF_8)));
+ }else{
+ LOGGER.error(XACMLErrorConstants.ERROR_PERMISSIONS + "No Credentials to send Request: " + pdpValues);
+ throw new Exception(XACMLErrorConstants.ERROR_PERMISSIONS + "No enough Credentials to send Request. " + pdpValues);
+ }
+ }else{
+ LOGGER.error(XACMLErrorConstants.ERROR_PERMISSIONS + "No Credentials to send Request: " + pdpVal);
+ throw new Exception(XACMLErrorConstants.ERROR_PERMISSIONS +"No enough Credentials to send Request.");
+ }
+ }
+
+ public static String getEncoding(String pdpID){
+ try {
+ readFile();
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+ }
+ String encoding = null;
+ if(pdpMap!=null && (!pdpMap.isEmpty())){
+ try{
+ encoding = pdpMap.get(pdpID);
+ } catch(Exception e){
+ LOGGER.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+ }
+ return encoding;
+ }else{
+ return null;
+ }
+ }
+}
diff --git a/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyAdapter.java b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyAdapter.java
new file mode 100644
index 000000000..329e3bd29
--- /dev/null
+++ b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyAdapter.java
@@ -0,0 +1,112 @@
+package org.openecomp.policy.admin;
+
+import org.openecomp.policy.controller.ActionPolicyController;
+import org.openecomp.policy.controller.CreateBRMSParamController;
+import org.openecomp.policy.controller.CreateBRMSRawController;
+import org.openecomp.policy.controller.CreateClosedLoopFaultController;
+import org.openecomp.policy.controller.CreateClosedLoopPMController;
+import org.openecomp.policy.controller.CreateDcaeMicroServiceController;
+import org.openecomp.policy.controller.CreateFirewallController;
+import org.openecomp.policy.controller.CreatePolicyController;
+import org.openecomp.policy.controller.DecisionPolicyController;
+import org.openecomp.policy.rest.adapter.PolicyRestAdapter;
+import org.openecomp.policy.rest.jpa.PolicyEntity;
+
+import com.att.research.xacml.util.XACMLProperties;
+
+public class PolicyAdapter {
+
+ public void configure(PolicyRestAdapter policyAdapter, PolicyEntity entity) {
+ String policyNameValue = null ;
+ String configPolicyName = null ;
+ if(extendedOptions(policyAdapter, entity)){
+ return;
+ }
+ if(policyAdapter.getPolicyName().startsWith("Config_PM")){
+ policyNameValue = policyAdapter.getPolicyName().substring(0, policyAdapter.getPolicyName().indexOf("_"));
+ configPolicyName = "ClosedLoop_PM";
+ }else if(policyAdapter.getPolicyName().startsWith("Config_Fault")){
+ policyNameValue = policyAdapter.getPolicyName().substring(0, policyAdapter.getPolicyName().indexOf("_"));
+ configPolicyName = "ClosedLoop_Fault";
+ }else if(policyAdapter.getPolicyName().startsWith("Config_FW")){
+ policyNameValue = policyAdapter.getPolicyName().substring(0, policyAdapter.getPolicyName().indexOf("_"));
+ configPolicyName = "Firewall Config";
+ }else if(policyAdapter.getPolicyName().startsWith("Config_BRMS_Raw")){
+ policyNameValue = policyAdapter.getPolicyName().substring(0, policyAdapter.getPolicyName().indexOf("_"));
+ configPolicyName = "BRMS_Raw";
+ }else if(policyAdapter.getPolicyName().startsWith("Config_BRMS_Param")){
+ policyNameValue = policyAdapter.getPolicyName().substring(0, policyAdapter.getPolicyName().indexOf("_"));
+ configPolicyName = "BRMS_Param";
+ }else if(policyAdapter.getPolicyName().startsWith("Config_MS")){
+ policyNameValue = policyAdapter.getPolicyName().substring(0, policyAdapter.getPolicyName().indexOf("_"));
+ configPolicyName = "Micro Service";
+ }else if(policyAdapter.getPolicyName().startsWith("Action") || policyAdapter.getPolicyName().startsWith("Decision") ){
+ policyNameValue = policyAdapter.getPolicyName().substring(0, policyAdapter.getPolicyName().indexOf("_"));
+ }else{
+ policyNameValue = policyAdapter.getPolicyName().substring(0, policyAdapter.getPolicyName().indexOf("_"));
+ configPolicyName = "Base";
+ }
+ if (policyNameValue != null) {
+ policyAdapter.setPolicyType(policyNameValue);
+ }
+ if (configPolicyName != null) {
+ policyAdapter.setConfigPolicyType(configPolicyName);
+ }
+
+ if("Action".equalsIgnoreCase(policyAdapter.getPolicyType())){
+ ActionPolicyController actionController = new ActionPolicyController();
+ actionController.prePopulateActionPolicyData(policyAdapter, entity);
+ }
+ if("Decision".equalsIgnoreCase(policyAdapter.getPolicyType())){
+ DecisionPolicyController decisionController = new DecisionPolicyController();
+ decisionController.prePopulateDecisionPolicyData(policyAdapter, entity);
+ }
+ if("Config".equalsIgnoreCase(policyAdapter.getPolicyType())){
+ if("Base".equalsIgnoreCase(policyAdapter.getConfigPolicyType())){
+ CreatePolicyController baseController = new CreatePolicyController();
+ baseController.prePopulateBaseConfigPolicyData(policyAdapter, entity);
+ }
+ else if("BRMS_Raw".equalsIgnoreCase(policyAdapter.getConfigPolicyType())){
+ CreateBRMSRawController brmsController = new CreateBRMSRawController();
+ brmsController.prePopulateBRMSRawPolicyData(policyAdapter, entity);
+ }
+ else if("BRMS_Param".equalsIgnoreCase(policyAdapter.getConfigPolicyType())){
+ CreateBRMSParamController paramController = new CreateBRMSParamController();
+ paramController.prePopulateBRMSParamPolicyData(policyAdapter, entity);
+ }
+ else if("ClosedLoop_Fault".equalsIgnoreCase(policyAdapter.getConfigPolicyType())){
+ CreateClosedLoopFaultController newFaultTemplate = new CreateClosedLoopFaultController();
+ newFaultTemplate.prePopulateClosedLoopFaultPolicyData(policyAdapter, entity);
+ }
+ else if("ClosedLoop_PM".equalsIgnoreCase(policyAdapter.getConfigPolicyType())){
+ CreateClosedLoopPMController pmController = new CreateClosedLoopPMController();
+ pmController.prePopulateClosedLoopPMPolicyData(policyAdapter, entity);
+ }
+ else if("Micro Service".equalsIgnoreCase(policyAdapter.getConfigPolicyType())){
+ CreateDcaeMicroServiceController msController = new CreateDcaeMicroServiceController();
+ msController.prePopulateDCAEMSPolicyData(policyAdapter, entity);
+ }
+ else if("Firewall Config".equalsIgnoreCase(policyAdapter.getConfigPolicyType())){
+ CreateFirewallController firewallController = new CreateFirewallController();
+ firewallController.prePopulateFWPolicyData(policyAdapter, entity);
+ }
+ }
+ }
+
+ public boolean extendedOptions(PolicyRestAdapter policyAdapter, PolicyEntity entity) {
+ return false;
+ }
+
+ public static PolicyAdapter getInstance() {
+ try {
+ Class<?> policyAdapter = Class.forName(XACMLProperties.getProperty("policyAdapter.impl.className", PolicyAdapter.class.getName()));
+ return (PolicyAdapter) policyAdapter.newInstance();
+ } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+
+}
diff --git a/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyManagerServlet.java b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyManagerServlet.java
new file mode 100644
index 000000000..86210cdef
--- /dev/null
+++ b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyManagerServlet.java
@@ -0,0 +1,1265 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * 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.admin;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+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.OutputStream;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonReader;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebInitParam;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.http.HttpStatus;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.openecomp.policy.components.HumanPolicyComponent;
+import org.openecomp.policy.controller.PolicyController;
+import org.openecomp.policy.controller.PolicyExportAndImportController;
+import org.openecomp.policy.model.Roles;
+import org.openecomp.policy.rest.XACMLRest;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.rest.adapter.PolicyRestAdapter;
+import org.openecomp.policy.rest.jpa.ActionBodyEntity;
+import org.openecomp.policy.rest.jpa.ConfigurationDataEntity;
+import org.openecomp.policy.rest.jpa.PolicyEditorScopes;
+import org.openecomp.policy.rest.jpa.PolicyEntity;
+import org.openecomp.policy.rest.jpa.PolicyVersion;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.openecomp.policy.utils.PolicyUtils;
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import org.openecomp.policy.xacml.util.XACMLPolicyScanner;
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+
+import com.att.research.xacml.util.XACMLProperties;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+
+@WebServlet(value ="/fm/*", loadOnStartup = 1, initParams = { @WebInitParam(name = "XACML_PROPERTIES_NAME", value = "xacml.admin.properties", description = "The location of the properties file holding configuration information.") })
+public class PolicyManagerServlet extends HttpServlet {
+ private static final Logger LOGGER = FlexLogger.getLogger(PolicyManagerServlet.class);
+ private static final long serialVersionUID = -8453502699403909016L;
+
+ private enum Mode {
+ LIST, RENAME, COPY, DELETE, EDITFILE, ADDFOLDER, DESCRIBEPOLICYFILE, VIEWPOLICY, ADDSUBSCOPE, SWITCHVERSION, EXPORT
+ }
+
+ private static String CONTENTTYPE = "application/json";
+ private static String SUPERADMIN = "super-admin";
+ private static String SUPEREDITOR = "super-editor";
+ private static String SUPERGUEST = "super-guest";
+ private static String ADMIN = "admin";
+ private static String EDITOR = "editor";
+ private static String GUEST = "guest";
+ private static String RESULT = "result";
+
+ private static Path closedLoopJsonLocation;
+ private static JsonArray policyNames;
+
+ public static JsonArray getPolicyNames() {
+ return policyNames;
+ }
+
+ public static void setPolicyNames(JsonArray policyNames) {
+ PolicyManagerServlet.policyNames = policyNames;
+ }
+
+ private static List<String> serviceTypeNamesList = new ArrayList<String>();
+
+ public static List<String> getServiceTypeNamesList() {
+ return serviceTypeNamesList;
+ }
+
+ @Override
+ public void init(ServletConfig servletConfig) throws ServletException {
+ super.init(servletConfig);
+ //
+ // Common initialization
+ //
+ XACMLRest.xacmlInit(servletConfig);
+ //
+ //Initialize ClosedLoop JSON
+ //
+ PolicyManagerServlet.initializeJSONLoad();
+ }
+
+ protected static void initializeJSONLoad() {
+ closedLoopJsonLocation = Paths.get(XACMLProperties
+ .getProperty(XACMLRestProperties.PROP_ADMIN_CLOSEDLOOP));
+ FileInputStream inputStream = null;
+ String location = closedLoopJsonLocation.toString();
+ try {
+ inputStream = new FileInputStream(location);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ if (location.endsWith("json")) {
+ JsonReader jsonReader = null;
+ jsonReader = Json.createReader(inputStream);
+ policyNames = jsonReader.readArray();
+ serviceTypeNamesList = new ArrayList<String>();
+ for (int i = 0; i < policyNames.size(); i++) {
+ javax.json.JsonObject policyName = policyNames.getJsonObject(i);
+ String name = policyName.getJsonString("serviceTypePolicyName").getString();
+ serviceTypeNamesList.add(name);
+ }
+ jsonReader.close();
+ }
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ LOGGER.debug("doPost");
+ try {
+ // if request contains multipart-form-data
+ if (ServletFileUpload.isMultipartContent(request)) {
+ uploadFile(request, response);
+ }
+ // all other post request has json params in body
+ else {
+ fileOperation(request, response);
+ }
+ } catch (Exception e) {
+ setError(e, response);
+ }
+ }
+
+ //Set Error Message for Exception
+ private void setError(Exception t, HttpServletResponse response) throws IOException {
+ try {
+ JSONObject responseJsonObject = error(t.getMessage());
+ response.setContentType(CONTENTTYPE);
+ PrintWriter out = response.getWriter();
+ out.print(responseJsonObject);
+ out.flush();
+ } catch (Exception x) {
+ response.sendError(HttpStatus.SC_INTERNAL_SERVER_ERROR, x.getMessage());
+ }
+ }
+
+ //Policy Import Functionality
+ private void uploadFile(HttpServletRequest request, HttpServletResponse response) throws ServletException {
+ try {
+ String newFile;
+ Map<String, InputStream> files = new HashMap<String, InputStream>();
+
+ List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
+ for (FileItem item : items) {
+ if (!item.isFormField()) {
+ // Process form file field (input type="file").
+ files.put(item.getName(), item.getInputStream());
+ if(item.getName().endsWith(".xls")){
+ try{
+ File file = new File(item.getName());
+ OutputStream outputStream = new FileOutputStream(file);
+ IOUtils.copy(item.getInputStream(), outputStream);
+ outputStream.close();
+ newFile = file.toString();
+ PolicyExportAndImportController importController = new PolicyExportAndImportController();
+ importController.importRepositoryFile(newFile, request);
+ }catch(Exception e){
+ LOGGER.error("Upload error : " + e);
+ }
+ }
+ }
+ }
+
+ JSONObject responseJsonObject = null;
+ responseJsonObject = this.success();
+ response.setContentType("application/json");
+ PrintWriter out = response.getWriter();
+ out.print(responseJsonObject);
+ out.flush();
+ } catch (Exception e) {
+ LOGGER.debug("Cannot write file");
+ throw new ServletException("Cannot write file", e);
+ }
+ }
+
+ //File Operation Functionality
+ private void fileOperation(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ JSONObject responseJsonObject = null;
+ try {
+ StringBuilder sb = new StringBuilder();
+ BufferedReader br = request.getReader();
+ String str;
+ while ((str = br.readLine()) != null) {
+ sb.append(str);
+ }
+ br.close();
+ JSONObject jObj = new JSONObject(sb.toString());
+ JSONObject params = jObj.getJSONObject("params");
+ Mode mode = Mode.valueOf(params.getString("mode"));
+ switch (mode) {
+ case ADDFOLDER:
+ responseJsonObject = addFolder(params, request);
+ break;
+ case COPY:
+ responseJsonObject = copy(params, request);
+ break;
+ case DELETE:
+ responseJsonObject = delete(params, request);
+ break;
+ case EDITFILE:
+ responseJsonObject = editFile(params);
+ break;
+ case VIEWPOLICY:
+ responseJsonObject = editFile(params);
+ break;
+ case LIST:
+ responseJsonObject = list(params, request);
+ break;
+ case RENAME:
+ responseJsonObject = rename(params, request);
+ break;
+ case DESCRIBEPOLICYFILE:
+ responseJsonObject = describePolicy(params);
+ break;
+ case ADDSUBSCOPE:
+ responseJsonObject = addFolder(params, request);
+ break;
+ case SWITCHVERSION:
+ responseJsonObject = switchVersion(params, request);
+ break;
+ default:
+ throw new ServletException("not implemented");
+ }
+ if (responseJsonObject == null) {
+ responseJsonObject = error("generic error : responseJsonObject is null");
+ }
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Exception Occured While doing File Operation" + e);
+ responseJsonObject = error(e.getMessage());
+ }
+ response.setContentType("application/json");
+ PrintWriter out = response.getWriter();
+ out.print(responseJsonObject);
+ out.flush();
+ }
+
+ //Switch Version Functionality
+ private JSONObject switchVersion(JSONObject params, HttpServletRequest request) throws ServletException{
+ String path = params.getString("path");
+ String userId = null;
+ try {
+ userId = UserUtils.getUserSession(request).getOrgUserId();
+ } catch (Exception e) {
+ LOGGER.error("Exception Occured while reading userid from cookie" +e);
+ }
+ String policyName;
+ String removeExtension = path.replace(".xml", "");
+ if(path.startsWith("/")){
+ policyName = removeExtension.substring(1, removeExtension.lastIndexOf("."));
+ }else{
+ policyName = removeExtension.substring(0, removeExtension.lastIndexOf("."));
+ }
+
+ String activePolicy = null;
+ PolicyController controller = new PolicyController();
+ if(params.toString().contains("activeVersion")){
+ String activeVersion = params.getString("activeVersion");
+ String highestVersion = params.get("highestVersion").toString();
+ if(Integer.parseInt(activeVersion) > Integer.parseInt(highestVersion)){
+ return error("The Version shouldn't be greater than Highest Value");
+ }else{
+ activePolicy = policyName + "." + activeVersion + ".xml";
+ String dbCheckName = activePolicy.replace("/", ".");
+ if(dbCheckName.contains("Config_")){
+ dbCheckName = dbCheckName.replace(".Config_", ":Config_");
+ }else if(dbCheckName.contains("Action_")){
+ dbCheckName = dbCheckName.replace(".Action_", ":Action_");
+ }else if(dbCheckName.contains("Decision_")){
+ dbCheckName = dbCheckName.replace(".Decision_", ":Decision_");
+ }
+ String[] splitDBCheckName = dbCheckName.split(":");
+ String peQuery = "FROM PolicyEntity where policyName = '"+splitDBCheckName[1]+"' and scope ='"+splitDBCheckName[0]+"'";
+ List<Object> policyEntity = controller.getDataByQuery(peQuery);
+ PolicyEntity pentity = (PolicyEntity) policyEntity.get(0);
+ if(pentity.isDeleted()){
+ return error("The Policy is Not Existing in Workspace");
+ }else{
+ if(policyName.contains("/")){
+ policyName = policyName.replace("/", File.separator);
+ }
+ policyName = policyName.substring(policyName.indexOf(File.separator)+1);
+ if(policyName.contains("\\")){
+ policyName = policyName.replace(File.separator, "\\");
+ }
+ policyName = splitDBCheckName[0].replace(".", File.separator)+File.separator+policyName;
+ String watchPolicyName = policyName;
+ if(policyName.contains("/")){
+ policyName = policyName.replace("/", File.separator);
+ }
+ if(policyName.contains("\\")){
+ policyName = policyName.replace("\\", "\\\\");
+ }
+ String query = "update PolicyVersion set active_version='"+activeVersion+"' where policy_name ='"+policyName+"' and id >0";
+ //query the database
+ controller.executeQuery(query);
+ //Policy Notification
+ PolicyVersion entity = new PolicyVersion();
+ entity.setPolicyName(watchPolicyName);
+ entity.setActiveVersion(Integer.parseInt(activeVersion));
+ entity.setModifiedBy(userId);
+ controller.watchPolicyFunction(entity, activePolicy, "SwitchVersion");
+ return success();
+ }
+ }
+ }
+ return controller.switchVersionPolicyContent(policyName);
+ }
+
+ //Describe Policy
+ private JSONObject describePolicy(JSONObject params) throws ServletException{
+ JSONObject object = null;
+ String path = params.getString("path");
+ String policyName = null;
+ if(path.startsWith("/")){
+ path = path.substring(1);
+ policyName = path.substring(path.lastIndexOf("/") +1);
+ path = path.replace("/", ".");
+ }else{
+ path = path.replace("/", ".");
+ }
+ if(path.contains("Config_")){
+ path = path.replace(".Config_", ":Config_");
+ }else if(path.contains("Action_")){
+ path = path.replace(".Action_", ":Action_");
+ }else if(path.contains("Decision_")){
+ path = path.replace(".Decision_", ":Decision_");
+ }
+ PolicyController controller = new PolicyController();
+ String[] split = path.split(":");
+ String query = "FROM PolicyEntity where policyName = '"+split[1]+"' and scope ='"+split[0]+"'";
+ List<Object> queryData = controller.getDataByQuery(query);
+ if(queryData != null){
+ PolicyEntity entity = (PolicyEntity) queryData.get(0);
+ File temp = null;
+ try {
+ temp = File.createTempFile(policyName, ".tmp");
+ BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
+ bw.write(entity.getPolicyData());
+ bw.close();
+ object = HumanPolicyComponent.DescribePolicy(temp);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }finally{
+ temp.delete();
+ }
+ }else{
+ return error("Error Occured while Describing the Policy");
+ }
+
+ return object;
+ }
+
+ //Get the List of Policies and Scopes for Showing in Editor tab
+ private JSONObject list(JSONObject params, HttpServletRequest request) throws ServletException {
+ Set<String> scopes = null;
+ List<String> roles = null;
+ try {
+ //Get the Login Id of the User from Request
+ String userId = UserUtils.getUserSession(request).getOrgUserId();
+ //Check if the Role and Scope Size are Null get the values from db.
+ List<Object> userRoles = PolicyController.getRoles(userId);
+ roles = new ArrayList<String>();
+ scopes = new HashSet<String>();
+ for(Object role: userRoles){
+ Roles userRole = (Roles) role;
+ roles.add(userRole.getRole());
+ if(userRole.getScope() != null){
+ if(userRole.getScope().contains(",")){
+ String[] multipleScopes = userRole.getScope().split(",");
+ for(int i =0; i < multipleScopes.length; i++){
+ scopes.add(multipleScopes[i]);
+ }
+ }else{
+ scopes.add(userRole.getScope());
+ }
+ }
+ }
+ if (roles.contains(ADMIN) || roles.contains(EDITOR) || roles.contains(GUEST) ) {
+ if(scopes.isEmpty()){
+ return error("No Scopes has been Assigned to the User. Please, Contact Super-Admin");
+ }
+ }
+
+ List<JSONObject> resultList = new ArrayList<JSONObject>();
+ boolean onlyFolders = params.getBoolean("onlyFolders");
+ String path = params.getString("path");
+ if(path.contains("..xml")){
+ path = path.replaceAll("..xml", "").trim();
+ }
+
+
+ if("/".equals(path)){
+ if(roles.contains(SUPERADMIN) || roles.contains(SUPEREDITOR) || roles.contains(SUPERGUEST)){
+ List<Object> scopesList = queryPolicyEditorScopes(null);
+ for(Object list : scopesList){
+ PolicyEditorScopes scope = (PolicyEditorScopes) list;
+ if(!(scope.getScopeName().contains(File.separator))){
+ JSONObject el = new JSONObject();
+ el.put("name", scope.getScopeName());
+ el.put("date", scope.getCreatedDate());
+ el.put("size", "");
+ el.put("type", "dir");
+ el.put("createdBy", scope.getUserCreatedBy().getUserName());
+ el.put("modifiedBy", scope.getUserModifiedBy().getUserName());
+ resultList.add(el);
+ }
+ }
+ }else if(roles.contains(ADMIN) || roles.contains(EDITOR) || roles.contains(GUEST)){
+ for(Object scope : scopes){
+ JSONObject el = new JSONObject();
+ List<Object> scopesList = queryPolicyEditorScopes(scope.toString());
+ PolicyEditorScopes scopeById = (PolicyEditorScopes) scopesList.get(0);
+ el.put("name", scopeById.getScopeName());
+ el.put("date", scopeById.getCreatedDate());
+ el.put("size", "");
+ el.put("type", "dir");
+ el.put("createdBy", scopeById.getUserCreatedBy().getUserName());
+ el.put("modifiedBy", scopeById.getUserModifiedBy().getUserName());
+ resultList.add(el);
+ }
+ }
+ }else{
+ try{
+ String scopeName = path.substring(path.indexOf("/") +1);
+ activePolicyList(scopeName, resultList, roles, scopes, onlyFolders);
+ } catch (Exception ex) {
+ LOGGER.error("Error Occured While reading Policy Files List"+ex );
+ }
+ }
+
+ return new JSONObject().put(RESULT, resultList);
+ } catch (Exception e) {
+ LOGGER.error("list", e);
+ return error(e.getMessage());
+ }
+ }
+
+ private List<Object> queryPolicyEditorScopes(String scopeName){
+ String scopeNamequery = "";
+ if(scopeName == null){
+ scopeNamequery = "from PolicyEditorScopes";
+ }else{
+ scopeNamequery = "from PolicyEditorScopes where SCOPENAME like'" +scopeName+"'";
+ }
+ PolicyController controller = new PolicyController();
+ List<Object> scopesList = controller.getDataByQuery(scopeNamequery);
+ return scopesList;
+ }
+
+ //Get Active Policy List based on Scope Selection form Policy Version table
+ private void activePolicyList(String scopeName, List<JSONObject> resultList, List<String> roles, Set<String> scopes, boolean onlyFolders){
+ PolicyController controller = new PolicyController();
+ if(scopeName.contains("/")){
+ scopeName = scopeName.replace("/", File.separator);
+ }
+ if(scopeName.contains("\\")){
+ scopeName = scopeName.replace("\\", "\\\\\\\\");
+ }
+ String query = "from PolicyVersion where POLICY_NAME like'" +scopeName+"%'";
+ String scopeNamequery = "from PolicyEditorScopes where SCOPENAME like'" +scopeName+"%'";
+ List<Object> activePolicies = controller.getDataByQuery(query);
+ List<Object> scopesList = controller.getDataByQuery(scopeNamequery);
+ for(Object list : scopesList){
+ PolicyEditorScopes scopeById = (PolicyEditorScopes) list;
+ String scope = scopeById.getScopeName();
+ if(scope.contains(File.separator)){
+ String checkScope = scope.substring(0, scope.lastIndexOf(File.separator));
+ if(scopeName.contains("\\\\")){
+ scopeName = scopeName.replace("\\\\", File.separator);
+ }
+ if(scope.contains(File.separator)){
+ scope = scope.substring(checkScope.length()+1);
+ if(scope.contains(File.separator)){
+ scope = scope.substring(0, scope.indexOf(File.separator));
+ }
+ }
+ if(scopeName.equalsIgnoreCase(checkScope)){
+ JSONObject el = new JSONObject();
+ el.put("name", scope);
+ el.put("date", scopeById.getModifiedDate());
+ el.put("size", "");
+ el.put("type", "dir");
+ el.put("createdBy", scopeById.getUserCreatedBy().getUserName());
+ el.put("modifiedBy", scopeById.getUserModifiedBy().getUserName());
+ resultList.add(el);
+ }
+ }
+ }
+ String scopeNameCheck = null;
+ for (Object list : activePolicies) {
+ PolicyVersion policy = (PolicyVersion) list;
+ String scopeNameValue = policy.getPolicyName().substring(0, policy.getPolicyName().lastIndexOf(File.separator));
+ if(roles.contains(SUPERADMIN) || roles.contains(SUPEREDITOR) || roles.contains(SUPERGUEST)){
+ if((scopeName.contains("\\\\"))){
+ scopeNameCheck = scopeName.replace("\\\\", File.separator);
+ }else{
+ scopeNameCheck = scopeName;
+ }
+ if(scopeNameValue.equals(scopeNameCheck)){
+ JSONObject el = new JSONObject();
+ el.put("name", policy.getPolicyName().substring(policy.getPolicyName().lastIndexOf(File.separator)+1));
+ el.put("date", policy.getModifiedDate());
+ el.put("version", policy.getActiveVersion());
+ el.put("size", "");
+ el.put("type", "file");
+ el.put("createdBy", getUserName(policy.getCreatedBy()));
+ el.put("modifiedBy", getUserName(policy.getModifiedBy()));
+ resultList.add(el);
+ }
+ }else if(!scopes.isEmpty()){
+ if(scopes.contains(scopeNameValue)){
+ JSONObject el = new JSONObject();
+ el.put("name", policy.getPolicyName().substring(policy.getPolicyName().lastIndexOf(File.separator)+1));
+ el.put("date", policy.getModifiedDate());
+ el.put("version", policy.getActiveVersion());
+ el.put("size", "");
+ el.put("type", "file");
+ el.put("createdBy", getUserName(policy.getCreatedBy()));
+ el.put("modifiedBy", getUserName(policy.getModifiedBy()));
+ resultList.add(el);
+ }
+ }
+ }
+ }
+
+ private String getUserName(String loginId){
+ PolicyController controller = new PolicyController();
+ UserInfo userInfo = (UserInfo) controller.getEntityItem(UserInfo.class, "userLoginId", loginId);
+ return userInfo.getUserName();
+ }
+
+ //Rename Policy
+ private JSONObject rename(JSONObject params, HttpServletRequest request) throws ServletException {
+ try {
+ String userId = UserUtils.getUserSession(request).getOrgUserId();
+ String oldPath = params.getString("path");
+ String newPath = params.getString("newPath");
+ oldPath = oldPath.substring(oldPath.indexOf("/")+1);
+ newPath = newPath.substring(newPath.indexOf("/")+1);
+ if(oldPath.endsWith(".xml")){
+ policyRename(oldPath, newPath, userId);
+ }else{
+ String scopeName = oldPath;
+ String newScopeName = newPath;
+ if(scopeName.contains("/")){
+ scopeName = scopeName.replace("/", File.separator);
+ newScopeName = newScopeName.replace("/", File.separator);
+ }
+ if(scopeName.contains("\\")){
+ scopeName = scopeName.replace("\\", "\\\\\\\\");
+ newScopeName = newScopeName.replace("\\", "\\\\\\\\");
+ }
+ PolicyController controller = new PolicyController();
+ String query = "from PolicyVersion where POLICY_NAME like'" +scopeName+"%'";
+ String scopeNamequery = "from PolicyEditorScopes where SCOPENAME like'" +scopeName+"%'";
+ List<Object> activePolicies = controller.getDataByQuery(query);
+ List<Object> scopesList = controller.getDataByQuery(scopeNamequery);
+ for(Object object : activePolicies){
+ PolicyVersion activeVersion = (PolicyVersion) object;
+ String policyOldPath = activeVersion.getPolicyName().replace(File.separator, "/") + "." + activeVersion.getActiveVersion() + ".xml";
+ String policyNewPath = policyOldPath.replace(oldPath, newPath);
+ policyRename(policyOldPath, policyNewPath, userId);
+ }
+ for(Object object : scopesList){
+ PolicyEditorScopes editorScopeEntity = (PolicyEditorScopes) object;
+ if(scopeName.contains("\\\\\\\\")){
+ scopeName = scopeName.replace("\\\\\\\\", File.separator);
+ newScopeName = newScopeName.replace("\\\\\\\\", File.separator);
+ }
+ String scope = editorScopeEntity.getScopeName().replace(scopeName, newScopeName);
+ editorScopeEntity.setScopeName(scope);
+ controller.updateData(editorScopeEntity);
+ }
+ }
+ return success();
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE+"Exception Occured While Renaming Policy"+e);
+ return error(e.getMessage());
+ }
+ }
+
+ private JSONObject policyRename(String oldPath, String newPath, String userId) throws ServletException {
+ try {
+ PolicyEntity entity = null;
+ PolicyController controller = new PolicyController();
+
+ String policyVersionName = newPath.replace(".xml", "");
+ String policyName = policyVersionName.substring(0, policyVersionName.lastIndexOf(".")).replace("/", File.separator);
+
+ String oldpolicyVersionName = oldPath.replace(".xml", "");
+ String oldpolicyName = oldpolicyVersionName.substring(0, oldpolicyVersionName.lastIndexOf(".")).replace("/", File.separator);
+
+ String newpolicyName = newPath.replace("/", ".");
+ String newPolicyCheck = newpolicyName;
+ if(newPolicyCheck.contains("Config_")){
+ newPolicyCheck = newPolicyCheck.replace(".Config_", ":Config_");
+ }else if(newPolicyCheck.contains("Action_")){
+ newPolicyCheck = newPolicyCheck.replace(".Action_", ":Action_");
+ }else if(newPolicyCheck.contains("Decision_")){
+ newPolicyCheck = newPolicyCheck.replace(".Decision_", ":Decision_");
+ }
+ String[] newPolicySplit = newPolicyCheck.split(":");
+
+ String orignalPolicyName = oldPath.replace("/", ".");
+ String oldPolicyCheck = orignalPolicyName;
+ if(oldPolicyCheck.contains("Config_")){
+ oldPolicyCheck = oldPolicyCheck.replace(".Config_", ":Config_");
+ }else if(oldPolicyCheck.contains("Action_")){
+ oldPolicyCheck = oldPolicyCheck.replace(".Action_", ":Action_");
+ }else if(oldPolicyCheck.contains("Decision_")){
+ oldPolicyCheck = oldPolicyCheck.replace(".Decision_", ":Decision_");
+ }
+ String[] oldPolicySplit = oldPolicyCheck.split(":");
+
+ //Check PolicyEntity table with newPolicy Name
+ String policyEntityquery = "FROM PolicyEntity where policyName = '"+newPolicySplit[1]+"' and scope ='"+newPolicySplit[0]+"'";
+ System.out.println(policyEntityquery);
+ List<Object> queryData = controller.getDataByQuery(policyEntityquery);
+ if(!queryData.isEmpty()){
+ entity = (PolicyEntity) queryData.get(0);
+ }
+
+ if(entity != null){
+ //if a policy exists with new name check if it is deleted or not
+ if(entity.isDeleted()){
+ //Check Policy Group Entity table if policy has been pushed or not
+ String query = "from PolicyGroupEntity where policyid = '"+entity.getPolicyId()+"'";
+ List<Object> object = controller.getDataByQuery(query);
+ if(object.isEmpty()){
+ //if PolicyGroupEntity data is empty delete the entry from database
+ controller.deleteData(entity);
+ //Query the Policy Entity with oldPolicy Name
+ String oldpolicyEntityquery = "FROM PolicyEntity where policyName = '"+oldPolicySplit[1]+"' and scope ='"+oldPolicySplit[0]+"'";
+ System.out.println(oldpolicyEntityquery);
+ List<Object> oldEntityData = controller.getDataByQuery(oldpolicyEntityquery);
+ if(!oldEntityData.isEmpty()){
+ entity = (PolicyEntity) oldEntityData.get(0);
+ }
+ checkOldPolicyEntryAndUpdate(entity, newPolicySplit[0], newPolicySplit[1], oldPolicySplit[0], oldPolicySplit[1], policyName, newpolicyName, oldpolicyName, userId);
+ }else{
+ return error("Policy rename failed due to policy with new name existing in PDP Group.");
+ }
+ }else{
+ return error("Policy rename failed due to same name existing.");
+ }
+ }else{
+ //Query the Policy Entity with oldPolicy Name
+ String oldpolicyEntityquery = "FROM PolicyEntity where policyName = '"+oldPolicySplit[1]+"' and scope ='"+oldPolicySplit[0]+"'";
+ System.out.println(oldpolicyEntityquery);
+ List<Object> oldEntityData = controller.getDataByQuery(oldpolicyEntityquery);
+ if(!oldEntityData.isEmpty()){
+ entity = (PolicyEntity) oldEntityData.get(0);
+ }
+ checkOldPolicyEntryAndUpdate(entity, newPolicySplit[0] , newPolicySplit[1], oldPolicySplit[0], oldPolicySplit[1], policyName, newpolicyName, oldpolicyName, userId);
+ }
+
+ return success();
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE+"Exception Occured While Renaming Policy"+e);
+ return error(e.getMessage());
+ }
+ }
+
+ private JSONObject checkOldPolicyEntryAndUpdate(PolicyEntity entity, String newScope, String removenewPolicyExtension, String oldScope, String removeoldPolicyExtension,
+ String policyName, String newpolicyName, String oldpolicyName, String userId) throws ServletException{
+ try {
+ ConfigurationDataEntity configEntity;
+ ActionBodyEntity actionEntity;
+ PolicyController controller = new PolicyController();
+ configEntity = entity.getConfigurationData();
+ actionEntity = entity.getActionBodyEntity();
+ if(entity != null){
+ //Check Policy Group Entity table if policy has been pushed or not
+ String query = "from PolicyGroupEntity where policyid = '"+entity.getPolicyId()+"'";
+ List<Object> object = controller.getDataByQuery(query);
+ if(object == null){
+ String oldPolicyNameWithoutExtension = removeoldPolicyExtension;
+ String newPolicyNameWithoutExtension = removenewPolicyExtension;
+ if(removeoldPolicyExtension.endsWith(".xml")){
+ oldPolicyNameWithoutExtension = oldPolicyNameWithoutExtension.substring(0, oldPolicyNameWithoutExtension.indexOf("."));
+ newPolicyNameWithoutExtension = newPolicyNameWithoutExtension.substring(0, newPolicyNameWithoutExtension.indexOf("."));
+ }
+ entity.setPolicyName(entity.getPolicyName().replace(removeoldPolicyExtension, removenewPolicyExtension));
+ entity.setPolicyData(entity.getPolicyData().replace(oldScope +"."+oldPolicyNameWithoutExtension, newScope+"."+newPolicyNameWithoutExtension));
+ entity.setScope(newScope);
+ entity.setModifiedBy(userId);
+ String oldConfigRemoveExtension = removeoldPolicyExtension.replace(".xml", "");
+ String newConfigRemoveExtension = removenewPolicyExtension.replace(".xml", "");
+ if(newpolicyName.contains("Config_")){
+ configEntity.setConfigurationName(configEntity.getConfigurationName().replace(oldScope +"."+oldConfigRemoveExtension, newScope+"."+newConfigRemoveExtension));
+ controller.updateData(configEntity);
+ }else if(newpolicyName.contains("Action_")){
+ actionEntity.setActionBody(actionEntity.getActionBody().replace(oldScope +"."+oldConfigRemoveExtension, newScope+"."+newConfigRemoveExtension));
+ controller.updateData(actionEntity);
+ }
+ controller.updateData(entity);
+ }else{
+ //Mark as Deleted in PolicyEntiy table
+ entity.setDeleted(true);
+ controller.updateData(entity);
+ //Mark as Deleted in ConfigurationDataEntity table
+ configEntity.setDeleted(true);
+ controller.updateData(configEntity);
+ //Mark as Deleted in ActionDataEntity table
+ actionEntity.setDeleted(true);
+ controller.updateData(actionEntity);
+ //Clone New Copy
+ cloneRecord(newpolicyName, oldScope, removeoldPolicyExtension, newScope, removenewPolicyExtension, entity, userId);
+ }
+
+ PolicyVersion versionEntity = (PolicyVersion) controller.getEntityItem(PolicyVersion.class, "policyName", oldpolicyName);
+ versionEntity.setPolicyName(policyName);
+ versionEntity.setModifiedBy(userId);
+ controller.updateData(versionEntity);
+ String movePolicyCheck = policyName.substring(policyName.lastIndexOf(File.separator)+1);
+ String moveOldPolicyCheck = oldpolicyName.substring(oldpolicyName.lastIndexOf(File.separator)+1);
+ if(movePolicyCheck.equals(moveOldPolicyCheck)){
+ controller.watchPolicyFunction(versionEntity, oldpolicyName, "Move");
+ }else{
+ controller.watchPolicyFunction(versionEntity, oldpolicyName, "Rename");
+ }
+ }
+ return success();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return error(e.getMessage());
+ }
+ }
+
+ private JSONObject cloneRecord(String newpolicyName, String oldScope, String removeoldPolicyExtension, String newScope, String removenewPolicyExtension, PolicyEntity entity, String userId) throws ServletException{
+ String queryEntityName = null;
+ PolicyController controller = new PolicyController();
+ PolicyEntity cloneEntity = new PolicyEntity();
+ cloneEntity.setPolicyName(newpolicyName);
+ removeoldPolicyExtension = removeoldPolicyExtension.replace(".xml", "");
+ removenewPolicyExtension = removenewPolicyExtension.replace(".xml", "");
+ cloneEntity.setPolicyData(entity.getPolicyData().replace(oldScope+"."+removeoldPolicyExtension, newScope+"."+removenewPolicyExtension));
+ cloneEntity.setScope(entity.getScope());
+ String oldConfigRemoveExtension = removeoldPolicyExtension.replace(".xml", "");
+ String newConfigRemoveExtension = removenewPolicyExtension.replace(".xml", "");
+ if(newpolicyName.contains("Config_")){
+ ConfigurationDataEntity configurationDataEntity = new ConfigurationDataEntity();
+ configurationDataEntity.setConfigurationName(entity.getConfigurationData().getConfigurationName().replace(oldScope+"."+oldConfigRemoveExtension, newScope+"."+newConfigRemoveExtension));
+ queryEntityName = configurationDataEntity.getConfigurationName();
+ configurationDataEntity.setConfigBody(entity.getConfigurationData().getConfigBody());
+ configurationDataEntity.setConfigType(entity.getConfigurationData().getConfigType());
+ configurationDataEntity.setDeleted(false);
+ configurationDataEntity.setCreatedBy(userId);
+ configurationDataEntity.setModifiedBy(userId);
+ controller.saveData(configurationDataEntity);
+ ConfigurationDataEntity configEntiy = (ConfigurationDataEntity) controller.getEntityItem(ConfigurationDataEntity.class, "configurationName", queryEntityName);
+ cloneEntity.setConfigurationData(configEntiy);
+ }else if(newpolicyName.contains("Action_")){
+ ActionBodyEntity actionBodyEntity = new ActionBodyEntity();
+ actionBodyEntity.setActionBodyName(entity.getActionBodyEntity().getActionBodyName().replace(oldScope+"."+oldConfigRemoveExtension, newScope+"."+newConfigRemoveExtension));
+ queryEntityName = actionBodyEntity.getActionBodyName();
+ actionBodyEntity.setActionBody(entity.getActionBodyEntity().getActionBody());
+ actionBodyEntity.setDeleted(false);
+ actionBodyEntity.setCreatedBy(userId);
+ actionBodyEntity.setModifiedBy(userId);
+ controller.saveData(actionBodyEntity);
+ ActionBodyEntity actionEntiy = (ActionBodyEntity) controller.getEntityItem(ActionBodyEntity.class, "actionBodyName", queryEntityName);
+ cloneEntity.setActionBodyEntity(actionEntiy);
+ }
+ cloneEntity.setDeleted(entity.isDeleted());
+ cloneEntity.setCreatedBy(userId);
+ cloneEntity.setModifiedBy(userId);
+ controller.saveData(cloneEntity);
+
+ return success();
+ }
+
+ //Clone the Policy
+ private JSONObject copy(JSONObject params, HttpServletRequest request) throws ServletException {
+ try {
+ String userId = UserUtils.getUserSession(request).getOrgUserId();
+ String oldPath = params.getString("path");
+ String newPath = params.getString("newPath");
+ oldPath = oldPath.substring(oldPath.indexOf("/")+1);
+ newPath = newPath.substring(newPath.indexOf("/")+1);
+
+ String policyVersionName = newPath.replace(".xml", "");
+ String version = policyVersionName.substring(policyVersionName.indexOf(".")+1);
+ String policyName = policyVersionName.substring(0, policyVersionName.lastIndexOf(".")).replace("/", File.separator);
+
+ String newpolicyName = newPath.replace("/", ".");
+
+ String orignalPolicyName = oldPath.replace("/", ".");
+
+ String newPolicyCheck = newpolicyName;
+ if(newPolicyCheck.contains("Config_")){
+ newPolicyCheck = newPolicyCheck.replace(".Config_", ":Config_");
+ }else if(newPolicyCheck.contains("Action_")){
+ newPolicyCheck = newPolicyCheck.replace(".Action_", ":Action_");
+ }else if(newPolicyCheck.contains("Decision_")){
+ newPolicyCheck = newPolicyCheck.replace(".Decision_", ":Decision_");
+ }
+ String[] newPolicySplit = newPolicyCheck.split(":");
+
+ String oldPolicyCheck = orignalPolicyName;
+ if(oldPolicyCheck.contains("Config_")){
+ oldPolicyCheck = oldPolicyCheck.replace(".Config_", ":Config_");
+ }else if(oldPolicyCheck.contains("Action_")){
+ oldPolicyCheck = oldPolicyCheck.replace(".Action_", ":Action_");
+ }else if(oldPolicyCheck.contains("Decision_")){
+ oldPolicyCheck = oldPolicyCheck.replace(".Decision_", ":Decision_");
+ }
+ String[] oldPolicySplit = oldPolicyCheck.split(":");
+
+ PolicyController controller = new PolicyController();
+
+ PolicyEntity entity = null;
+ boolean success = false;
+
+ //Check PolicyEntity table with newPolicy Name
+ String policyEntityquery = "FROM PolicyEntity where policyName = '"+newPolicySplit[1]+"' and scope ='"+newPolicySplit[0]+"'";
+ System.out.println(policyEntityquery);
+ List<Object> queryData = controller.getDataByQuery(policyEntityquery);
+ if(!queryData.isEmpty()){
+ entity = (PolicyEntity) queryData.get(0);
+ }
+ if(entity != null){
+ //if a policy exists with new name check if it is deleted or not
+ if(entity.isDeleted()){
+ //Check Policy Group Entity table if policy has been pushed or not
+ String query = "from PolicyGroupEntity where policyid = '"+entity.getPolicyId()+"'";
+ List<Object> object = controller.getDataByQuery(query);
+ if(object == null){
+ //if PolicyGroupEntity data is empty delete the entry from database
+ controller.deleteData(entity);
+ //Query the Policy Entity with oldPolicy Name
+ policyEntityquery = "FROM PolicyEntity where policyName = '"+oldPolicySplit[1]+"' and scope ='"+oldPolicySplit[0]+"'";
+ System.out.println(policyEntityquery);
+ queryData = controller.getDataByQuery(policyEntityquery);
+ if(!queryData.isEmpty()){
+ entity = (PolicyEntity) queryData.get(0);
+ }
+ if(entity != null){
+ cloneRecord(newPolicySplit[1], oldPolicySplit[0], oldPolicySplit[1], newPolicySplit[0], newPolicySplit[1], entity, userId);
+ success = true;
+ }
+ }else{
+ return error("Policy Clone failed due to policy with new name existing in PDP Group.");
+ }
+ }else{
+ return error("Policy Clone failed due to same name existing.");
+ }
+ }else{
+ //Query the Policy Entity with oldPolicy Name
+ policyEntityquery = "FROM PolicyEntity where policyName = '"+oldPolicySplit[1]+"' and scope ='"+oldPolicySplit[0]+"'";
+ System.out.println(policyEntityquery);
+ queryData = controller.getDataByQuery(policyEntityquery);
+ if(!queryData.isEmpty()){
+ entity = (PolicyEntity) queryData.get(0);
+ }
+ if(entity != null){
+ cloneRecord(newPolicySplit[1], oldPolicySplit[0], oldPolicySplit[1], newPolicySplit[0], newPolicySplit[1], entity, userId);
+ success = true;
+ }
+ }
+ if(success){
+ PolicyVersion entityItem = new PolicyVersion();
+ entityItem.setActiveVersion(Integer.parseInt(version));
+ entityItem.setHigherVersion(Integer.parseInt(version));
+ entityItem.setPolicyName(policyName);
+ entityItem.setCreatedBy(userId);
+ entityItem.setModifiedBy(userId);
+ controller.saveData(entityItem);
+ }
+
+ LOGGER.debug("copy from: {} to: {}" + oldPath +newPath);
+
+ return success();
+ } catch (Exception e) {
+ LOGGER.error("copy", e);
+ return error(e.getMessage());
+ }
+ }
+
+ //Delete Policy or Scope Functionality
+ private JSONObject delete(JSONObject params, HttpServletRequest request) throws ServletException {
+ PolicyController controller = new PolicyController();
+ PolicyRestController restController = new PolicyRestController();
+ PolicyEntity policyEntity = null;
+ String policyNamewithoutExtension;
+ try {
+ String userId = UserUtils.getUserSession(request).getOrgUserId();
+ String deleteVersion = "";
+ String path = params.getString("path");
+ LOGGER.debug("delete {}" +path);
+ if(params.has("deleteVersion")){
+ deleteVersion = params.getString("deleteVersion");
+ }
+ path = path.substring(path.indexOf("/")+1);
+ String policyNamewithExtension = path.replace("/", File.separator);
+ String policyVersionName = policyNamewithExtension.replace(".xml", "");
+ String query = "";
+ if(path.endsWith(".xml")){
+ policyNamewithoutExtension = policyVersionName.substring(0, policyVersionName.lastIndexOf("."));
+ policyNamewithoutExtension = policyNamewithoutExtension.replace(File.separator, ".");
+ String splitPolicyName = null;
+ if(policyNamewithoutExtension.contains("Config_")){
+ splitPolicyName = policyNamewithoutExtension.replace(".Config_", ":Config_");
+ }else if(policyNamewithoutExtension.contains("Action_")){
+ splitPolicyName = policyNamewithoutExtension.replace(".Action_", ":Action_");
+ }else if(policyNamewithoutExtension.contains("Decision_")){
+ splitPolicyName = policyNamewithoutExtension.replace(".Decision_", ":Decision_");
+ }
+ String[] split = splitPolicyName.split(":");
+ query = "FROM PolicyEntity where policyName like '"+split[1]+"%' and scope ='"+split[0]+"'";
+ }else{
+ policyNamewithoutExtension = path.replace(File.separator, ".");
+ query = "FROM PolicyEntity where scope like '"+policyNamewithoutExtension+"%'";
+ }
+
+ List<Object> policyEntityobjects = controller.getDataByQuery(query);
+ boolean pdpCheck = true;
+ if(path.endsWith(".xml")){
+ policyNamewithoutExtension = policyNamewithoutExtension.replace(".", File.separator);
+ int version = Integer.parseInt(policyVersionName.substring(policyVersionName.indexOf(".")+1));
+ if("ALL".equals(deleteVersion)){
+ if(!policyEntityobjects.isEmpty()){
+ for(Object object : policyEntityobjects){
+ policyEntity = (PolicyEntity) object;
+ String groupEntityquery = "from PolicyGroupEntity where policyid = '"+policyEntity.getPolicyId()+"'";
+ List<Object> groupobject = controller.getDataByQuery(groupEntityquery);
+ if(groupobject != null){
+ pdpCheck = false;
+ break;
+ }
+ }
+ }
+ if(pdpCheck){
+ for(Object object : policyEntityobjects){
+ policyEntity = (PolicyEntity) object;
+ //Delete the entity from Elastic Search Database
+ String searchFileName = policyEntity.getScope() + "." + policyEntity.getPolicyName();
+ restController.deleteElasticData(searchFileName);
+ //Delete the entity from Policy Entity table
+ controller.deleteData(policyEntity);
+ if(policyNamewithoutExtension.contains("Config_")){
+ controller.deleteData(policyEntity.getConfigurationData());
+ }else if(policyNamewithoutExtension.contains("Action_")){
+ controller.deleteData(policyEntity.getActionBodyEntity());
+ }
+ }
+ //Policy Notification
+ PolicyVersion versionEntity = new PolicyVersion();
+ versionEntity.setPolicyName(policyNamewithoutExtension);
+ versionEntity.setModifiedBy(userId);
+ controller.watchPolicyFunction(versionEntity, policyNamewithExtension, "DeleteAll");
+ //Delete from policyVersion table
+ String policyVersionQuery = "delete from PolicyVersion where policy_name ='" +policyNamewithoutExtension.replace("\\", "\\\\")+"' and id >0";
+ if(policyVersionQuery != null){
+ controller.executeQuery(policyVersionQuery);
+ }
+ }else{
+ return error("Policy can't be deleted, it is active in PDP Groups. PolicyName: '"+policyEntity.getScope() + "." +policyEntity.getPolicyName()+"'");
+ }
+ }else if("CURRENT".equals(deleteVersion)){
+ String currentVersionPolicyName = policyNamewithExtension.substring(policyNamewithExtension.lastIndexOf(File.separator)+1);
+ String currentVersionScope = policyNamewithExtension.substring(0, policyNamewithExtension.lastIndexOf(File.separator)).replace(File.separator, ".");
+ query = "FROM PolicyEntity where policyName = '"+currentVersionPolicyName+"' and scope ='"+currentVersionScope+"'";
+ List<Object> policyEntitys = controller.getDataByQuery(query);
+ if(!policyEntitys.isEmpty()){
+ policyEntity = (PolicyEntity) policyEntitys.get(0);
+ }
+ if(policyEntity != null){
+ String groupEntityquery = "from PolicyGroupEntity where policyid = '"+policyEntity.getPolicyId()+"'";
+ List<Object> groupobject = controller.getDataByQuery(groupEntityquery);
+ if(groupobject == null){
+ //Delete the entity from Elastic Search Database
+ String searchFileName = policyEntity.getScope() + "." + policyEntity.getPolicyName();
+ restController.deleteElasticData(searchFileName);
+ //Delete the entity from Policy Entity table
+ controller.deleteData(policyEntity);
+ if(policyNamewithoutExtension.contains("Config_")){
+ controller.deleteData(policyEntity.getConfigurationData());
+ }else if(policyNamewithoutExtension.contains("Action_")){
+ controller.deleteData(policyEntity.getActionBodyEntity());
+ }
+
+ if(version > 1){
+ int highestVersion = 0;
+ if(policyEntityobjects.isEmpty()){
+ for(Object object : policyEntityobjects){
+ policyEntity = (PolicyEntity) object;
+ String policyEntityName = policyEntity.getPolicyName().replace(".xml", "");
+ int policyEntityVersion = Integer.parseInt(policyEntityName.substring(policyEntityName.lastIndexOf(".")+1));
+ if(policyEntityVersion > highestVersion){
+ highestVersion = policyEntityVersion;
+ }
+ }
+ }
+
+ //Policy Notification
+ PolicyVersion entity = new PolicyVersion();
+ entity.setPolicyName(policyNamewithoutExtension);
+ entity.setActiveVersion(highestVersion);
+ entity.setModifiedBy(userId);
+ controller.watchPolicyFunction(entity, policyNamewithExtension, "DeleteOne");
+
+ String updatequery = "update PolicyVersion set active_version='"+highestVersion+"' , highest_version='"+highestVersion+"' where policy_name ='" +policyNamewithoutExtension.replace("\\", "\\\\")+"'";
+ controller.executeQuery(updatequery);
+ }else{
+ String policyVersionQuery = "delete from PolicyVersion where policy_name ='" +policyNamewithoutExtension.replace("\\", "\\\\")+"' and id >0";
+ if(policyVersionQuery != null){
+ controller.executeQuery(policyVersionQuery);
+ }
+ }
+ }else{
+ return error("Policy can't be deleted, it is active in PDP Groups. PolicyName: '"+policyEntity.getScope() + "." +policyEntity.getPolicyName()+"'");
+ }
+ }
+ }
+ }else{
+ if(!policyEntityobjects.isEmpty()){
+ for(Object object : policyEntityobjects){
+ policyEntity = (PolicyEntity) object;
+ String groupEntityquery = "from PolicyGroupEntity where policyid = '"+policyEntity.getPolicyId()+"'";
+ List<Object> groupobject = controller.getDataByQuery(groupEntityquery);
+ if(groupobject != null){
+ pdpCheck = false;
+ }
+ }
+ if(pdpCheck){
+ for(Object object : policyEntityobjects){
+ policyEntity = (PolicyEntity) object;
+ //Delete the entity from Elastic Search Database
+ String searchFileName = policyEntity.getScope() + "." + policyEntity.getPolicyName();
+ restController.deleteElasticData(searchFileName);
+ //Delete the entity from Policy Entity table
+ controller.deleteData(policyEntity);
+ policyNamewithoutExtension = policyEntity.getPolicyName();
+ if(policyNamewithoutExtension.contains("Config_")){
+ controller.deleteData(policyEntity.getConfigurationData());
+ }else if(policyNamewithoutExtension.contains("Action_")){
+ controller.deleteData(policyEntity.getActionBodyEntity());
+ }
+ }
+
+ //Delete from policyVersion and policyEditor Scope table
+ String policyVersionQuery = "delete PolicyVersion where POLICY_NAME like '"+path.replace("\\", "\\\\")+"%' and id >0";
+ String policyScopeQuery = "delete PolicyEditorScopes where SCOPENAME like '"+path.replace("\\", "\\\\")+"%' and id >0";
+ controller.executeQuery(policyVersionQuery);
+ controller.executeQuery(policyScopeQuery);
+ //Policy Notification
+ PolicyVersion entity = new PolicyVersion();
+ entity.setPolicyName(path);
+ entity.setModifiedBy(userId);
+ controller.watchPolicyFunction(entity, path, "DeleteScope");
+ }
+ }
+ }
+ return success();
+ } catch (Exception e) {
+ LOGGER.error("delete", e);
+ return error(e.getMessage());
+ }
+ }
+
+ //Edit the Policy
+ private JSONObject editFile(JSONObject params) throws ServletException {
+ // get content
+ try {
+ PolicyController controller = new PolicyController();
+ String mode = params.getString("mode");
+ String path = params.getString("path");
+ LOGGER.debug("editFile path: {}"+ path);
+
+ String domain = path.substring(1, path.lastIndexOf("/"));
+ domain = domain.replace("/", ".");
+
+ path = path.substring(1);
+ path = path.replace("/", ".");
+ String dbCheckName = path;
+ if(dbCheckName.contains("Config_")){
+ dbCheckName = dbCheckName.replace(".Config_", ":Config_");
+ }else if(dbCheckName.contains("Action_")){
+ dbCheckName = dbCheckName.replace(".Action_", ":Action_");
+ }else if(dbCheckName.contains("Decision_")){
+ dbCheckName = dbCheckName.replace(".Decision_", ":Decision_");
+ }
+
+ String[] split = dbCheckName.split(":");
+ String query = "FROM PolicyEntity where policyName = '"+split[1]+"' and scope ='"+split[0]+"'";
+ List<Object> queryData = controller.getDataByQuery(query);
+ PolicyEntity entity = (PolicyEntity) queryData.get(0);
+ InputStream stream = new ByteArrayInputStream(entity.getPolicyData().getBytes(StandardCharsets.UTF_8));
+
+
+ Object policy = XACMLPolicyScanner.readPolicy(stream);
+ PolicyRestAdapter policyAdapter = new PolicyRestAdapter();
+ policyAdapter.setData(policy);
+
+ if("viewPolicy".equalsIgnoreCase(mode)){
+ policyAdapter.setReadOnly(true);
+ policyAdapter.setEditPolicy(false);
+ }else{
+ policyAdapter.setReadOnly(false);
+ policyAdapter.setEditPolicy(true);
+ }
+ policyAdapter.setDomain(domain);
+ policyAdapter.setDomainDir(domain);
+ policyAdapter.setPolicyData(policy);
+ String policyName = path.replace(".xml", "");
+ policyName = policyName.substring(0, policyName.lastIndexOf("."));
+ policyAdapter.setPolicyName(policyName.substring(policyName.lastIndexOf(".")+1));
+
+ PolicyAdapter setpolicyAdapter = PolicyAdapter.getInstance();
+ setpolicyAdapter.configure(policyAdapter,entity);
+
+ policyAdapter.setParentPath(null);
+ ObjectMapper mapper = new ObjectMapper();
+ String json = mapper.writeValueAsString(policyAdapter);
+ JsonNode jsonNode = mapper.readTree(json);
+
+ return new JSONObject().put(RESULT, jsonNode);
+ } catch (Exception e) {
+ LOGGER.error("editFile", e);
+ return error(e.getMessage());
+ }
+ }
+
+ //Add Scopes
+ private JSONObject addFolder(JSONObject params, HttpServletRequest request) throws ServletException {
+ PolicyController controller = new PolicyController();
+ String name = "";
+ try {
+ String userId = UserUtils.getUserSession(request).getOrgUserId();
+ String path = params.getString("path");
+ try{
+ if(params.has("subScopename")){
+ if(!params.getString("subScopename").equals("")){
+ name = params.getString("path").replace("/", File.separator) + File.separator +params.getString("subScopename");
+ }
+ }else{
+ name = params.getString("name");
+ }
+ }catch(Exception e){
+ name = params.getString("name");
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Exception Occured While Adding Scope"+e);
+ }
+ String validateName;
+ if(name.contains(File.separator)){
+ validateName = name.substring(name.lastIndexOf(File.separator)+1);
+ }else{
+ validateName = name;
+ }
+ if(!name.isEmpty()){
+ String validate = PolicyUtils.emptyPolicyValidator(validateName);
+ if(!validate.contains("success")){
+ return error(validate);
+ }
+ }
+ LOGGER.debug("addFolder path: {} name: {}" + path +name);
+ if(!name.equals("")){
+ PolicyEditorScopes entity = (PolicyEditorScopes) controller.getEntityItem(PolicyEditorScopes.class, "scopeName", name);
+ if(entity == null){
+ UserInfo userInfo = new UserInfo();
+ userInfo.setUserLoginId(userId);
+ PolicyEditorScopes newScope = new PolicyEditorScopes();
+ String scopeName = null;
+ if(name.startsWith(File.separator)){
+ scopeName = name.substring(1);
+ }else{
+ scopeName = name;
+ }
+ newScope.setScopeName(scopeName);
+ newScope.setUserCreatedBy(userInfo);
+ newScope.setUserModifiedBy(userInfo);
+ controller.saveData(newScope);
+ }else{
+ return error("Scope Already Exists");
+ }
+ }
+ return success();
+ } catch (Exception e) {
+ LOGGER.error("addFolder", e);
+ return error(e.getMessage());
+ }
+ }
+
+ //Return Error Object
+ private JSONObject error(String msg) throws ServletException {
+ try {
+ JSONObject result = new JSONObject();
+ result.put("success", false);
+ result.put("error", msg);
+ return new JSONObject().put(RESULT, result);
+ } catch (JSONException e) {
+ throw new ServletException(e);
+ }
+ }
+
+ //Return Success Object
+ private JSONObject success() throws ServletException {
+ try {
+ JSONObject result = new JSONObject();
+ result.put("success", true);
+ result.put("error", (Object) null);
+ return new JSONObject().put(RESULT, result);
+ } catch (JSONException e) {
+ throw new ServletException(e);
+ }
+ }
+}
diff --git a/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyNotificationMail.java b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyNotificationMail.java
new file mode 100644
index 000000000..3aee634fd
--- /dev/null
+++ b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyNotificationMail.java
@@ -0,0 +1,166 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * 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.admin;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.openecomp.policy.controller.PolicyController;
+import org.openecomp.policy.rest.dao.CommonClassDao;
+import org.openecomp.policy.rest.jpa.PolicyVersion;
+import org.openecomp.policy.rest.jpa.WatchPolicyNotificationTable;
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import org.springframework.beans.factory.annotation.Configurable;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.mail.javamail.MimeMessageHelper;
+
+@Configurable
+public class PolicyNotificationMail{
+ private static Logger LOGGER = FlexLogger.getLogger(PolicyNotificationMail.class);
+
+ @Bean
+ public JavaMailSenderImpl javaMailSenderImpl(){
+ JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
+ mailSender.setHost(PolicyController.smtpHost);
+ mailSender.setPort(Integer.parseInt(PolicyController.smtpPort));
+ mailSender.setUsername(PolicyController.smtpUsername);
+ mailSender.setPassword(PolicyController.smtpPassword);
+ Properties prop = mailSender.getJavaMailProperties();
+ prop.put("mail.transport.protocol", "smtp");
+ prop.put("mail.smtp.auth", "true");
+ prop.put("mail.smtp.starttls.enable", "true");
+ prop.put("mail.debug", "true");
+ return mailSender;
+ }
+
+ @SuppressWarnings("resource")
+ public void sendMail(PolicyVersion entityItem, String policyName, String mode, CommonClassDao policyNotificationDao) throws MessagingException {
+ String from = PolicyController.smtpUsername;
+ String to = "";
+ String subject = "";
+ String message = "";
+ DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+ Date date = new Date();
+ if(mode.equalsIgnoreCase("EditPolicy")){
+ subject = "Policy has been Updated : "+entityItem.getPolicyName();
+ message = "The Policy Which you are watching in " + PolicyController.smtpApplicationName + " has been Updated" + '\n' + '\n' + '\n'+ "Scope + Policy Name : " + policyName + '\n' + "Active Version : " +entityItem.getActiveVersion()
+ + '\n' + '\n' + "Modified By : " +entityItem.getModifiedBy() + '\n' + "Modified Time : " +dateFormat.format(date) + '\n' + '\n' + '\n' + '\n' + "Policy Notification System (please don't respond to this email)";
+ }
+ if(mode.equalsIgnoreCase("Rename")){
+ subject = "Policy has been Renamed : "+entityItem.getPolicyName();
+ message = "The Policy Which you are watching in " + PolicyController.smtpApplicationName + " has been Renamed" + '\n' + '\n' + '\n'+ "Scope + Policy Name : " + policyName + '\n' + "Active Version : " +entityItem.getActiveVersion()
+ + '\n' + '\n' + "Renamed By : " +entityItem.getModifiedBy() + '\n' + "Renamed Time : " +dateFormat.format(date) + '\n' + '\n' + '\n' + '\n' + "Policy Notification System (please don't respond to this email)";
+ }
+ if(mode.equalsIgnoreCase("DeleteAll")){
+ subject = "Policy has been Deleted : "+entityItem.getPolicyName();
+ message = "The Policy Which you are watching in " + PolicyController.smtpApplicationName + " has been Deleted with All Versions" + '\n' + '\n' + '\n'+ "Scope + Policy Name : " + policyName + '\n'
+ + '\n' + '\n' + "Deleted By : " +entityItem.getModifiedBy() + '\n' + "Deleted Time : " +dateFormat.format(date) + '\n' + '\n' + '\n' + '\n' + "Policy Notification System (please don't respond to this email)";
+ }
+ if(mode.equalsIgnoreCase("DeleteOne")){
+ subject = "Policy has been Deleted : "+entityItem.getPolicyName();
+ message = "The Policy Which you are watching in " + PolicyController.smtpApplicationName + " has been Deleted" + '\n' + '\n' + '\n'+ "Scope + Policy Name : " + policyName + '\n' +"Policy Version : " +entityItem.getActiveVersion()
+ + '\n' + '\n' + "Deleted By : " +entityItem.getModifiedBy() + '\n' + "Deleted Time : " +dateFormat.format(date) + '\n' + '\n' + '\n' + '\n' + "Policy Notification System (please don't respond to this email)";
+ }
+ if(mode.equalsIgnoreCase("DeleteScope")){
+ subject = "Scope has been Deleted : "+entityItem.getPolicyName();
+ message = "The Scope Which you are watching in " + PolicyController.smtpApplicationName + " has been Deleted" + '\n' + '\n' + '\n'+ "Scope + Scope Name : " + policyName + '\n'
+ + '\n' + '\n' + "Deleted By : " +entityItem.getModifiedBy() + '\n' + "Deleted Time : " +dateFormat.format(date) + '\n' + '\n' + '\n' + '\n' + "Policy Notification System (please don't respond to this email)";
+ }
+ if(mode.equalsIgnoreCase("SwitchVersion")){
+ subject = "Policy has been SwitchedVersion : "+entityItem.getPolicyName();
+ message = "The Policy Which you are watching in " + PolicyController.smtpApplicationName + " has been SwitchedVersion" + '\n' + '\n' + '\n'+ "Scope + Policy Name : " + policyName + '\n' + "Active Version : " +entityItem.getActiveVersion()
+ + '\n' + '\n' + "Switched By : " +entityItem.getModifiedBy() + '\n' + "Switched Time : " +dateFormat.format(date) + '\n' + '\n' + '\n' + '\n' + "Policy Notification System (please don't respond to this email)";
+ }
+ if(mode.equalsIgnoreCase("Move")){
+ subject = "Policy has been Moved to Other Scope : "+entityItem.getPolicyName();
+ message = "The Policy Which you are watching in " + PolicyController.smtpApplicationName + " has been Moved to Other Scope" + '\n' + '\n' + '\n'+ "Scope + Policy Name : " + policyName + '\n' + "Active Version : " +entityItem.getActiveVersion()
+ + '\n' + '\n' + "Moved By : " +entityItem.getModifiedBy() + '\n' + "Moved Time : " +dateFormat.format(date) + '\n' + '\n' + '\n' + '\n' + "Policy Notification System (please don't respond to this email)";
+ }
+ String policyFileName = entityItem.getPolicyName();
+ String checkPolicyName = policyFileName;
+ if(policyFileName.contains("/")){
+ policyFileName = policyFileName.substring(0, policyFileName.indexOf("/"));
+ policyFileName = policyFileName.replace("/", File.separator);
+ }
+ if(policyFileName.contains("\\")){
+ policyFileName = policyFileName.substring(0, policyFileName.indexOf("\\"));
+ policyFileName = policyFileName.replace("\\", "\\\\");
+ }
+
+ String query = "from WatchPolicyNotificationTable where policyName like'" +policyFileName+"%'";
+ boolean sendFlag = false;
+ List<Object> watchList = policyNotificationDao.getDataByQuery(query);
+ if(watchList != null){
+ if(watchList.size() > 0){
+ for(Object watch : watchList){
+ WatchPolicyNotificationTable list = (WatchPolicyNotificationTable) watch;
+ String watchPolicyName = list.getPolicyName();
+ if(watchPolicyName.contains("Config_")){
+ if(watchPolicyName.equals(checkPolicyName)){
+ sendFlag = true;
+ }
+ }else if(watchPolicyName.contains("Action_")){
+ if(watchPolicyName.equals(checkPolicyName)){
+ sendFlag = true;
+ }
+ }else if(watchPolicyName.contains("Decision_")){
+ if(watchPolicyName.equals(checkPolicyName)){
+ sendFlag = true;
+ }
+ }else{
+ sendFlag = true;
+ }
+ if(sendFlag){
+ to = list.getLoginIds()+"@"+PolicyController.smtpEmailExtension;
+ to = to.trim();
+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
+ ctx.register(PolicyNotificationMail.class);
+ ctx.refresh();
+ JavaMailSenderImpl mailSender = ctx.getBean(JavaMailSenderImpl.class);
+ MimeMessage mimeMessage = mailSender.createMimeMessage();
+ MimeMessageHelper mailMsg = new MimeMessageHelper(mimeMessage);
+ try {
+ mailMsg.setFrom(new InternetAddress(from, "Policy Notification System"));
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Exception Occured in Policy Notification" +e);
+ }
+ mailMsg.setTo(to);
+ mailMsg.setSubject(subject);
+ mailMsg.setText(message);
+ mailSender.send(mimeMessage);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyRestController.java b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyRestController.java
new file mode 100644
index 000000000..2a1129cf6
--- /dev/null
+++ b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyRestController.java
@@ -0,0 +1,379 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * 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.admin;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.io.IOUtils;
+import org.json.JSONObject;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.openecomp.policy.controller.CreateClosedLoopFaultController;
+import org.openecomp.policy.controller.CreateDcaeMicroServiceController;
+import org.openecomp.policy.controller.CreateFirewallController;
+import org.openecomp.policy.controller.PolicyController;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.rest.adapter.PolicyRestAdapter;
+import org.openecomp.policy.rest.dao.CommonClassDao;
+import org.openecomp.policy.rest.jpa.PolicyVersion;
+import org.openecomp.policy.utils.PolicyUtils;
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import org.openecomp.portalsdk.core.controller.RestrictedBaseController;
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.att.research.xacml.util.XACMLProperties;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+@RestController
+@RequestMapping("/")
+public class PolicyRestController extends RestrictedBaseController{
+
+ private static final Logger LOGGER = FlexLogger.getLogger(PolicyRestController.class);
+
+ private String boundary = null;
+
+ @Autowired
+ CommonClassDao commonClassDao;
+
+ @RequestMapping(value={"/policycreation/save_policy"}, method={RequestMethod.POST})
+ public ModelAndView policyCreationController(HttpServletRequest request, HttpServletResponse response) throws Exception{
+
+ String userId = UserUtils.getUserSession(request).getOrgUserId();
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ JsonNode root = mapper.readTree(request.getReader());
+
+ PolicyRestAdapter policyData = (PolicyRestAdapter)mapper.readValue(root.get("policyData").get("policy").toString(), PolicyRestAdapter.class);
+ policyData.setDomainDir(root.get("policyData").get("model").get("name").toString().replace("\"", ""));
+ if(root.get("policyData").get("model").get("type").toString().replace("\"", "").equals("file")){
+ policyData.isEditPolicy = true;
+ }
+ if(policyData.getConfigPolicyType() != null){
+ if(policyData.getConfigPolicyType().equalsIgnoreCase("ClosedLoop_Fault")){
+ CreateClosedLoopFaultController faultController = new CreateClosedLoopFaultController();
+ policyData = faultController.setDataToPolicyRestAdapter(policyData, root);
+ }else if(policyData.getConfigPolicyType().equalsIgnoreCase("Firewall Config")){
+ CreateFirewallController fwController = new CreateFirewallController();
+ policyData = fwController.setDataToPolicyRestAdapter(policyData);
+ }else if(policyData.getConfigPolicyType().equalsIgnoreCase("Micro Service")){
+ CreateDcaeMicroServiceController msController = new CreateDcaeMicroServiceController();
+ policyData = msController.setDataToPolicyRestAdapter(policyData, root);
+ }
+ }
+
+ policyData.setUserId(userId);
+
+ if(root.get("policyData").get("model").get("path").size() != 0){
+ String dirName = "";
+ for(int i = 0; i < root.get("policyData").get("model").get("path").size(); i++){
+ dirName = dirName.replace("\"", "") + root.get("policyData").get("model").get("path").get(i).toString().replace("\"", "") + File.separator;
+ }
+ if(policyData.isEditPolicy){
+ policyData.setDomainDir(dirName.substring(0, dirName.lastIndexOf(File.separator)));
+ }else{
+ policyData.setDomainDir(dirName + root.get("policyData").get("model").get("name").toString().replace("\"", ""));
+ }
+ }else{
+ policyData.setDomainDir(root.get("policyData").get("model").get("name").toString().replace("\"", ""));
+ }
+ String result;
+ String body = PolicyUtils.objectToJsonString(policyData);
+ String uri = request.getRequestURI();
+ ResponseEntity<?> responseEntity = sendToPAP(body, uri, request, HttpMethod.POST);
+ if(responseEntity.getBody().equals(HttpServletResponse.SC_CONFLICT)){
+ result = "PolicyExists";
+ }else{
+ result = responseEntity.getBody().toString();
+ String policyName = responseEntity.getHeaders().get("policyName").get(0).toString();
+ if(policyData.isEditPolicy){
+ if(result.equalsIgnoreCase("success")){
+ PolicyNotificationMail email = new PolicyNotificationMail();
+ String mode = "EditPolicy";
+ String watchPolicyName = policyName.replace(".xml", "");
+ String version = watchPolicyName.substring(watchPolicyName.lastIndexOf(".")+1);
+ watchPolicyName = watchPolicyName.substring(0, watchPolicyName.lastIndexOf(".")).replace(".", File.separator);
+ String policyVersionName = watchPolicyName.replace(".", File.separator);
+ watchPolicyName = watchPolicyName + "." + version + ".xml";
+ PolicyVersion entityItem = new PolicyVersion();
+ entityItem.setPolicyName(policyVersionName);
+ entityItem.setActiveVersion(Integer.parseInt(version));
+ entityItem.setModifiedBy(userId);
+ email.sendMail(entityItem, watchPolicyName, mode, commonClassDao);
+ }
+ }
+ }
+
+
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("application / json");
+ request.setCharacterEncoding("UTF-8");
+
+ PrintWriter out = response.getWriter();
+ String responseString = mapper.writeValueAsString(result);
+ JSONObject j = new JSONObject("{policyData: " + responseString + "}");
+ out.write(j.toString());
+ return null;
+
+ }
+
+
+ private ResponseEntity<?> sendToPAP(String body, String requestURI, HttpServletRequest request, HttpMethod method) throws Exception{
+ String papUrl = PolicyController.papUrl;
+ String papID = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_USERID);
+ String papPass = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_PASS);
+ LOGGER.info("User Id is " + papID + "Pass is: " + papPass);
+
+ Base64.Encoder encoder = Base64.getEncoder();
+ String encoding = encoder.encodeToString((papID+":"+papPass).getBytes(StandardCharsets.UTF_8));
+ HttpHeaders headers = new HttpHeaders();
+ headers.set("Authorization", "Basic " + encoding);
+ headers.set("Content-Type", "application/json");
+
+ RestTemplate restTemplate = new RestTemplate();
+ HttpEntity<?> requestEntity = new HttpEntity<>(body, headers);
+ ResponseEntity<?> result = null;
+ HttpClientErrorException exception = null;
+
+ try{
+ result = ((ResponseEntity<?>) restTemplate.exchange(papUrl + requestURI, method, requestEntity, String.class));
+ }catch(Exception e){
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while connecting to " + papUrl, e);
+ exception = new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage());
+ if(e.getMessage().equals("409 Conflict")){
+ return (ResponseEntity<?>) ResponseEntity.ok(HttpServletResponse.SC_CONFLICT);
+ }
+ }
+ if(exception != null && exception.getStatusCode()!=null){
+ if(exception.getStatusCode().equals(HttpStatus.UNAUTHORIZED)){
+ String message = XACMLErrorConstants.ERROR_PERMISSIONS +":"+exception.getStatusCode()+":" + "ERROR_AUTH_GET_PERM" ;
+ LOGGER.error(message);
+ throw new Exception(message, exception);
+ }
+ if(exception.getStatusCode().equals(HttpStatus.BAD_REQUEST)){
+ String message = XACMLErrorConstants.ERROR_DATA_ISSUE + ":"+exception.getStatusCode()+":" + exception.getResponseBodyAsString();
+ LOGGER.error(message);
+ throw new Exception(message, exception);
+ }
+ if(exception.getStatusCode().equals(HttpStatus.NOT_FOUND)){
+ String message = XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while connecting to " + papUrl + exception;
+ LOGGER.error(message);
+ throw new Exception(message, exception);
+ }
+ String message = XACMLErrorConstants.ERROR_PROCESS_FLOW + ":"+exception.getStatusCode()+":" + exception.getResponseBodyAsString();
+ LOGGER.error(message);
+ throw new Exception(message, exception);
+ }
+ return result;
+ }
+
+ private String callPAP(HttpServletRequest request, HttpServletResponse response, String method, String uri){
+ String papUrl = PolicyController.papUrl;
+ String papID = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_USERID);
+ String papPass = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_PASS);
+ LOGGER.info("User Id is " + papID + "Pass is: " + papPass);
+
+ Base64.Encoder encoder = Base64.getEncoder();
+ String encoding = encoder.encodeToString((papID+":"+papPass).getBytes(StandardCharsets.UTF_8));
+ HttpHeaders headers = new HttpHeaders();
+ headers.set("Authorization", "Basic " + encoding);
+ headers.set("Content-Type", "application/json");
+
+
+ HttpURLConnection connection = null;
+ List<FileItem> items;
+ FileItem item = null;
+ File file = null;
+ if(uri.contains("import_dictionary")){
+ try {
+ items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
+ item = items.get(0);
+ file = new File(item.getName());
+ String newFile = file.toString();
+ uri = uri +"&dictionaryName="+newFile;
+ } catch (Exception e2) {
+ e2.printStackTrace();
+ }
+ }
+
+ try {
+ URL url = new URL(papUrl + uri);
+ connection = (HttpURLConnection)url.openConnection();
+ connection.setRequestMethod(method);
+ connection.setUseCaches(false);
+ connection.setInstanceFollowRedirects(false);
+ connection.setRequestProperty("Authorization", "Basic " + encoding);
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+
+ if(!uri.contains("searchPolicy")){
+ if(!(uri.endsWith("set_BRMSParamData") || uri.contains("import_dictionary"))){
+ connection.setRequestProperty("Content-Type","application/json");
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ JsonNode root = null;
+ try {
+ root = mapper.readTree(request.getReader());
+ }catch (Exception e1) {
+ e1.printStackTrace();
+ }
+
+ ObjectMapper mapper1 = new ObjectMapper();
+ mapper1.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
+
+ Object obj = mapper1.treeToValue(root, Object.class);
+ String json = mapper1.writeValueAsString(obj);
+
+ Object content = new ByteArrayInputStream(json.getBytes());
+
+ if (content != null && (content instanceof InputStream)) {
+ // send current configuration
+ try (OutputStream os = connection.getOutputStream()) {
+ int count = IOUtils.copy((InputStream) content, os);
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("copied to output, bytes=" + count);
+ }
+ }
+ }
+ }else{
+ if(uri.endsWith("set_BRMSParamData")){
+ connection.setRequestProperty("Content-Type","application/json");
+ try (OutputStream os = connection.getOutputStream()) {
+ IOUtils.copy((InputStream) request.getInputStream(), os);
+ }
+ }else{
+ boundary = "===" + System.currentTimeMillis() + "===";
+ connection.setRequestProperty("Content-Type","multipart/form-data; boundary=" + boundary);
+ try (OutputStream os = connection.getOutputStream()) {
+ IOUtils.copy((InputStream) item.getInputStream(), os);
+ }
+ }
+ }
+ }
+
+ connection.connect();
+
+ int responseCode = connection.getResponseCode();
+ if(responseCode == 200){
+ // get the response content into a String
+ String responseJson = null;
+ // read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
+ java.util.Scanner scanner = new java.util.Scanner(connection.getInputStream());
+ scanner.useDelimiter("\\A");
+ responseJson = scanner.hasNext() ? scanner.next() : "";
+ scanner.close();
+ LOGGER.info("JSON response from PAP: " + responseJson);
+ return responseJson;
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }finally{
+ if(file != null){
+ if(file.exists()){
+ file.delete();
+ }
+ }
+ if (connection != null) {
+ try {
+ // For some reason trying to get the inputStream from the connection
+ // throws an exception rather than returning null when the InputStream does not exist.
+ InputStream is = null;
+ try {
+ is = connection.getInputStream();
+ } catch (Exception e1) {
+ // ignore this
+ }
+ if (is != null) {
+ is.close();
+ }
+
+ } catch (IOException ex) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to close connection: " + ex, ex);
+ }
+ connection.disconnect();
+ }
+ }
+ return null;
+ }
+
+ @RequestMapping(value={"/getDictionary/*"}, method={RequestMethod.GET})
+ public void getDictionaryController(HttpServletRequest request, HttpServletResponse response) throws Exception{
+ String uri = request.getRequestURI().replace("/getDictionary", "");
+ String body = sendToPAP(null, uri, request, HttpMethod.GET).getBody().toString();
+ response.getWriter().write(body);
+ }
+
+ @RequestMapping(value={"/saveDictionary/*/*"}, method={RequestMethod.POST})
+ public ModelAndView saveDictionaryController(HttpServletRequest request, HttpServletResponse response) throws Exception{
+ String uri = request.getRequestURI().replace("/saveDictionary", "");
+ if(uri.contains("import_dictionary")){
+ String userId = UserUtils.getUserSession(request).getOrgUserId();
+ uri = uri+ "?userId=" +userId;
+ }
+ String body = callPAP(request, response, "POST", uri.replaceFirst("/", "").trim());
+ response.getWriter().write(body);
+ return null;
+ }
+
+ @RequestMapping(value={"/deleteDictionary/*/*"}, method={RequestMethod.POST})
+ public ModelAndView deletetDictionaryController(HttpServletRequest request, HttpServletResponse response) throws Exception{
+ String uri = request.getRequestURI().replace("/deleteDictionary", "");
+ String body = callPAP(request, response, "POST", uri.replaceFirst("/", "").trim());
+ response.getWriter().write(body);
+ return null;
+ }
+
+ public void deleteElasticData(String fileName){
+ String uri = "searchPolicy?action=delete&policyName='"+fileName+"'";
+ callPAP(null, null, "POST", uri.trim());
+ }
+
+} \ No newline at end of file
diff --git a/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyUserInfoController.java b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyUserInfoController.java
new file mode 100644
index 000000000..97d26a4ee
--- /dev/null
+++ b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/PolicyUserInfoController.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * 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.admin;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.openecomp.portalsdk.core.controller.RestrictedBaseController;
+import org.openecomp.portalsdk.core.web.support.JsonMessage;
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+@RequestMapping("/")
+public class PolicyUserInfoController extends RestrictedBaseController{
+
+ @RequestMapping(value="/get_PolicyUserInfo", method = RequestMethod.GET)
+ private void getPolicyUserInfo(HttpServletRequest request, HttpServletResponse response){
+ JsonMessage msg = null;
+ try {
+ String userId = UserUtils.getUserSession(request).getOrgUserId();
+ Map<String, Object> model = new HashMap<String, Object>();
+ ObjectMapper mapper = new ObjectMapper();
+ model.put("userid", userId);
+ msg = new JsonMessage(mapper.writeValueAsString(model));
+ JSONObject j = new JSONObject(msg);
+ response.getWriter().write(j.toString());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/RESTfulPAPEngine.java b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/RESTfulPAPEngine.java
new file mode 100644
index 000000000..d9fe9fa11
--- /dev/null
+++ b/POLICY-SDK-APP/src/main/java/org/openecomp/policy/admin/RESTfulPAPEngine.java
@@ -0,0 +1,528 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * 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.admin;
+
+
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.io.IOUtils;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.rest.adapter.PolicyRestAdapter;
+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 org.openecomp.policy.xacml.std.pap.StdPAPPolicy;
+import org.openecomp.policy.xacml.std.pap.StdPDP;
+import org.openecomp.policy.xacml.std.pap.StdPDPGroup;
+import org.openecomp.policy.xacml.std.pap.StdPDPItemSetChangeNotifier;
+import org.openecomp.policy.xacml.std.pap.StdPDPPolicy;
+import org.openecomp.policy.xacml.std.pap.StdPDPStatus;
+import com.att.research.xacml.api.pap.PAPException;
+import com.att.research.xacml.api.pap.PDPPolicy;
+import com.att.research.xacml.api.pap.PDPStatus;
+import com.att.research.xacml.util.XACMLProperties;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.CollectionType;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+/**
+ * Implementation of the PAPEngine interface that communicates with a PAP engine in a remote servlet
+ * through a RESTful interface
+ *
+ *
+ */
+public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAPPolicyEngine {
+ private static final Logger LOGGER = FlexLogger.getLogger(RESTfulPAPEngine.class);
+
+ //
+ // URL of the PAP Servlet that this Admin Console talks to
+ //
+ private String papServletURLString;
+
+ /**
+ * Set up link with PAP Servlet and get our initial set of Groups
+ * @throws Exception
+ */
+ public RESTfulPAPEngine (String myURLString) throws PAPException, IOException {
+ //
+ // Get our URL to the PAP servlet
+ //
+ this.papServletURLString = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_URL);
+ if (this.papServletURLString == null || this.papServletURLString.length() == 0) {
+ String message = "The property 'POLICYENGINE_ADMIN_ACTIVE' was not set during installation. Admin Console cannot call PAP.";
+ LOGGER.error(message);
+ throw new PAPException(message);
+ }
+
+ //
+ // register this Admin Console with the PAP Servlet to get updates
+ //
+ Object newURL = sendToPAP("PUT", null, null, null, "adminConsoleURL=" + myURLString);
+ if (newURL != null) {
+ // assume this was a re-direct and try again
+ LOGGER.warn("Redirecting to '" + newURL + "'");
+ this.papServletURLString = (String)newURL;
+ newURL = sendToPAP("PUT", null, null, null, "adminConsoleURL=" + myURLString);
+ if (newURL != null) {
+ LOGGER.error("Failed to redirect to " + this.papServletURLString);
+ throw new PAPException("Failed to register with PAP");
+ }
+ }
+ }
+
+
+ //
+ // High-level commands used by the Admin Console code through the PAPEngine Interface
+ //
+
+ @Override
+ public EcompPDPGroup getDefaultGroup() throws PAPException {
+ EcompPDPGroup newGroup = (EcompPDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, "groupId=", "default=");
+ return newGroup;
+ }
+
+ @Override
+ public void SetDefaultGroup(EcompPDPGroup group) throws PAPException {
+ sendToPAP("POST", null, null, null, "groupId=" + group.getId(), "default=true");
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Set<EcompPDPGroup> getEcompPDPGroups() throws PAPException {
+ Set<EcompPDPGroup> newGroupSet;
+ newGroupSet = (Set<EcompPDPGroup>) this.sendToPAP("GET", null, Set.class, StdPDPGroup.class, "groupId=");
+ return Collections.unmodifiableSet(newGroupSet);
+ }
+
+
+ @Override
+ public EcompPDPGroup getGroup(String id) throws PAPException {
+ EcompPDPGroup newGroup = (EcompPDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, "groupId=" + id);
+ return newGroup;
+ }
+
+ @Override
+ public void newGroup(String name, String description)
+ throws PAPException, NullPointerException {
+ String escapedName = null;
+ String escapedDescription = null;
+ try {
+ escapedName = URLEncoder.encode(name, "UTF-8");
+ escapedDescription = URLEncoder.encode(description, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new PAPException("Unable to send name or description to PAP: " + e.getMessage());
+ }
+
+ this.sendToPAP("POST", null, null, null, "groupId=", "groupName="+escapedName, "groupDescription=" + escapedDescription);
+ }
+
+
+ /**
+ * Update the configuration on the PAP for a single Group.
+ *
+ * @param group
+ * @return
+ * @throws PAPException
+ */
+ public void updateGroup(EcompPDPGroup group) throws PAPException {
+
+ try {
+
+ //
+ // ASSUME that all of the policies mentioned in this group are already located in the correct directory on the PAP!
+ //
+ // Whenever a Policy is added to the group, that file must be automatically copied to the PAP from the Workspace.
+ //
+
+
+ // Copy all policies from the local machine's workspace to the PAP's PDPGroup directory.
+ // This is not efficient since most of the policies will already exist there.
+ // However, the policy files are (probably!) not too huge, and this is a good way to ensure that any corrupted files on the PAP get refreshed.
+
+
+ // now update the group object on the PAP
+
+ sendToPAP("PUT", group, null, null, "groupId=" + group.getId());
+ } catch (Exception e) {
+ String message = "Unable to PUT policy '" + group.getId() + "', e:" + e;
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
+ throw new PAPException(message);
+ }
+ }
+
+
+ @Override
+ public void removeGroup(EcompPDPGroup group, EcompPDPGroup newGroup)
+ throws PAPException, NullPointerException {
+ String moveToGroupString = null;
+ if (newGroup != null) {
+ moveToGroupString = "movePDPsToGroupId=" + newGroup.getId();
+ }
+ sendToPAP("DELETE", null, null, null, "groupId=" + group.getId(), moveToGroupString);
+ }
+
+ @Override
+ public EcompPDPGroup getPDPGroup(EcompPDP pdp) throws PAPException {
+ return getPDPGroup(pdp.getId());
+ }
+
+
+ public EcompPDPGroup getPDPGroup(String pdpId) throws PAPException {
+ EcompPDPGroup newGroup = (EcompPDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, "groupId=", "pdpId=" + pdpId, "getPDPGroup=");
+ return newGroup;
+ }
+
+ @Override
+ public EcompPDP getPDP(String pdpId) throws PAPException {
+ EcompPDP newPDP = (EcompPDP)sendToPAP("GET", null, null, StdPDP.class, "groupId=", "pdpId=" + pdpId);
+ return newPDP;
+ }
+
+ @Override
+ public void newPDP(String id, EcompPDPGroup group, String name, String description, int jmxport) throws PAPException,
+ NullPointerException {
+ StdPDP newPDP = new StdPDP(id, name, description, jmxport);
+ sendToPAP("PUT", newPDP, null, null, "groupId=" + group.getId(), "pdpId=" + id);
+ return;
+ }
+
+ @Override
+ public void movePDP(EcompPDP pdp, EcompPDPGroup newGroup) throws PAPException {
+ sendToPAP("POST", null, null, null, "groupId=" + newGroup.getId(), "pdpId=" + pdp.getId());
+ return;
+ }
+
+ @Override
+ public void updatePDP(EcompPDP pdp) throws PAPException {
+ EcompPDPGroup group = getPDPGroup(pdp);
+ sendToPAP("PUT", pdp, null, null, "groupId=" + group.getId(), "pdpId=" + pdp.getId());
+ return;
+ }
+
+ @Override
+ public void removePDP(EcompPDP pdp) throws PAPException {
+ EcompPDPGroup group = getPDPGroup(pdp);
+ sendToPAP("DELETE", null, null, null, "groupId=" + group.getId(), "pdpId=" + pdp.getId());
+ return;
+ }
+
+ //Validate the Policy Data
+ public boolean validatePolicyRequest(PolicyRestAdapter policyAdapter, String policyType) throws PAPException {
+ Boolean isValidData = false;
+ StdPAPPolicy newPAPPolicy = new StdPAPPolicy(policyAdapter.getPolicyName(), policyAdapter.getConfigBodyData(), policyAdapter.getConfigType(), "Base");
+
+ //send JSON object to PAP
+ isValidData = (Boolean) sendToPAP("PUT", newPAPPolicy, null, null, "operation=validate", "apiflag=admin", "policyType=" + policyType);
+ return isValidData;
+ }
+
+
+
+ @Override
+ public void publishPolicy(String id, String name, boolean isRoot,
+ InputStream policy, EcompPDPGroup group) throws PAPException {
+
+
+ // copy the (one) file into the target directory on the PAP servlet
+ copyFile(id, group, policy);
+
+ // adjust the local copy of the group to include the new policy
+ PDPPolicy pdpPolicy = new StdPDPPolicy(id, isRoot, name);
+ group.getPolicies().add(pdpPolicy);
+
+ // tell the PAP servlet to include the policy in the configuration
+ updateGroup(group);
+
+ return;
+ }
+
+ /**
+ * Copy a single Policy file from the input stream to the PAP Servlet.
+ * Either this works (silently) or it throws an exception.
+ *
+ * @param policyId
+ * @param group
+ * @param policy
+ * @return
+ * @throws PAPException
+ */
+ public void copyFile(String policyId, EcompPDPGroup group, InputStream policy) throws PAPException {
+ // send the policy file to the PAP Servlet
+ try {
+ sendToPAP("POST", policy, null, null, "groupId=" + group.getId(), "policyId="+policyId);
+ } catch (Exception e) {
+ String message = "Unable to PUT policy '" + policyId + "', e:" + e;
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
+ throw new PAPException(message);
+ }
+ }
+
+
+ @Override
+ public void copyPolicy(PDPPolicy policy, EcompPDPGroup group) throws PAPException {
+ if (policy == null || group == null) {
+ throw new PAPException("Null input policy="+policy+" group="+group);
+ }
+ try (InputStream is = new FileInputStream(new File(policy.getLocation())) ) {
+ copyFile(policy.getId(), group, is );
+ } catch (Exception e) {
+ String message = "Unable to PUT policy '" + policy.getId() + "', e:" + e;
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
+ throw new PAPException(message);
+ }
+ }
+
+ @Override
+ public void removePolicy(PDPPolicy policy, EcompPDPGroup group) throws PAPException {
+ throw new PAPException("NOT IMPLEMENTED");
+
+ }
+
+
+ /**
+ * Special operation - Similar to the normal PAP operations but this one contacts the PDP directly
+ * to get detailed status info.
+ *
+ * @param pdp
+ * @return
+ * @throws PAPException
+ */
+
+ public PDPStatus getStatus(EcompPDP pdp) throws PAPException {
+ StdPDPStatus status = (StdPDPStatus)sendToPAP("GET", pdp, null, StdPDPStatus.class);
+ return status;
+ }
+
+
+ //
+ // Internal Operations called by the PAPEngine Interface methods
+ //
+
+ /**
+ * Send a request to the PAP Servlet and get the response.
+ *
+ * The content is either an InputStream to be copied to the Request OutputStream
+ * OR it is an object that is to be encoded into JSON and pushed into the Request OutputStream.
+ *
+ * The Request parameters may be encoded in multiple "name=value" sets, or parameters may be combined by the caller.
+ *
+ * @param method
+ * @param content - EITHER an InputStream OR an Object to be encoded in JSON
+ * @param collectionTypeClass
+ * @param responseContentClass
+ * @param parameters
+ * @return
+ * @throws Exception
+ */
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private Object sendToPAP(String method, Object content, Class collectionTypeClass, Class responseContentClass, String... parameters ) throws PAPException {
+ HttpURLConnection connection = null;
+ String papID = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_USERID);
+ LOGGER.info("User Id is " + papID);
+ String papPass = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_PASS);
+ LOGGER.info("Pass is: " + papPass);
+ Base64.Encoder encoder = Base64.getEncoder();
+ String encoding = encoder.encodeToString((papID+":"+papPass).getBytes(StandardCharsets.UTF_8));
+ LOGGER.info("Encoding for the PAP is: " + encoding);
+ try {
+ String fullURL = papServletURLString;
+ if (parameters != null && parameters.length > 0) {
+ String queryString = "";
+ for (String p : parameters) {
+ queryString += "&" + p;
+ }
+ fullURL += "?" + queryString.substring(1);
+ }
+
+ // special case - Status (actually the detailed status) comes from the PDP directly, not the PAP
+ if (method.equals("GET") && (content instanceof EcompPDP) && responseContentClass == StdPDPStatus.class) {
+ // Adjust the url and properties appropriately
+ String pdpID =((EcompPDP)content).getId();
+ fullURL = pdpID + "?type=Status";
+ content = null;
+ if(CheckPDP.validateID(pdpID)){
+ encoding = CheckPDP.getEncoding(pdpID);
+ }
+ }
+
+
+ URL url = new URL(fullURL);
+
+ //
+ // Open up the connection
+ //
+ connection = (HttpURLConnection)url.openConnection();
+ //
+ // Setup our method and headers
+ //
+ connection.setRequestMethod(method);
+ 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.setRequestProperty("Authorization", "Basic " + encoding);
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+
+ if (content != null) {
+ if (content instanceof InputStream) {
+ try {
+ //
+ // Send our current policy configuration
+ //
+ try (OutputStream os = connection.getOutputStream()) {
+ int count = IOUtils.copy((InputStream)content, os);
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("copied to output, bytes="+count);
+ }
+ }
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to write content in '" + method + "'", e);
+ throw e;
+ }
+ } else {
+ // The content is an object to be encoded in JSON
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.writeValue(connection.getOutputStream(), content);
+ }
+ }
+ //
+ // Do the connect
+ //
+ connection.connect();
+ if (connection.getResponseCode() == 204) {
+ LOGGER.info("Success - no content.");
+ return null;
+ } else if (connection.getResponseCode() == 200) {
+ LOGGER.info("Success. We have a return object.");
+ String isValidData = connection.getHeaderField("isValidData");
+ String isSuccess = connection.getHeaderField("successMapKey");
+ Map<String, String> successMap = new HashMap<String, String>();
+ if (isValidData != null && isValidData.equalsIgnoreCase("true")){
+ LOGGER.info("Policy Data is valid.");
+ return true;
+ } else if (isValidData != null && isValidData.equalsIgnoreCase("false")) {
+ LOGGER.info("Policy Data is invalid.");
+ return false;
+ } else if (isSuccess != null && isSuccess.equalsIgnoreCase("success")) {
+ LOGGER.info("Policy Created Successfully!" );
+ String finalPolicyPath = connection.getHeaderField("finalPolicyPath");
+ successMap.put("success", finalPolicyPath);
+ return successMap;
+ } else if (isSuccess != null && isSuccess.equalsIgnoreCase("error")) {
+ LOGGER.info("There was an error while creating the policy!");
+ successMap.put("error", "error");
+ return successMap;
+ } else {
+ // get the response content into a String
+ String json = null;
+ // read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
+ java.util.Scanner scanner = new java.util.Scanner(connection.getInputStream());
+ scanner.useDelimiter("\\A");
+ json = scanner.hasNext() ? scanner.next() : "";
+ scanner.close();
+ LOGGER.info("JSON response from PAP: " + json);
+
+ // convert Object sent as JSON into local object
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+ if (collectionTypeClass != null) {
+ // collection of objects expected
+ final CollectionType javaType =
+ mapper.getTypeFactory().constructCollectionType(collectionTypeClass, responseContentClass);
+
+ Object objectFromJSON = mapper.readValue(json, javaType);
+ return objectFromJSON;
+ } else {
+ // single value object expected
+ Object objectFromJSON = mapper.readValue(json, responseContentClass);
+ return objectFromJSON;
+ }
+ }
+
+ } else if (connection.getResponseCode() >= 300 && connection.getResponseCode() <= 399) {
+ // redirection
+ String newURL = connection.getHeaderField("Location");
+ if (newURL == null) {
+ LOGGER.error("No Location header to redirect to when response code="+connection.getResponseCode());
+ throw new IOException("No redirect Location header when response code="+connection.getResponseCode());
+ }
+ int qIndex = newURL.indexOf("?");
+ if (qIndex > 0) {
+ newURL = newURL.substring(0, qIndex);
+ }
+ LOGGER.info("Redirect seen. Redirecting " + fullURL + " to " + newURL);
+ return newURL;
+ } else {
+ LOGGER.warn("Unexpected response code: " + connection.getResponseCode() + " message: " + connection.getResponseMessage());
+ throw new IOException("Server Response: " + connection.getResponseCode() + ": " + connection.getResponseMessage());
+ }
+
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "HTTP Request/Response to PAP: " + e,e);
+ throw new PAPException("Request/Response threw :" + e);
+ } finally {
+ // cleanup the connection
+ if (connection != null) {
+ try {
+ // For some reason trying to get the inputStream from the connection
+ // throws an exception rather than returning null when the InputStream does not exist.
+ InputStream is = null;
+ try {
+ is = connection.getInputStream();
+ } catch (Exception e1) {
+ // ignore this
+ }
+ if (is != null) {
+ is.close();
+ }
+
+ } catch (IOException ex) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to close connection: " + ex, ex);
+ }
+ connection.disconnect();
+ }
+ }
+ }
+}