aboutsummaryrefslogtreecommitdiffstats
path: root/PolicyEngineUtils/src/main/java/org/onap
diff options
context:
space:
mode:
Diffstat (limited to 'PolicyEngineUtils/src/main/java/org/onap')
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/api/LoadedPolicy.java57
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/api/NotificationHandler.java34
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/api/NotificationType.java58
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/api/PDPNotification.java52
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/api/PEDependency.java90
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/api/RemovedPolicy.java41
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/api/UpdateType.java54
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/jpa/BackUpMonitorEntity.java117
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/std/NotificationStore.java264
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/std/StdLoadedPolicy.java72
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/std/StdPDPNotification.java80
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/std/StdRemovedPolicy.java49
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFEnvironment.java29
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClient.java40
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClientImpl.java214
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyException.java48
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/utils/BackUpHandler.java41
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/utils/BackUpMonitor.java422
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusConsumer.java99
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusPublisher.java119
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyAccess.java106
-rw-r--r--PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyUtils.java201
22 files changed, 2287 insertions, 0 deletions
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/api/LoadedPolicy.java b/PolicyEngineUtils/src/main/java/org/onap/policy/api/LoadedPolicy.java
new file mode 100644
index 000000000..25636fb45
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/api/LoadedPolicy.java
@@ -0,0 +1,57 @@
+/*-
+ * ============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.onap.policy.api;
+
+import java.util.Map;
+/**
+ * <code>LoadedPolicy</code> defines the Policy that has been Loaded into the PDP.
+ *
+ * @version 0.2
+ */
+public interface LoadedPolicy {
+ /**
+ * Gets the <code>String</code> format of the Policy Name that has been Loaded into the PDP.
+ *
+ * @return <code>String</code> format of Policy Name
+ */
+ public String getPolicyName();
+
+ /**
+ * Gets the <code>String</code> format of the Policy Version that has been Loaded into the PDP.
+ *
+ * @return <code>String</code> format of the Policy Version.
+ */
+ public String getVersionNo();
+
+ /**
+ * Gets the <code>Map</code> of <code>String,String</code> format of the Matches if the policy Loaded is of Config Type.
+ *
+ * @return the <code>Map</code> of <code>String,String</code> format of the matches in the policy.
+ */
+ public Map<String, String> getMatches();
+
+ /**
+ * Gets the <code>UpdateType</code> of {@link org.onap.policy.api.UpdateType} received.
+ *
+ * @return <code>UpdateType</code> associated with this <code>PDPNotification</code>
+ */
+ public UpdateType getUpdateType();
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/api/NotificationHandler.java b/PolicyEngineUtils/src/main/java/org/onap/policy/api/NotificationHandler.java
new file mode 100644
index 000000000..6484a9d7e
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/api/NotificationHandler.java
@@ -0,0 +1,34 @@
+/*-
+ * ============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.onap.policy.api;
+/**
+ * Defines the methods which need to run when an Event or Notification is received.
+ *
+ * @version 0.1
+ */
+public interface 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.onap.policy.api.PDPNotification} is the object that has information of the notification.
+ */
+ public void notificationReceived(PDPNotification notification);
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/api/NotificationType.java b/PolicyEngineUtils/src/main/java/org/onap/policy/api/NotificationType.java
new file mode 100644
index 000000000..730ad022d
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/api/NotificationType.java
@@ -0,0 +1,58 @@
+/*-
+ * ============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.onap.policy.api;
+
+/**
+ * Enumeration of the Update Type that has occurred in the <code>PDPNotification</code> of
+ * {@link org.onap.policy.api.PDPNotification}
+ *
+ * @version 0.1
+ */
+public enum NotificationType {
+ /**
+ * Indicates that a policy has been updated
+ */
+ UPDATE("update"),
+ /**
+ * Indicates that a policy has been removed
+ */
+ REMOVE("remove"),
+ /**
+ * Indicates that both update and removal of policy events has occurred.
+ */
+ BOTH("both")
+ ;
+
+ private String name;
+
+ private NotificationType(String name){
+ this.name = name;
+ }
+
+ /**
+ * Returns the <code>String</code> format of the Type for this <code>UpdateType</code>
+ * @return the <code>String</code> Type of <code>UpdateType</code>
+ */
+ @Override
+ public String toString(){
+ return this.name;
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/api/PDPNotification.java b/PolicyEngineUtils/src/main/java/org/onap/policy/api/PDPNotification.java
new file mode 100644
index 000000000..a88ec06cb
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/api/PDPNotification.java
@@ -0,0 +1,52 @@
+/*-
+ * ============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.onap.policy.api;
+
+import java.util.Collection;
+
+/**
+ * Defines the <code>Notification</code> event sent from PDP to Client PEP.
+ *
+ * @version 0.2
+ */
+public interface PDPNotification {
+ /**
+ * Gets the <code>Collection</code> of {@link org.onap.policy.api.RemovedPolicy} objects received.
+ *
+ * @return the <code>Collection</code> which consists of <code>RemovedPolicy</code> objects.
+ */
+ public Collection<RemovedPolicy> getRemovedPolicies();
+
+ /**
+ * Gets the <code>Collection</code> of {@link org.onap.policy.api.LoadedPolicy} objects receieved.
+ *
+ * @return the <code>Collection</code> which consists of <code>UpdatedPolicy</code> objects.
+ */
+ public Collection<LoadedPolicy> getLoadedPolicies();
+
+ /**
+ * Gets the <code>NotificationType</code> of {@link org.onap.policy.api.NotificationType} received.
+ *
+ * @return <code>NotificationType</code> associated with this <code>PDPNotification</code>
+ */
+ public NotificationType getNotificationType();
+
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/api/PEDependency.java b/PolicyEngineUtils/src/main/java/org/onap/policy/api/PEDependency.java
new file mode 100644
index 000000000..d722f1696
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/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.onap.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/onap/policy/api/RemovedPolicy.java b/PolicyEngineUtils/src/main/java/org/onap/policy/api/RemovedPolicy.java
new file mode 100644
index 000000000..f26c1499a
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/api/RemovedPolicy.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.onap.policy.api;
+/**
+ * <code>RemovedPolicy</code> defines the Policy that has been removed
+ *
+ * @version 0.1
+ */
+public interface RemovedPolicy {
+ /**
+ * Gets the <code>String</code> format of the Policy Name that has been removed.
+ *
+ * @return <code>String</code> format of Policy Name
+ */
+ public String getPolicyName();
+
+ /**
+ * Gets the <code>String</code> format of the Policy Version that has been removed.
+ *
+ * @return <code>String</code> format of Policy Version
+ */
+ public String getVersionNo();
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/api/UpdateType.java b/PolicyEngineUtils/src/main/java/org/onap/policy/api/UpdateType.java
new file mode 100644
index 000000000..deeecddd0
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/api/UpdateType.java
@@ -0,0 +1,54 @@
+/*-
+ * ============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.onap.policy.api;
+
+/**
+ * Enumeration of the Update Type that has occurred in the <code>UpdatedPolicy</code> of
+ * {@link org.onap.policy.api.LoadedPolicy}
+ *
+ * @version 0.1
+ */
+public enum UpdateType {
+ /**
+ * Indicates that a policy has been updated
+ */
+ UPDATE("update"),
+ /**
+ * Indicates that a policy is new
+ */
+ NEW("new")
+ ;
+
+ private String name;
+
+ private UpdateType(String name){
+ this.name = name;
+ }
+
+ /**
+ * Returns the <code>String</code> format of the Type for this <code>UpdateType</code>
+ * @return the <code>String</code> Type of <code>UpdateType</code>
+ */
+ @Override
+ public String toString(){
+ return this.name;
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/jpa/BackUpMonitorEntity.java b/PolicyEngineUtils/src/main/java/org/onap/policy/jpa/BackUpMonitorEntity.java
new file mode 100644
index 000000000..f2e7f3ff8
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/jpa/BackUpMonitorEntity.java
@@ -0,0 +1,117 @@
+/*-
+ * ============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.onap.policy.jpa;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.NamedQuery;
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+
+@Entity
+@Table(name="BackUpMonitorEntity")
+@NamedQuery(name="BackUpMonitorEntity.findAll", query= "SELECT b FROM BackUpMonitorEntity b ")
+public class BackUpMonitorEntity implements Serializable{
+ private static final long serialVersionUID = -9190606334322230630L;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Column(name="id")
+ private int id;
+
+ @Column(name="node_name", nullable=false)
+ private String resourceNodeName;
+
+ @Column(name="resource_name", nullable=false, unique=true)
+ private String resourceName;
+
+ @Column(name="flag", nullable=false)
+ private String flag;
+
+ @Lob
+ @Column(name="notification_record")
+ private String notificationRecord;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name="last_seen")
+ private Date timeStamp;
+
+ @PrePersist
+ public void prePersist(){
+ this.timeStamp = new Date();
+ }
+
+ @PreUpdate
+ public void preUpdate(){
+ this.timeStamp = new Date();
+ }
+
+ public String getResourceName(){
+ return this.resourceName;
+ }
+
+ public String getResourceNodeName(){
+ return this.resourceNodeName;
+ }
+
+ public String getFlag(){
+ return this.flag;
+ }
+
+ public String getNotificationRecord(){
+ return this.notificationRecord;
+ }
+
+ public Date getTimeStamp(){
+ return this.timeStamp;
+ }
+
+ public void setResourceName(String resourceName){
+ this.resourceName = resourceName;
+ }
+
+ public void setResoruceNodeName(String resourceNodeName){
+ this.resourceNodeName = resourceNodeName;
+ }
+
+ public void setFlag(String flag){
+ this.flag = flag;
+ }
+
+ public void setNotificationRecord(String notificationRecord){
+ this.notificationRecord = notificationRecord;
+ }
+
+ public void setTimeStamp(Date timeStamp){
+ this.timeStamp = timeStamp;
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/std/NotificationStore.java b/PolicyEngineUtils/src/main/java/org/onap/policy/std/NotificationStore.java
new file mode 100644
index 000000000..8a401c4cc
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/std/NotificationStore.java
@@ -0,0 +1,264 @@
+/*-
+ * ============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.onap.policy.std;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.onap.policy.api.LoadedPolicy;
+import org.onap.policy.api.NotificationType;
+import org.onap.policy.api.PDPNotification;
+import org.onap.policy.api.RemovedPolicy;
+
+
+/*
+ * This Should Compare and save the Notifications from the beginning of Time.
+ * If there is something new (missed) We notify the client.
+ * Works for PDP failures.
+ *
+ */
+public class NotificationStore {
+ private static StdPDPNotification notificationRecord = new StdPDPNotification();
+
+ public static StdPDPNotification getDeltaNotification(StdPDPNotification newNotification){
+ StdPDPNotification notificationDelta = new StdPDPNotification();
+ ArrayList<StdRemovedPolicy> removedDelta = new ArrayList<>();
+ ArrayList<StdLoadedPolicy> updatedDelta = new ArrayList<>();
+ Collection<StdLoadedPolicy> newUpdatedPolicies = new ArrayList<>();
+ Collection<StdRemovedPolicy> newRemovedPolicies = new ArrayList<>();
+ Collection<LoadedPolicy> oldUpdatedLostPolicies = notificationRecord.getLoadedPolicies();
+ Collection<RemovedPolicy> oldRemovedPolicies = notificationRecord.getRemovedPolicies();
+ Collection<LoadedPolicy> oldUpdatedPolicies = notificationRecord.getLoadedPolicies();
+ Boolean update = false;
+ Boolean remove = false;
+ // if the NotificationRecord is empty
+ if(notificationRecord.getRemovedPolicies()==null || notificationRecord.getLoadedPolicies()==null){
+ if(newNotification!=null){
+ notificationRecord = newNotification;
+ }
+ return notificationDelta;
+ }
+ // do the Delta operation.
+ if(newNotification!=null){
+ // check for old removed policies.
+ if(!newNotification.getRemovedPolicies().isEmpty()){
+ for(RemovedPolicy newRemovedPolicy: newNotification.getRemovedPolicies()){
+ //Look for policy Not in Remove
+ Boolean removed = true;
+ for(RemovedPolicy oldRemovedPolicy: notificationRecord.getRemovedPolicies()){
+ if(newRemovedPolicy.getPolicyName().equals(oldRemovedPolicy.getPolicyName())){
+ if(newRemovedPolicy.getVersionNo().equals(oldRemovedPolicy.getVersionNo())){
+ removed = false;
+ // Don't want a duplicate.
+ oldRemovedPolicies.remove(oldRemovedPolicy);
+ }
+ }
+ }
+ //We need to change our record we have an Update record of this remove.
+ for(LoadedPolicy oldUpdatedPolicy: notificationRecord.getLoadedPolicies()){
+ if(newRemovedPolicy.getPolicyName().equals(oldUpdatedPolicy.getPolicyName())){
+ if(newRemovedPolicy.getVersionNo().equals(oldUpdatedPolicy.getVersionNo())){
+ oldUpdatedPolicies.remove(oldUpdatedPolicy);
+ oldUpdatedLostPolicies.remove(oldUpdatedPolicy);
+ }
+ }
+ }
+ if(removed){
+ remove = true;
+ notificationRecord.getRemovedPolicies().add(newRemovedPolicy);
+ removedDelta.add((StdRemovedPolicy)newRemovedPolicy);
+ }
+ // This will be converted to New Later.
+ oldRemovedPolicies.add(newRemovedPolicy);
+ }
+ }
+ // Check for old Updated Policies.
+ if(!newNotification.getLoadedPolicies().isEmpty()){
+ for(LoadedPolicy newUpdatedPolicy: newNotification.getLoadedPolicies()){
+ // Look for policies which are not in Update
+ Boolean updated = true;
+ for(LoadedPolicy oldUpdatedPolicy: notificationRecord.getLoadedPolicies()){
+ if(newUpdatedPolicy.getPolicyName().equals(oldUpdatedPolicy.getPolicyName())){
+ if(newUpdatedPolicy.getVersionNo().equals(oldUpdatedPolicy.getVersionNo())){
+ updated = false;
+ // Remove the policy from copy.
+ oldUpdatedLostPolicies.remove(oldUpdatedPolicy);
+ // Eliminating Duplicate.
+ oldUpdatedPolicies.remove(oldUpdatedPolicy);
+ }
+ }
+ }
+ // Change the record if the policy has been Removed earlier.
+ for(RemovedPolicy oldRemovedPolicy: notificationRecord.getRemovedPolicies()){
+ if(oldRemovedPolicy.getPolicyName().equals(newUpdatedPolicy.getPolicyName())){
+ if(oldRemovedPolicy.getVersionNo().equals(newUpdatedPolicy.getVersionNo())){
+ oldRemovedPolicies.remove(oldRemovedPolicy);
+ }
+ }
+ }
+ if(updated){
+ update = true;
+ updatedDelta.add((StdLoadedPolicy)newUpdatedPolicy);
+ }
+ // This will be converted to new Later
+ oldUpdatedPolicies.add(newUpdatedPolicy);
+ }
+ // Conversion of Update to Remove if that occurred.
+ if(!oldUpdatedLostPolicies.isEmpty()){
+ for(LoadedPolicy updatedPolicy: oldUpdatedLostPolicies){
+ StdRemovedPolicy removedPolicy = new StdRemovedPolicy();
+ removedPolicy.setPolicyName(updatedPolicy.getPolicyName());
+ removedPolicy.setVersionNo(updatedPolicy.getVersionNo());
+ removedDelta.add(removedPolicy);
+ remove = true;
+ }
+ }
+ }
+ // Update our Record.
+ if(!oldUpdatedPolicies.isEmpty()){
+ for(LoadedPolicy updatedPolicy: oldUpdatedPolicies){
+ newUpdatedPolicies.add((StdLoadedPolicy)updatedPolicy);
+ }
+ }
+ if(!oldRemovedPolicies.isEmpty()){
+ for(RemovedPolicy removedPolicy: oldRemovedPolicies){
+ newRemovedPolicies.add((StdRemovedPolicy)removedPolicy);
+ }
+ }
+ notificationRecord.setRemovedPolicies(newRemovedPolicies);
+ notificationRecord.setLoadedPolicies(newUpdatedPolicies);
+ // Update the notification Result.
+ notificationDelta.setRemovedPolicies(removedDelta);
+ notificationDelta.setLoadedPolicies(updatedDelta);
+ if(remove&&update){
+ notificationDelta.setNotificationType(NotificationType.BOTH);
+ }else if(remove){
+ notificationDelta.setNotificationType(NotificationType.REMOVE);
+ }else if(update){
+ notificationDelta.setNotificationType(NotificationType.UPDATE);
+ }
+ }
+ return notificationDelta;
+ }
+
+ public static void recordNotification(StdPDPNotification notification){
+ if(notification!=null){
+ if(notificationRecord.getRemovedPolicies()==null || notificationRecord.getLoadedPolicies()==null){
+ notificationRecord = notification;
+ }else{
+ // Check if there is anything new and update the record.
+ if(notificationRecord.getLoadedPolicies()!=null || notificationRecord.getRemovedPolicies()!=null){
+ HashSet<StdRemovedPolicy> removedPolicies = new HashSet<>();
+ for(RemovedPolicy rPolicy: notificationRecord.getRemovedPolicies()){
+ StdRemovedPolicy sRPolicy = new StdRemovedPolicy();
+ sRPolicy.setPolicyName(rPolicy.getPolicyName());
+ sRPolicy.setVersionNo(rPolicy.getVersionNo());
+ removedPolicies.add(sRPolicy);
+ }
+ HashSet<StdLoadedPolicy> updatedPolicies = new HashSet<>();
+ for(LoadedPolicy uPolicy: notificationRecord.getLoadedPolicies()){
+ StdLoadedPolicy sUPolicy = new StdLoadedPolicy();
+ sUPolicy.setMatches(uPolicy.getMatches());
+ sUPolicy.setPolicyName(uPolicy.getPolicyName());
+ sUPolicy.setVersionNo(uPolicy.getVersionNo());
+ updatedPolicies.add(sUPolicy);
+ }
+
+ // Checking with the new updated policies.
+ if(notification.getLoadedPolicies()!=null && !notification.getLoadedPolicies().isEmpty()){
+ for(LoadedPolicy newUpdatedPolicy: notification.getLoadedPolicies()){
+ // If it was removed earlier then we need to remove from our record
+ Iterator<StdRemovedPolicy> oldRemovedPolicy = removedPolicies.iterator();
+ while(oldRemovedPolicy.hasNext()){
+ RemovedPolicy 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<StdLoadedPolicy> oldUpdatedPolicy = updatedPolicies.iterator();
+ while(oldUpdatedPolicy.hasNext()){
+ LoadedPolicy policy = oldUpdatedPolicy.next();
+ if(newUpdatedPolicy.getPolicyName().equals(policy.getPolicyName())) {
+ if(newUpdatedPolicy.getVersionNo().equals(policy.getVersionNo())) {
+ oldUpdatedPolicy.remove();
+ }
+ }
+ }
+ StdLoadedPolicy sUPolicy = new StdLoadedPolicy();
+ sUPolicy.setMatches(newUpdatedPolicy.getMatches());
+ sUPolicy.setPolicyName(newUpdatedPolicy.getPolicyName());
+ sUPolicy.setVersionNo(newUpdatedPolicy.getVersionNo());
+ updatedPolicies.add(sUPolicy);
+ }
+ }
+ // Checking with New Removed Policies.
+ if(notification.getRemovedPolicies()!=null && !notification.getRemovedPolicies().isEmpty()){
+ for(RemovedPolicy newRemovedPolicy : notification.getRemovedPolicies()){
+ // If it was previously removed Overwrite it to the record.
+ Iterator<StdRemovedPolicy> oldRemovedPolicy = removedPolicies.iterator();
+ while(oldRemovedPolicy.hasNext()){
+ RemovedPolicy 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<StdLoadedPolicy> oldUpdatedPolicy = updatedPolicies.iterator();
+ while(oldUpdatedPolicy.hasNext()){
+ LoadedPolicy policy = oldUpdatedPolicy.next();
+ if(newRemovedPolicy.getPolicyName().equals(policy.getPolicyName())) {
+ if(newRemovedPolicy.getVersionNo().equals(policy.getVersionNo())) {
+ oldUpdatedPolicy.remove();
+ }
+ }
+ }
+ StdRemovedPolicy sRPolicy = new StdRemovedPolicy();
+ sRPolicy.setPolicyName(newRemovedPolicy.getPolicyName());
+ sRPolicy.setVersionNo(newRemovedPolicy.getVersionNo());
+ removedPolicies.add(sRPolicy);
+ }
+ }
+ notificationRecord.setRemovedPolicies(removedPolicies);
+ notificationRecord.setLoadedPolicies(updatedPolicies);
+ }
+ if(!notificationRecord.getLoadedPolicies().isEmpty() && !notificationRecord.getRemovedPolicies().isEmpty()){
+ notificationRecord.setNotificationType(NotificationType.BOTH);
+ }else if(!notificationRecord.getLoadedPolicies().isEmpty()){
+ notificationRecord.setNotificationType(NotificationType.UPDATE);
+ }else if(!notificationRecord.getRemovedPolicies().isEmpty()){
+ notificationRecord.setNotificationType(NotificationType.REMOVE);
+ }
+ }
+ }
+ }
+
+ // This should return the current Notification Record.
+ public static PDPNotification getNotificationRecord(){
+ return notificationRecord;
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdLoadedPolicy.java b/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdLoadedPolicy.java
new file mode 100644
index 000000000..c1f4fed7f
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdLoadedPolicy.java
@@ -0,0 +1,72 @@
+/*-
+ * ============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.onap.policy.std;
+
+import java.util.Map;
+
+import org.onap.policy.api.LoadedPolicy;
+import org.onap.policy.api.UpdateType;
+
+public class StdLoadedPolicy implements LoadedPolicy{
+ private String policyName = null;
+ private String versionNo = null;
+ private Map<String,String> matches = null;
+ private UpdateType updateType = null;
+
+ @Override
+ public String getPolicyName() {
+ if(policyName!=null && policyName.contains(".xml")){
+ return (policyName.substring(0, policyName.substring(0, policyName.lastIndexOf(".")).lastIndexOf(".")));
+ }
+ return this.policyName;
+ }
+
+ public void setPolicyName(String policyName) {
+ this.policyName = policyName;
+ }
+
+ @Override
+ public String getVersionNo() {
+ return this.versionNo;
+ }
+
+ public void setVersionNo(String versionNo) {
+ this.versionNo = versionNo;
+ }
+
+ @Override
+ public Map<String,String> getMatches() {
+ return this.matches;
+ }
+
+ public void setMatches(Map<String,String> matches) {
+ this.matches = matches;
+ }
+
+ @Override
+ public UpdateType getUpdateType() {
+ return this.updateType;
+ }
+
+ public void setUpdateType(UpdateType updateType){
+ this.updateType = updateType;
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdPDPNotification.java b/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdPDPNotification.java
new file mode 100644
index 000000000..fe7807185
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdPDPNotification.java
@@ -0,0 +1,80 @@
+/*-
+ * ============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.onap.policy.std;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import org.onap.policy.api.LoadedPolicy;
+import org.onap.policy.api.NotificationType;
+import org.onap.policy.api.PDPNotification;
+import org.onap.policy.api.RemovedPolicy;
+
+public class StdPDPNotification implements PDPNotification{
+ private Collection<StdRemovedPolicy> removedPolicies = null;
+ private Collection<StdLoadedPolicy> loadedPolicies = null;
+ private Collection<RemovedPolicy> removed = null;
+ private Collection<LoadedPolicy> updated = null;
+ private NotificationType notificationType= null;
+
+ @Override
+ public Collection<RemovedPolicy> getRemovedPolicies() {
+ removed = new HashSet<RemovedPolicy>();
+ if(removedPolicies!=null){
+ for(RemovedPolicy removedPolicy: removedPolicies){
+ removed.add(removedPolicy);
+ }
+ return this.removed;
+ }else{
+ return null;
+ }
+ }
+
+ @Override
+ public Collection<LoadedPolicy> getLoadedPolicies() {
+ updated = new HashSet<LoadedPolicy>();
+ if(loadedPolicies!=null){
+ for(LoadedPolicy updatedPolicy: loadedPolicies){
+ updated.add(updatedPolicy);
+ }
+ return updated;
+ }else{
+ return null;
+ }
+ }
+
+ @Override
+ public NotificationType getNotificationType() {
+ return notificationType;
+ }
+
+ public void setNotificationType(NotificationType notificationType){
+ this.notificationType= notificationType;
+ }
+
+ public void setLoadedPolicies(Collection<StdLoadedPolicy> loadedPolicies) {
+ this.loadedPolicies = loadedPolicies;
+ }
+
+ public void setRemovedPolicies(Collection<StdRemovedPolicy> removedPolicies) {
+ this.removedPolicies = removedPolicies;
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdRemovedPolicy.java b/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdRemovedPolicy.java
new file mode 100644
index 000000000..bdce33a3b
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/std/StdRemovedPolicy.java
@@ -0,0 +1,49 @@
+/*-
+ * ============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.onap.policy.std;
+
+import org.onap.policy.api.RemovedPolicy;
+
+public class StdRemovedPolicy implements RemovedPolicy{
+ private String policyName = null;
+ private String versionNo = null;
+
+ @Override
+ public String getVersionNo() {
+ return this.versionNo;
+ }
+
+ public void setVersionNo(String versionNo) {
+ this.versionNo = versionNo;
+ }
+
+ @Override
+ public String getPolicyName() {
+ if(policyName!=null && policyName.contains(".xml")){
+ return (policyName.substring(0, policyName.substring(0, policyName.lastIndexOf(".")).lastIndexOf(".")));
+ }
+ return this.policyName;
+ }
+
+ public void setPolicyName(String policyName) {
+ this.policyName = policyName;
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFEnvironment.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFEnvironment.java
new file mode 100644
index 000000000..1fccabcbd
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFEnvironment.java
@@ -0,0 +1,29 @@
+/*-
+ * ============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.onap.policy.utils;
+
+public enum AAFEnvironment {
+ /*
+ * Enumeration for the Resource Node Naming. Add here if required.
+ */
+ DEVL,
+ TEST,
+ PROD
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClient.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClient.java
new file mode 100644
index 000000000..e560d0ecc
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClient.java
@@ -0,0 +1,40 @@
+/*-
+ * ============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.onap.policy.utils;
+
+import java.lang.reflect.Method;
+import java.util.Properties;
+
+public interface AAFPolicyClient {
+
+ 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", AAFPolicyClientImpl.class.getName()));
+ Method method = aafPolicyClient.getMethod("getInstance", Properties.class);
+ return (AAFPolicyClient) method.invoke(null, properties);
+ } catch (Exception e) {
+ throw new AAFPolicyException(e);
+ }
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClientImpl.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClientImpl.java
new file mode 100644
index 000000000..0f4876051
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyClientImpl.java
@@ -0,0 +1,214 @@
+/*-
+ * ============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.onap.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 static 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(AAFEnvironment.TEST.toString())){
+ props.setProperty(Config.AAF_URL, TEST_AAF_URL);
+ }else if(properties.getProperty(ENVIRONMENT, "DEVL").equalsIgnoreCase(AAFEnvironment.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){
+ return checkAuth(mechID, pass) && checkPerm(mechID, pass, type, instance, action);
+ }
+
+ /**
+ * 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() + e);
+ }
+ }
+ 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() + e);
+ 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 static 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() + e);
+ return false;
+ }
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyException.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/AAFPolicyException.java
new file mode 100644
index 000000000..d476d2c95
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/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.onap.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/onap/policy/utils/BackUpHandler.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BackUpHandler.java
new file mode 100644
index 000000000..f45ba56da
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/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.onap.policy.utils;
+
+import org.onap.policy.api.NotificationHandler;
+import org.onap.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.onap.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.onap.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/onap/policy/utils/BackUpMonitor.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BackUpMonitor.java
new file mode 100644
index 000000000..6fff797a6
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BackUpMonitor.java
@@ -0,0 +1,422 @@
+/*-
+ * ============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.onap.policy.utils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+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.onap.policy.api.PDPNotification;
+import org.onap.policy.jpa.BackUpMonitorEntity;
+import org.onap.policy.std.NotificationStore;
+import org.onap.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 = 15000; // 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);
+ 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 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 for other Master(s)
+ ArrayList<BackUpMonitorEntity> masterEntities = new ArrayList<>();
+ // 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. ");
+ em.refresh(bMEntity);
+ if(bMEntity.getFlag().equalsIgnoreCase("MASTER")){
+ masterEntities.add(bMEntity);
+ }
+ if(bMEntity.getResourceName().equals(resourceName)){
+ selfEntity = bMEntity;
+ }
+ }
+ 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{
+ // Already Slave Mode.
+ setFlag(false);
+ selfEntity.setTimeStamp(new Date());
+ selfEntity.setNotificationRecord(notificationRecord);
+ em.persist(selfEntity);
+ em.flush();
+ LOGGER.info(resourceName + " is on Slave Mode");
+ }
+ }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<>();
+ 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());
+ 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);
+ notificationRecord = lastMasterNotification;
+ }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")){
+ if(lastMasterNotification.equals(notificationRecord)){
+ return;
+ }
+ callHandler(notification);
+ }
+ }
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusConsumer.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusConsumer.java
new file mode 100644
index 000000000..bf92835c6
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusConsumer.java
@@ -0,0 +1,99 @@
+package org.onap.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/onap/policy/utils/BusPublisher.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusPublisher.java
new file mode 100644
index 000000000..792c389ab
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/BusPublisher.java
@@ -0,0 +1,119 @@
+package org.onap.policy.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+import org.onap.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<>();
+ 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/onap/policy/utils/PolicyAccess.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyAccess.java
new file mode 100644
index 000000000..ea1514a0f
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyAccess.java
@@ -0,0 +1,106 @@
+/*-
+ * ============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.onap.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) {
+ return false;
+ }
+}
diff --git a/PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyUtils.java b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyUtils.java
new file mode 100644
index 000000000..82340c13c
--- /dev/null
+++ b/PolicyEngineUtils/src/main/java/org/onap/policy/utils/PolicyUtils.java
@@ -0,0 +1,201 @@
+/*-
+ * ============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.onap.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.JsonProcessingException;
+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,})$";
+ private static final String PACKAGE_ERROR = "mismatched input '{' expecting one of the following tokens: '[package";
+ private static final String SUCCESS = "success";
+
+ private PolicyUtils(){
+ // Private Constructor
+ }
+ 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 IOException{
+ ObjectMapper mapper = new ObjectMapper();
+ return mapper.readValue(jsonString, className);
+ }
+
+ 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" + " ", "");
+ 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 new String[]{};
+ }
+ }
+
+ public static String emptyPolicyValidator(String field){
+ String error;
+ if ("".equals(field) || 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 emptyPolicyValidatorWithSpaceAllowed(String field){
+ String error;
+ if ("".equals(field) || !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;
+ 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 Boolean isInteger(String number){
+ try{
+ Integer.parseInt(number);
+ }catch(NumberFormatException e){
+ return false;
+ }
+ return true;
+ }
+
+ public static String validateEmailAddress(String emailAddressValue) {
+ String error = SUCCESS;
+ List<String> emailList = Arrays.asList(emailAddressValue.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);
+ 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().isEmpty()){
+ boolean ignore = false;
+ StringBuilder message = new StringBuilder("Not a Valid DRL rule");
+ for(VerifierError error: verifier.getErrors()){
+ // Ignore annotations Error Messages
+ if(!error.getMessage().contains("'@'") && !error.getMessage().contains(PACKAGE_ERROR)){
+ ignore= true;
+ message.append("\n" + error.getMessage());
+ }
+ }
+ // Ignore new package names with {
+ // More checks for message to check if its a package error.
+ if(ignore && !message.toString().contains("Parser returned a null Package")){
+ message.append("[ERR 107]");
+ }
+ return message.toString();
+ }
+ 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;
+ }
+}