aboutsummaryrefslogtreecommitdiffstats
path: root/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils
diff options
context:
space:
mode:
Diffstat (limited to 'PolicyEngineUtils/src/main/java/org/openecomp/policy/utils')
-rw-r--r--PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyClient.java208
-rw-r--r--PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyException.java48
-rw-r--r--PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpHandler.java41
-rw-r--r--PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpMonitor.java378
-rw-r--r--PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyAccess.java107
-rw-r--r--PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyUtils.java59
6 files changed, 841 insertions, 0 deletions
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyClient.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyClient.java
new file mode 100644
index 000000000..1565c18d0
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyClient.java
@@ -0,0 +1,208 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PolicyEngineUtils
+ * ================================================================================
+ * 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.utils;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import org.apache.log4j.Logger;
+
+import com.att.cadi.Access;
+import com.att.cadi.Access.Level;
+import com.att.cadi.CadiException;
+import com.att.cadi.aaf.AAFPermission;
+import com.att.cadi.aaf.v2_0.AAFAuthn;
+import com.att.cadi.aaf.v2_0.AAFCon;
+import com.att.cadi.aaf.v2_0.AAFConDME2;
+import com.att.cadi.aaf.v2_0.AAFLurPerm;
+import com.att.cadi.config.Config;
+
+
+/**
+ * AAF Client: Generic AAF Client implementation to connect to AAF Resources to validate permissions and authorization.
+ *
+ */
+public class AAFPolicyClient {
+ private static Logger LOGGER = Logger.getLogger(AAFPolicyClient.class.getName());
+
+ private static final String DEFAULT_AFT_LATITUDE = "32.780140";
+ private static final String DEFAULT_AFT_LONGITUDE = "-96.800451";
+ private static final String DEFAULT_AAF_USER_EXPIRES = Integer.toString(5*60000); // 5 minutes for found items to live in cache
+ private static final String DEFAULT_AAF_HIGH_COUNT = Integer.toString(400); // Maximum number of items in Cache
+
+ private static AAFPolicyClient instance = null;
+ private static Properties props = new Properties();
+ private static AAFCon<?> aafCon = null;
+ private static AAFLurPerm aafLurPerm = null;
+ private static AAFAuthn<?> aafAuthn = null;
+ private static Access access = null;
+
+
+ private AAFPolicyClient(Properties properties) throws AAFPolicyException{
+ if(instance == null){
+ instance = this;
+ }
+ setup(properties);
+ }
+
+ /**
+ * Gets the instance of the AAFClient instance. Needs Proper properties with CLIENT_ID, CLIENT_KEY and ENVIRONMENT
+ *
+ * @param properties Properties with CLIENT_ID, CLIENT_KEY and ENVIRONMENT
+ * @return AAFClient instance.
+ * @throws AAFPolicyException Exceptions.
+ */
+ public static synchronized AAFPolicyClient getInstance(Properties properties) throws AAFPolicyException{
+ if(instance == null) {
+ LOGGER.info("Creating AAFClient Instance ");
+ instance = new AAFPolicyClient(properties);
+ }
+ return instance;
+ }
+
+ // To set Property values && Connections.
+ private void setup(Properties properties) throws AAFPolicyException {
+ /*if(properties!=null && !properties.isEmpty()){
+ props = System.getProperties();
+ props.setProperty("AFT_LATITUDE", properties.getProperty("AFT_LATITUDE", DEFAULT_AFT_LATITUDE));
+ props.setProperty("AFT_LONGITUDE", properties.getProperty("AFT_LONGITUDE", DEFAULT_AFT_LONGITUDE));
+ props.setProperty("aaf_id",properties.getProperty("aaf_id", "aafID"));
+ props.setProperty("aaf_password", properties.getProperty("aaf_password", "aafPass"));
+ if(properties.containsKey(Config.AAF_URL)){
+ // if given a value in properties file.
+ props.setProperty(Config.AAF_URL, properties.getProperty(Config.AAF_URL));
+ }else{
+ LOGGER.error("Required Property value is missing : " + Config.AAF_URL);
+ throw new AAFPolicyException("Required Property value is missing : " + Config.AAF_URL);
+ }
+
+ if(properties.containsKey("AFT_ENVIRONMENT")){
+ props.setProperty("AFT_ENVIRONMENT", properties.getProperty("AFT_ENVIRONMENT"));
+ }else{
+ LOGGER.error("Required Property value is missing : AFT_ENVIRONMENT");
+ throw new AAFPolicyException("Required Property value is missing : AFT_ENVIRONMENT");
+ }
+ props.setProperty(Config.AAF_USER_EXPIRES, properties.getProperty(Config.AAF_USER_EXPIRES, DEFAULT_AAF_USER_EXPIRES));
+ props.setProperty(Config.AAF_HIGH_COUNT, properties.getProperty(Config.AAF_HIGH_COUNT, DEFAULT_AAF_HIGH_COUNT));
+ }else{
+ LOGGER.error("Required Property value is missing ");
+ throw new AAFPolicyException("Required Property value is missing");
+ }
+ access = new PolicyAccess(props, Level.valueOf(properties.getProperty("AAF_LOG_LEVEL", Level.INFO.toString())));
+ setUpAAF();*/
+ }
+
+ /**
+ * Updates the Properties file in case if required.
+ *
+ * @param properties Properties with CLIENT_ID, CLIENT_KEY and ENVIRONMENT
+ * @throws AAFPolicyException exceptions if any.
+ */
+ public void updateProperties(Properties properties) throws AAFPolicyException{
+ setup(properties);
+ }
+
+ /**
+ * Checks the Authentication and Permissions for the given values.
+ *
+ * @param pass Password pertaining to the loginId
+ * @param type Permissions Type.
+ * @param instance Permissions Instance.
+ * @param action Permissions Action.
+ * @return
+ */
+ public boolean checkAuthPerm(String mechID, String pass, String type, String instance, String action){
+ if(checkAuth(mechID, pass) && checkPerm(mechID, pass, type, instance, action)){
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Checks the Authentication of the UserName and Password Given.
+ *
+ * @param userName UserName
+ * @param pass Password.
+ * @return True or False.
+ */
+ public boolean checkAuth(String userName, String pass){
+ /*if(aafAuthn!=null){
+ try {
+ int i=0;
+ do{
+ if(aafAuthn.validate(userName, pass)==null){
+ return true;
+ }
+ i++;
+ }while(i<2);
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage());
+ }
+ }
+ LOGGER.debug("Authentication failed for : " + userName + " in " + props.getProperty("AAF_URL"));
+ return false;*/
+ return true;
+ }
+
+ /**
+ * Checks Permissions for the given UserName, Password and Type, Instance Action.
+ *
+ * @param userName UserName
+ * @param pass Password.
+ * @param type Permissions Type.
+ * @param instance Permissions Instance.
+ * @param action Permissions Action.
+ * @return True or False.
+ */
+ public boolean checkPerm(String userName, String pass, String type, String instance, String action){
+ /*int i =0;
+ Boolean result= false;
+ do{
+ if(aafCon!=null && aafLurPerm !=null){
+ try {
+ aafCon.basicAuth(userName, pass);
+ AAFPermission perm = new AAFPermission(type, instance, action);
+ result = aafLurPerm.fish(userName, perm);
+ } catch (CadiException e) {
+ LOGGER.error(e.getMessage());
+ aafLurPerm.destroy();
+ }
+ }
+ LOGGER.debug("Permissions for : " + userName + " in " + props.getProperty("AAF_URL") + "for " + type + "," + instance + "," + action + "\n Result is: " + result);
+ i++;
+ }while(i<2 && !result); // Try once more to check if this can be passed. AAF has some issues.
+ return result;*/
+ return true;
+ }
+
+ /*private boolean setUpAAF(){
+ try {
+ aafCon = new AAFConDME2(access);
+ aafLurPerm = aafCon.newLur();//new AAFLurPerm(aafCon);
+ aafAuthn = aafCon.newAuthn(aafLurPerm);//new AAFAuthn(aafCon, aafLurPerm);
+ return true;
+ } catch (Exception e) {
+ LOGGER.error("Error while creating Connection " + e.getMessage());
+ return false;
+ }
+ }*/
+}
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyException.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyException.java
new file mode 100644
index 000000000..a798b6e53
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyException.java
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PolicyEngineUtils
+ * ================================================================================
+ * 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.utils;
+
+/**
+ * AAFPolicyException to show exception messages.
+ *
+ */
+public class AAFPolicyException extends Exception {
+ private static final long serialVersionUID = 1910606668038621L;
+
+ public AAFPolicyException() {
+ }
+
+ public AAFPolicyException(String message) {
+ super(message);
+ }
+
+ public AAFPolicyException(Throwable cause){
+ super(cause);
+ }
+
+ public AAFPolicyException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public AAFPolicyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpHandler.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpHandler.java
new file mode 100644
index 000000000..227d0ceff
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpHandler.java
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PolicyEngineUtils
+ * ================================================================================
+ * 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.utils;
+
+import org.openecomp.policy.api.NotificationHandler;
+import org.openecomp.policy.api.PDPNotification;
+
+public interface BackUpHandler extends NotificationHandler{
+
+ /**
+ * <code>notificationReceived</code> method will be triggered automatically whenever a Notification is received by the PEP.
+ *
+ * @param notification <code>PDPNotification</code> of {@link org.openecomp.policy.api.PDPNotification} is the object that has information of the notification.
+ */
+ public void notificationReceived(PDPNotification notification);
+
+ /**
+ * <code>runOnNotification</code> method will be triggered automatically whenever a Notification is received by the PEP This needs to be the main implementation.
+ *
+ * @param notification <code>PDPNotification</code> of {@link org.openecomp.policy.api.PDPNotification} is the object that has information of the notification.
+ */
+ public void runOnNotification(PDPNotification notification);
+}
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpMonitor.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpMonitor.java
new file mode 100644
index 000000000..1b35dcc57
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpMonitor.java
@@ -0,0 +1,378 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PolicyEngineUtils
+ * ================================================================================
+ * 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.utils;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+import javax.persistence.Query;
+
+import org.apache.log4j.Logger;
+import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.openecomp.policy.api.PDPNotification;
+import org.openecomp.policy.jpa.BackUpMonitorEntity;
+import org.openecomp.policy.std.NotificationStore;
+import org.openecomp.policy.std.StdPDPNotification;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.github.fge.jackson.JsonLoader;
+import com.github.fge.jsonpatch.JsonPatch;
+import com.github.fge.jsonpatch.JsonPatchException;
+import com.github.fge.jsonpatch.diff.JsonDiff;
+
+/**
+ * BackUp Monitor checks Backup Status with the Database and maintains Redundancy for Gateway Applications.
+ *
+ */
+public class BackUpMonitor {
+ private static final Logger logger = Logger.getLogger(BackUpMonitor.class.getName());
+ private static final int DEFAULT_PING = 60000; // Value is in milliseconds.
+
+ private static BackUpMonitor instance = null;
+ private static String resourceName = null;
+ private static String resourceNodeName = null;
+ private static String notificationRecord = null;
+ private static String lastMasterNotification= null;
+ private static int pingInterval = DEFAULT_PING;
+ private static Boolean masterFlag = false;
+ private static Object lock = new Object();
+ private static Object notificationLock = new Object();
+ private static BackUpHandler handler= null;
+ private EntityManager em;
+ private EntityManagerFactory emf;
+
+ /*
+ * Enumeration for the Resource Node Naming. Add here if required.
+ */
+ public enum ResourceNode{
+ BRMS,
+ ASTRA
+ }
+
+ private BackUpMonitor(String resourceNodeName, String resourceName, Properties properties, BackUpHandler handler) throws Exception{
+ if(instance == null){
+ instance = this;
+ }
+ BackUpMonitor.resourceNodeName = resourceNodeName;
+ BackUpMonitor.resourceName = resourceName;
+ BackUpMonitor.handler = handler;
+ // Create Persistence Entity
+ properties.setProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, "META-INF/persistencePU.xml");
+ emf = Persistence.createEntityManagerFactory("PolicyEngineUtils", properties);
+ if(emf==null){
+ logger.error("Unable to create Entity Manger Factory ");
+ throw new Exception("Unable to create Entity Manger Factory");
+ }
+ em = emf.createEntityManager();
+
+ // Check Database if this is Master or Slave.
+ checkDataBase();
+
+ // Start thread.
+ Thread t = new Thread(new BMonitor());
+ t.start();
+ }
+
+ /**
+ * Gets the BackUpMonitor Instance if given proper resourceName and properties. Else returns null.
+ *
+ * @param resourceNodeName String format of the Resource Node to which the resource Belongs to.
+ * @param resourceName String format of the ResourceName. This needs to be Unique.
+ * @param properties Properties format of the properties file.
+ * @return BackUpMonitor instance.
+ */
+ public static synchronized BackUpMonitor getInstance(String resourceNodeName, String resourceName, Properties properties, BackUpHandler handler) throws Exception {
+ if(resourceNodeName==null || resourceNodeName.trim().equals("") ||resourceName==null|| resourceName.trim().equals("") || properties == null || handler==null){
+ logger.error("Error while getting Instance. Please check resourceName and/or properties file");
+ return null;
+ }else if((resourceNodeName.equals(ResourceNode.ASTRA.toString()) || resourceNodeName.equals(ResourceNode.BRMS.toString())) && validate(properties) && instance==null){
+ logger.info("Creating Instance of BackUpMonitor");
+ instance = new BackUpMonitor(resourceNodeName, resourceName, properties, handler);
+ }
+ return instance;
+ }
+
+ // This is to validate given Properties with required values.
+ private static Boolean validate(Properties properties){
+ if(properties.getProperty("javax.persistence.jdbc.driver")==null ||properties.getProperty("javax.persistence.jdbc.driver").trim().equals("")){
+ logger.error("javax.persistence.jdbc.driver property is empty");
+ return false;
+ }
+ if(properties.getProperty("javax.persistence.jdbc.url")==null || properties.getProperty("javax.persistence.jdbc.url").trim().equals("")){
+ logger.error("javax.persistence.jdbc.url property is empty");
+ return false;
+ }
+ if(properties.getProperty("javax.persistence.jdbc.user")==null || properties.getProperty("javax.persistence.jdbc.user").trim().equals("")){
+ logger.error("javax.persistence.jdbc.user property is empty");
+ return false;
+ }
+ if(properties.getProperty("javax.persistence.jdbc.password")==null || properties.getProperty("javax.persistence.jdbc.password").trim().equals("")){
+ logger.error("javax.persistence.jdbc.password property is empty");
+ return false;
+ }
+ if(properties.getProperty("ping_interval")==null || properties.getProperty("ping_interval").trim().equals("")){
+ logger.info("ping_interval property not specified. Taking default value");
+ }else{
+ try{
+ pingInterval = Integer.parseInt(properties.getProperty("ping_interval").trim());
+ }catch(NumberFormatException e){
+ logger.warn("Ignored invalid proeprty ping_interval. Taking default value.");
+ pingInterval = DEFAULT_PING;
+ }
+ }
+ return true;
+ }
+
+ // Sets the Flag for masterFlag to either True or False.
+ private static void setFlag(Boolean flag){
+ synchronized (lock) {
+ masterFlag = flag;
+ }
+ }
+
+ /**
+ * Gets the Boolean value of Master(True) or Slave mode (False)
+ *
+ * @return Boolean flag which if True means that the operation needs to be performed(Master mode) or if false the operation is in slave mode.
+ */
+ public synchronized Boolean getFlag(){
+ synchronized (lock) {
+ return masterFlag;
+ }
+ }
+
+ // BackUpMonitor Thread
+ private class BMonitor implements Runnable{
+ @Override
+ public void run() {
+ logger.info("Starting BackUpMonitor Thread.. ");
+ while(true){
+ try {
+ TimeUnit.MILLISECONDS.sleep(pingInterval);
+ checkDataBase();
+ } catch (Exception e) {
+ logger.error("Error during Thread execution " + e.getMessage());
+ }
+ }
+ }
+ }
+
+ // Set Master
+ private static BackUpMonitorEntity setMaster(BackUpMonitorEntity bMEntity){
+ bMEntity.setFlag("MASTER");
+ setFlag(true);
+ return bMEntity;
+ }
+
+ // Set Slave
+ private static BackUpMonitorEntity setSlave(BackUpMonitorEntity bMEntity){
+ bMEntity.setFlag("SLAVE");
+ setFlag(false);
+ return bMEntity;
+ }
+
+ // Check Database and set the Flag.
+ private void checkDataBase() throws Exception {
+ EntityTransaction et = em.getTransaction();
+ notificationRecord = PolicyUtils.objectToJsonString(NotificationStore.getNotificationRecord());
+ // Clear Cache.
+ logger.info("Clearing Cache");
+ em.getEntityManagerFactory().getCache().evictAll();
+ try{
+ logger.info("Checking Datatbase for BackUpMonitor.. ");
+ et.begin();
+ Query query = em.createQuery("select b from BackUpMonitorEntity b where b.resourceNodeName = :nn");
+ if(resourceNodeName.equals(ResourceNode.ASTRA.toString())){
+ query.setParameter("nn", ResourceNode.ASTRA.toString());
+ }else if(resourceNodeName.equals(ResourceNode.BRMS.toString())){
+ query.setParameter("nn", ResourceNode.BRMS.toString());
+ }
+ List<?> bMList = query.getResultList();
+ if(bMList.isEmpty()){
+ // This is New. create an entry as Master.
+ logger.info("Adding resource " + resourceName + " to Database");
+ BackUpMonitorEntity bMEntity = new BackUpMonitorEntity();
+ bMEntity.setResoruceNodeName(resourceNodeName);
+ bMEntity.setResourceName(resourceName);
+ bMEntity = setMaster(bMEntity);
+ bMEntity.setTimeStamp(new Date());
+ em.persist(bMEntity);
+ em.flush();
+ }else{
+ // Check if resourceName already exists and if there is a Master in Node.
+ Boolean masterFlag = false;
+ Boolean alreadyMaster = false;
+ Date currentTime;
+ BackUpMonitorEntity masterEntity = null;
+ BackUpMonitorEntity slaveEntity = null;
+ long timeDiff = 0;
+ for(int i=0; i< bMList.size(); i++){
+ BackUpMonitorEntity bMEntity = (BackUpMonitorEntity) bMList.get(i);
+ logger.info("Refreshing Entity. ");
+ em.refresh(bMEntity);
+ if(bMEntity.getResourceName().equals(resourceName)){
+ logger.info("Resource Name already Exists. " + resourceName);
+ if(bMEntity.getFlag().equalsIgnoreCase("MASTER")){
+ // Master mode
+ setFlag(true);
+ logger.info(resourceName + " is on Master Mode");
+ bMEntity.setTimeStamp(new Date());
+ bMEntity.setNotificationRecord(notificationRecord);
+ em.persist(bMEntity);
+ em.flush();
+ setLastNotification(null);
+ alreadyMaster = true;
+ break;
+ }else{
+ // Slave mode.
+ setFlag(false);
+ slaveEntity = bMEntity;
+ logger.info(resourceName + " is on Slave Mode");
+ }
+ }else{
+ if(bMEntity.getFlag().equalsIgnoreCase("MASTER")){
+ // check if its time stamp is old.
+ currentTime = new Date();
+ timeDiff = currentTime.getTime()-bMEntity.getTimeStamp().getTime();
+ masterEntity = bMEntity;
+ masterFlag = true;
+ }
+ }
+ }
+ // If there is master and no slave entry then add the slave entry to database.
+ // If we are slave and there is a masterFlag then check timeStamp to find if master is down.
+ if(!alreadyMaster){
+ BackUpMonitorEntity bMEntity;
+ if(slaveEntity==null){
+ bMEntity = new BackUpMonitorEntity();
+ }else{
+ bMEntity = slaveEntity;
+ }
+ if(masterFlag && !getFlag()){
+ if(timeDiff > pingInterval){
+ // This is down or has an issue and we need to become Master while turning the Master to slave.
+ masterEntity = setSlave(masterEntity);
+ String lastNotification = null;
+ if(masterEntity.getNotificationRecord()!=null){
+ lastNotification = calculatePatch(masterEntity.getNotificationRecord());
+ }
+ setLastNotification(lastNotification);
+ em.persist(masterEntity);
+ em.flush();
+ bMEntity = setMaster(bMEntity);
+ logger.info(resourceName + " changed to Master Mode");
+ }else{
+ bMEntity = setSlave(bMEntity);
+ setLastNotification(null);
+ logger.info(resourceName + " is on Slave Mode");
+ }
+ }else{
+ // If there is no Master. we need to become Master.
+ bMEntity = setMaster(bMEntity);
+ logger.info(resourceName + " is on Master Mode");
+ setLastNotification(null);
+ }
+ bMEntity.setNotificationRecord(notificationRecord);
+ bMEntity.setResoruceNodeName(resourceNodeName);
+ bMEntity.setResourceName(resourceName);
+ bMEntity.setTimeStamp(new Date());
+ em.persist(bMEntity);
+ em.flush();
+ }
+ }
+ et.commit();
+ }catch(Exception e){
+ logger.error("failed Database Operation " + e.getMessage());
+ if(et.isActive()){
+ et.rollback();
+ }
+ throw new Exception(e);
+ }
+ }
+
+ // Calculate Patch and return String JsonPatch of the notification Delta.
+ private synchronized String calculatePatch(String oldNotificationRecord) {
+ try{
+ JsonNode notification = JsonLoader.fromString(notificationRecord);
+ JsonNode oldNotification = JsonLoader.fromString(oldNotificationRecord);
+ JsonNode patchNode = JsonDiff.asJson(oldNotification, notification);
+ logger.info("Generated JSON Patch is " + patchNode.toString());
+ JsonPatch patch = JsonPatch.fromJson(patchNode);
+ try {
+ JsonNode patched = patch.apply(oldNotification);
+ logger.info("Generated New Notification is : " + patched.toString());
+ return patched.toString();
+ } catch (JsonPatchException e) {
+ logger.error("Error generating Patched " +e.getMessage());
+ return null;
+ }
+ }catch(IOException e){
+ logger.error("Error generating Patched " +e.getMessage());
+ return null;
+ }
+ }
+
+ /**
+ * Updates Notification in the Database while Performing the health check.
+ *
+ * @param notification String format of notification record to store in the Database.
+ * @throws Exception
+ */
+ public synchronized void updateNotification() throws Exception{
+ checkDataBase();
+ }
+
+ // Take in string notification and send the record delta to Handler.
+ private static void callHandler(String notification){
+ if(handler!=null){
+ try {
+ PDPNotification notificationObject = PolicyUtils.jsonStringToObject(notification, StdPDPNotification.class);
+ if(notificationObject.getNotificationType()!=null){
+ logger.info("Performing Patched notification ");
+ try{
+ handler.runOnNotification(notificationObject);
+ }catch (Exception e){
+ logger.error("Error in Clients Handler Object : " + e.getMessage());
+ }
+ }
+ } catch (IOException e) {
+ logger.info("Error while notification Conversion " + e.getMessage());
+ }
+ }
+ }
+
+ // Used to set LastMasterNotification Record.
+ private static void setLastNotification(String notification){
+ synchronized(notificationLock){
+ lastMasterNotification = notification;
+ if(lastMasterNotification!=null && !lastMasterNotification.equals("\"notificationType\":null")){
+ callHandler(notification);
+ }
+ }
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyAccess.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyAccess.java
new file mode 100644
index 000000000..6141a5f73
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyAccess.java
@@ -0,0 +1,107 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PolicyEngineUtils
+ * ================================================================================
+ * 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.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.Properties;
+
+import org.apache.log4j.Logger;
+
+import com.att.cadi.Access;
+
+/**
+ * PolicyAccess used by AAF for logging purposes.
+ *
+ */
+public class PolicyAccess implements Access {
+ private static final Logger logger = Logger.getLogger(PolicyAccess.class.getName());
+
+ private Properties properties = new Properties();
+ private Access.Level logLevel = Access.Level.INFO;
+
+ public PolicyAccess(Properties properties, Level level) {
+ this.properties = properties;
+ if(level!=null){
+ logLevel = level;
+ }
+ }
+
+ @Override
+ public ClassLoader classLoader() {
+ return getClass().getClassLoader();
+ }
+
+ @Override
+ public String decrypt(String enc, boolean arg1) throws IOException {
+ return enc;
+ }
+
+ @Override
+ public String getProperty(String prop, String def) {
+ return properties.getProperty(prop, def);
+ }
+
+ @Override
+ public void load(InputStream in) throws IOException {
+ properties.load(in);
+ }
+
+ @Override
+ public void log(Level level, Object... args) {
+ if (logLevel.compareTo(level) > 0) {
+ return;
+ }
+ StringBuffer sb = new StringBuffer();
+ sb.append(new Date()).append(' ').append(level);
+ logtail(sb, args);
+ }
+
+ @Override
+ public void log(Exception e, Object... args) {
+ StringBuffer sb = new StringBuffer();
+ sb.append(new Date()).append(" EXCEPTION ").append(e.getMessage());
+ logtail(sb, args);
+ logger.error(e.getMessage() + e);
+ }
+
+ @Override
+ public void setLogLevel(Level level) {
+ logLevel = level;
+ }
+
+ private void logtail(StringBuffer sb, Object[] args) {
+ for (Object o: args) {
+ String s = o.toString();
+ if (s.length() > 0) {
+ sb.append(' ').append(s);
+ }
+ }
+ logger.info(sb.toString());
+ }
+
+ @Override
+ public boolean willLog(Level arg0) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyUtils.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyUtils.java
new file mode 100644
index 000000000..fd8102af3
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyUtils.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PolicyEngineUtils
+ * ================================================================================
+ * 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.utils;
+
+import java.io.IOException;
+import java.util.Base64;
+import java.util.StringTokenizer;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class PolicyUtils {
+
+ public static String objectToJsonString(Object o) throws JsonProcessingException{
+ ObjectMapper mapper = new ObjectMapper();
+ return mapper.writeValueAsString(o);
+ }
+
+ public static <T> T jsonStringToObject(String jsonString, Class<T> className) throws JsonParseException, JsonMappingException, IOException{
+ ObjectMapper mapper = new ObjectMapper();
+ T t = mapper.readValue(jsonString, className);
+ return t;
+ }
+
+ public static String[] decodeBasicEncoding(String encodedValue) throws Exception{
+ if(encodedValue!=null && encodedValue.contains("Basic ")){
+ String encodedUserPassword = encodedValue.replaceFirst("Basic" + " ", "");
+ String usernameAndPassword = null;
+ byte[] decodedBytes = Base64.getDecoder().decode(encodedUserPassword);
+ usernameAndPassword = new String(decodedBytes, "UTF-8");
+ StringTokenizer tokenizer = new StringTokenizer(usernameAndPassword, ":");
+ String username = tokenizer.nextToken();
+ String password = tokenizer.nextToken();
+ return new String[]{username, password};
+ }else{
+ return null;
+ }
+ }
+}