Policy 1707 commit to LF

Change-Id: Ibe6f01d92f9a434c040abb05d5386e89d675ae65
Signed-off-by: ITSERVICES\rb7147 <rb7147@att.com>
diff --git a/PolicyEngineUtils/pom.xml b/PolicyEngineUtils/pom.xml
index 50d98eb..98eae1e 100644
--- a/PolicyEngineUtils/pom.xml
+++ b/PolicyEngineUtils/pom.xml
@@ -17,7 +17,6 @@
   limitations under the License.
   ============LICENSE_END=========================================================
   -->
-
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
@@ -26,13 +25,32 @@
 		<artifactId>PolicyEngineSuite</artifactId>
 		<version>1.1.0-SNAPSHOT</version>
 	</parent>
-
 	<artifactId>PolicyEngineUtils</artifactId>
 	<dependencies>
 		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-			<version>1.2.17</version>
+			<groupId>org.openecomp.policy.common</groupId>
+			<artifactId>integrity-monitor</artifactId>
+			<version>${common-modules.version}</version> 
+		</dependency>
+		<dependency>
+			<groupId>org.openecomp.policy.common</groupId>
+			<artifactId>integrity-audit</artifactId>
+			<version>${common-modules.version}</version> 
+		</dependency>
+		<dependency>
+			<groupId>org.openecomp.policy.common</groupId>
+			<artifactId>ECOMP-Logging</artifactId>
+			<version>${common-modules.version}</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.powermock</groupId>
+					<artifactId>powermock-module-junit4</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.powermock</groupId>
+					<artifactId>powermock-core</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 		<dependency>
 			<groupId>org.eclipse.persistence</groupId>
@@ -45,11 +63,6 @@
 			<version>2.6.0</version>
 		</dependency>
 		<dependency>
-			<groupId>com.h2database</groupId>
-			<artifactId>h2</artifactId>
-			<version>[1.4.186,)</version>
-		</dependency>
-		<dependency>
 			<groupId>mysql</groupId>
 			<artifactId>mysql-connector-java</artifactId>
 			<version>5.1.30</version>
@@ -65,21 +78,57 @@
 			<version>1.9</version>
 		</dependency>
 		<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-model</artifactId>
+			<version>3.3.9</version>
+		</dependency>
+		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
 			<version>4.11</version>
+			<scope>test</scope>
 		</dependency>
-		<!-- https://mvnrepository.com/artifact/com.att.cadi/cadi-aaf -->
 		<dependency>
