aboutsummaryrefslogtreecommitdiffstats
path: root/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications
diff options
context:
space:
mode:
Diffstat (limited to 'ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications')
-rw-r--r--ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/ManualNotificationUpdateThread.java151
-rw-r--r--ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Notification.java52
-rw-r--r--ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/NotificationController.java391
-rw-r--r--ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/NotificationServer.java141
-rw-r--r--ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Removed.java52
-rw-r--r--ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Updated.java61
-rw-r--r--ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/package-info.java28
7 files changed, 876 insertions, 0 deletions
diff --git a/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/ManualNotificationUpdateThread.java b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/ManualNotificationUpdateThread.java
new file mode 100644
index 000000000..6b8857273
--- /dev/null
+++ b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/ManualNotificationUpdateThread.java
@@ -0,0 +1,151 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PDP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pdp.rest.notifications;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.security.GeneralSecurityException;
+import java.util.LinkedList;
+import java.util.UUID;
+
+import org.openecomp.policy.rest.XACMLRestProperties;
+
+import com.att.nsa.cambria.client.CambriaClientFactory;
+import com.att.nsa.cambria.client.CambriaConsumer;
+import com.att.nsa.cambria.client.CambriaPublisher;
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.openecomp.policy.common.logging.flexlogger.*;
+
+public class ManualNotificationUpdateThread implements Runnable {
+ private static final Logger logger = FlexLogger.getLogger(ManualNotificationUpdateThread.class);
+// private static List<String> uebURLList = null;
+ private static String topic = null;
+ private static CambriaConsumer CConsumer = null;
+// private static Collection<String> clusterList = null;
+ private static String clusterList = null;
+// private Collection<String> urlList = null;
+ private static String update = null;
+
+ public volatile boolean isRunning = false;
+
+ public synchronized boolean isRunning() {
+ return this.isRunning;
+ }
+
+ public synchronized void terminate() {
+ this.isRunning = false;
+ }
+
+ /**
+ *
+ * This is our thread that runs on startup if the system is configured to UEB to accept manual update requests
+ *
+ */
+ @Override
+ public void run() {
+ synchronized(this) {
+ this.isRunning = true;
+ }
+ URL aURL = null;
+ String group = UUID.randomUUID ().toString ();
+ String id = "0";
+ String returnTopic = null;
+ try {
+ ManualNotificationUpdateThread.clusterList = XACMLProperties.getProperty(XACMLRestProperties.PROP_NOTIFICATION_UEB_CLUSTER);
+ String url = XACMLProperties.getProperty(XACMLRestProperties.PROP_PDP_ID);
+ aURL = new URL(url);
+ topic = aURL.getHost() + aURL.getPort();
+ } catch (NumberFormatException e) {
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Unable to get UEB cluster list or pdp url: ", e);
+ this.isRunning = false;
+ } catch (MalformedURLException e) {
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Error in processing URL to create topic for Notification ", e);
+ }
+ String consumerTopic = aURL.getHost() + aURL.getPort() + "UpdateRequest";
+ SendMessage(consumerTopic, "Starting-Topic");
+ final LinkedList<String> urlList = new LinkedList<String> ();
+ for ( String u : clusterList.split ( "," ) ){
+ urlList.add ( u );
+ }
+
+ try {
+ CConsumer = CambriaClientFactory.createConsumer ( null, urlList, consumerTopic , group, id, 20*1000, 1000 );
+ } catch (MalformedURLException | GeneralSecurityException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+
+
+ while (this.isRunning()) {
+ logger.debug("While loop test _ take out ");
+ try {
+ for ( String msg : CConsumer.fetch () ){
+ logger.debug("Manual Notification Recieved Message " + msg + " from UEB cluster : ");
+ returnTopic = processMessage(msg);
+ if(returnTopic != null){
+ SendMessage(returnTopic, update);
+ }
+ }
+ } catch (IOException e) {
+ logger.debug(XACMLErrorConstants.ERROR_DATA_ISSUE + "Error in processing UEB message");
+ }
+ }
+ logger.debug("Stopping UEB Consuer loop will not logger fetch messages from the cluser");
+
+ }
+
+ private void SendMessage( String topic, String message) {
+ CambriaPublisher pub = null;
+ try {
+ pub = CambriaClientFactory.createSimplePublisher (null, clusterList, topic );
+ } catch (MalformedURLException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ } catch (GeneralSecurityException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ try {
+ pub.send( "pdpReturnMessage", message );
+ logger.debug("Sending to Message to tpoic" + topic);
+ } catch (IOException e) {
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+ "Error sending notification update");
+ }
+ pub.close();
+ }
+
+ private String processMessage(String msg) {
+ logger.debug("notification message: " + msg);
+ String[] UID = msg.split("=")[1].split("\"");
+ String returnTopic = topic + UID[0];
+ if(msg.contains("Starting-Topic")){
+ return null;
+ }
+ return returnTopic;
+ }
+ public static void setUpdate(String update) {
+ ManualNotificationUpdateThread.update = update;
+ }
+
+}
diff --git a/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Notification.java b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Notification.java
new file mode 100644
index 000000000..5ab165b0a
--- /dev/null
+++ b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Notification.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PDP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pdp.rest.notifications;
+
+import java.util.Collection;
+
+/**
+ * Notification is the POJO which will be used to send the Notifications to the Server.
+ * Notification must contain the Removal and Updated policies.
+ *
+ * @version 0.1
+ *
+ */
+public class Notification {
+ private Collection<Removed> removedPolicies = null;
+ private Collection<Updated> loadedPolicies = null;
+
+ public Collection<Removed> getRemovedPolicies() {
+ return removedPolicies;
+ }
+
+ public void setRemovedPolicies(Collection<Removed> removedPolicies) {
+ this.removedPolicies = removedPolicies;
+ }
+
+ public Collection<Updated> getLoadedPolicies() {
+ return loadedPolicies;
+ }
+
+ public void setLoadedPolicies(Collection<Updated> loadedPolicies) {
+ this.loadedPolicies = loadedPolicies;
+ }
+
+}
diff --git a/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/NotificationController.java b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/NotificationController.java
new file mode 100644
index 000000000..1dfd07422
--- /dev/null
+++ b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/NotificationController.java
@@ -0,0 +1,391 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PDP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pdp.rest.notifications;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
+import org.openecomp.policy.pdp.rest.PapUrlResolver;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+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.att.research.xacmlatt.pdp.policy.AllOf;
+import com.att.research.xacmlatt.pdp.policy.AnyOf;
+import com.att.research.xacmlatt.pdp.policy.Match;
+import com.att.research.xacmlatt.pdp.policy.PolicyDef;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+
+/**
+ * NotificationController Checks for the Updated and Removed policies. It
+ * notifies the Server to send Notifications to the Client.
+ *
+ * @version 0.2
+ *
+ */
+public class NotificationController {
+ private static final Logger logger = FlexLogger.getLogger(NotificationController.class);
+ private static Notification record = new Notification();
+ private PDPStatus oldStatus = null;
+ private Removed removed = null;
+ private Updated updated = null;
+ private ManualNotificationUpdateThread registerMaunualNotificationRunnable = null;
+ private Thread manualNotificationThread = null;
+ private boolean manualThreadStarted = false;
+
+ private static String notificationJSON = null;
+ private static String propNotificationType = null;
+ private static String pdpURL = null;
+ private static Boolean notificationFlag = false;
+
+ public void check(PDPStatus newStatus,HashMap<String, PolicyDef> policyContainer) {
+ boolean updated = false;
+ boolean removed = false;
+ Notification notification = new Notification();
+ HashSet<Removed> removedPolicies = new HashSet<Removed>();
+ HashSet<Updated> updatedPolicies = new HashSet<Updated>();
+
+ if (oldStatus == null) {
+ oldStatus = newStatus;
+ }
+ // Debugging purpose only.
+ logger.debug("old config Status :" + oldStatus.getStatus());
+ logger.debug("new config Status :" + newStatus.getStatus());
+
+ // Depending on the above condition taking the Change as an Update.
+ if (oldStatus.getStatus().toString() != newStatus.getStatus().toString()) {
+ logger.info("There is an Update to the PDP");
+ logger.debug(oldStatus.getLoadedPolicies());
+ logger.debug(newStatus.getLoadedPolicies());
+ // Check if there is an Update/additions in the policy.
+ for (PDPPolicy newPolicy : newStatus.getLoadedPolicies()) {
+ boolean change = true;
+ for (PDPPolicy oldPolicy : oldStatus.getLoadedPolicies()) {
+ // Check if there are same policies.
+ if (oldPolicy.getId().equals(newPolicy.getId())) {
+ // Check if they have same version.
+ if (oldPolicy.getVersion().equals(newPolicy.getVersion())) {
+ change = false;
+ }
+ }
+ }
+ // if there is a change Send the notifications to the Client.
+ if (change) {
+ sendUpdate(newPolicy, policyContainer);
+ updated = true;
+ updatedPolicies.add(this.updated);
+ }
+ }
+ // Check if there is any removal of policy.
+ for (PDPPolicy oldPolicy : oldStatus.getLoadedPolicies()) {
+ boolean change = true;
+ for (PDPPolicy newPolicy : newStatus.getLoadedPolicies()) {
+ // Check if there are same policies.
+ if (oldPolicy.getId().equals(newPolicy.getId())) {
+ // Check if they have same version.
+ if (oldPolicy.getVersion().equals(newPolicy.getVersion())) {
+ change = false;
+ }
+ }
+ }
+ // if there is a change Send the notifications to the Client.
+ if (change) {
+ sendremove(oldPolicy);
+ removed = true;
+ removedPolicies.add(this.removed);
+ }
+ }
+ }
+ // At the end the oldStatus must be updated with the newStatus.
+ oldStatus = newStatus;
+ // Sending Notification to the Server to pass over to the clients
+ if (updated || removed) {
+ // Call the Notification Server..
+ notification.setRemovedPolicies(removedPolicies);
+ notification.setLoadedPolicies(updatedPolicies);
+ ObjectWriter om = new ObjectMapper().writer();
+ try {
+ notificationJSON = om.writeValueAsString(notification);
+ logger.info(notificationJSON);
+ // NotificationServer Method here.
+ propNotificationType = XACMLProperties.getProperty(XACMLRestProperties.PROP_NOTIFICATION_TYPE);
+ pdpURL = XACMLProperties.getProperty(XACMLRestProperties.PROP_PDP_ID);
+ if (propNotificationType!=null && propNotificationType.equals("ueb") && !manualThreadStarted) {
+ logger.debug("Starting Thread to accept UEB notfications.");
+ this.registerMaunualNotificationRunnable = new ManualNotificationUpdateThread();
+ this.manualNotificationThread = new Thread(this.registerMaunualNotificationRunnable);
+ this.manualNotificationThread.start();
+ manualThreadStarted = true;
+ }
+ String notificationJSON= null;
+ notificationFlag = true;
+ try{
+ notificationJSON= record(notification);
+ }catch(Exception e){
+ logger.error(e);
+ // TODO:EELF Cleanup - Remove logger
+ //PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "");
+ }
+ NotificationServer.setUpdate(notificationJSON);
+ ManualNotificationUpdateThread.setUpdate(notificationJSON);
+ } catch (JsonProcessingException e) {
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getMessage());
+ // TODO:EELF Cleanup - Remove logger
+ //PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "");
+ }
+ }
+ }
+
+ public static void sendNotification(){
+ if(notificationFlag){
+ NotificationServer.sendNotification(notificationJSON, propNotificationType, pdpURL);
+ notificationFlag = false;
+ }
+ }
+
+ private void sendremove(PDPPolicy oldPolicy) {
+ removed = new Removed();
+ // Want to know what is removed ?
+ // logger.info("The Policy removed is: " + oldPolicy.getId());
+ // logger.info("The version no. is: " + oldPolicy.getVersion());
+ logger.info("Policy removed: " + oldPolicy.getId()+ " with version number: " + oldPolicy.getVersion());
+ removed.setPolicyName(oldPolicy.getId());
+ removed.setVersionNo(oldPolicy.getVersion());
+ removeFile(oldPolicy);
+ }
+
+ private void sendUpdate(PDPPolicy newPolicy,HashMap<String, PolicyDef> policyContainer) {
+ updated = new Updated();
+ // Want to know what is new ?
+ logger.info("The new Policy is: " + newPolicy.getId());
+ logger.info("The version no. is: " + newPolicy.getVersion());
+ updated.setPolicyName(newPolicy.getId());
+ updated.setVersionNo(newPolicy.getVersion());
+ // If the policy is of Config type then retrieve its matches.
+ if (newPolicy.getName().startsWith("Config")) {
+ // Take a Configuration copy to PDP webapps.
+ final String urlStart = "attributeId=URLID,expression";
+ final String urlEnd = "}}},{";
+ String policy = policyContainer.get(newPolicy.getId()).toString();
+ if(policy.contains(urlStart)){
+ String urlFinePartOne = policy.substring(policy.indexOf(urlStart)+urlStart.length());
+ String urlFinePart = urlFinePartOne.substring(0,urlFinePartOne.indexOf(urlEnd));
+ String urlString = urlFinePart.substring(urlFinePart.indexOf("value=$URL")+6);
+ callPap(urlString, "Config");
+ }
+ Iterator<AnyOf> anyOfs = policyContainer.get(newPolicy.getId()).getTarget().getAnyOfs();
+ while (anyOfs.hasNext()) {
+ AnyOf anyOf = anyOfs.next();
+ Iterator<AllOf> allOfs = anyOf.getAllOfs();
+ while (allOfs.hasNext()) {
+ AllOf allOf = allOfs.next();
+ Iterator<Match> matches = allOf.getMatches();
+ HashMap<String, String> matchValues = new HashMap<String, String>();
+ while (matches.hasNext()) {
+ Match match = matches.next();
+ logger.info("Attribute Value is: "+ match.getAttributeValue().getValue().toString());
+ String[] result = match.getAttributeRetrievalBase().toString().split("attributeId=");
+ result[1] = result[1].replaceAll("}", "");
+ if (!result[1].equals("urn:oasis:names:tc:xacml:1.0:subject:subject-id")) {
+ logger.info("Attribute id is: " + result[1]);
+ }
+ matchValues.put(result[1], match.getAttributeValue().getValue().toString());
+ logger.info("Match is : "+ result[1]+ " , " + match.getAttributeValue().getValue().toString());
+ }
+ updated.setMatches(matchValues);
+ }
+ }
+ }else if(newPolicy.getName().startsWith("Action")){
+ // Take Configuration copy to PDP Webapps.
+ // Action policies have .json as extension.
+ String urlString = "$URL/Action/" + newPolicy.getId().substring(0, newPolicy.getId().lastIndexOf(".")) + ".json";
+ callPap(urlString, "Action");
+ }
+ }
+
+ // Adding this for Recording the changes to serve Polling requests..
+ public static String record(Notification notification) throws Exception {
+ // Initialization with updates.
+ if (record.getRemovedPolicies() == null || record.getLoadedPolicies() == null) {
+ record.setRemovedPolicies(notification.getRemovedPolicies());
+ record.setLoadedPolicies(notification.getLoadedPolicies());
+ } else {
+ // Check if there is anything new and update the record..
+ if (record.getLoadedPolicies() != null || record.getRemovedPolicies() != null) {
+ HashSet<Removed> removedPolicies = (HashSet<Removed>) record.getRemovedPolicies();
+ HashSet<Updated> updatedPolicies = (HashSet<Updated>) record.getLoadedPolicies();
+
+ // Checking with New updated policies.
+ if (notification.getLoadedPolicies() != null && !notification.getLoadedPolicies().isEmpty()) {
+ for (Updated newUpdatedPolicy : notification.getLoadedPolicies()) {
+ // If it was removed earlier then we need to remove from our record
+ Iterator<Removed> oldRemovedPolicy = removedPolicies.iterator();
+ while (oldRemovedPolicy.hasNext()) {
+ Removed policy = oldRemovedPolicy.next();
+ if (newUpdatedPolicy.getPolicyName().equals(policy.getPolicyName())) {
+ if (newUpdatedPolicy.getVersionNo().equals(policy.getVersionNo())) {
+ oldRemovedPolicy.remove();
+ }
+ }
+ }
+ // If it was previously updated need to Overwrite it to the record.
+ Iterator<Updated> oldUpdatedPolicy = updatedPolicies.iterator();
+ while (oldUpdatedPolicy.hasNext()) {
+ Updated policy = oldUpdatedPolicy.next();
+ if (newUpdatedPolicy.getPolicyName().equals(policy.getPolicyName())) {
+ if (newUpdatedPolicy.getVersionNo().equals(policy.getVersionNo())) {
+ oldUpdatedPolicy.remove();
+ }
+ }
+ }
+ updatedPolicies.add(newUpdatedPolicy);
+ }
+ }
+ // Checking with New Removed policies.
+ if (notification.getRemovedPolicies() != null && !notification.getRemovedPolicies().isEmpty()) {
+ for (Removed newRemovedPolicy : notification.getRemovedPolicies()) {
+ // If it was previously removed Overwrite it to the record.
+ Iterator<Removed> oldRemovedPolicy = removedPolicies.iterator();
+ while (oldRemovedPolicy.hasNext()) {
+ Removed policy = oldRemovedPolicy.next();
+ if (newRemovedPolicy.getPolicyName().equals(policy.getPolicyName())) {
+ if (newRemovedPolicy.getVersionNo().equals(policy.getVersionNo())) {
+ oldRemovedPolicy.remove();
+ }
+ }
+ }
+ // If it was added earlier then we need to remove from our record.
+ Iterator<Updated> oldUpdatedPolicy = updatedPolicies.iterator();
+ while (oldUpdatedPolicy.hasNext()) {
+ Updated policy = oldUpdatedPolicy.next();
+ if (newRemovedPolicy.getPolicyName().equals(policy.getPolicyName())) {
+ if (newRemovedPolicy.getVersionNo().equals(policy.getVersionNo())) {
+ oldUpdatedPolicy.remove();
+ }
+ }
+ }
+ removedPolicies.add(newRemovedPolicy);
+ }
+ }
+ record.setRemovedPolicies(removedPolicies);
+ record.setLoadedPolicies(updatedPolicies);
+ }
+ }
+ // Send the Result to the caller.
+ ObjectWriter om = new ObjectMapper().writer();
+ String json = null;
+ try {
+ json = om.writeValueAsString(record);
+ } catch (JsonProcessingException e) {
+ logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getMessage());
+ // TODO:EELF Cleanup - Remove logger
+ //PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "");
+ }
+ logger.info(json);
+ return json;
+ }
+
+ private void removeFile(PDPPolicy oldPolicy) {
+ try{
+ Path removedPolicyFile = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PDP_CONFIG)+File.separator+oldPolicy.getId());
+ Files.deleteIfExists(removedPolicyFile);
+ boolean delete=false;
+ File dir= null;
+ if(oldPolicy.getName().startsWith("Config")){
+ delete = true;
+ dir = new File(XACMLProperties.getProperty(XACMLRestProperties.PROP_PDP_WEBAPPS)+File.separator+"Config");
+ }else if(oldPolicy.getName().startsWith("Action")){
+ delete = true;
+ dir = new File(XACMLProperties.getProperty(XACMLRestProperties.PROP_PDP_WEBAPPS)+File.separator+"Action");
+ }
+ if(delete && dir!=null){
+ FileFilter fileFilter = new WildcardFileFilter(oldPolicy.getId().substring(0, oldPolicy.getId().lastIndexOf("."))+".*");
+ File[] configFile = dir.listFiles(fileFilter);
+ if(configFile.length==1){
+ Files.deleteIfExists(configFile[0].toPath());
+ }
+ }
+ }catch(Exception e){
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Couldn't remove the policy/config file " + oldPolicy.getName());
+ // TODO:EELF Cleanup - Remove logger
+ //PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "Couldn't remove the policy file " + oldPolicy.getName());
+ }
+ }
+
+ private void callPap(String urlString, String type) {
+ Path configLocation = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PDP_WEBAPPS)+File.separator+type);
+ if(Files.notExists(configLocation)){
+ try {
+ Files.createDirectories(configLocation);
+ } catch (IOException e) {
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW +"Failed to create config directory: " + configLocation.toAbsolutePath().toString(), e);
+ }
+ }
+ PapUrlResolver papUrls = PapUrlResolver.getInstance();
+ while(papUrls.hasMoreUrls()){
+ String papPath = papUrls.getUrl();
+ papPath = papPath.substring(0, papPath.lastIndexOf("/pap"));
+ String papAddress= urlString.replace("$URL", papPath);
+ String fileName = papAddress.substring(papAddress.lastIndexOf("/")+1);
+ String fileLocation = configLocation.toString() + File.separator + fileName;
+ try {
+ URL papURL = new URL(papAddress);
+ logger.info("Calling " +papAddress + " for Configuration Copy.");
+ URLConnection urlConnection = papURL.openConnection();
+ File file= new File(fileLocation);
+ try (InputStream is = urlConnection.getInputStream();
+ OutputStream os = new FileOutputStream(file)) {
+ IOUtils.copy(is, os);
+ break;
+ }
+ } catch (MalformedURLException e) {
+ logger.error(e + e.getMessage());
+ } catch(FileNotFoundException e){
+ logger.error(e + e.getMessage());
+ } catch (IOException e) {
+ logger.error(e + e.getMessage());
+ }
+ papUrls.getNext();
+ }
+ }
+}
diff --git a/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/NotificationServer.java b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/NotificationServer.java
new file mode 100644
index 000000000..d6cda7491
--- /dev/null
+++ b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/NotificationServer.java
@@ -0,0 +1,141 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PDP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pdp.rest.notifications;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.security.GeneralSecurityException;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import com.att.nsa.cambria.client.CambriaClientFactory;
+import com.att.nsa.cambria.client.CambriaPublisher;
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.openecomp.policy.common.logging.flexlogger.*;
+
+
+/**
+ * The NotificationServer sends the Server Notifications to the Clients once there is any Event.
+ * WebSockets is being used as a medium for sending Notifications.
+ * UEB is being used as a medium for sending Notifications.
+ *
+ * @version 0.1
+ *
+ **/
+@ServerEndpoint(value = "/notifications")
+public class NotificationServer {
+ private static final Logger logger = FlexLogger.getLogger(NotificationServer.class);
+ private static Queue<Session> queue = new ConcurrentLinkedQueue<Session>();
+ private static String update = null;
+ private static String hosts = null;
+ private static URL aURL = null;
+
+ @OnOpen
+ public void openConnection(Session session) {
+ logger.info("Session Connected: " + session.getId());
+ queue.add(session);
+ }
+
+ @OnClose
+ public void closeConnection(Session session) {
+ queue.remove(session);
+ }
+
+ @OnError
+ public void error(Session session, Throwable t) {
+ queue.remove(session);
+ logger.info(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Session Error for : " + session.getId() + " Error: " + t.getMessage());
+
+ }
+
+ @OnMessage
+ public void Message(String message, Session session) {
+
+ if(message.equalsIgnoreCase("Manual")) {
+ try {
+ session.getBasicRemote().sendText(update);
+ session.close();
+ } catch (IOException e) {
+ logger.info(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error in sending the Event Notification: "+ e.getMessage());
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error sending Message update");
+ }
+ }
+ }
+
+ public static void sendNotification(String notification, String propNotificationType, String pdpURL){
+
+ logger.debug("Notification set to " + propNotificationType);
+ if (propNotificationType.equals("ueb")){
+ String topic = null;
+ try {
+ aURL = new URL(pdpURL);
+ topic = aURL.getHost() + aURL.getPort();
+ } catch (MalformedURLException e1) {
+ pdpURL = pdpURL.replace("/", "");
+ topic = pdpURL.replace(":", "");
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error in parsing out pdpURL for UEB notfication ");
+ PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e1, "Error in parsing out pdpURL for UEB notfication ");
+ }
+ hosts = XACMLProperties.getProperty(XACMLRestProperties.PROP_NOTIFICATION_UEB_CLUSTER);
+ logger.debug("Creating Publisher for host: " + hosts + " with topic: " + topic);
+ CambriaPublisher pub = null;
+ try {
+ pub = CambriaClientFactory.createSimplePublisher (null, hosts, topic );
+ } catch (MalformedURLException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ } catch (GeneralSecurityException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ try {
+ pub.send( "MyPartitionKey", notification );
+ } catch (IOException e) {
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error sending notification update");
+ }
+ pub.close();
+ }
+ for(Session session: queue) {
+ try {
+ session.getBasicRemote().sendText(notification);
+ } catch (IOException e) {
+ logger.info(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error in sending the Event Notification: "+ e.getMessage());
+ }
+ }
+ }
+
+ public static void setUpdate(String update) {
+ NotificationServer.update = update;
+ }
+}
diff --git a/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Removed.java b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Removed.java
new file mode 100644
index 000000000..6ba073815
--- /dev/null
+++ b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Removed.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PDP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pdp.rest.notifications;
+
+
+/**
+ * Removal is the POJO for removal updates of the Policy.
+ * It must have the Policy removed and its Version number.
+ *
+ * @version 0.1
+ *
+ */
+public class Removed {
+
+ private String policyName = null;
+ private String versionNo = null;
+
+ public String getVersionNo() {
+ return versionNo;
+ }
+
+ public void setVersionNo(String versionNo) {
+ this.versionNo = versionNo;
+ }
+
+ public String getPolicyName() {
+ return policyName;
+ }
+
+ public void setPolicyName(String policyName) {
+ this.policyName = policyName;
+ }
+
+}
diff --git a/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Updated.java b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Updated.java
new file mode 100644
index 000000000..39236bada
--- /dev/null
+++ b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/Updated.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PDP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pdp.rest.notifications;
+
+import java.util.HashMap;
+
+/**
+ * Updated is the POJO which consists of any new or Updated Policy information.
+ * It must hold the Policy Name, version Number, Matches.
+ *
+ * @version 0.1
+ *
+ */
+public class Updated {
+ private String policyName = null;
+ private String versionNo = null;
+ private HashMap<String,String> matches = null;
+
+ public String getPolicyName() {
+ return policyName;
+ }
+
+ public void setPolicyName(String policyName) {
+ this.policyName = policyName;
+ }
+
+ public String getVersionNo() {
+ return versionNo;
+ }
+
+ public void setVersionNo(String versionNo) {
+ this.versionNo = versionNo;
+ }
+
+ public HashMap<String,String> getMatches() {
+ return matches;
+ }
+
+ public void setMatches(HashMap<String,String> matches) {
+ this.matches = matches;
+ }
+
+}
diff --git a/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/package-info.java b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/package-info.java
new file mode 100644
index 000000000..7d3995ec6
--- /dev/null
+++ b/ECOMP-PDP-REST/src/main/java/org/openecomp/policy/pdp/rest/notifications/package-info.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PDP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+/**
+ * This is the new Addition to the PDP Server added for sending Notifications to the Clients
+ * about the policy Updates/ Removals.
+ *
+ * @version 0.1
+ *
+ */
+package org.openecomp.policy.pdp.rest.notifications;