Policy:Blocker
[policy/engine.git] / BRMSGateway / src / main / java / org / onap / policy / brmsInterface / BRMSPush.java
index 6e8588a..86cd066 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP Policy Engine
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018 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.
@@ -46,6 +46,7 @@ import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
+import java.util.regex.Pattern;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
@@ -73,7 +74,6 @@ 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;
@@ -104,11 +104,21 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 
 @SuppressWarnings("deprecation")
 public class BRMSPush {
-    private static final Logger LOGGER = FlexLogger.getLogger(BRMSPush.class.getName());
+    private static final String GROUP_NAMES = "groupNames";
+       private static final String DROOLS_APPS_TEMPLATE_GROUP = "org.onap.policy.drools-applications.controlloop.templates";
+       private static final String DROOLS_APPS_MODEL_GROUP    = "org.onap.policy.drools-applications.controlloop.common.model-impl";
+       private static final String META_INF = "META-INF";
+       private static final String KMODULE_XML_FILE = "kmodule.xml";
+       private static final String POM_XML_FILE = "pom.xml";
+       private static final String VERSION_0_1_0 = "0.1.0";
+       private static final String RULES = "rules";
+       private static final String RESOURCES = "resources";
+       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 DEFAULT_VERSION = "1.2.0-SNAPSHOT";
     private static final String DEPENDENCY_FILE = "dependency.json";
+    private static final String BRMSPERSISTENCE = "brmsEclipselink.persistencexml";
 
     private static Map<String, String> modifiedGroups = new HashMap<>();
     private static IntegrityMonitor im;
@@ -188,8 +198,10 @@ public class BRMSPush {
         } catch (Exception e) {
             LOGGER.error("Error starting BackUpMonitor: " + e);
         }
-        if(!config.containsKey(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML)){
+        if(!config.containsKey(BRMSPERSISTENCE)){
             config.setProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, "META-INF/persistenceBRMS.xml");
+        } else {
+            config.setProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, config.getProperty(BRMSPERSISTENCE,"META-INF/persistenceBRMS.xml"));
         }
         EntityManagerFactory emf = Persistence.createEntityManagerFactory("BRMSGW", config);
         em = emf.createEntityManager();
@@ -363,6 +375,11 @@ public class BRMSPush {
         if (flag)
             syncGroupInfo();
     }
+    
+    public void resetDS(){
+       resetModifiedGroups();
+        controllers = new ArrayList<>();
+    }
 
     private static void resetModifiedGroups() {
         modifiedGroups = new HashMap<>();
@@ -383,38 +400,38 @@ public class BRMSPush {
             // Pick selected Value
             String userControllerName = null;
             ArrayList<PEDependency> userDependencies = new ArrayList<>();
-            for (String key : responseAttributes.keySet()) {
+            for (Map.Entry<String, String> entry: responseAttributes.entrySet()) {
+               String key = entry.getKey();
+               String value = entry.getValue();
                 if (key.equals(policyKeyID)) {
-                    selectedName = responseAttributes.get(key);
+                    selectedName = value;
                 }
                 // kmodule configurations
                 else if ("kSessionName".equals(key)) {
-                    kSessionName = responseAttributes.get(key);
+                    kSessionName = value;
                 }
                 // Check User Specific values.
                 if ("$controller:".equals(key)) {
                     try {
-                        PEDependency dependency = PolicyUtils.jsonStringToObject(responseAttributes.get(key),
+                        PEDependency dependency = PolicyUtils.jsonStringToObject(value,
                                 PEDependency.class);
                         userControllerName = key.replaceFirst("$controller:", "");
+                        LOGGER.info("addRule: userControllerName - " + userControllerName + ", dependency: - " + dependency);
                         addToGroup(userControllerName, dependency);
                     } catch (Exception e) {
                         LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while resolving Controller: " + e);
                     }
 
-                } else if ("$dependency$".equals(key)) {
-                    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);
-                            }
+                } else if ("$dependency$".equals(key) && value.startsWith("[") && value.endsWith("]")) {
+                    value = value.substring(1, value.length() - 1).trim();
+                    List<String> dependencyStrings = Arrays.asList(value.split(Pattern.quote("},{")));
+                    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);
                         }
                     }
                 }