-    		<groupId>com.att.cadi</groupId>
-    		<artifactId>cadi-aaf</artifactId>
-    		<version>1.3.0</version>
-    		<exclusions>
-    			<exclusion>
-    				<groupId>com.att.aft</groupId>
-					<artifactId>dme2</artifactId>
-    			</exclusion>
-    		</exclusions>
+			<groupId>org.mariadb.jdbc</groupId>
+			<artifactId>mariadb-java-client</artifactId>
+			<version>1.2.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.drools</groupId>
+			<artifactId>drools-verifier</artifactId>
+			<version>6.3.0.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>com.att.cadi</groupId>
+			<artifactId>cadi-aaf</artifactId>
+			<version>1.3.0</version>
+		</dependency>
+		<dependency>
+    		<groupId>com.att.aft</groupId>
+    		<artifactId>dme2</artifactId>
+    		<version>3.1.200</version>
+		</dependency>
+		<dependency>
+			<groupId>com.att.nsa</groupId>
+			<artifactId>cambriaClient</artifactId>
+			<version>0.0.1</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>slf4j-log4j12</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.att.nsa</groupId>
+			<artifactId>dmaapClient</artifactId>
+			<version>0.2.12</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>slf4j-log4j12</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 	</dependencies>
 </project>
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/api/PEDependency.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/api/PEDependency.java
new file mode 100644
index 0000000..2141741
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/api/PEDependency.java
@@ -0,0 +1,90 @@
+/*-
+ * ============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.api;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Exclusion;
+
+public class PEDependency{
+    
+    private String groupId;
+    private String artifactId;
+    private String version;
+    private String classifier;
+	private String type;
+    private String scope;
+    private java.util.List<Exclusion> exclusions;
+    
+    public String getGroupId() {
+        return groupId;
+    }
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+    public String getArtifactId() {
+        return artifactId;
+    }
+    public void setArtifactId(String artifactId) {
+        this.artifactId = artifactId;
+    }
+    public String getVersion() {
+        return version;
+    }
+    public void setVersion(String version) {
+        this.version = version;
+    }
+    public java.util.List<Exclusion> getExclusions() {
+        return exclusions;
+    }
+    public void setExclusions(java.util.List<Exclusion> exclusions) {
+        this.exclusions = exclusions;
+    }
+    public String getClassifier() {
+		return classifier;
+	}
+	public void setClassifier(String classifier) {
+		this.classifier = classifier;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getScope() {
+		return scope;
+	}
+	public void setScope(String scope) {
+		this.scope = scope;
+	}
+	
+    public Dependency getDependency(){
+        Dependency dependency = new Dependency();
+        dependency.setArtifactId(artifactId);
+        dependency.setGroupId(groupId);
+        dependency.setVersion(version);
+        dependency.setExclusions(exclusions);
+        dependency.setClassifier(classifier);
+        dependency.setScope(scope);
+        dependency.setType(type);
+        return dependency;
+    }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyClient.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyClient.java
index 1565c18..0c8de27 100644
--- a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyClient.java
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyClient.java
@@ -1,208 +1,30 @@
-/*-
- * ============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.lang.reflect.Method;
 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);
-			}
+public interface AAFPolicyClient {
+	/*
+	 * Enumeration for the Resource Node Naming. Add here if required. 
+	 */
+	String AAF_DEFAULT_CLASS = "org.openecomp.policy.utils.AAFPolicyClientImpl";
+	public enum Environment{
+		DEVL,
+		TEST,
+		PROD
+	}
+	public boolean checkAuth(String userName, String pass);
+	public void updateProperties(Properties properties) throws AAFPolicyException;
+	public boolean checkAuthPerm(String mechID, String pass, String type, String instance, String action);
+	public boolean checkPerm(String userName, String pass, String type, String instance, String action);
+	public static AAFPolicyClient getInstance(Properties properties) throws AAFPolicyException{
+		try {
+			Class<?> aafPolicyClient = Class.forName(properties.getProperty("aafClient.impl.className", AAF_DEFAULT_CLASS));
+			Method method =  aafPolicyClient.getMethod("getInstance", Properties.class);
+			AAFPolicyClient instance = (AAFPolicyClient) method.invoke(null, properties);
 			return instance;
+		} catch (Exception e) {
+			throw new AAFPolicyException(e);
 		}
-		
-		// 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/AAFPolicyClientImpl.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyClientImpl.java
new file mode 100644
index 0000000..bd64026
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/AAFPolicyClientImpl.java
@@ -0,0 +1,217 @@
+/*-
+ * ============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.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 AAFPolicyClientImpl implements AAFPolicyClient{
+	private static Logger LOGGER = Logger.getLogger(AAFPolicyClientImpl.class.getName());
+
+	private static final String ENVIRONMENT = "ENVIRONMENT";
+	
+	// Warning Please don't Change these Values. Confirm with AAF team.  
+	private static final String DEVL_AAF_URL = "";
+	private static final String TEST_AAF_URL = "";
+	private static final String PROD_AAF_URL = "";
+	private static final String DEFAULT_AFT_LATITUDE = "32.780140";
+	private static final String DEFAULT_AFT_LONGITUDE = "-96.800451";
+	private static final String TEST_AFT_ENVIRONMENT = "AFTUAT";
+	private static final String PROD_AFT_ENVIRONMENT = "AFTPRD";
+	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 AAFPolicyClientImpl 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 AAFPolicyClientImpl(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 AAFPolicyClientImpl getInstance(Properties properties) throws AAFPolicyException{
+		if(instance == null) {
+			LOGGER.info("Creating AAFClient Instance ");
+			instance = new AAFPolicyClientImpl(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));
+			String aftEnv = TEST_AFT_ENVIRONMENT;
+			//props.setProperty(Config.CADI_KEYFILE,"keyfile");
+			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{
+				// Set Default values. 
+				if(properties.getProperty(ENVIRONMENT, "DEVL").equalsIgnoreCase(Environment.TEST.toString())){
+					props.setProperty(Config.AAF_URL, TEST_AAF_URL);
+				}else if(properties.getProperty(ENVIRONMENT, "DEVL").equalsIgnoreCase(Environment.PROD.toString())){
+					props.setProperty(Config.AAF_URL, PROD_AAF_URL);
+					aftEnv = PROD_AFT_ENVIRONMENT;
+				}else{
+					props.setProperty(Config.AAF_URL, DEVL_AAF_URL);
+				}
+			}
+			props.setProperty("AFT_ENVIRONMENT", properties.getProperty("AFT_ENVIRONMENT", aftEnv));
+			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 : " + ENVIRONMENT);
+			throw new AAFPolicyException("Required Property value is missing : " + ENVIRONMENT);
+		}
+		access = new PolicyAccess(props, Level.valueOf(properties.getProperty("AAF_LOG_LEVEL", Level.ERROR.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 mechID MechID or ATT ID must be registered under the Name space. 
+	 * @param pass Password pertaining to the MechID or ATTID. 
+	 * @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 or MechID
+	 * @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.info("Authentication failed for : " + userName + " in " + props.getProperty(Config.AAF_URL));
+		return false;
+	}
+
+	/**
+	 * Checks Permissions for the given UserName, Password and Type, Instance Action. 
+	 * 
+	 * @param userName UserName or MechID
+	 * @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.info("Permissions for : " + userName + " in " + props.getProperty(Config.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;
+	}
+
+	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 setting up AAF Connection " + e.getMessage());
+			return false;
+		}
+	}
+}
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpMonitor.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpMonitor.java
index 1b35dcc..f041d10 100644
--- a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpMonitor.java
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BackUpMonitor.java
@@ -21,6 +21,7 @@
 package org.openecomp.policy.utils;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Properties;
@@ -50,9 +51,9 @@
  * 
  */
 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 final Logger LOGGER = Logger.getLogger(BackUpMonitor.class.getName());
+	private static final int DEFAULT_PING = 15000; // Value is in milliseconds. 
+
 	private static BackUpMonitor instance = null;
 	private static String resourceName = null;
 	private static String resourceNodeName = null;
@@ -65,7 +66,7 @@
 	private static BackUpHandler handler= null;
 	private EntityManager em;
 	private EntityManagerFactory emf;
-	
+
 	/*
 	 * Enumeration for the Resource Node Naming. Add here if required. 
 	 */
@@ -73,7 +74,7 @@
 		BRMS,
 		ASTRA
 	}
