summaryrefslogtreecommitdiffstats
path: root/BRMSGateway/src/main/java/org/onap
diff options
context:
space:
mode:
authorGuo Ruijing <ruijing.guo@intel.com>2017-07-31 08:47:35 +0000
committerPamela Dragosh <pdragosh@research.att.com>2017-07-31 15:51:10 -0400
commit073cc188efe9abb4c010cf674e34e2cf46ef1c52 (patch)
tree155c23fbdf3a838ecb5f4183fc3bb6b09aac41eb /BRMSGateway/src/main/java/org/onap
parent4ca818fdfb9b807562166800a086b413593d6894 (diff)
[POLICY-73] replace openecomp for policy-engine
Change-Id: I54072f6bcd388c0e05562614ee89b4ae7ad67004 Signed-off-by: Guo Ruijing <ruijing.guo@intel.com> Signed-off-by: Pamela Dragosh <pdragosh@research.att.com>
Diffstat (limited to 'BRMSGateway/src/main/java/org/onap')
-rw-r--r--BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSGateway.java88
-rw-r--r--BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSHandler.java184
-rw-r--r--BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSPush.java1107
-rw-r--r--BRMSGateway/src/main/java/org/onap/policy/brmsInterface/ControllerPOJO.java52
-rw-r--r--BRMSGateway/src/main/java/org/onap/policy/brmsInterface/NotificationPOJO.java52
-rw-r--r--BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/BRMSGroupInfo.java75
-rw-r--r--BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/BRMSPolicyInfo.java56
-rw-r--r--BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/DependencyInfo.java38
8 files changed, 1652 insertions, 0 deletions
diff --git a/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSGateway.java b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSGateway.java
new file mode 100644
index 000000000..0b4058d59
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSGateway.java
@@ -0,0 +1,88 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.brmsInterface;
+
+import org.onap.policy.api.NotificationScheme;
+import org.onap.policy.api.PolicyEngine;
+
+//import org.apache.log4j.Logger;
+
+//import org.apache.commons.logging.Log;
+//import org.apache.commons.logging.LogFactory;
+
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+
+import org.onap.policy.xacml.api.XACMLErrorConstants;
+
+
+/**
+ * BRMSGateway: This application acts as the Gateway interface between the PDP XACML and PDP Drools.
+ * The listens for BRMS based policies and pushes them to the specified Policy Repository, from where the PDP Drools reads the Rule Jar.
+ *
+ * @version 0.1
+ */
+public class BRMSGateway {
+
+ private static final Logger logger = FlexLogger.getLogger(BRMSGateway.class);
+ private static final String configFile = "config.properties";
+
+ private static PolicyEngine policyEngine = null;
+
+ public static void main(String[] args) throws Exception{
+ // Initialize Handler.
+ logger.info("Initializing BRMS Handler");
+ BRMSHandler bRMSHandler = null;
+ try{
+ bRMSHandler = new BRMSHandler(configFile);
+ }catch(NullPointerException e){
+ logger.error("Check your property file: " + e.getMessage());
+ System.exit(1);
+ }
+
+ // Set Handler with Auto Notification and initialize policyEngine
+ try{
+ logger.info("Initializing policyEngine with Auto Notifications");
+ policyEngine= new PolicyEngine(configFile,NotificationScheme.AUTO_ALL_NOTIFICATIONS, bRMSHandler);
+ }catch(Exception e){
+ logger.error(XACMLErrorConstants.ERROR_UNKNOWN+"Error while Initializing Policy Engine " + e.getMessage());
+ }
+
+ //Keep Running....
+ Runnable runnable = new Runnable(){
+ public void run(){
+ while (true){
+ try {
+ Thread.sleep(30000);
+ } catch (InterruptedException e) {
+ logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR+"Thread Exception " + e.getMessage());
+ }
+ }
+ }
+ };
+ Thread thread = new Thread(runnable);
+ thread.start();
+ }
+
+ public static PolicyEngine getPolicyEngine(){
+ return policyEngine;
+ }
+}
diff --git a/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSHandler.java b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSHandler.java
new file mode 100644
index 000000000..305f64de1
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSHandler.java
@@ -0,0 +1,184 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.brmsInterface;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.onap.policy.api.ConfigRequestParameters;
+import org.onap.policy.api.LoadedPolicy;
+import org.onap.policy.api.NotificationType;
+import org.onap.policy.api.PDPNotification;
+import org.onap.policy.api.PolicyConfig;
+import org.onap.policy.api.PolicyConfigStatus;
+import org.onap.policy.api.PolicyEngine;
+import org.onap.policy.api.PolicyException;
+import org.onap.policy.api.RemovedPolicy;
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.utils.BackUpHandler;
+import org.onap.policy.xacml.api.XACMLErrorConstants;
+
+/**
+ * BRMSHandler: Notification Handler which listens for PDP Notifications.
+ * Take action only for BRMS policies.
+ *
+ * @version 0.3
+ */
+public class BRMSHandler implements BackUpHandler{
+
+ private static final Logger logger = FlexLogger.getLogger(BRMSHandler.class.getName());
+
+ private BRMSPush bRMSPush = null;
+
+ public BRMSHandler(String propertiesFile) throws PolicyException{
+ setBRMSPush(new BRMSPush(propertiesFile, this));
+ }
+
+ public void setBRMSPush(BRMSPush brmsPush) {
+ this.bRMSPush = brmsPush;
+ }
+
+ /*
+ * This Method is executed upon notification by the Policy Engine API Notification.
+ * (non-Javadoc)
+ * @see org.onap.policy.utils.BackUpHandler#notificationReceived(org.onap.policy.api.PDPNotification)
+ */
+ @Override
+ public void notificationReceived(PDPNotification notification) {
+ logger.info("Notification Recieved");
+ logger.info(notification.getNotificationType().toString());
+ Boolean flag = BRMSPush.getBackUpMonitor().getFlag();
+ bRMSPush.initiate(flag);
+ if(flag){
+ logger.info("Master Application performing on Notification ");
+ runOnNotification(notification);
+ }else{
+ logger.info("Slave application Skipping Notification.. ");
+ }
+ }
+
+ /*
+ * Executed when a policy is removed from PDP.
+ */
+ private void removedPolicies(Collection<RemovedPolicy> removedPolicies){
+ Boolean removed = false;
+ logger.info("Removed Policies");
+ for(RemovedPolicy removedPolicy: removedPolicies){
+ logger.info(removedPolicy.getPolicyName());
+ logger.info(removedPolicy.getVersionNo());
+ if(removedPolicy.getPolicyName().contains("_BRMS_")){
+ try{
+ logger.info("Policy Removed with this policy Name : " + removedPolicy.getPolicyName());
+ bRMSPush.removeRule(removedPolicy.getPolicyName());
+ removed = true;
+ }catch(Exception e){
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Rertriving policy failed " + e.getMessage());
+ }
+ }
+ }
+ Boolean failureFlag = false;
+ int i = 0;
+ do{
+ failureFlag = false;
+ if(removed){
+ try{
+ bRMSPush.pushRules();
+ }catch(PolicyException e){
+ //Upon Notification failure
+ failureFlag = true;
+ bRMSPush.rotateURLs();
+ }
+ }
+ i++;
+ }while(failureFlag && i< bRMSPush.URLListSize());
+ }
+
+ /*
+ * This method is executed if BRMSGW is "MASTER"
+ * (non-Javadoc)
+ * @see org.onap.policy.utils.BackUpHandler#runOnNotification(org.onap.policy.api.PDPNotification)
+ */
+ public void runOnNotification(PDPNotification notification){
+ if(notification.getNotificationType().equals(NotificationType.REMOVE)){
+ removedPolicies(notification.getRemovedPolicies());
+ }else if(notification.getNotificationType().equals(NotificationType.UPDATE)|| notification.getNotificationType().equals(NotificationType.BOTH)){
+ logger.info("Updated Policies: \n");
+ ArrayList<PolicyConfig> brmsPolicies = addedPolicies(notification);
+ Boolean successFlag = false;
+ for(int i=0; !successFlag && i< bRMSPush.URLListSize(); i++){
+ if(i!=0){
+ for(PolicyConfig policyConfig: brmsPolicies){
+ logger.info("Policy Retry with this Name notified: " + policyConfig.getPolicyName());
+ bRMSPush.addRule(policyConfig.getPolicyName(),policyConfig.toOther(),policyConfig.getResponseAttributes());
+ }
+ }
+ try{
+ bRMSPush.pushRules();
+ successFlag = true;
+ }catch(PolicyException e){
+ //Upon Notification failure
+ successFlag = false;
+ bRMSPush.rotateURLs();
+ }
+ }
+ }
+ }
+
+ /*
+ * Executed when a policy is added to PDP.
+ */
+ private ArrayList<PolicyConfig> addedPolicies(PDPNotification notification) {
+ ArrayList<PolicyConfig> result = new ArrayList<>();
+ for(LoadedPolicy updatedPolicy: notification.getLoadedPolicies()){
+ logger.info("policyName : " + updatedPolicy.getPolicyName());
+ logger.info("policyVersion :" + updatedPolicy.getVersionNo());
+ logger.info("Matches: " + updatedPolicy.getMatches());
+ // Checking the Name is correct or not.
+ if(updatedPolicy.getPolicyName().contains("_BRMS_")){
+ try{
+ PolicyEngine policyEngine = getPolicyEngine();
+ if(policyEngine!=null){
+ ConfigRequestParameters configRequestParameters = new ConfigRequestParameters();
+ configRequestParameters.setPolicyName(updatedPolicy.getPolicyName());
+ Collection<PolicyConfig> policyConfigs = policyEngine.getConfig(configRequestParameters);
+ for(PolicyConfig policyConfig: policyConfigs){
+ if(policyConfig.getPolicyConfigStatus().equals(PolicyConfigStatus.CONFIG_RETRIEVED)){
+ logger.info("Policy Retrieved with this Name notified: " + policyConfig.getPolicyName());
+ result.add(policyConfig);
+ bRMSPush.addRule(policyConfig.getPolicyName(),policyConfig.toOther(),policyConfig.getResponseAttributes());
+ }else{
+ logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR +"Fail to retrieve policy so rule will not be pushed to PolicyRepo !!!!\n\n");
+ }
+ }
+ }
+ }catch(Exception e){
+ logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Rertriving policy failed " + e.getMessage());
+ }
+ }
+ }
+ return result;
+ }
+
+ public PolicyEngine getPolicyEngine() {
+ return BRMSGateway.getPolicyEngine();
+ }
+}
diff --git a/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSPush.java b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSPush.java
new file mode 100644
index 000000000..c24493882
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/BRMSPush.java
@@ -0,0 +1,1107 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.brmsInterface;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.net.URL;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+import javax.persistence.Query;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.DeploymentRepository;
+import org.apache.maven.model.DistributionManagement;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
+import org.apache.maven.shared.invoker.DefaultInvocationRequest;
+import org.apache.maven.shared.invoker.DefaultInvoker;
+import org.apache.maven.shared.invoker.InvocationRequest;
+import org.apache.maven.shared.invoker.InvocationResult;
+import org.apache.maven.shared.invoker.Invoker;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.WriterFactory;
+import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.onap.policy.api.PEDependency;
+import org.onap.policy.api.PolicyException;
+import org.onap.policy.brmsInterface.jpa.BRMSGroupInfo;
+import org.onap.policy.brmsInterface.jpa.BRMSPolicyInfo;
+import org.onap.policy.brmsInterface.jpa.DependencyInfo;
+import org.onap.policy.common.im.AdministrativeStateException;
+import org.onap.policy.common.im.IntegrityMonitor;
+import org.onap.policy.common.logging.eelf.MessageCodes;
+import org.onap.policy.common.logging.eelf.PolicyLogger;
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.utils.BackUpHandler;
+import org.onap.policy.utils.BackUpMonitor;
+import org.onap.policy.utils.BusPublisher;
+import org.onap.policy.utils.PolicyUtils;
+import org.onap.policy.xacml.api.XACMLErrorConstants;
+import org.sonatype.nexus.client.NexusClient;
+import org.sonatype.nexus.client.NexusClientException;
+import org.sonatype.nexus.client.NexusConnectionException;
+import org.sonatype.nexus.client.rest.NexusRestClient;
+import org.sonatype.nexus.rest.model.NexusArtifact;
+
+import com.att.nsa.cambria.client.CambriaBatchingPublisher;
+import com.att.nsa.cambria.client.CambriaClientBuilders;
+import com.att.nsa.cambria.client.CambriaClientBuilders.PublisherBuilder;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+/**
+ * BRMSPush: Application responsible to push policies to the BRMS PDP Policy Repository (PR).
+ * Mavenize and push policy to PR
+ *
+ * @version 1.0
+ */
+
+@SuppressWarnings("deprecation")
+public class BRMSPush {
+ private static final Logger LOGGER = FlexLogger.getLogger(BRMSPush.class.getName());
+ private static final String PROJECTSLOCATION = "RuleProjects";
+ private static final String GOALS[] = {"clean", "deploy"};
+ private static final String DEFAULT_VERSION = "1.1.0-SNAPSHOT";
+ private static final String DEPENDENCY_FILE = "dependency.json";
+
+ private static Map<String, String> modifiedGroups = new HashMap<>();
+ private static IntegrityMonitor im;
+ private static BackUpMonitor bm;
+ private static String resourceName = null;
+ private String defaultName = null;
+ private String repID = null;
+ private String repName = null;
+ private ArrayList<String> repURLs= null;
+ private String repUserName = null;
+ private String repPassword = null;
+ private String policyKeyID = null;
+ private boolean createFlag = false;
+ private String uebList = null;
+ private List<String> dmaapList = null;
+ private String pubTopic = null;
+ private PublisherBuilder pubBuilder = null;
+ protected BusPublisher publisher = null;
+ private Long uebDelay = Long.parseLong("20");
+ private Long dmaapDelay = Long.parseLong("5000");
+ private String notificationType = null;
+ private ArrayList<ControllerPOJO> controllers;
+ private HashMap<String, ArrayList<Object>> groupMap = new HashMap<>();
+ private Map<String, String> policyMap = new HashMap<>();
+ private String brmsdependencyversion;
+ private EntityManager em;
+ private boolean syncFlag = false;
+
+ public BRMSPush(String propertiesFile, BackUpHandler handler) throws PolicyException{
+ Properties config = new Properties();
+ Path file = Paths.get(propertiesFile);
+ if(Files.notExists(file)){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE+"Config File doesn't Exist in the specified Path " + file.toString());
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE+"Config File doesn't Exist in the specified Path " + file.toString());
+ }else{
+ if(file.toString().endsWith(".properties")){
+ // Grab the Properties.
+ setProperty(file, config, handler);
+ }
+ }
+ }
+
+ private void setProperty(Path file, Properties config, BackUpHandler handler) throws PolicyException{
+ InputStream in;
+ try {
+ in = new FileInputStream(file.toFile());
+ config.load(in);
+ } catch (IOException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Data/File Read Error while reading from the property file.");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + "Data/File Read Error while reading from the property file.");
+ }
+ LOGGER.info("Trying to set up IntegrityMonitor");
+ try {
+ LOGGER.info("Trying to set up IntegrityMonitor");
+ resourceName = config.getProperty("RESOURCE_NAME");
+ if(resourceName==null){
+ LOGGER.warn("RESOURCE_NAME is missing setting default value. ");
+ resourceName = "brmsgw_pdp01";
+ }
+ resourceName = resourceName.trim();
+ im = IntegrityMonitor.getInstance(resourceName, config);
+ } catch (Exception e) {
+ LOGGER.error("Error starting Integerity Monitor: " + e);
+ }
+ LOGGER.info("Trying to set up BackUpMonitor");
+ try {
+ bm = BackUpMonitor.getInstance(BackUpMonitor.ResourceNode.BRMS.toString(), resourceName, config, handler);
+ } catch (Exception e) {
+ LOGGER.error("Error starting BackUpMonitor: " + e);
+ }
+ config.setProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, "META-INF/persistenceBRMS.xml");
+ EntityManagerFactory emf = Persistence.createEntityManagerFactory("BRMSGW", config);
+ em = emf.createEntityManager();
+ defaultName = config.getProperty("defaultName");
+ if(defaultName==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "defaultName property is missing from the property file ");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + "defaultName property is missing from the property file");
+ }
+ defaultName = defaultName.trim();
+ repID = config.getProperty("repositoryID");
+ if(repID==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryID property is missing from the property file ");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryID property is missing from the property file ");
+ }
+ repID = repID.trim();
+ repName = config.getProperty("repositoryName");
+ if(repName==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryName property is missing from the property file ");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryName property is missing from the property file ");
+ }
+ repName = repName.trim();
+ String repURL = config.getProperty("repositoryURL");
+ if(repURL==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryURL property is missing from the property file ");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + "repositoryURL property is missing from the property file ");
+ }
+ if(repURL.contains(",")){
+ repURLs = new ArrayList<>(Arrays.asList(repURL.trim().split(",")));
+ }else{
+ repURLs = new ArrayList<>();
+ repURLs.add(repURL);
+ }
+ repUserName = config.getProperty("repositoryUsername");
+ repPassword = config.getProperty("repositoryPassword");
+ if(repUserName==null || repPassword==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "repostoryUserName and respositoryPassword properties are required.");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + "repostoryUserName and respositoryPassword properties are required.");
+ }
+ repUserName = repUserName.trim();
+ repPassword = repPassword.trim();
+ policyKeyID = config.getProperty("policyKeyID");
+ if(policyKeyID==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "policyKeyID property is missing from the property file ");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + "policyKeyID property is missing from the property file ");
+ }
+ policyKeyID = policyKeyID.trim();
+ String syncF = config.getProperty("sync", "false").trim();
+ syncFlag = Boolean.parseBoolean(syncF);
+ if(syncFlag){
+ PolicyLogger.info("SYNC Flag is turned ON. DB will be given Priority.");
+ }
+ brmsdependencyversion = config.getProperty("brms.dependency.version");
+ if(brmsdependencyversion==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "brmsdependencyversion property is missing from the property file, Using default Version.");
+ brmsdependencyversion = DEFAULT_VERSION;
+ }
+ brmsdependencyversion = brmsdependencyversion.trim();
+ readGroups(config);
+
+ // Setup Publisher
+ notificationType = config.getProperty("NOTIFICATION_TYPE");
+ if("dmaap".equalsIgnoreCase(notificationType)){
+
+ LOGGER.info("Notification Type being used is DMaaP... creating instance of BusPublisher.");
+ // Setting up the Publisher for DMaaP MR
+ String dmaapServers = config.getProperty("NOTIFICATION_SERVERS");
+ pubTopic = config.getProperty("NOTIFICATION_TOPIC");
+ String aafLogin = config.getProperty("CLIENT_ID").trim();
+ String aafPassword = config.getProperty("CLIENT_KEY").trim();
+
+ if(dmaapServers==null || pubTopic==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "DMaaP properties are missing from the property file ");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + "DMaaP properties are missing from the property file ");
+ }
+
+ dmaapServers = dmaapServers.trim();
+ pubTopic = pubTopic.trim();
+
+ if(dmaapServers.contains(",")) {
+ dmaapList = new ArrayList<>(Arrays.asList(dmaapServers.split("\\s*,\\s*")));
+ } else {
+ dmaapList = new ArrayList<>();
+ dmaapList.add(dmaapServers);
+ }
+
+ this.publisher =
+ new BusPublisher.DmaapPublisherWrapper(this.dmaapList,
+ this.pubTopic,
+ aafLogin,
+ aafPassword);
+
+
+ String dDelay = config.getProperty("NOTIFICATION_DELAY");
+ if(dDelay!=null && !dDelay.isEmpty()){
+ dDelay = dDelay.trim();
+ try{
+ dmaapDelay = Long.parseLong(dDelay);
+ }catch (NumberFormatException e){
+ LOGGER.error("DMAAP_DELAY not a long format number" + e);
+ }
+ }
+ LOGGER.info("DMAAP BusPublisher is created.");
+
+ } else {
+ LOGGER.info("Notification Type being used is UEB... creating instance of PublisherBuilder.");
+ // Setting up the Publisher for UEB
+ uebList = config.getProperty("NOTIFICATION_SERVERS");
+ pubTopic = config.getProperty("NOTIFICATION_TOPIC");
+ String apiKey = config.getProperty("UEB_API_KEY");
+ String apiSecret = config.getProperty("UEB_API_SECRET");
+ if(uebList==null || pubTopic==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "UEB properties are missing from the property file ");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + "UEB properties are missing from the property file ");
+ }
+ uebList = uebList.trim();
+ pubTopic = pubTopic.trim();
+ pubBuilder = new CambriaClientBuilders.PublisherBuilder();
+ pubBuilder.usingHosts(uebList).onTopic(pubTopic);
+ if(apiKey!=null && !apiKey.isEmpty() &&
+ apiSecret!=null && !apiSecret.isEmpty()) {
+ apiKey= apiKey.trim();
+ apiSecret = apiSecret.trim();
+ pubBuilder.authenticatedBy(apiKey, apiSecret);
+ }
+ String uDelay = config.getProperty("NOTIFICATION_DELAY");
+ if(uDelay!=null && !uDelay.isEmpty()){
+ uDelay = uDelay.trim();
+ try{
+ uebDelay = Long.parseLong(uDelay);
+ }catch (NumberFormatException e){
+ LOGGER.error("UEB_DELAY not a long format number" + e);
+ }
+ }
+ LOGGER.info("UEB PublisherBuilder is created.");
+
+ }
+
+ }
+
+ /**
+ * Will Initialize the variables required for BRMSPush.
+ */
+ public void initiate(boolean flag) {
+ modifiedGroups = new HashMap<>();
+ controllers = new ArrayList<>();
+ try {
+ bm.updateNotification();
+ } catch (Exception e) {
+ LOGGER.error("Error while updating Notification: " + e.getMessage());
+ }
+ if(flag) syncGroupInfo();
+ }
+
+ /**
+ * Will Add rules to projects. Creates necessary folders if required.
+ */
+ public void addRule(String name, String rule, Map<String, String> responseAttributes) {
+ // 1 check the response Attributes and determine if this belongs to any projects.
+ // 2 if not create folder
+ // 3 create pom.
+ // 4 copy the rule.
+ // 5 store the groups that have been updated.
+ String kSessionName=null;
+ String selectedName = null;
+ if(!responseAttributes.isEmpty()){
+ // Pick selected Value
+ String userControllerName = null;
+ ArrayList<PEDependency> userDependencies = new ArrayList<>();
+ for(String key: responseAttributes.keySet()){
+ if(key.equals(policyKeyID)){
+ selectedName = responseAttributes.get(key);
+ }
+ //kmodule configurations
+ else if (key.equals("kSessionName")){
+ kSessionName=responseAttributes.get(key);
+ }
+ // Check User Specific values.
+ if (key.equals("$controller:")) {
+ try {
+ PEDependency dependency = PolicyUtils.jsonStringToObject(responseAttributes.get(key), PEDependency.class);
+ userControllerName = key.replaceFirst("$controller:","");
+ addToGroup(userControllerName, dependency);
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Error while resolving Controller: " + e);
+ }
+
+ }
+ else if(key.equals("$dependency$")){
+ String value = responseAttributes.get(key);
+ if(value.startsWith("[") && value.endsWith("]")){
+ value = value.substring(1, value.length()-1).trim();
+ List<String> dependencyStrings = Arrays.asList(value.split("},{"));
+ for(String dependencyString: dependencyStrings){
+ try {
+ userDependencies.add(PolicyUtils.jsonStringToObject(dependencyString, PEDependency.class));
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Error while resolving Dependencies: " + e);
+ }
+ }
+ }
+ }
+ }
+ if(userControllerName!=null){
+ // Adding custom dependencies here.
+ ArrayList<Object> values = groupMap.get(userControllerName);
+ values.add(userDependencies);
+ groupMap.put(userControllerName, values);
+ selectedName = userControllerName;
+ }
+ }
+ // If no Match then pick Default.
+ if(selectedName==null){
+ selectedName = defaultName;
+ }
+ if (groupMap.containsKey(selectedName)) {
+ //If the key is not got as parameters set by the user, setting the default value for kSessionName as closedLoop
+ if(kSessionName==null){
+ if(selectedName==defaultName){
+ kSessionName="closedloop";
+ }else{
+ kSessionName= "closedloop-" + selectedName;
+ }
+ }
+ // create directories if missing.
+ manageProject(selectedName, kSessionName, name, rule);
+ addModifiedGroup(selectedName, "update"); // Will check for Create Later after generating the Pom.
+ }
+ }
+
+ private void syncGroupInfo() {
+ // Sync DB to JMemory.
+ EntityTransaction et = em.getTransaction();
+ et.begin();
+ Query query = em.createQuery("select b from BRMSGroupInfo AS b");
+ List<?> bList = query.getResultList();
+ if(bList.size()!=groupMap.size()){
+ for(Object value : bList){
+ BRMSGroupInfo brmsGroupInfo = (BRMSGroupInfo) value;
+ PEDependency dependency = new PEDependency();
+ dependency.setArtifactId(brmsGroupInfo.getArtifactId());
+ dependency.setGroupId(brmsGroupInfo.getGroupId());
+ dependency.setVersion(brmsGroupInfo.getVersion());
+ ArrayList<Object> values = new ArrayList<>();
+ values.add(dependency);
+ groupMap.put(brmsGroupInfo.getControllerName(), values);
+ }
+ }
+ query = em.createQuery("select g from BRMSPolicyInfo AS g");
+ bList = query.getResultList();
+ if(bList.size()!=policyMap.size()){
+ for(Object value: bList){
+ BRMSPolicyInfo brmsPolicyInfo = (BRMSPolicyInfo) value;
+ policyMap.put(brmsPolicyInfo.getPolicyName(), brmsPolicyInfo.getControllerName().getControllerName());
+ }
+ }
+ et.commit();
+ LOGGER.info("Updated Local Memory values with values from database.");
+ }
+
+ private void manageProject(String selectedName, String kSessionName, String name, String rule) {
+ // Check if the Project is in Sync. If not get the latest Version.
+ syncProject(selectedName);
+ createProject(PROJECTSLOCATION + File.separator
+ + getArtifactID(selectedName) + File.separator + "src"
+ + File.separator + "main" + File.separator + "resources",
+ kSessionName);
+ copyDataToFile(
+ PROJECTSLOCATION + File.separator
+ + getArtifactID(selectedName) + File.separator
+ + "src" + File.separator + "main" + File.separator
+ + "resources" + File.separator + "rules"
+ + File.separator + name + ".drl", rule);
+ addToPolicy(name,selectedName);
+ }
+
+ /*
+ * Add Policy to JMemory and DataBase.
+ */
+ private void addToPolicy(String policyName, String controllerName) {
+ policyMap.put(policyName, controllerName);
+ EntityTransaction et = em.getTransaction();
+ et.begin();
+ Query query = em.createQuery("select b from BRMSPolicyInfo as b where b.policyName = :pn");
+ query.setParameter("pn", policyName);
+ List<?> pList = query.getResultList();
+ boolean createFlag = false;
+ BRMSPolicyInfo brmsPolicyInfo = new BRMSPolicyInfo();
+ if(pList.size()>0){
+ // Already exists.
+ brmsPolicyInfo = (BRMSPolicyInfo) pList.get(0);
+ if(!brmsPolicyInfo.getControllerName().getControllerName().equals(controllerName)){
+ createFlag = true;
+ }
+ }else{
+ createFlag = true;
+ }
+ if(createFlag){
+ query = em.createQuery("select b from BRMSGroupInfo as b where b.controllerName = :cn");
+ query.setParameter("cn", controllerName);
+ List<?> bList = query.getResultList();
+ BRMSGroupInfo brmsGroupInfo = new BRMSGroupInfo();
+ if(bList.size()>0){
+ brmsGroupInfo = (BRMSGroupInfo) bList.get(0);
+ }
+ brmsPolicyInfo.setPolicyName(policyName);
+ brmsPolicyInfo.setControllerName(brmsGroupInfo);
+ em.persist(brmsPolicyInfo);
+ em.flush();
+ }
+ et.commit();
+ }
+
+ private void syncProject(String selectedName) {
+ boolean projectExists = checkProject(selectedName);
+ if(projectExists){
+ String version = null;
+ version = getVersion(selectedName);
+ if(version==null){
+ LOGGER.error("Error getting local version for the given Controller Name:"+ selectedName+" going with Default value");
+ version = "0.1.0";
+ }
+ String nextVersion = incrementVersion(version);
+ boolean outOfSync = checkRemoteSync(selectedName, nextVersion);
+ if(!outOfSync){
+ return;
+ }
+ }
+ // We are out of Sync or Project is not Present.
+ downloadProject(selectedName);
+ }
+
+ private void downloadProject(String selectedName) {
+ NexusArtifact artifact = getLatestArtifactFromNexus(selectedName);
+ if(artifact==null) return;
+ String dirName = getDirectoryName(selectedName);
+ URL website;
+ String fileName = "rule.jar";
+ try {
+ website = new URL(artifact.getResourceURI());
+ ReadableByteChannel rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(fileName);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ extractJar(fileName, dirName);
+ new File(fileName).delete();
+ } catch (IOException e) {
+ LOGGER.error("Error while downloading the project to File System. " + e.getMessage());
+ }
+ }
+
+ private void extractJar(String jarFileName, String artifactId) throws IOException{
+ JarFile jar = new JarFile(jarFileName);
+ Enumeration<?> enumEntries = jar.entries();
+ while (enumEntries.hasMoreElements()) {
+ JarEntry file = (JarEntry) enumEntries.nextElement();
+ File f = null;
+ String fileName = file.getName().substring(file.getName().lastIndexOf("/")+1);
+ if(file.getName().endsWith(".drl")){
+ String path = PROJECTSLOCATION+ File.separator + artifactId + File.separator + "src"+
+ File.separator+ "main" + File.separator + "resources" + File.separator+ "rules";
+ new File(path).mkdirs();
+ if(syncFlag && policyMap.containsKey(fileName.replace(".drl", ""))){
+ f = new File(path + File.separator + fileName);
+ }else{
+ f = new File(path + File.separator + fileName);
+ }
+ }else if(file.getName().endsWith("pom.xml")){
+ String path = PROJECTSLOCATION+ File.separator + artifactId;
+ new File(path).mkdirs();
+ f = new File(path + File.separator + fileName);
+ }else if(file.getName().endsWith("kmodule.xml")){
+ String path = PROJECTSLOCATION+ File.separator + artifactId + File.separator + "src"+
+ File.separator+ "main" + File.separator + "resources" + File.separator+ "META-INF";
+ new File(path).mkdirs();
+ f = new File(path + File.separator + fileName);
+ }
+ if(f!=null){
+ InputStream is = jar.getInputStream(file);
+ FileOutputStream fos = new FileOutputStream(f);
+ while (is.available() > 0) {
+ fos.write(is.read());
+ }
+ fos.close();
+ is.close();
+ f=null;
+ LOGGER.info(fileName + " Created..");
+ }
+ }
+ jar.close();
+ }
+
+ private NexusArtifact getLatestArtifactFromNexus(String selectedName) {
+ List<NexusArtifact> artifacts = getArtifactFromNexus(selectedName, null);
+ int bigNum = 0;
+ int smallNum = 0;
+ NexusArtifact result = null;
+ for (NexusArtifact artifact : artifacts) {
+ int majorVal = Integer.parseInt(artifact.getVersion().substring(0, artifact.getVersion().indexOf(".")));
+ int minorVal = Integer.parseInt(artifact.getVersion().substring(artifact.getVersion().indexOf(".")+1,artifact.getVersion().lastIndexOf(".")));
+ if(majorVal>bigNum){
+ bigNum = majorVal;
+ smallNum = minorVal;
+ }
+ if((bigNum==majorVal)&&(minorVal>smallNum)){
+ smallNum = minorVal;
+ }
+ if(bigNum==majorVal && minorVal==smallNum){
+ result = artifact;
+ }
+ }
+ return additionalNexusLatestCheck(selectedName, result);
+ }
+
+ // Additional Check due to Limitations from Nexus API to check if the artifact is the latest.
+ private NexusArtifact additionalNexusLatestCheck(String selectedName, NexusArtifact result) {
+ String nextVersion = incrementVersion(result.getVersion());
+ List<NexusArtifact> artifact = getArtifactFromNexus(selectedName, nextVersion);
+ return artifact.isEmpty()? result: additionalNexusLatestCheck(selectedName, artifact.get(0));
+ }
+
+ private boolean checkRemoteSync(String selectedName, String version) {
+ List<NexusArtifact> artifacts = getArtifactFromNexus(selectedName, version);
+ return (artifacts.size()==0) ? false: true;
+ }
+
+ private List<NexusArtifact> getArtifactFromNexus(String selectedName, String version) {
+ final NexusClient client = new NexusRestClient();
+ int i = 0 ;
+ boolean flag = false;
+ while(i<repURLs.size()){
+ try {
+ String repURL = repURLs.get(0);
+ client.connect(repURL.substring(0, repURL.indexOf(repURL.split(":[0-9]+\\/nexus")[1])), repUserName, repPassword);
+ final NexusArtifact template = new NexusArtifact();
+ template.setGroupId(getGroupID(selectedName));
+ template.setArtifactId(getArtifactID(selectedName));
+ if(version!=null){
+ template.setVersion(version);
+ }
+ List<NexusArtifact> resultList = client.searchByGAV(template);
+ if(resultList!=null){
+ flag = true;
+ return resultList;
+ }
+ } catch (NexusClientException | NexusConnectionException | NullPointerException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Connection to remote Nexus has failed. " +e.getMessage());
+ } finally {
+ try {
+ client.disconnect();
+ } catch (NexusClientException | NexusConnectionException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "failed to disconnect Connection from Nexus." +e.getMessage());
+ }
+ if(!flag){
+ Collections.rotate(repURLs, -1);
+ i++;
+ }
+ }
+ }
+ return new ArrayList<>();
+ }
+
+ private void setVersion(String selectedName) {
+ String newVersion = "0.1.0";
+ createFlag = false;
+ NexusArtifact artifact = getLatestArtifactFromNexus(selectedName);
+ if(artifact!=null){
+ newVersion = incrementVersion(artifact.getVersion());
+ }
+ if(newVersion.equals("0.1.0")){
+ createFlag = true;
+ }
+ setVersion(newVersion, selectedName);
+ LOGGER.info("Controller: " + selectedName + "is on version: " + newVersion);
+ }
+
+ private String incrementVersion(String version) {
+ int majorVal = Integer.parseInt(version.substring(0, version.indexOf(".")));
+ int minorVal = Integer.parseInt(version.substring(version.indexOf(".")+1,version.lastIndexOf(".")));
+ if (minorVal >= 9) {
+ majorVal += 1;
+ minorVal = 0;
+ } else {
+ minorVal += 1;
+ }
+ return majorVal + "." + minorVal + version.substring(version.lastIndexOf("."));
+ }
+
+ private boolean checkProject(String selectedName) {
+ return new File(PROJECTSLOCATION + File.separator + getDirectoryName(selectedName)).exists();
+ }
+
+ private String getDirectoryName(String selectedName) {
+ return getArtifactID(selectedName);
+ }
+
+ /**
+ * Will Push policies to the PolicyRepo.
+ *
+ * @param notificationType <String> type of notification Type.
+ * @throws PolicyException
+ */
+ public void pushRules() throws PolicyException{
+ // Check how many groups have been updated.
+ // Invoke their Maven process.
+ try {
+ im.startTransaction();
+ } catch (AdministrativeStateException e) {
+ LOGGER.error("Error while starting Transaction " + e);
+ } catch (Exception e) {
+ LOGGER.error("Error while starting Transaction " + e);
+ }
+ if(!modifiedGroups.isEmpty()){
+ Boolean flag = false;
+ for(String group: modifiedGroups.keySet()){
+ InvocationResult result = null;
+ try{
+ InvocationRequest request = new DefaultInvocationRequest();
+ setVersion(group);
+ createPom(group);
+ request.setPomFile(new File(PROJECTSLOCATION+File.separator+getArtifactID(group)+File.separator+"pom.xml"));
+ request.setGoals(Arrays.asList(GOALS));
+ Invoker invoker = new DefaultInvoker();
+ result = invoker.execute(request);
+ if(result.getExecutionException()!=null){
+ LOGGER.error(result.getExecutionException());
+ }else if(result.getExitCode()!=0){
+ LOGGER.error("Maven Invocation failure..!");
+ }
+ }catch(Exception e){
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Maven Invocation issue for "+getArtifactID(group) + e.getMessage());
+ }
+ if(result!=null && result.getExitCode()==0){
+ LOGGER.info("Build Completed..!");
+ if (createFlag) {
+ addNotification(group, "create");
+ }else{
+ addNotification(group, modifiedGroups.get(group));
+ }
+ flag = true;
+ }else{
+ throw new PolicyException(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Maven Invocation failure!");
+ }
+ }
+ if(flag){
+ sendNotification(controllers);
+ }
+ }
+ if(im!=null){
+ im.endTransaction();
+ }
+ }
+
+ /**
+ * Removes a Rule from Rule Projects.
+ */
+ public void removeRule(String name){
+ String controllerName = getGroupName(name);
+ if(controllerName==null){
+ LOGGER.info("Error finding the controllerName for the given Policy: " + name);
+ return;
+ }
+ syncProject(controllerName);
+ getNameAndSetRemove(controllerName, name);
+ }
+
+ private String getGroupName(String name) {
+ if(policyMap.containsKey(name)){
+ return policyMap.get(name);
+ }else{
+ syncGroupInfo();
+ return (policyMap.containsKey(name)) ? policyMap.get(name):null;
+ }
+ }
+
+ private void addModifiedGroup(String controllerName, String operation) {
+ if(controllerName!=null){
+ modifiedGroups.put(controllerName, operation);
+ }
+ }
+
+ private void addNotification(String controllerName, String operation) {
+ ControllerPOJO controllerPOJO = new ControllerPOJO();
+ controllerPOJO.setName(controllerName);
+ controllerPOJO.setOperation(operation);
+ HashMap<String, String> drools = new HashMap<>();
+ drools.put("groupId", getGroupID(controllerName));
+ drools.put("artifactId", getArtifactID(controllerName));
+ drools.put("version", getVersion(controllerName));
+ controllerPOJO.setDrools(drools);
+ controllers.add(controllerPOJO);
+ try {
+ LOGGER.debug("Notification added: "
+ + PolicyUtils.objectToJsonString(controllerPOJO));
+ } catch (JsonProcessingException e) {
+ LOGGER.error(MessageCodes.ERROR_SCHEMA_INVALID
+ + "Json Processing Error " + e);
+ }
+ }
+
+ private void removedRuleModifiedGroup(String controllerName){
+ // This will be sending Notification to PDPD directly to Lock
+ ControllerPOJO controllerPOJO = new ControllerPOJO();
+ controllerPOJO.setName(controllerName);
+ controllerPOJO.setOperation("lock");
+ List<ControllerPOJO> controllers = new ArrayList<>();
+ controllers.add(controllerPOJO);
+ sendNotification(controllers);
+ }
+
+ private void sendNotification(List<ControllerPOJO> controllers){
+ NotificationPOJO notification = new NotificationPOJO();
+ String requestId = UUID.randomUUID().toString();
+ LOGGER.info("Generating notification RequestID : " + requestId);
+ notification.setRequestID(requestId);
+ notification.setEntity("controller");
+ notification.setControllers(controllers);
+ try {
+ String notificationJson = PolicyUtils.objectToJsonString(notification);
+ LOGGER.info("Sending Notification :\n" + notificationJson);
+ sendMessage(notificationJson);
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while sending notification to PDP-D " + e.getMessage());
+ }
+ }
+
+ private void sendMessage(String message) throws IOException, GeneralSecurityException, InterruptedException {
+
+ if("dmaap".equalsIgnoreCase(notificationType)) {
+ // Sending Message through DMaaP Message Router
+ LOGGER.debug("DMAAP Publishing Message");
+
+ publisher.send( "MyPartitionKey", message);
+
+ LOGGER.debug("Message Published on DMaaP :" + dmaapList.get(0) + "for Topic: " + pubTopic);
+
+ Thread.sleep(dmaapDelay);
+ publisher.close();
+ } else {
+ // Sending Message through UEB interface.
+ LOGGER.debug("UEB Publishing Message");
+
+ CambriaBatchingPublisher pub = pubBuilder.build();
+ pub.send( "MyPartitionKey", message);
+
+ final List<?> stuck = pub.close ( uebDelay, TimeUnit.SECONDS );
+ if ( stuck.size () > 0 ) {
+ LOGGER.error ( stuck.size() + " messages unsent" );
+ }else {
+ LOGGER.debug ( "Clean exit; Message Published on UEB : " + uebList + "for Topic: " + pubTopic );
+ }
+ }
+
+ }
+
+ private void createPom(String name) {
+ Model model = new Model();
+ model.setModelVersion("4.0.0");
+ model.setGroupId(getGroupID(name));
+ model.setArtifactId(getArtifactID(name));
+ model.setVersion(getVersion(name));
+ model.setName(name);
+ DistributionManagement distributionManagement = new DistributionManagement();
+ DeploymentRepository repository = new DeploymentRepository();
+ repository.setId(repID);
+ repository.setName(repName);
+ repository.setUrl(repURLs.get(0));
+ distributionManagement.setRepository(repository);
+ model.setDistributionManagement(distributionManagement);
+ // Dependency Management goes here.
+ List<Dependency> dependencyList= new ArrayList<>();
+ if(groupMap.get(name).size()>1){
+ @SuppressWarnings("unchecked")
+ ArrayList<PEDependency> dependencies = (ArrayList<PEDependency>) groupMap.get(name).get(1);
+ for(PEDependency dependency: dependencies){
+ dependencyList.add(dependency.getDependency());
+ }
+ }else{
+ // Add Default dependencies.
+ dependencyList = getDependencies(name);
+ }
+ model.setDependencies(dependencyList);
+ Writer writer = null;
+ try{
+ writer = WriterFactory.newXmlWriter(new File(PROJECTSLOCATION
+ + File.separator + getArtifactID(name) + File.separator
+ + "pom.xml"));
+ MavenXpp3Writer pomWriter = new MavenXpp3Writer();
+ pomWriter.write(writer, model);
+ }catch(Exception e){
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW
+ + "Error while creating POM for " + getArtifactID(name)
+ + e.getMessage());
+ }finally{
+ IOUtil.close(writer);
+ }
+ }
+
+ private List<Dependency> getDependencies(String controllerName) {
+ // Read the Dependency Information from property file.
+ Path file = Paths.get(DEPENDENCY_FILE);
+ if(!Files.notExists(file)){
+ try {
+ String dependencyJSON = new String(Files.readAllBytes(file), StandardCharsets.UTF_8);
+ DependencyInfo dependencyInfo = PolicyUtils.jsonStringToObject(dependencyJSON, DependencyInfo.class);
+ String controller = "default";
+ if(dependencyInfo.getDependencies().containsKey(controllerName)){
+ controller = controllerName;
+ }
+ List<Dependency> dependencyList = new ArrayList<>();
+ for(PEDependency dependency: dependencyInfo.getDependencies().get(controller)){
+ dependencyList.add(dependency.getDependency());
+ }
+ return dependencyList;
+ } catch (IOException| NullPointerException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW
+ + "Error while getting dependecy Information for controller: " + controllerName
+ + e.getMessage());
+ }
+ }
+ return defaultDependencies(controllerName);
+ }
+
+ // Default Dependency Section. Can be changed as required.
+ public List<Dependency> defaultDependencies(String controllerName) {
+
+ List<Dependency> dependencyList = new ArrayList<>();
+ String version= StringEscapeUtils.escapeJava(brmsdependencyversion);
+
+ Dependency demoDependency = new Dependency();
+ demoDependency.setGroupId("org.onap.policy.drools-applications");
+ demoDependency.setArtifactId("demo");
+ demoDependency.setVersion(version);
+ dependencyList.add(demoDependency);
+
+ Dependency controlloopDependency = new Dependency();
+ controlloopDependency.setGroupId("org.onap.policy.drools-applications");
+ controlloopDependency.setArtifactId("events");
+ controlloopDependency.setVersion(version);
+ dependencyList.add(controlloopDependency);
+
+ Dependency restDependency = new Dependency();
+ restDependency.setGroupId("org.onap.policy.drools-applications");
+ restDependency.setArtifactId("rest");
+ restDependency.setVersion(version);
+ dependencyList.add(restDependency);
+
+ Dependency appcDependency = new Dependency();
+ appcDependency.setGroupId("org.onap.policy.drools-applications");
+ appcDependency.setArtifactId("appc");
+ appcDependency.setVersion(version);
+ dependencyList.add(appcDependency);
+
+ Dependency aaiDependency = new Dependency();
+ aaiDependency.setGroupId("org.onap.policy.drools-applications");
+ aaiDependency.setArtifactId("aai");
+ aaiDependency.setVersion(version);
+ dependencyList.add(aaiDependency);
+
+ Dependency msoDependency = new Dependency();
+ msoDependency.setGroupId("org.onap.policy.drools-applications");
+ msoDependency.setArtifactId("mso");
+ msoDependency.setVersion(version);
+ dependencyList.add(msoDependency);
+
+ Dependency trafficgeneratorDependency = new Dependency();
+ trafficgeneratorDependency.setGroupId("org.onap.policy.drools-applications");
+ trafficgeneratorDependency.setArtifactId("trafficgenerator");
+ trafficgeneratorDependency.setVersion(version);
+ dependencyList.add(trafficgeneratorDependency);
+ return dependencyList;
+ }
+
+ private void createProject(String path,String ksessionName){
+ new File(path+File.separator+"rules").mkdirs();
+ new File(path+File.separator+"META-INF").mkdirs();
+ if(!Files.exists(Paths.get(path+File.separator+"META-INF"+File.separator+"kmodule.xml"))){
+ // Hard coding XML for PDP Drools to accept our Rules.
+ String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "\n"+
+ "<kmodule xmlns=\"http://jboss.org/kie/6.0.0/kmodule\">" +"\n"+
+ "<kbase name=\"rules\" packages=\"rules\">" + "\n" +
+ "<ksession name=\""+ ksessionName +"\"/>"+ "\n" +
+ "</kbase></kmodule>";
+ copyDataToFile(path+File.separator+"META-INF"+File.separator+"kmodule.xml", xml);
+ }
+ }
+
+ private void copyDataToFile(String file, String rule) {
+ try{
+ FileUtils.writeStringToFile(new File(file), rule);
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Error while creating Rule for " + file + e.getMessage());
+ }
+ }
+
+ private void readGroups(Properties config) throws PolicyException{
+ String[] groupNames = null;
+ if(config.getProperty("groupNames").contains(",")){
+ groupNames = config.getProperty("groupNames").replaceAll(" ", "").split(",");
+ }else{
+ groupNames = new String[]{config.getProperty("groupNames").replaceAll(" ", "")};
+ }
+ if(groupNames==null || groupNames.length==0){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "groupNames property is missing or empty from the property file ");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + "groupNames property is missing or empty from the property file ");
+ }
+ groupMap = new HashMap<>();
+ for(int counter=0; counter < groupNames.length ;counter++){
+ String name = groupNames[counter];
+ String groupID = config.getProperty(name+".groupID");
+ if(groupID==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + name+".groupID property is missing from the property file ");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + name+".groupID property is missing from the property file ");
+ }
+ String artifactID = config.getProperty(name+".artifactID");
+ if(artifactID==null){
+ LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE + name+".artifactID property is missing from the property file ");
+ throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE + name+".artifactID property is missing from the property file ");
+ }
+ PEDependency dependency = new PEDependency();
+ dependency.setArtifactId(artifactID);
+ dependency.setGroupId(groupID);
+ // Add to list if we got all
+ addToGroup(name,dependency);
+ }
+ }
+
+ private void addToGroup(String name, PEDependency dependency) {
+ ArrayList<Object> values = new ArrayList<>();
+ values.add(dependency);
+ groupMap.put(name, values);
+ EntityTransaction et = em.getTransaction();
+ et.begin();
+ Query query = em.createQuery("select b from BRMSGroupInfo as b where b.controllerName = :cn");
+ query.setParameter("cn", name);
+ List<?> groupList = query.getResultList();
+ BRMSGroupInfo brmsGroupInfo = null;
+ if(groupList.size()>0){
+ LOGGER.info("Controller name already Existing in DB. Will be updating the DB Values" + name);
+ brmsGroupInfo = (BRMSGroupInfo) groupList.get(0);
+ }
+ if(brmsGroupInfo==null){
+ brmsGroupInfo = new BRMSGroupInfo();
+ }
+ brmsGroupInfo.setControllerName(name);
+ brmsGroupInfo.setGroupId(dependency.getGroupId());
+ brmsGroupInfo.setArtifactId(dependency.getArtifactId());
+ brmsGroupInfo.setVersion(dependency.getVersion());
+ em.persist(brmsGroupInfo);
+ em.flush();
+ et.commit();
+ }
+
+ private String getArtifactID(String name){
+ return ((PEDependency) groupMap.get(name).get(0)).getArtifactId();
+ }
+
+ private String getGroupID(String name){
+ return ((PEDependency) groupMap.get(name).get(0)).getGroupId();
+ }
+
+ private String getVersion(String name){
+ return ((PEDependency) groupMap.get(name).get(0)).getVersion();
+ }
+
+ private void getNameAndSetRemove(String controllerName, String policyName) {
+ String artifactName = getArtifactID(controllerName);
+ String ruleFolder= PROJECTSLOCATION + File.separator
+ + artifactName + File.separator + "src"
+ + File.separator + "main" + File.separator
+ + "resources" + File.separator + "rules";
+ File file = new File(ruleFolder+File.separator+ policyName +".drl");
+ if(file.delete()){
+ LOGGER.info("Deleted File.. " + file.getAbsolutePath());
+ removePolicyFromGroup(policyName, controllerName);
+ }
+ if(new File(ruleFolder).listFiles().length == 0) {
+ removedRuleModifiedGroup(controllerName);
+ } else {
+ // This is an update in terms of PDPD.
+ addModifiedGroup(controllerName, "update");
+ }
+ }
+
+ // Removes Policy from Memory and Database.
+ private void removePolicyFromGroup(String policyName, String controllerName) {
+ policyMap.remove(policyName);
+ EntityTransaction et = em.getTransaction();
+ et.begin();
+ Query query = em.createQuery("select b from BRMSPolicyInfo as b where b.policyName = :pn");
+ query.setParameter("pn", policyName);
+ List<?> pList = query.getResultList();
+ BRMSPolicyInfo brmsPolicyInfo = new BRMSPolicyInfo();
+ if(pList.size()>0){
+ // Already exists.
+ brmsPolicyInfo = (BRMSPolicyInfo) pList.get(0);
+ if(brmsPolicyInfo.getControllerName().getControllerName().equals(controllerName)){
+ em.remove(brmsPolicyInfo);
+ em.flush();
+ }
+ }
+ et.commit();
+ }
+
+ private void setVersion(String newVersion, String controllerName) {
+ PEDependency userController = (PEDependency) groupMap.get(controllerName).get(0);
+ userController.setVersion(newVersion);
+ groupMap.get(controllerName).set(0, userController);
+ }
+
+ // Return BackUpMonitor
+ public static BackUpMonitor getBackUpMonitor(){
+ return bm;
+ }
+
+ public void rotateURLs() {
+ if(repURLs!=null){
+ Collections.rotate(repURLs, -1);
+ }
+ }
+
+ public int URLListSize() {
+ if(repURLs!=null){
+ return repURLs.size();
+ }else return 0;
+ }
+}
diff --git a/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/ControllerPOJO.java b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/ControllerPOJO.java
new file mode 100644
index 000000000..5a0679c29
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/ControllerPOJO.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.brmsInterface;
+
+import java.util.Map;
+
+/**
+ * POJO for controller information.
+ *
+ */
+public class ControllerPOJO {
+ private String name;
+ private Map<String,String> drools;
+ private String operation;
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public Map<String,String> getDrools() {
+ return drools;
+ }
+ public void setDrools(Map<String,String> drools) {
+ this.drools = drools;
+ }
+ public String getOperation() {
+ return operation;
+ }
+ public void setOperation(String operation) {
+ this.operation = operation;
+ }
+}
+
diff --git a/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/NotificationPOJO.java b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/NotificationPOJO.java
new file mode 100644
index 000000000..75bbe8a4e
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/NotificationPOJO.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.brmsInterface;
+
+import java.util.List;
+
+/**
+ * This POJO will be transformed to JSON for Notification Purposes.
+ *
+ */
+public class NotificationPOJO {
+ private String requestID;
+ private String entity;
+ private List<ControllerPOJO> controllers;
+ public String getRequestID() {
+ return requestID;
+ }
+ public void setRequestID(String requestID) {
+ this.requestID = requestID;
+ }
+ public String getEntity() {
+ return entity;
+ }
+ public void setEntity(String entity) {
+ this.entity = entity;
+ }
+ public List<ControllerPOJO> getControllers() {
+ return controllers;
+ }
+ public void setControllers(List<ControllerPOJO> controllers) {
+ this.controllers = controllers;
+ }
+
+}
diff --git a/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/BRMSGroupInfo.java b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/BRMSGroupInfo.java
new file mode 100644
index 000000000..6b4a2bf85
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/BRMSGroupInfo.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.brmsInterface.jpa;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="brmsgroup_info")
+public class BRMSGroupInfo{
+
+ @Id
+ @Column(name = "controllerName", nullable=false, length=255)
+ private String controllerName;
+
+ @Column(name = "groupId", nullable=false, length=255)
+ private String groupId;
+
+ @Column(name = "artifactId", nullable=false, length=255)
+ private String artifactId;
+
+ @Column(name = "version", length=255)
+ private String version;
+
+ public String getControllerName() {
+ return controllerName;
+ }
+
+ public void setControllerName(String controllerName) {
+ this.controllerName = controllerName;
+ }
+
+ 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;
+ }
+}
diff --git a/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/BRMSPolicyInfo.java b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/BRMSPolicyInfo.java
new file mode 100644
index 000000000..c269e295a
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/BRMSPolicyInfo.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.brmsInterface.jpa;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="brmsgroup_policy")
+public class BRMSPolicyInfo {
+
+ @Id
+ @Column(name="policyName")
+ private String policyName;
+
+ @ManyToOne
+ @JoinColumn(name="controllerName")
+ private BRMSGroupInfo controllerName;
+
+ public String getPolicyName() {
+ return policyName;
+ }
+
+ public void setPolicyName(String policyName) {
+ this.policyName = policyName;
+ }
+
+ public BRMSGroupInfo getControllerName() {
+ return controllerName;
+ }
+
+ public void setControllerName(BRMSGroupInfo controllerName) {
+ this.controllerName = controllerName;
+ }
+}
diff --git a/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/DependencyInfo.java b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/DependencyInfo.java
new file mode 100644
index 000000000..753de5219
--- /dev/null
+++ b/BRMSGateway/src/main/java/org/onap/policy/brmsInterface/jpa/DependencyInfo.java
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.policy.brmsInterface.jpa;
+
+import java.util.List;
+import java.util.Map;
+
+import org.onap.policy.api.PEDependency;
+
+public class DependencyInfo {
+ private Map<String, List<PEDependency>> dependencies;
+
+ public Map<String, List<PEDependency>> getDependencies() {
+ return dependencies;
+ }
+
+ public void setDependencies(Map<String, List<PEDependency>> dependencies) {
+ this.dependencies = dependencies;
+ }
+
+}