@@ -435,7 +452,8 @@ public class BRMSPush {
             // 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) {
+               LOGGER.info("kSessionName is null, selectedName is  : " + selectedName );
+                if (selectedName.equalsIgnoreCase(defaultName)) {
                     kSessionName = "closedloop";
                 } else {
                     kSessionName = "closedloop-" + selectedName;
@@ -481,9 +499,9 @@ public class BRMSPush {
         // 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);
+                + 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
+                + File.separator + "main" + File.separator + RESOURCES + File.separator + RULES + File.separator
                 + name + ".drl", rule);
         addToPolicy(name, selectedName);
     }
@@ -498,18 +516,18 @@ public class BRMSPush {
         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;
+        boolean create = false;
         BRMSPolicyInfo brmsPolicyInfo = new BRMSPolicyInfo();
         if (!pList.isEmpty()) {
             // Already exists.
             brmsPolicyInfo = (BRMSPolicyInfo) pList.get(0);
             if (!brmsPolicyInfo.getControllerName().getControllerName().equals(controllerName)) {
-                createFlag = true;
+                create = true;
             }
         } else {
-            createFlag = true;
+            create = true;
         }
-        if (createFlag) {
+        if (create) {
             query = em.createQuery("select b from BRMSGroupInfo as b where b.controllerName = :cn");
             query.setParameter("cn", controllerName);
             List<?> bList = query.getResultList();
@@ -533,7 +551,7 @@ public class BRMSPush {
             if (version == null) {
                 LOGGER.error("Error getting local version for the given Controller Name:" + selectedName
                         + " going with Default value");
-                version = "0.1.0";
+                version = VERSION_0_1_0;
             }
             String nextVersion = incrementVersion(version);
             boolean outOfSync = checkRemoteSync(selectedName, nextVersion);
@@ -554,19 +572,22 @@ public class BRMSPush {
         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(), e);
+            try( ReadableByteChannel rbc = Channels.newChannel(website.openStream());
+                       FileOutputStream fos = new FileOutputStream(fileName)){
+               fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+                extractJar(fileName, dirName);
+                new File(fileName).delete();
+            }catch (IOException e) {
+         LOGGER.error("Error while downloading the project to File System. " + e.getMessage(), e);
+                       }
+          
+        } catch (IOException e1) {
+            LOGGER.error("Error while retrieve the artifact. " + e1.getMessage(), e1);
         }
     }
 
-    private void extractJar(String jarFileName, String artifactId) throws IOException {
-        JarFile jar = new JarFile(jarFileName);
+private void extractJar(String jarFileName, String artifactId){
+               try (JarFile jar = new JarFile(jarFileName)) {  
         Enumeration<?> enumEntries = jar.entries();
         while (enumEntries.hasMoreElements()) {
             JarEntry file = (JarEntry) enumEntries.nextElement();
@@ -574,36 +595,38 @@ public class BRMSPush {
             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";
+                        + "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")) {
+            } else if (file.getName().endsWith(POM_XML_FILE)) {
                 String path = PROJECTSLOCATION + File.separator + artifactId;
                 new File(path).mkdirs();
                 f = new File(path + File.separator + fileName);
-            } else if (file.getName().endsWith("kmodule.xml")) {
+            } else if (file.getName().endsWith(KMODULE_XML_FILE)) {
                 String path = PROJECTSLOCATION + File.separator + artifactId + File.separator + "src" + File.separator
-                        + "main" + File.separator + "resources" + File.separator + "META-INF";
+                        + "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);
+                               try (InputStream is = jar.getInputStream(file); FileOutputStream fos = new FileOutputStream(f)) {
                 while (is.available() > 0) {
                     fos.write(is.read());
                 }
-                fos.close();
-                is.close();
                 LOGGER.info(fileName + " Created..");
+                               } catch (IOException e) {
+                                               LOGGER.info("exception Occured" + e);
+                                       }
             }
-        }
-        jar.close();
-    }
+         }
+               } catch (IOException e) {
+                       LOGGER.info("exception Occured" + e);
+               }
+  }
 
     private NexusArtifact getLatestArtifactFromNexus(String selectedName) {
         List<NexusArtifact> artifacts = getArtifactFromNexus(selectedName, null);
@@ -683,13 +706,13 @@ public class BRMSPush {
     }
 
     private void setVersion(String selectedName) {
-        String newVersion = "0.1.0";
+        String newVersion = VERSION_0_1_0;
         createFlag = false;
         NexusArtifact artifact = getLatestArtifactFromNexus(selectedName);
         if (artifact != null) {
             newVersion = incrementVersion(artifact.getVersion());
         }
-        if ("0.1.0".equals(newVersion)) {
+        if (VERSION_0_1_0.equals(newVersion)) {
             createFlag = true;
         }
         setVersion(newVersion, selectedName);
@@ -728,8 +751,6 @@ public class BRMSPush {
         // 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);
         }
@@ -739,11 +760,12 @@ public class BRMSPush {
                 InvocationResult result = null;
                String group = entry.getKey();
                 try {
+                       LOGGER.info("PushRules: ModifiedGroups, Key: " + group + ", Value: " + entry.getValue());
                     InvocationRequest request = new DefaultInvocationRequest();
                     setVersion(group);
                     createPom(group);
                     request.setPomFile(new File(
-                            PROJECTSLOCATION + File.separator + getArtifactID(group) + File.separator + "pom.xml"));
+                            PROJECTSLOCATION + File.separator + getArtifactID(group) + File.separator + POM_XML_FILE));
                     request.setGoals(Arrays.asList(GOALS));
                     Invoker invoker = new DefaultInvoker();
                     result = invoker.execute(request);
@@ -827,9 +849,9 @@ public class BRMSPush {
         ControllerPOJO controllerPOJO = new ControllerPOJO();
         controllerPOJO.setName(controllerName);
         controllerPOJO.setOperation("lock");
-        List<ControllerPOJO> controllers = new ArrayList<>();
-        controllers.add(controllerPOJO);
-        sendNotification(controllers);
+        List<ControllerPOJO> controllerPojos = new ArrayList<>();
+        controllerPojos.add(controllerPOJO);
+        sendNotification(controllerPojos);
     }
 
     private void sendNotification(List<ControllerPOJO> controllers) {
@@ -908,7 +930,7 @@ public class BRMSPush {
         Writer writer = null;
         try {
             writer = WriterFactory.newXmlWriter(
-                    new File(PROJECTSLOCATION + File.separator + getArtifactID(name) + File.separator + "pom.xml"));
+                    new File(PROJECTSLOCATION + File.separator + getArtifactID(name) + File.separator + POM_XML_FILE));
             MavenXpp3Writer pomWriter = new MavenXpp3Writer();
             pomWriter.write(writer, model);
         } catch (Exception e) {
@@ -951,59 +973,59 @@ public class BRMSPush {
         String version = StringEscapeUtils.escapeJava(brmsdependencyversion);
 
         Dependency demoDependency = new Dependency();
-        demoDependency.setGroupId("org.onap.policy.drools-applications");
-        demoDependency.setArtifactId("demo");
+        demoDependency.setGroupId(DROOLS_APPS_TEMPLATE_GROUP);
+        demoDependency.setArtifactId("template.demo");
         demoDependency.setVersion(version);
         dependencyList.add(demoDependency);
 
         Dependency controlloopDependency = new Dependency();
-        controlloopDependency.setGroupId("org.onap.policy.drools-applications");
+        controlloopDependency.setGroupId(DROOLS_APPS_MODEL_GROUP);
         controlloopDependency.setArtifactId("events");
         controlloopDependency.setVersion(version);
         dependencyList.add(controlloopDependency);
 
         Dependency restDependency = new Dependency();
-        restDependency.setGroupId("org.onap.policy.drools-applications");
-        restDependency.setArtifactId("rest");
+        restDependency.setGroupId(DROOLS_APPS_MODEL_GROUP);
+        restDependency.setArtifactId("controlloop.common.model-impl.rest");
         restDependency.setVersion(version);
         dependencyList.add(restDependency);
 
         Dependency appcDependency = new Dependency();
-        appcDependency.setGroupId("org.onap.policy.drools-applications");
-        appcDependency.setArtifactId("appc");
+        appcDependency.setGroupId(DROOLS_APPS_MODEL_GROUP);
+        appcDependency.setArtifactId("controlloop.common.model-impl.appc");
         appcDependency.setVersion(version);
         dependencyList.add(appcDependency);
 
         Dependency aaiDependency = new Dependency();
-        aaiDependency.setGroupId("org.onap.policy.drools-applications");
-        aaiDependency.setArtifactId("aai");
+        aaiDependency.setGroupId(DROOLS_APPS_MODEL_GROUP);
+        aaiDependency.setArtifactId("controlloop.common.model-impl.aai");
         aaiDependency.setVersion(version);
         dependencyList.add(aaiDependency);
 
         Dependency msoDependency = new Dependency();
-        msoDependency.setGroupId("org.onap.policy.drools-applications");
-        msoDependency.setArtifactId("mso");
+        msoDependency.setGroupId(DROOLS_APPS_MODEL_GROUP);
+        msoDependency.setArtifactId("controlloop.common.model-impl.so");
         msoDependency.setVersion(version);
         dependencyList.add(msoDependency);
 
         Dependency trafficgeneratorDependency = new Dependency();
-        trafficgeneratorDependency.setGroupId("org.onap.policy.drools-applications");
-        trafficgeneratorDependency.setArtifactId("trafficgenerator");
+        trafficgeneratorDependency.setGroupId(DROOLS_APPS_MODEL_GROUP);
+        trafficgeneratorDependency.setArtifactId("controlloop.common.model-impl.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"))) {
+        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_FILE))) {
             // 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);
+            copyDataToFile(path + File.separator + META_INF + File.separator + KMODULE_XML_FILE, xml);
         }
     }
 
@@ -1019,20 +1041,21 @@ public class BRMSPush {
 
     private void readGroups(Properties config) throws PolicyException {
         String[] groupNames;
-        if (!config.containsKey("groupNames") || config.getProperty("groupNames")==null){
+        String groupNamesError = "groupNames property is missing or empty from the property file ";
+               if (!config.containsKey(GROUP_NAMES) || config.getProperty(GROUP_NAMES)==null){
             throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE
-                    + "groupNames property is missing or empty from the property file ");
+                    + groupNamesError);
         }
-        if (config.getProperty("groupNames").contains(",")) {
-            groupNames = config.getProperty("groupNames").replaceAll(" ", "").split(",");
+        if (config.getProperty(GROUP_NAMES).contains(",")) {
+            groupNames = config.getProperty(GROUP_NAMES).replaceAll(" ", "").split(",");
         } else {
-            groupNames = new String[] { config.getProperty("groupNames").replaceAll(" ", "") };
+            groupNames = new String[] { config.getProperty(GROUP_NAMES).replaceAll(" ", "") };
         }
         if (groupNames == null || groupNames.length == 0) {
             LOGGER.error(XACMLErrorConstants.ERROR_DATA_ISSUE
-                    + "groupNames property is missing or empty from the property file ");
+                    + groupNamesError);
             throw new PolicyException(XACMLErrorConstants.ERROR_DATA_ISSUE
-                    + "groupNames property is missing or empty from the property file ");
+                    + groupNamesError);
         }
         groupMap = new HashMap<>();
         for (int counter = 0; counter < groupNames.length; counter++) {
@@ -1100,7 +1123,7 @@ public class BRMSPush {
     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";
+                + "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());
@@ -1151,7 +1174,7 @@ public class BRMSPush {
         }
     }
 
-    public int URLListSize() {
+    public int urlListSize() {
         if (repURLs != null) {
             return repURLs.size();
         } else