-	
+
 	private BackUpMonitor(String resourceNodeName, String resourceName, Properties properties, BackUpHandler handler) throws Exception{
 		if(instance == null){
 			instance = this;
@@ -85,14 +86,14 @@
 		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 ");
+			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();
@@ -108,103 +109,103 @@
 	 */
 	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");
+			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");
+			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");
+			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");
+			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");
+			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");
+			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");
+			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.");
+				LOGGER.warn("Ignored invalid proeprty ping_interval. Taking default value: " + pingInterval);
 				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(){
+	public Boolean getFlag(){
 		synchronized (lock) {
 			return masterFlag;
 		}
 	}
-	
+
 	// BackUpMonitor Thread 
 	private class BMonitor implements Runnable{
 		@Override
 		public void run() {
-			logger.info("Starting BackUpMonitor Thread.. ");
+			LOGGER.info("Starting BackUpMonitor Thread.. ");
 			while(true){
 				try {
 					TimeUnit.MILLISECONDS.sleep(pingInterval);
 					checkDataBase();
 				} catch (Exception e) {
-					logger.error("Error during Thread execution " + e.getMessage());
+					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");
+		LOGGER.info("Clearing Cache");
 		em.getEntityManagerFactory().getCache().evictAll();
 		try{
-			logger.info("Checking Datatbase for BackUpMonitor.. ");
+			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())){
@@ -215,7 +216,7 @@
 			List<?> bMList = query.getResultList();
 			if(bMList.isEmpty()){
 				// This is New. create an entry as Master. 
-				logger.info("Adding resource " + resourceName + " to Database");
+				LOGGER.info("Adding resource " + resourceName + " to Database");
 				BackUpMonitorEntity bMEntity = new BackUpMonitorEntity();
 				bMEntity.setResoruceNodeName(resourceNodeName);
 				bMEntity.setResourceName(resourceName);
@@ -224,115 +225,154 @@
 				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;
+				// Check for other Master(s)
+				ArrayList<BackUpMonitorEntity> masterEntities = new ArrayList<BackUpMonitorEntity>();
+				// Check for self. 
+				BackUpMonitorEntity selfEntity = null;
+				// Check backup monitor entities.
 				for(int i=0; i< bMList.size(); i++){
 					BackUpMonitorEntity bMEntity = (BackUpMonitorEntity) bMList.get(i);
-					logger.info("Refreshing Entity. ");
+					LOGGER.info("Refreshing Entity. ");
 					em.refresh(bMEntity);
+					if(bMEntity.getFlag().equalsIgnoreCase("MASTER")){
+						masterEntities.add(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;
-						}
+						selfEntity = bMEntity;
 					}
 				}
-				// 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");
+				if(selfEntity!=null){
+					LOGGER.info("Resource Name already Exists: " + resourceName);
+					if(selfEntity.getFlag().equalsIgnoreCase("MASTER")){
+						// Already Master Mode. 
+						setFlag(true);
+						LOGGER.info(resourceName + " is on Master Mode");
+						selfEntity.setTimeStamp(new Date());
+						selfEntity.setNotificationRecord(notificationRecord);
+						em.persist(selfEntity);
+						em.flush();
+						setLastNotification(null);
+						if(!masterEntities.contains(selfEntity)){
+							masterEntities.add(selfEntity);
 						}
 					}else{
-						// If there is no Master. we need to become Master. 
-						bMEntity = setMaster(bMEntity);
-						logger.info(resourceName + " is on Master Mode");
-						setLastNotification(null);
+						// Already Slave Mode.
+						setFlag(false);
+						selfEntity.setTimeStamp(new Date());
+						selfEntity.setNotificationRecord(notificationRecord);
+						em.persist(selfEntity);
+						em.flush();
+						LOGGER.info(resourceName + " is on Slave Mode");
 					}
-					bMEntity.setNotificationRecord(notificationRecord);
-					bMEntity.setResoruceNodeName(resourceNodeName);
-					bMEntity.setResourceName(resourceName);
-					bMEntity.setTimeStamp(new Date());
-					em.persist(bMEntity);
+				}else{
+					// Resource name is null -> No resource with same name. 
+					selfEntity = new BackUpMonitorEntity();
+					selfEntity.setResoruceNodeName(resourceNodeName);
+					selfEntity.setResourceName(resourceName);
+					selfEntity.setTimeStamp(new Date());
+					selfEntity = setSlave(selfEntity);
+					setLastNotification(null);
+					LOGGER.info("Creating: " + resourceName + " on Slave Mode");
+					em.persist(selfEntity);
 					em.flush();
 				}
+				// Correct the database if any errors and perform monitor checks.
+				if(masterEntities.size()!=1 || !getFlag()){
+					// We are either not master or there are more masters or no masters. 
+					if(masterEntities.size()==0){
+						// No Masters is a problem Convert ourselves to Master. 
+						selfEntity = setMaster(selfEntity);
+						selfEntity.setTimeStamp(new Date());
+						selfEntity.setNotificationRecord(notificationRecord);
+						LOGGER.info(resourceName + " changed to Master Mode - No Masters available.");
+						em.persist(selfEntity);
+						em.flush();
+					}else {
+						if(masterEntities.size()>1){
+							// More Masters is a problem, Fix the issue by looking for the latest one and make others Slave. 
+							BackUpMonitorEntity masterEntity = null;
+							for(BackUpMonitorEntity currentEntity: masterEntities){
+								if(currentEntity.getFlag().equalsIgnoreCase("MASTER")){
+									if(masterEntity==null){
+										masterEntity = currentEntity;
+									}else if(currentEntity.getTimeStamp().getTime() > masterEntity.getTimeStamp().getTime()){
+										// False Master, Update master to slave and take currentMaster as Master. 
+										masterEntity.setFlag("SLAVE");
+										masterEntity.setTimeStamp(new Date());
+										em.persist(masterEntity);
+										em.flush();
+										masterEntity = currentEntity;
+									}else{
+										currentEntity.setFlag("SLAVE");
+										currentEntity.setTimeStamp(new Date());
+										em.persist(currentEntity);
+										em.flush();
+									}
+								}
+							}
+							masterEntities = new ArrayList<BackUpMonitorEntity>();
+							masterEntities.add(masterEntity);
+						}
+						if(masterEntities.size()==1){
+							// Correct Size, Check if Master is Latest, if not Change Master to Slave and Slave to Master.   
+							BackUpMonitorEntity masterEntity = masterEntities.get(0);
+							if(!masterEntity.getResourceName().equals(selfEntity.getResourceName())){
+								Date currentTime = new Date();
+								long timeDiff = 0;
+								timeDiff = currentTime.getTime()-masterEntity.getTimeStamp().getTime();
+								if(timeDiff > (pingInterval+1500)){
+									// This is down or has an issue and we need to become Master while turning the Master to slave.
+									masterEntity.setFlag("SLAVE");
+									String lastNotification = null;
+									if(masterEntity.getNotificationRecord()!=null){
+										lastNotification = calculatePatch(masterEntity.getNotificationRecord());
+									}
+									setLastNotification(lastNotification);
+									em.persist(masterEntity);
+									em.flush();
+									// Lets Become Master. 
+									selfEntity = setMaster(selfEntity);
+									LOGGER.info("Changing "+ resourceName + " from slave to Master Mode");
+									selfEntity.setTimeStamp(new Date());
+									selfEntity.setNotificationRecord(notificationRecord);
+									em.persist(selfEntity);
+									em.flush();
+								}
+							}
+						}else{
+							LOGGER.error("Backup Monitor Issue, Masters out of sync, This will be fixed in next interval.");
+						}
+					}
+				}
 			}
 			et.commit();
 		}catch(Exception e){
-			logger.error("failed Database Operation " + e.getMessage());
+			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());
+			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());
+				LOGGER.info("Generated New Notification is : " + patched.toString());
 				return patched.toString();
 			} catch (JsonPatchException e) {
-				logger.error("Error generating Patched "  +e.getMessage());
+				LOGGER.error("Error generating Patched "  +e.getMessage());
 				return null;
 			}
 		}catch(IOException e){
-			logger.error("Error generating Patched "  +e.getMessage());
+			LOGGER.error("Error generating Patched "  +e.getMessage());
 			return null;
 		}
 	}
@@ -346,31 +386,35 @@
 	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 ");
+					LOGGER.info("Performing Patched notification ");
 					try{
 						handler.runOnNotification(notificationObject);
+						notificationRecord = lastMasterNotification;
 					}catch (Exception e){
-						logger.error("Error in Clients Handler Object : " + e.getMessage());
+						LOGGER.error("Error in Clients Handler Object : " + e.getMessage());
 					}
 				}
 			} catch (IOException e) {
-				logger.info("Error while notification Conversion " + e.getMessage());
+				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")){
+				if(lastMasterNotification.equals(notificationRecord)){
+					return;
+				}
 				callHandler(notification);
 			}
 		}
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BusConsumer.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BusConsumer.java
new file mode 100644
index 0000000..9fcae39
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BusConsumer.java
@@ -0,0 +1,99 @@
+package org.openecomp.policy.utils;
+
+import java.util.List;
+import java.util.Properties;
+
+import com.att.nsa.mr.client.impl.MRConsumerImpl;
+import com.att.nsa.mr.test.clients.ProtocolTypeConstants;
+
+public interface BusConsumer {
+	
+	/**
+	 * fetch messages
+	 * 
+	 * @return list of messages
+	 * @throws Exception when error encountered by underlying libraries
+	 */
+	public Iterable<String> fetch() throws Exception;
+	
+	/**
+	 * close underlying library consumer
+	 */
+	public void close();
+	
+	/**
+	 * MR based consumer
+	 */
+	public static class DmaapConsumerWrapper implements BusConsumer {
+		
+		/**
+		 * MR Consumer
+		 */
+		protected MRConsumerImpl consumer;
+		
+		/**
+		 * MR Consumer Wrapper
+		 * 
+		 * @param servers messaging bus hosts
+		 * @param topic topic
+		 * @param apiKey API Key
+		 * @param apiSecret API Secret
+		 * @param aafLogin AAF Login
+		 * @param aafPassword AAF Password
+		 * @param consumerGroup Consumer Group
+		 * @param consumerInstance Consumer Instance
+		 * @param fetchTimeout Fetch Timeout
+		 * @param fetchLimit Fetch Limit
+		 */
+		public DmaapConsumerWrapper(List<String> servers, String topic, 
+								String aafLogin, String aafPassword,
+								String consumerGroup, String consumerInstance,
+								int fetchTimeout, int fetchLimit) 
+		throws Exception {
+					
+			this.consumer = new MRConsumerImpl(servers, topic, 
+											   consumerGroup, consumerInstance, 
+											   fetchTimeout, fetchLimit, 
+									           null, aafLogin, aafPassword);
+			
+			this.consumer.setUsername(aafLogin);
+			this.consumer.setPassword(aafPassword);
+			
+			this.consumer.setProtocolFlag(ProtocolTypeConstants.AAF_AUTH.getValue());
+			
+			Properties props = new Properties();
+			props.setProperty("Protocol", "http");
+			this.consumer.setProps(props);
+			this.consumer.setHost(servers.get(0) + ":3904");
+		}
+		
+		/**
+		 * {@inheritDoc}
+		 */
+		public Iterable<String> fetch() throws Exception {
+			return this.consumer.fetch();
+		}
+		
+		/**
+		 * {@inheritDoc}
+		 */
+		public void close() {
+			this.consumer.close();
+		}
+		
+		@Override
+		public String toString() {
+			StringBuilder builder = new StringBuilder();
+			builder.
+			append("DmaapConsumerWrapper [").
+			append("consumer.getAuthDate()=").append(consumer.getAuthDate()).
+			append(", consumer.getAuthKey()=").append(consumer.getAuthKey()).
+			append(", consumer.getHost()=").append(consumer.getHost()).
+			append(", consumer.getProtocolFlag()=").append(consumer.getProtocolFlag()).
+			append(", consumer.getUsername()=").append(consumer.getUsername()).
+			append("]");
+			return builder.toString();
+		}
+	}
+
+}
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BusPublisher.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BusPublisher.java
new file mode 100644
index 0000000..9c9e54b
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/BusPublisher.java
@@ -0,0 +1,119 @@
+package org.openecomp.policy.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+
+import com.att.nsa.mr.client.impl.MRSimplerBatchPublisher;
+import com.att.nsa.mr.test.clients.ProtocolTypeConstants;
+
+public interface BusPublisher {
+	
+	/**
+	 * sends a message
+	 * 
+	 * @param partition id
+	 * @param message the message
+	 * @return true if success, false otherwise
+	 * @throws IllegalArgumentException if no message provided
+	 */
+	public boolean send(String partitionId, String message) throws IllegalArgumentException;
+	
+	/**
+	 * closes the publisher
+	 */
+	public void close();
+	
+	/**
+	 * DmaapClient library wrapper
+	 */
+	public static class DmaapPublisherWrapper implements BusPublisher {
+		/**
+		 * MR based Publisher
+		 */		
+		protected MRSimplerBatchPublisher publisher;
+		
+		public DmaapPublisherWrapper(List<String> servers, String topic,
+				                     String aafLogin,
+				                     String aafPassword) {
+			
+			ArrayList<String> dmaapServers = new ArrayList<String>();
+			for (String server: servers) {
+				dmaapServers.add(server + ":3904");
+			}
+					
+			this.publisher = 
+				new MRSimplerBatchPublisher.Builder().
+			                                againstUrls(dmaapServers).
+			                                onTopic(topic).
+			                                build();
+			
+			this.publisher.setProtocolFlag(ProtocolTypeConstants.AAF_AUTH.getValue());
+			
+			this.publisher.setUsername(aafLogin);
+			this.publisher.setPassword(aafPassword);  
+			
+			Properties props = new Properties();
+			props.setProperty("Protocol", "http");
+			props.setProperty("contenttype", "application/json");
+			
+			this.publisher.setProps(props);
+			
+			this.publisher.setHost(servers.get(0));
+			
+			if (PolicyLogger.isInfoEnabled())
+				PolicyLogger.info(DmaapPublisherWrapper.class.getName(), 
+						          "CREATION: " + this);
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void close() {
+			if (PolicyLogger.isInfoEnabled())
+				PolicyLogger.info(DmaapPublisherWrapper.class.getName(), 
+				                  "CREATION: " + this);
+			
+			try {
+				this.publisher.close(1, TimeUnit.SECONDS);
+			} catch (Exception e) {
+				PolicyLogger.warn(DmaapPublisherWrapper.class.getName(), 
+				                  "CLOSE: " + this + " because of " + 
+								  e.getMessage());
+			}
+		}
+		
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public boolean send(String partitionId, String message) 
+				throws IllegalArgumentException {
+			if (message == null)
+				throw new IllegalArgumentException("No message provided");
+			
+			this.publisher.send(partitionId, message);
+			return true;
+			
+		}
+		
+		@Override
+		public String toString() {
+			StringBuilder builder = new StringBuilder();
+			builder.append("DmaapPublisherWrapper [").
+			append("publisher.getAuthDate()=").append(publisher.getAuthDate()).
+			append(", publisher.getAuthKey()=").append(publisher.getAuthKey()).
+			append(", publisher.getHost()=").append(publisher.getHost()).
+			append(", publisher.getProtocolFlag()=").append(publisher.getProtocolFlag()).
+			append(", publisher.getUsername()=").append(publisher.getUsername()).
+			append(", publisher.getPendingMessageCount()=").append(publisher.getPendingMessageCount()).
+			append("]");
+			return builder.toString();
+		}
+	}
+
+}
diff --git a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyAccess.java b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyAccess.java
index 6141a5f..bbbffec 100644
--- a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyAccess.java
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyAccess.java
@@ -101,7 +101,6 @@
 
 	@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
index fd8102a..7519793 100644
--- a/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyUtils.java
+++ b/PolicyEngineUtils/src/main/java/org/openecomp/policy/utils/PolicyUtils.java
@@ -21,16 +21,34 @@
 package org.openecomp.policy.utils;
 
 import java.io.IOException;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
 import java.util.Base64;
+import java.util.List;
 import java.util.StringTokenizer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.drools.core.io.impl.ReaderResource;
+import org.drools.verifier.Verifier;
+import org.drools.verifier.VerifierError;
+import org.drools.verifier.builder.VerifierBuilder;
+import org.drools.verifier.builder.VerifierBuilderFactory;
+import org.kie.api.io.ResourceType;
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.CharMatcher;
 
 public class PolicyUtils {
 	
+	public static final String EMAIL_PATTERN =
+            "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
+	
 	public static String objectToJsonString(Object o) throws JsonProcessingException{
 		ObjectMapper mapper = new ObjectMapper();
 		return mapper.writeValueAsString(o);
@@ -42,6 +60,14 @@
 		return t;
 	}
 	
+	public static String decode(String encodedString) throws UnsupportedEncodingException { 
+		if(encodedString!=null && !encodedString.isEmpty()){ 
+			return new String(Base64.getDecoder().decode(encodedString) ,"UTF-8"); 
+		}else{ 
+			return null; 
+		} 
+	}
+	
 	public static String[] decodeBasicEncoding(String encodedValue) throws Exception{
 		if(encodedValue!=null && encodedValue.contains("Basic ")){
 			String encodedUserPassword = encodedValue.replaceFirst("Basic"	+ " ", "");
@@ -56,4 +82,87 @@
 			return null;
 		}
 	}
+	
+	public static String  emptyPolicyValidator(String field){
+        String error = "success";
+        if (field.equals("") || field.contains(" ") || !field.matches("^[a-zA-Z0-9_]*$")) {
+            error = "The Value in Required Field will allow only '{0-9}, {a-z}, {A-Z}, _' following set of Combinations";
+            return error;
+        } else {
+            if(CharMatcher.ASCII.matchesAllOf((CharSequence) field)){
+                 error = "success";
+            }else{
+                error = "The Value Contains Non ASCII Characters";
+                return error;
+            }   
+        }
+        return error;   
+    } 
+    
+    public static String descriptionValidator(String field) {
+        String error = "success";
+        if (field.contains("@CreatedBy:") || field.contains("@ModifiedBy:")) {
+             error = "The value in the description shouldn't contain @CreatedBy: or @ModifiedBy:";
+             return error;
+        } else {
+            error = "success";
+        }
+        return error;   
+    }
+    
+    public static String validateEmailAddress(String emailAddressValue) {
+        String error = "success";
+        List<String> emailList = Arrays.asList(emailAddressValue.toString().split(","));
+        for(int i =0 ; i < emailList.size() ; i++){
+            Pattern pattern = Pattern.compile(EMAIL_PATTERN);
+            Matcher matcher = pattern.matcher(emailList.get(i).trim());
+            if(!matcher.matches()){
+                error = "Please check the Following Email Address is not Valid ....   " +emailList.get(i).toString();
+                return error;
+            }else{
+                error = "success";
+            }
+        }
+        return error;       
+    }
+    
+    /*
+     * Check for "[ERR" to see if there are any errors. 
+     */
+    public static String brmsRawValidate(String rule){
+        VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder();
+        Verifier verifier = vBuilder.newVerifier();
+        verifier.addResourcesToVerify(new ReaderResource(new StringReader(rule)), ResourceType.DRL);
+        // Check if there are any Errors in Verification. 
+        if(verifier.getErrors().size()!=0){
+            String message = "Not a Valid DRL rule"; 
+            for(VerifierError error: verifier.getErrors()){
+                // Ignore annotations Error Messages
+                if(!error.getMessage().contains("'@'")){
+                    message = message + "\n" + error.getMessage();
+                }
+            }
+            return message;
+        }
+        return "";
+    }
+    
+    /**
+	 * Given a version string consisting of integers with dots between them, convert it into an array of ints.
+	 * 
+	 * @param version
+	 * @return
+	 * @throws NumberFormatException
+	 */
+	public static int[] versionStringToArray(String version) throws NumberFormatException {
+		if (version == null || version.length() == 0) {
+			return new int[0];
+		}
+		String[] stringArray = version.split("\\.");
+		int[] resultArray = new int[stringArray.length];
+		for (int i = 0; i < stringArray.length; i++) {
+			resultArray[i] = Integer.parseInt(stringArray[i]);
+		}
+		return resultArray;
+	}
 }