Add junit and refactor code 01/37501/9
authoreikrwaq <waqas.ikram@ericsson.com>
Wed, 21 Mar 2018 15:31:05 +0000 (15:31 +0000)
committereikrwaq <waqas.ikram@ericsson.com>
Thu, 22 Mar 2018 15:00:51 +0000 (15:00 +0000)
Adding Junit tests in modules and refactoring code

Change-Id: I887f1b2371d9e3d4a4e2ce6e7e1f3c97a361f283
Issue-ID: POLICY-704
Signed-off-by: eikrwaq <waqas.ikram@ericsson.com>
25 files changed:
site-manager/pom.xml
site-manager/src/main/java/org/onap/policy/common/sitemanager/Main.java
site-manager/src/main/java/org/onap/policy/common/sitemanager/data/service/DatabaseAccessService.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/data/service/DatabaseAccessServiceImpl.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/IllegalCommandLineArgumentException.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/MissingPropertyException.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/NoMatchingEntryFoundException.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/PropertyFileProcessingException.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/CommandLineHelper.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/Constants.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/ErrorMessages.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/ExtraCommandLineArgument.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/JmxOpProcessor.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/PersistenceUnitPropertiesProvider.java [new file with mode: 0644]
site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/Printable.java [new file with mode: 0644]
site-manager/src/test/java/org/onap/policy/common/sitemanager/MainTest.java [new file with mode: 0644]
site-manager/src/test/java/org/onap/policy/common/sitemanager/MainTestRunner.java [new file with mode: 0644]
site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/IllegalCommandLineArgumentExceptionTest.java [new file with mode: 0644]
site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/MissingPropertyExceptionTest.java [new file with mode: 0644]
site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/NoMatchingEntryFoundExceptionTest.java [new file with mode: 0644]
site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/PropertyFileProcessingExceptionTest.java [new file with mode: 0644]
site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/CommandLineHelperTest.java [new file with mode: 0644]
site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/ExtraCommandLineArgumentTest.java [new file with mode: 0644]
site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/PersistenceUnitPropertiesProviderTest.java [new file with mode: 0644]
site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/PrintableImpl.java [new file with mode: 0644]

index a30be04..84c38b4 100644 (file)
   ============LICENSE_END=========================================================
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" 
-                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-                xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-       
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
        <modelVersion>4.0.0</modelVersion>
 
        <artifactId>site-manager</artifactId>
@@ -76,7 +75,7 @@
                                                                        <exclude>org.eclipse.persistence:javax.persistence</exclude>
                                                                </excludes>
                                                        </artifactSet>
-                                               </configuration>        
+                                               </configuration>
                                        </execution>
                                </executions>
                        </plugin>
                        <artifactId>commons-cli</artifactId>
                        <version>1.3</version>
                </dependency>
+               <dependency>
+                       <groupId>com.h2database</groupId>
+                       <artifactId>h2</artifactId>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.eclipse.persistence</groupId>
+                       <artifactId>eclipselink</artifactId>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.onap.policy.common</groupId>
+                       <artifactId>utils-test</artifactId>
+                       <version>${project.version}</version>
+                       <scope>test</scope>
+               </dependency>
        </dependencies>
 </project>
index dcaa26c..780e14f 100644 (file)
 
 package org.onap.policy.common.sitemanager;
 
-import java.io.BufferedReader;
-
 /*
  * Site Manager argument list:
  *
- * none - dump help information
- * show - dump information about all nodes
- *      ([site, nodetype, resourceName],
- *          adminState, opState, availStatus, standbyStatus)
- *          The first 3 determine the sort order.
- * setAdminState [ -s <site> | -r <resourceName> ] <new-state>
- * lock [ -s <site> | -r <resourceName> ]
- * unlock [ -s <site> | -r <resourceName> ]
+ * none - dump help information show - dump information about all nodes ([site, nodetype,
+ * resourceName], adminState, opState, availStatus, standbyStatus) The first 3 determine the sort
+ * order. setAdminState [ -s <site> | -r <resourceName> ] <new-state> lock [ -s <site> | -r
+ * <resourceName> ] unlock [ -s <site> | -r <resourceName> ]
  */
 
-import java.io.File;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Comparator;
+import static org.onap.policy.common.sitemanager.utils.Constants.OPERATIONAL_PERSISTENCE_UNIT;
+import static org.onap.policy.common.sitemanager.utils.Constants.SITE_MANAGER_PROPERTIES_PROPERTY_NAME;
+import static org.onap.policy.common.sitemanager.utils.ErrorMessages.HELP_STRING;
+import static org.onap.policy.common.sitemanager.utils.ExtraCommandLineArgument.LOCK;
+import static org.onap.policy.common.sitemanager.utils.ExtraCommandLineArgument.SET_ADMIN_STATE;
+import static org.onap.policy.common.sitemanager.utils.ExtraCommandLineArgument.UNLOCK;
+import static org.onap.policy.common.sitemanager.utils.JmxOpProcessor.jmxOp;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.TreeSet;
-
-import javax.management.JMX;
-import javax.management.ObjectName;
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorFactory;
-import javax.management.remote.JMXServiceURL;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.EntityTransaction;
-import javax.persistence.Persistence;
-import javax.persistence.TypedQuery;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
-import org.apache.commons.cli.DefaultParser;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.onap.policy.common.im.jmx.ComponentAdminMBean;
 import org.onap.policy.common.im.jpa.ResourceRegistrationEntity;
 import org.onap.policy.common.im.jpa.StateManagementEntity;
+import org.onap.policy.common.sitemanager.data.service.DatabaseAccessService;
+import org.onap.policy.common.sitemanager.data.service.DatabaseAccessServiceImpl;
+import org.onap.policy.common.sitemanager.exception.IllegalCommandLineArgumentException;
+import org.onap.policy.common.sitemanager.exception.MissingPropertyException;
+import org.onap.policy.common.sitemanager.exception.NoMatchingEntryFoundException;
+import org.onap.policy.common.sitemanager.exception.PropertyFileProcessingException;
+import org.onap.policy.common.sitemanager.utils.CommandLineHelper;
+import org.onap.policy.common.sitemanager.utils.PersistenceUnitPropertiesProvider;
+import org.onap.policy.common.sitemanager.utils.Printable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -71,19 +59,6 @@ import org.slf4j.LoggerFactory;
  * This class contains the main entry point for Site Manager.
  */
 public class Main {
-    private static final String SITE_NAME = "site";
-
-    private static final String WHERE_R_SITE_SITE = " WHERE r.site = :" + SITE_NAME;
-
-    private static final String WHERE_R_RESOURCE_NAME = " WHERE r.resourceName = :";
-
-    private static final String RESOURCE_NAME = "resourceName";
-
-    private static final String WHERE_S_RESOURCE_NAME = " WHERE s.resourceName = :";
-
-    private static final String RESOURCE_REGISTRATION_QUERY = "SELECT r FROM ResourceRegistrationEntity r";
-
-    private static final String STATE_MANAGEMENT_QUERY = "SELECT s FROM StateManagementEntity s";
 
     private static final Logger logger = LoggerFactory.getLogger(Main.class.getName());
 
@@ -96,189 +71,92 @@ public class Main {
     /**
      * Print out help information regarding command arguments.
      */
-    private static void help() {
-        System.out.print("Usage:\n" + "    siteManager show [ -s <site> | -r <resourceName> ] :\n"
-                + "        display node information\n"
-                + "    siteManager setAdminState { -s <site> | -r <resourceName> }" + " <new-state> :\n"
-                + "        update admin state on selected nodes\n"
-                + "    siteManager lock { -s <site> | -r <resourceName> } :\n" + "        lock selected nodes\n"
-                + "    siteManager unlock { -s <site> | -r <resourceName> } :\n" + "        unlock selected nodes\n");
+    private static String getHelpString() {
+        return HELP_STRING;
     }
 
     /**
-     * Print out help information regarding the properties file.
+     * This is the main entry point
      *
-     * @param propertiesFileName the path to the properties file
+     * @param args these are command-line arguments to 'siteManager'
      */
-    private static void helpProperties(final String propertiesFileName) {
-        if (propertiesFileName == null) {
-            // file name not specified (missing system property)
-            System.out.print("'siteManager' needs to be passed the system property\n"
-                    + "'siteManager.properties', which is the file name of a\n"
-                    + "properties file containing database access information\n\n");
-        } else {
-            final File file = new File(propertiesFileName);
-            if (!file.exists()) {
-                // file name specified, but does not exist
-                System.out.print("Properties file '" + file.getAbsolutePath() + "' does not exist.\n\n");
-            } else {
-                // file name specified and does exist -- presumably, the
-                // problem is with one or more properties
-                System.out.print("One or more missing properties in\n'" + file.getAbsolutePath() + "'.\n\n");
+    public static void main(final String[] args) {
+        final Printable printable = new PrintableImpl();
+        new Main().process(args, printable);
+    }
+
+    public void process(final String[] args, final Printable printable) {
+        try {
+            final CommandLineHelper commandLineHelper = new CommandLineHelper(args, printable);
+
+            if (commandLineHelper.isHelpArgumentSet()) {
+                printable.println(getHelpString());
+                System.exit(0);
             }
-        }
 
-        System.out.print("The following properties need to be specified:\n\n" + "    javax.persistence.jdbc.driver -"
-                + " typically 'org.mariadb.jdbc.Driver'\n"
-                + "    javax.persistence.jdbc.url - URL referring to the database,\n"
-                + "        which typically has the form:" + " 'jdbc:mariadb://<host>:<port>/<db>'\n"
-                + "        ('<db>' is probably 'xacml' in this case)\n"
-                + "    javax.persistence.jdbc.user - the user id for accessing the" + " database\n"
-                + "    javax.persistence.jdbc.password - password for accessing the" + " database\n");
+            if (!commandLineHelper.isValid()) {
+                printable.println(getHelpString());
+                System.exit(2);
+            }
+            process(commandLineHelper, printable);
+        } catch (final IllegalCommandLineArgumentException illegalCommandLineArgumentException) {
+            printable.println(illegalCommandLineArgumentException.getMessage());
+            printable.println(getHelpString());
+            System.exit(1);
+        } catch (final PropertyFileProcessingException | MissingPropertyException exception) {
+            System.exit(3);
+        } catch (final NoMatchingEntryFoundException exception) {
+            System.exit(4);
+        }
     }
 
-    /**
-     * This is the main entry point.
-     *
-     * @param args these are command-line arguments to 'siteManager'
-     */
-    public static void main(final String[] args) {
-        CommandLine cmd = getCommandLine(args);
-
+    private void process(final CommandLineHelper cmd, final Printable printable) {
         // fetch options, and remaining arguments
-        final String sOption = cmd.getOptionValue('s');
-        final String rOption = cmd.getOptionValue('r');
+        final String sOption = cmd.getSite();
+        final String rOption = cmd.getResourceName();
         final List<String> argList = cmd.getArgList();
 
-        // a number of commands require either the '-r' option or '-s' option
-        final boolean optionLetterSpecified = (rOption != null || sOption != null);
+        final String arg0 = argList.get(0);
 
-        // used to accumulate any error messages that are generated
-        final StringBuilder error = new StringBuilder();
+        // read in properties used to access the database
+        final String propertiesFileName = System.getProperty(SITE_MANAGER_PROPERTIES_PROPERTY_NAME);
+        final Properties properties = PersistenceUnitPropertiesProvider.getProperties(propertiesFileName, printable);
 
-        // first non-option argument
-        String arg0 = null;
+        try (final DatabaseAccessService accessService =
+                getDatabaseAccessService(OPERATIONAL_PERSISTENCE_UNIT, properties)) {
 
-        if (argList.isEmpty()) {
-            error.append("No command specified\n");
-        } else {
-            arg0 = argList.get(0);
-            if ("show".equalsIgnoreCase(arg0)) {
-                // show [ -s <site> | -r <resourceName> ]
-                if (argList.size() != 1) {
-                    error.append("show: Extra arguments\n");
-                }
-            } else if ("setAdminState".equalsIgnoreCase(arg0)) {
-                // setAdminState { -s <site> | -r <resourceName> } <new-state>
-                switch (argList.size()) {
-                    case 1:
-                        error.append("setAdminState: Missing <new-state> value\n");
-                        break;
-                    case 2:
-                        // this is expected
-                        break;
-                    default:
-                        error.append("setAdminState: Extra arguments\n");
-                        break;
-                }
-                if (!optionLetterSpecified) {
-                    error.append("setAdminState: Either '-s' or '-r' option is needed\n");
-                }
-            } else if ("lock".equalsIgnoreCase(arg0)) {
-                // lock { -s <site> | -r <resourceName> }
-                if (argList.size() != 1) {
-                    error.append("lock: Extra arguments\n");
-                }
-                if (!optionLetterSpecified) {
-                    error.append("lock: Either '-s' or '-r' option is needed\n");
-                }
-            } else if ("unlock".equalsIgnoreCase(arg0)) {
-                // unlock { -s <site> | -r <resourceName> }
-                if (argList.size() != 1) {
-                    error.append("unlock: Extra arguments\n");
-                }
-                if (!optionLetterSpecified) {
-                    error.append("unlock: Either '-s' or '-r' option is needed\n");
-                }
-            } else {
-                error.append(arg0).append(": Unknown command\n");
-            }
-        }
-        if (sOption != null && rOption != null) {
-            error.append(arg0).append(":  'r' and 's' options are mutually exclusive\n");
-        }
-        if (error.length() != 0) {
-            // if any errors have occurred, dump out the error string,
-            // help information, and exit
-            System.out.println(error.toString());
-            help();
-            System.exit(2);
-        }
+            final List<StateManagementEntity> stateManagementResultList =
+                    accessService.getStateManagementEntities(rOption, sOption);
+            final List<ResourceRegistrationEntity> resourceRegistrationResultList =
+                    accessService.getResourceRegistrationEntities(rOption, sOption);
 
-        // read in properties used to access the database
-        final String propertiesFileName = System.getProperty("siteManager.properties");
-        final Properties properties = getProperties(propertiesFileName);
-
-        // access database through 'EntityManager'
-        final EntityManagerFactory emf = Persistence.createEntityManagerFactory("operationalPU", properties);
-        final EntityManager em = emf.createEntityManager();
-
-        TypedQuery<StateManagementEntity> stateManagementEntityTableQuery;
-        TypedQuery<ResourceRegistrationEntity> resourceRegistryEntityTableQuery;
-
-        if (rOption != null) {
-            // 'resourceName' specified -- both queries are limited to this
-            // resource
-            stateManagementEntityTableQuery =
-                    em.createQuery(STATE_MANAGEMENT_QUERY + WHERE_S_RESOURCE_NAME + RESOURCE_NAME,
-                            StateManagementEntity.class).setParameter(RESOURCE_NAME, rOption);
-            resourceRegistryEntityTableQuery =
-                    em.createQuery(RESOURCE_REGISTRATION_QUERY + WHERE_R_RESOURCE_NAME + RESOURCE_NAME,
-                            ResourceRegistrationEntity.class).setParameter(RESOURCE_NAME, rOption);
-        } else if (sOption != null) {
-            // 'site' is specified -- 'ResourceRegistrationEntity' has a 'site'
-            // field, but 'StateManagementEntity' does not
-            stateManagementEntityTableQuery = em.createQuery(STATE_MANAGEMENT_QUERY, StateManagementEntity.class);
-            resourceRegistryEntityTableQuery =
-                    em.createQuery(RESOURCE_REGISTRATION_QUERY + WHERE_R_SITE_SITE, ResourceRegistrationEntity.class)
-                            .setParameter(SITE_NAME, sOption);
-        } else {
-            // query all entries
-            stateManagementEntityTableQuery = em.createQuery(STATE_MANAGEMENT_QUERY, StateManagementEntity.class);
-            resourceRegistryEntityTableQuery =
-                    em.createQuery(RESOURCE_REGISTRATION_QUERY, ResourceRegistrationEntity.class);
-        }
-
-        // perform 'StateManagementEntity' query, and place matching entries
-        // in 'stateManagementTable'
-        for (final StateManagementEntity stateManagementEntity : stateManagementEntityTableQuery.getResultList()) {
-            stateManagementTable.put(stateManagementEntity.getResourceName(), stateManagementEntity);
-        }
+            // perform 'StateManagementEntity' query, and place matching entries
+            // in 'stateManagementTable'
+            for (final StateManagementEntity stateManagementEntity : stateManagementResultList) {
+                stateManagementTable.put(stateManagementEntity.getResourceName(), stateManagementEntity);
+            }
 
-        // perform 'ResourceRegistrationQuery', and place matching entries
-        // in 'resourceRegistrationTable' ONLY if there is also an associated
-        // 'stateManagementTable' entry
-        for (final ResourceRegistrationEntity resourceRegistrationEntity : resourceRegistryEntityTableQuery
-                .getResultList()) {
-            final String resourceName = resourceRegistrationEntity.getResourceName();
-            if (stateManagementTable.get(resourceName) != null) {
-                // only include entries that have a corresponding
-                // state table entry -- silently ignore the rest
-                resourceRegistrationTable.put(resourceName, resourceRegistrationEntity);
+            // perform 'ResourceRegistrationQuery', and place matching entries
+            // in 'resourceRegistrationTable' ONLY if there is also an associated
+            // 'stateManagementTable' entry
+            for (final ResourceRegistrationEntity resourceRegistrationEntity : resourceRegistrationResultList) {
+                final String resourceName = resourceRegistrationEntity.getResourceName();
+                if (stateManagementTable.get(resourceName) != null) {
+                    // only include entries that have a corresponding
+                    // state table entry -- silently ignore the rest
+                    resourceRegistrationTable.put(resourceName, resourceRegistrationEntity);
+                }
             }
-        }
 
-        if (resourceRegistrationTable.size() == 0) {
-            System.out.println(arg0 + ": No matching entries");
-            System.exit(4);
-        }
+            if (resourceRegistrationTable.isEmpty()) {
+                final String message = arg0 + ": No matching entries";
+                printable.println(message);
+                throw new NoMatchingEntryFoundException(message);
+            }
 
-        if ("setAdminState".equalsIgnoreCase(arg0)) {
-            // update admin state on all of the nodes
-            final String adminState = argList.get(1);
-            final EntityTransaction et = em.getTransaction();
-            et.begin();
-            try {
+            if (SET_ADMIN_STATE.getValue().equalsIgnoreCase(arg0)) {
+                // update admin state on all of the nodes
+                final String adminState = argList.get(1);
                 // iterate over all matching 'ResourceRegistrationEntity' instances
                 for (final ResourceRegistrationEntity r : resourceRegistrationTable.values()) {
                     // we know the corresponding 'StateManagementEntity' exists --
@@ -288,79 +166,44 @@ public class Main {
 
                     // update the admin state, and save the changes
                     s.setAdminState(adminState);
-                    em.persist(s);
                 }
-            } finally {
-                // do the commit
-                em.flush();
-                et.commit();
-            }
-        } else if ("lock".equalsIgnoreCase(arg0) || "unlock".equalsIgnoreCase(arg0)) {
-            // these use the JMX interface
-            for (final ResourceRegistrationEntity r : resourceRegistrationTable.values()) {
-                // lock or unlock the entity
-                jmxOp(arg0, r);
-
-                // change should be reflected in 'adminState'
-                em.refresh(stateManagementTable.get(r.getResourceName()));
+                accessService.persist(stateManagementTable.values());
+
+            } else if (LOCK.getValue().equalsIgnoreCase(arg0) || UNLOCK.getValue().equalsIgnoreCase(arg0)) {
+                // these use the JMX interface
+                for (final ResourceRegistrationEntity r : resourceRegistrationTable.values()) {
+                    // lock or unlock the entity
+                    jmxOp(arg0, r, printable);
+
+                    // change should be reflected in 'adminState'
+                    accessService.refreshEntity(stateManagementTable.get(r.getResourceName()));
+                }
             }
+        } catch (final Exception exception) {
+            printable.println(exception.getMessage());
         }
 
-        // free connection to the database
-        em.close();
-
         // display all entries
         display();
     }
 
     /**
-     * Process a 'lock' or 'unlock' operation on a single 'ResourceRegistrationEntity'.
+     * Compare two strings, either of which may be null
      *
-     * @param arg0 this is the string "lock" or "unlock"
-     * @param resourceRegistrationEntity this is the ResourceRegistrationEntity to lock or unlock
+     * @param first the first string
+     * @param second the second string
+     * @return a negative value if s1<s2, 0 if they are equal, and positive if s1>s2
      */
-    static void jmxOp(final String arg0, final ResourceRegistrationEntity resourceRegistrationEntity) {
-        final String resourceName = resourceRegistrationEntity.getResourceName();
-        final String jmxUrl = resourceRegistrationEntity.getResourceUrl();
-        if (jmxUrl == null) {
-            System.out.println(arg0 + ": no resource URL for '" + resourceName + "'");
-            return;
+    private static int stringCompare(final String first, final String second) {
+        if (first == null ^ second == null) {
+            return (first == null) ? -1 : 1;
         }
 
-        JMXConnector connector = null;
-        try {
-            connector = JMXConnectorFactory.connect(new JMXServiceURL(jmxUrl));
-            final ComponentAdminMBean admin = JMX.newMXBeanProxy(connector.getMBeanServerConnection(),
-                    new ObjectName("ONAP_POLICY_COMP:name=" + resourceName), ComponentAdminMBean.class);
-
-            if ("lock".equals(arg0)) {
-                admin.lock();
-            } else {
-                admin.unlock();
-            }
-        } catch (final Exception e) {
-            // e.printStackTrace();
-            System.out.println(arg0 + " failed for '" + resourceName + "': " + e);
-        } finally {
-            if (connector != null) {
-                try {
-                    connector.close();
-                } catch (final Exception e) {
-                    System.err.println(e);
-                }
-            }
+        if (first == null && second == null) {
+            return 0;
         }
-    }
 
-    /**
-     * Compare two strings, either of which may be null.
-     *
-     * @param s1 the first string
-     * @param s2 the second string
-     * @return a negative value if s1 < s2, 0 if they are equal, and positive if s1 > s2
-     */
-    private static int stringCompare(final String s1, final String s2) {
-        return ((s1 == null) ? (s2 == null ? 0 : -1) : (s2 == null ? 1 : s1.compareTo(s2)));
+        return first.compareTo(second);
     }
 
     /**
@@ -369,12 +212,11 @@ public class Main {
      *
      * @param current this is an array of length 7, containing the current maximum lengths of each
      *        column in the tabular dump
-     * @param strings this is an array of length 7, containing the current String entry for each
-     *        column
+     * @param s this is an array of length 7, containing the current String entry for each column
      */
-    private static void updateLengths(final int[] current, final String[] strings) {
+    private static void updateLengths(final int[] current, final String[] s) {
         for (int i = 0; i < 7; i += 1) {
-            final String str = strings[i];
+            final String str = s[i];
             final int newLength = (str == null ? 4 : str.length());
             if (current[i] < newLength) {
                 // this column needs to be expanded
@@ -384,29 +226,25 @@ public class Main {
     }
 
     /**
-     * Ordered display -- dump out all of the entries.
+     * Ordered display -- dump out all of the entries, in
      */
     static void display() {
-        final TreeSet<String[]> treeset = new TreeSet<String[]>(new Comparator<String[]>() {
-            @Override
-            public int compare(final String[] r1, final String[] r2) {
-                int rval = 0;
-
-                // the first 3 columns are 'Site', 'NodeType', and 'ResourceName',
-                // and are used to sort the entries
-                for (int i = 0; i < 3; i += 1) {
-                    if ((rval = stringCompare(r1[i], r2[i])) != 0) {
-                        break;
-                    }
-                }
-                return (rval);
+        final TreeSet<String[]> treeset = new TreeSet<>((final String[] r1, final String[] r2) -> {
+            int rval = 0;
+
+            // the first 3 columns are 'Site', 'NodeType', and 'ResourceName',
+            // and are used to sort the entries
+            for (int i = 0; i < 3; i += 1) {
+                if ((rval = stringCompare(r1[i], r2[i])) != 0)
+                    break;
             }
+            return (rval);
         });
 
         final String[] labels = new String[] {"Site", "NodeType", "ResourceName", "AdminState", "OpState",
-            "AvailStatus", "StandbyStatus"};
+                "AvailStatus", "StandbyStatus"};
         final String[] underlines = new String[] {"----", "--------", "------------", "----------", "-------",
-            "-----------", "-------------"};
+                "-----------", "-------------"};
 
         // each column needs to be at least wide enough to fit the column label
         final int[] lengths = new int[7];
@@ -445,62 +283,15 @@ public class Main {
         }
     }
 
-    private static Properties getProperties(final String propertiesFileName) {
-        final File propertiesFile = new File(propertiesFileName);
-
-        if (propertiesFileName == null || !propertiesFile.exists()) {
-            helpProperties(propertiesFileName);
-            System.exit(3);
-        }
-        final Properties properties = getProperties(propertiesFile.toPath());
-
-        // verify that we have all of the properties needed
-        if (properties.getProperty("javax.persistence.jdbc.driver") == null
-                || properties.getProperty("javax.persistence.jdbc.url") == null
-                || properties.getProperty("javax.persistence.jdbc.user") == null
-                || properties.getProperty("javax.persistence.jdbc.password") == null) {
-            // one or more missing properties
-            helpProperties(propertiesFileName);
-            System.exit(3);
-        }
-        return properties;
+    DatabaseAccessService getDatabaseAccessService(final String persistenceUnitName, final Properties properties) {
+        return new DatabaseAccessServiceImpl(persistenceUnitName, properties);
     }
 
-    private static Properties getProperties(final Path filePath) {
-        final Properties properties = new Properties();
-        try (final BufferedReader bufferedReader = Files.newBufferedReader(filePath);) {
-            properties.load(bufferedReader);
-        } catch (final Exception e) {
-            System.out.println("Exception loading properties: " + e);
-            helpProperties(filePath.getFileName().toString());
-            System.exit(3);
-        }
-        return properties;
-    }
-
-    private static CommandLine getCommandLine(final String[] args) {
-        final Options options = new Options();
-        options.addOption("s", true, "specify site");
-        options.addOption("r", true, "specify resource name");
-        options.addOption("h", false, "display help");
-        options.addOption("?", false, "display help");
-
-        // parse options
-        final CommandLineParser parser = new DefaultParser();
-        CommandLine cmd = null;
-
-        try {
-            cmd = parser.parse(options, args);
-        } catch (final ParseException e) {
-            System.out.println(e.getMessage());
-            help();
-            System.exit(1);
-        }
+    private static class PrintableImpl implements Printable {
 
-        if (cmd == null || cmd.getOptionValue('h') != null || cmd.getOptionValue('?') != null) {
-            help();
-            System.exit(0);
+        @Override
+        public void println(final String value) {
+            System.out.println(value);
         }
-        return cmd;
     }
 }
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/data/service/DatabaseAccessService.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/data/service/DatabaseAccessService.java
new file mode 100644 (file)
index 0000000..513ba17
--- /dev/null
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.data.service;
+
+import java.util.Collection;
+import java.util.List;
+import org.onap.policy.common.im.jpa.ResourceRegistrationEntity;
+import org.onap.policy.common.im.jpa.StateManagementEntity;
+
+public interface DatabaseAccessService extends AutoCloseable {
+
+    <T> List<T> execute(final Class<T> clazz, final String query, final String paramName, final String paramValue);
+
+    <T> List<T> execute(final Class<T> clazz, final String query);
+
+    /**
+     * Get {@link StateManagementEntity} entities from database
+     * 
+     * @param rOption resource name (optional)
+     * @param sOption site name (optional)
+     * @return list of {@link StateManagementEntity} entities found
+     */
+    List<StateManagementEntity> getStateManagementEntities(final String rOption, final String sOption);
+
+    /**
+     * Get {@link ResourceRegistrationEntity} entities from database
+     * 
+     * @param rOption resource name (optional)
+     * @param sOption site name (optional)
+     * @return list of {@link ResourceRegistrationEntity} entities found
+     */
+    List<ResourceRegistrationEntity> getResourceRegistrationEntities(final String rOption, final String sOption);
+
+    <T> void persist(final Collection<T> entities);
+
+    <T> void refreshEntity(final T enity);
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/data/service/DatabaseAccessServiceImpl.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/data/service/DatabaseAccessServiceImpl.java
new file mode 100644 (file)
index 0000000..ee98fc2
--- /dev/null
@@ -0,0 +1,120 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.data.service;
+
+import static org.onap.policy.common.sitemanager.utils.Constants.RESOURCE_NAME;
+import static org.onap.policy.common.sitemanager.utils.Constants.RESOURCE_REGISTRATION_QUERY;
+import static org.onap.policy.common.sitemanager.utils.Constants.SITE_NAME;
+import static org.onap.policy.common.sitemanager.utils.Constants.STATE_MANAGEMENT_QUERY;
+import static org.onap.policy.common.sitemanager.utils.Constants.WHERE_R_RESOURCE_NAME;
+import static org.onap.policy.common.sitemanager.utils.Constants.WHERE_R_SITE_NAME;
+import static org.onap.policy.common.sitemanager.utils.Constants.WHERE_S_RESOURCE_NAME;
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.persistence.TypedQuery;
+import org.onap.policy.common.im.jpa.ResourceRegistrationEntity;
+import org.onap.policy.common.im.jpa.StateManagementEntity;
+import org.onap.policy.common.utils.jpa.EntityTransCloser;
+
+public class DatabaseAccessServiceImpl implements DatabaseAccessService {
+
+    private final EntityManagerFactory entityManagerFactory;
+    private EntityManager entityManager;
+
+    public DatabaseAccessServiceImpl(final String persistenceUnitName, final Properties properties) {
+        this.entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName, properties);
+        this.entityManager = entityManagerFactory.createEntityManager();
+    }
+    
+    public DatabaseAccessServiceImpl(final EntityManagerFactory entityManagerFactory) {
+        this.entityManagerFactory = entityManagerFactory;
+        this.entityManager = entityManagerFactory.createEntityManager();
+    }
+
+    @Override
+    public <T> List<T> execute(final Class<T> clazz, final String query, final String paramName,
+            final String paramValue) {
+        final TypedQuery<T> typedQuery = entityManager.createQuery(query, clazz);
+        typedQuery.setParameter(paramName, paramValue);
+        return typedQuery.getResultList();
+
+    }
+
+    @Override
+    public <T> List<T> execute(final Class<T> clazz, final String query) {
+        final TypedQuery<T> typedQuery = entityManager.createQuery(query, clazz);
+        return typedQuery.getResultList();
+    }
+
+    @Override
+    public List<StateManagementEntity> getStateManagementEntities(final String rOption, final String sOption) {
+        if (rOption != null) {
+            final String query = STATE_MANAGEMENT_QUERY + WHERE_S_RESOURCE_NAME + RESOURCE_NAME;
+            return execute(StateManagementEntity.class, query, RESOURCE_NAME, rOption);
+        } else if (sOption != null) {
+            return execute(StateManagementEntity.class, STATE_MANAGEMENT_QUERY);
+        }
+        return execute(StateManagementEntity.class, STATE_MANAGEMENT_QUERY);
+
+    }
+
+    @Override
+    public List<ResourceRegistrationEntity> getResourceRegistrationEntities(final String rOption,
+            final String sOption) {
+        if (rOption != null) {
+            final String query = RESOURCE_REGISTRATION_QUERY + WHERE_R_RESOURCE_NAME + RESOURCE_NAME;
+            return execute(ResourceRegistrationEntity.class, query, RESOURCE_NAME, rOption);
+        } else if (sOption != null) {
+            final String query = RESOURCE_REGISTRATION_QUERY + WHERE_R_SITE_NAME + SITE_NAME;
+            return execute(ResourceRegistrationEntity.class, query, SITE_NAME, sOption);
+        }
+        return execute(ResourceRegistrationEntity.class, RESOURCE_REGISTRATION_QUERY);
+    }
+
+    @Override
+    public <T> void persist(final Collection<T> entities) {
+        try (final EntityTransCloser et = new EntityTransCloser(entityManager.getTransaction())) {
+            for (final T entity : entities) {
+                entityManager.persist(entity);
+            }
+            entityManager.flush();
+            et.commit();
+        }
+    }
+
+    @Override
+    public <T> void refreshEntity(final T enity) {
+        entityManager.refresh(enity);
+
+    }
+
+    @Override
+    public void close() {
+        if (entityManager.isOpen()) {
+            entityManager.close();
+        }
+    }
+
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/IllegalCommandLineArgumentException.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/IllegalCommandLineArgumentException.java
new file mode 100644 (file)
index 0000000..db374c3
--- /dev/null
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.exception;
+
+public class IllegalCommandLineArgumentException extends RuntimeException {
+
+    private static final long serialVersionUID = 4229478147993769997L;
+
+    public IllegalCommandLineArgumentException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/MissingPropertyException.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/MissingPropertyException.java
new file mode 100644 (file)
index 0000000..b5c1088
--- /dev/null
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.exception;
+
+public class MissingPropertyException extends RuntimeException {
+
+    private static final long serialVersionUID = 1224494625143527218L;
+
+    public MissingPropertyException(final String message) {
+        super(message);
+    }
+
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/NoMatchingEntryFoundException.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/NoMatchingEntryFoundException.java
new file mode 100644 (file)
index 0000000..f77cdce
--- /dev/null
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.exception;
+
+public class NoMatchingEntryFoundException extends RuntimeException {
+
+    private static final long serialVersionUID = -1118517375170348132L;
+
+    public NoMatchingEntryFoundException(final String message) {
+        super(message);
+    }
+
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/PropertyFileProcessingException.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/exception/PropertyFileProcessingException.java
new file mode 100644 (file)
index 0000000..2c4bcb9
--- /dev/null
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.exception;
+
+public class PropertyFileProcessingException extends RuntimeException {
+
+    private static final long serialVersionUID = 6507640341242930149L;
+
+    public PropertyFileProcessingException(final String message) {
+        super(message);
+    }
+
+    public PropertyFileProcessingException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/CommandLineHelper.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/CommandLineHelper.java
new file mode 100644 (file)
index 0000000..58db7bc
--- /dev/null
@@ -0,0 +1,116 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+import java.util.List;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.onap.policy.common.sitemanager.exception.IllegalCommandLineArgumentException;
+
+public class CommandLineHelper {
+
+    private static final String HELP_QUESTION_MARK_ARGUMENT_NAME = "?";
+
+    private static final String HELP_ARGUMENT_NAME = "h";
+
+    private static final String RESOURCE_ARGUMENT_NAME = "r";
+
+    private static final String SITE_ARGUMENT_NAME = "s";
+
+    private final CommandLine commandLine;
+
+    private static final CommandLineParser PARSER = new DefaultParser();
+
+    private final Printable printable;
+
+    public CommandLineHelper(final String[] args, final Printable printable) {
+        this.commandLine = getCommandLine(getOptions(), args);
+        this.printable = printable;
+    }
+
+    private Options getOptions() {
+        final Options options = new Options();
+        options.addOption(Option.builder(SITE_ARGUMENT_NAME).hasArg(true).desc("specify site").build());
+        options.addOption(Option.builder(RESOURCE_ARGUMENT_NAME).hasArg(true).desc("specify resource name").build());
+        options.addOption(Option.builder(HELP_ARGUMENT_NAME).hasArg(false).desc("display help").build());
+        options.addOption(Option.builder(HELP_QUESTION_MARK_ARGUMENT_NAME).hasArg(false).desc("display help").build());
+
+        return options;
+    }
+
+    public String getSite() {
+        return commandLine.getOptionValue(SITE_ARGUMENT_NAME);
+    }
+
+    public String getResourceName() {
+        return commandLine.getOptionValue(RESOURCE_ARGUMENT_NAME);
+    }
+
+    private CommandLine getCommandLine(final Options options, final String[] args) {
+        try {
+            return PARSER.parse(options, args);
+        } catch (final ParseException | NullPointerException exception) {
+            throw new IllegalCommandLineArgumentException(exception.getMessage(), exception);
+        }
+    }
+
+    public boolean isValid() {
+        // fetch options, and remaining arguments
+        final String sOption = commandLine.getOptionValue(SITE_ARGUMENT_NAME);
+        final String rOption = commandLine.getOptionValue(RESOURCE_ARGUMENT_NAME);
+        final List<String> argList = commandLine.getArgList();
+
+        // a number of commands require either the '-r' option or '-s' option
+        final boolean optionLetterSpecified = (rOption != null || sOption != null);
+
+        if (argList.isEmpty()) {
+            printable.println(ErrorMessages.NO_COMMAND_SPECIFIED);
+            return false;
+        }
+        // a number of commands require either the '-r' option or '-s' option
+        final String arg0 = argList.get(0);
+        final ExtraCommandLineArgument argument = ExtraCommandLineArgument.getExtraCommandLineArgument(arg0);
+
+        if (!argument.isValid(argList, printable, optionLetterSpecified)) {
+            return false;
+        }
+
+        if (sOption != null && rOption != null) {
+            printable.println(arg0 + ErrorMessages.R_AND_S_OPTIONS_ARE_MUTUALLY_EXCLUSIVE);
+            return false;
+        }
+
+        return true;
+    }
+
+    public boolean isHelpArgumentSet() {
+        return commandLine.hasOption(HELP_ARGUMENT_NAME) || commandLine.hasOption(HELP_QUESTION_MARK_ARGUMENT_NAME);
+    }
+
+    public List<String> getArgList() {
+        return commandLine.getArgList();
+    }
+
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/Constants.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/Constants.java
new file mode 100644 (file)
index 0000000..0f2d9a4
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+public final class Constants {
+
+    public static final String SITE_NAME = "site";
+
+    public static final String WHERE_R_SITE_NAME = " WHERE r.site = :";
+
+    public static final String WHERE_R_RESOURCE_NAME = " WHERE r.resourceName = :";
+
+    public static final String RESOURCE_NAME = "resourceName";
+
+    public static final String WHERE_S_RESOURCE_NAME = " WHERE s.resourceName = :";
+
+    public static final String RESOURCE_REGISTRATION_QUERY = "SELECT r FROM ResourceRegistrationEntity r";
+
+    public static final String STATE_MANAGEMENT_QUERY = "SELECT s FROM StateManagementEntity s";
+
+    public static final String JDBC_PASSWORD_PROPERTY_NAME = "javax.persistence.jdbc.password";
+
+    public static final String JDBC_USER_PROPERTY_NAME = "javax.persistence.jdbc.user";
+
+    public static final String JDBC_URL_PROPERTY_NAME = "javax.persistence.jdbc.url";
+
+    public static final String JDBC_DRIVER_PROPERTY_NAME = "javax.persistence.jdbc.driver";
+
+    public static final String OPERATIONAL_PERSISTENCE_UNIT = "operationalPU";
+
+    public static final String SITE_MANAGER_PROPERTIES_PROPERTY_NAME = "siteManager.properties";
+
+    private Constants() {
+        super();
+    }
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/ErrorMessages.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/ErrorMessages.java
new file mode 100644 (file)
index 0000000..8114546
--- /dev/null
@@ -0,0 +1,76 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+public class ErrorMessages {
+
+    public static final String EXTRA_ARGUMENTS = "Extra arguments";
+
+    public static final String EITHER_S_OR_R_OPTION_IS_NEEDED = "Either '-s' or '-r' option is needed";
+
+    public static final String R_AND_S_OPTIONS_ARE_MUTUALLY_EXCLUSIVE = ":  'r' and 's' options are mutually exclusive";
+
+    public static final String UNKNOWN_COMMAND = ": Unknown command";
+
+    public static final String UNLOCK_EITHER_S_OR_R_OPTION_IS_NEEDED = "unlock: " + EITHER_S_OR_R_OPTION_IS_NEEDED;
+
+    public static final String UNLOCK_EXTRA_ARGUMENTS = "unlock: " + EXTRA_ARGUMENTS;
+
+    public static final String LOCK_EITHER_S_OR_R_OPTION_IS_NEEDED = "lock: " + EITHER_S_OR_R_OPTION_IS_NEEDED;
+
+    public static final String LOCK_EXTRA_ARGUMENTS = "lock: " + EXTRA_ARGUMENTS;
+
+    public static final String SET_ADMIN_STATE_EITHER_S_OR_R_OPTION_IS_NEEDED =
+            "setAdminState: " + EITHER_S_OR_R_OPTION_IS_NEEDED;
+
+    public static final String SET_ADMIN_STATE_EXTRA_ARGUMENTS = "setAdminState: " + EXTRA_ARGUMENTS;
+
+    public static final String SET_ADMIN_STATE_MISSING_NEW_STATE_VALUE = "setAdminState: Missing <new-state> value";
+
+    public static final String SHOW_EXTRA_ARGUMENTS = "show: " + EXTRA_ARGUMENTS;
+
+    public static final String NO_COMMAND_SPECIFIED = "No command specified";
+
+    public static final String HELP_STRING = "Usage:\n" + "    siteManager show [ -s <site> | -r <resourceName> ] :\n"
+            + "        display node information\n" + "    siteManager setAdminState { -s <site> | -r <resourceName> }"
+            + " <new-state> :\n" + "        update admin state on selected nodes\n"
+            + "    siteManager lock { -s <site> | -r <resourceName> } :\n" + "        lock selected nodes\n"
+            + "    siteManager unlock { -s <site> | -r <resourceName> } :\n" + "        unlock selected nodes\n";
+
+    public static final String SITE_MANAGER_PROPERY_FILE_MISSING_PROPERTY =
+            "The following properties need to be specified:\n\n" + "    javax.persistence.jdbc.driver -"
+                    + " typically 'org.mariadb.jdbc.Driver'\n"
+                    + "    javax.persistence.jdbc.url - URL referring to the database,\n"
+                    + "        which typically has the form:" + " 'jdbc:mariadb://<host>:<port>/<db>'\n"
+                    + "        ('<db>' is probably 'xacml' in this case)\n"
+                    + "    javax.persistence.jdbc.user - the user id for accessing the" + " database\n"
+                    + "    javax.persistence.jdbc.password - password for accessing the" + " database\n";
+
+    public static final String SITE_MANAGER_PROPERY_FILE_NOT_DEFINED_MESSAGE =
+            "'siteManager' needs to be passed the system property\n"
+                    + "'siteManager.properties', which is the file name of a\n"
+                    + "properties file containing database access information\n\n";
+
+    private ErrorMessages() {
+        super();
+    }
+
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/ExtraCommandLineArgument.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/ExtraCommandLineArgument.java
new file mode 100644 (file)
index 0000000..a28deec
--- /dev/null
@@ -0,0 +1,138 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+import java.util.List;
+
+public enum ExtraCommandLineArgument {
+    SHOW("show") {
+
+        @Override
+        public boolean isValid(final List<String> argList, final Printable printable) {
+            if (argList.size() != 1) {
+                printable.println(ErrorMessages.SHOW_EXTRA_ARGUMENTS);
+                return false;
+            }
+            return true;
+        }
+
+        @Override
+        public boolean isValid(final List<String> argList, final Printable printable,
+                final boolean optionLetterSpecified) {
+            return isValid(argList, printable);
+        }
+    },
+    SET_ADMIN_STATE("setAdminState") {
+        @Override
+        public boolean isValid(final List<String> argList, final Printable printable,
+                final boolean optionLetterSpecified) {
+            boolean isValid = true;
+            switch (argList.size()) {
+                case 1:
+                    printable.println(ErrorMessages.SET_ADMIN_STATE_MISSING_NEW_STATE_VALUE);
+                    isValid = false;
+                    break;
+                case 2:
+                    isValid = true;
+                    break;
+                default:
+                    printable.println(ErrorMessages.SET_ADMIN_STATE_EXTRA_ARGUMENTS);
+                    isValid = false;
+            }
+            if (!optionLetterSpecified) {
+                printable.println(ErrorMessages.SET_ADMIN_STATE_EITHER_S_OR_R_OPTION_IS_NEEDED);
+                return false;
+            }
+
+            return isValid;
+        }
+
+    },
+    LOCK("lock") {
+
+        @Override
+        public boolean isValid(final List<String> argList, final Printable printable,
+                final boolean optionLetterSpecified) {
+            boolean isValid = true;
+            if (argList.size() != 1) {
+                printable.println(ErrorMessages.LOCK_EXTRA_ARGUMENTS);
+                isValid = false;
+            }
+            if (!optionLetterSpecified) {
+                printable.println(ErrorMessages.LOCK_EITHER_S_OR_R_OPTION_IS_NEEDED);
+                isValid = false;
+            }
+            return isValid;
+        }
+    },
+    UNLOCK("unlock") {
+
+        @Override
+        public boolean isValid(final List<String> argList, final Printable printable,
+                final boolean optionLetterSpecified) {
+            boolean isValid = true;
+            if (argList.size() != 1) {
+                printable.println(ErrorMessages.UNLOCK_EXTRA_ARGUMENTS);
+                isValid = false;
+            }
+            if (!optionLetterSpecified) {
+                printable.println(ErrorMessages.UNLOCK_EITHER_S_OR_R_OPTION_IS_NEEDED);
+                isValid = false;
+            }
+            return isValid;
+        }
+    },
+    INVALID("") {
+        @Override
+        public boolean isValid(final List<String> argList, final Printable printable,
+                final boolean optionLetterSpecified) {
+            printable.println(argList.get(0) + ErrorMessages.UNKNOWN_COMMAND);
+            return false;
+        }
+    };
+
+    private final String value;
+
+    private ExtraCommandLineArgument(final String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public static ExtraCommandLineArgument getExtraCommandLineArgument(final String value) {
+        for (final ExtraCommandLineArgument argument : ExtraCommandLineArgument.values()) {
+            if (argument.getValue().equals(value)) {
+                return argument;
+            }
+        }
+        return ExtraCommandLineArgument.INVALID;
+    }
+
+    public boolean isValid(final List<String> argList, final Printable printable) {
+        return isValid(argList, printable, false);
+    }
+
+    public abstract boolean isValid(final List<String> argList, final Printable printable,
+            final boolean optionLetterSpecified);
+
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/JmxOpProcessor.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/JmxOpProcessor.java
new file mode 100644 (file)
index 0000000..2e354d3
--- /dev/null
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+import java.io.IOException;
+import javax.management.JMX;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+import org.onap.policy.common.im.IntegrityMonitorException;
+import org.onap.policy.common.im.jmx.ComponentAdminMBean;
+import org.onap.policy.common.im.jpa.ResourceRegistrationEntity;
+
+public class JmxOpProcessor {
+
+    private JmxOpProcessor() {
+        super();
+    }
+
+    /**
+     * Process a 'lock' or 'unlock' operation on a single 'ResourceRegistrationEntity'
+     *
+     * @param action this is the string "lock" or "unlock"
+     * @param resourceRegistrationEntity this is the ResourceRegistrationEntity to lock or unlock
+     */
+    public static void jmxOp(final String action, final ResourceRegistrationEntity resourceRegistrationEntity,
+            final Printable printable) {
+        final String resourceName = resourceRegistrationEntity.getResourceName();
+        final String jmxUrl = resourceRegistrationEntity.getResourceUrl();
+        if (jmxUrl == null) {
+            printable.println(action + ": no resource URL for '" + resourceName + "'");
+            return;
+        }
+
+        try (final JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL(jmxUrl))) {
+            final ComponentAdminMBean admin = JMX.newMXBeanProxy(connector.getMBeanServerConnection(),
+                    new ObjectName("ONAP_POLICY_COMP:name=" + resourceName), ComponentAdminMBean.class);
+
+            if ("lock".equals(action)) {
+                admin.lock();
+            } else if ("unlock".equals(action)) {
+                admin.unlock();
+            } else {
+                printable.println("Unknown action: " + action);
+            }
+        } catch (final IOException | MalformedObjectNameException | IntegrityMonitorException exception) {
+            printable.println(action + " failed for '" + resourceName + "': " + exception);
+        }
+    }
+
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/PersistenceUnitPropertiesProvider.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/PersistenceUnitPropertiesProvider.java
new file mode 100644 (file)
index 0000000..5d7abe7
--- /dev/null
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+import static org.onap.policy.common.sitemanager.utils.Constants.JDBC_DRIVER_PROPERTY_NAME;
+import static org.onap.policy.common.sitemanager.utils.Constants.JDBC_PASSWORD_PROPERTY_NAME;
+import static org.onap.policy.common.sitemanager.utils.Constants.JDBC_URL_PROPERTY_NAME;
+import static org.onap.policy.common.sitemanager.utils.Constants.JDBC_USER_PROPERTY_NAME;
+import static org.onap.policy.common.sitemanager.utils.ErrorMessages.SITE_MANAGER_PROPERY_FILE_MISSING_PROPERTY;
+import static org.onap.policy.common.sitemanager.utils.ErrorMessages.SITE_MANAGER_PROPERY_FILE_NOT_DEFINED_MESSAGE;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Properties;
+import org.onap.policy.common.sitemanager.exception.MissingPropertyException;
+import org.onap.policy.common.sitemanager.exception.PropertyFileProcessingException;
+
+public class PersistenceUnitPropertiesProvider {
+
+    private PersistenceUnitPropertiesProvider() {
+        super();
+    }
+
+    public static Properties getProperties(final String propertiesFileName, final Printable printable) {
+        if (propertiesFileName == null) {
+            printable.println(SITE_MANAGER_PROPERY_FILE_NOT_DEFINED_MESSAGE);
+            printable.println(SITE_MANAGER_PROPERY_FILE_MISSING_PROPERTY);
+            throw new PropertyFileProcessingException("Property file name is null :" + propertiesFileName);
+        }
+
+        final Path filePath = Paths.get(propertiesFileName);
+        final Properties properties = getProperties(filePath, printable);
+
+        // verify that we have all of the properties needed
+        if (isNotValid(properties, JDBC_DRIVER_PROPERTY_NAME, JDBC_URL_PROPERTY_NAME, JDBC_USER_PROPERTY_NAME,
+                JDBC_PASSWORD_PROPERTY_NAME)) {
+            // one or more missing properties
+            printable.println(SITE_MANAGER_PROPERY_FILE_MISSING_PROPERTY);
+            throw new MissingPropertyException("missing mandatory attributes");
+        }
+        return properties;
+    }
+
+    private static boolean isNotValid(final Properties properties, final String... values) {
+        if (values == null || values.length == 0) {
+            return true;
+        }
+        for (final String val : values) {
+            if (properties.get(val) == null) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static Properties getProperties(final Path filePath, final Printable printable) {
+        if (!filePath.toFile().exists()) {
+            printable.println(SITE_MANAGER_PROPERY_FILE_NOT_DEFINED_MESSAGE);
+            printable.println(SITE_MANAGER_PROPERY_FILE_MISSING_PROPERTY);
+            throw new PropertyFileProcessingException("Property file not found");
+        }
+
+        try (final BufferedReader bufferedReader = Files.newBufferedReader(filePath);) {
+            final Properties properties = new Properties();
+            properties.load(bufferedReader);
+            return properties;
+        } catch (final IOException exception) {
+            printable.println("Exception loading properties: " + exception);
+            printable.println(ErrorMessages.SITE_MANAGER_PROPERY_FILE_NOT_DEFINED_MESSAGE);
+            printable.println(ErrorMessages.SITE_MANAGER_PROPERY_FILE_MISSING_PROPERTY);
+            throw new PropertyFileProcessingException("Exception loading properties: ", exception);
+        }
+    }
+}
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/Printable.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/utils/Printable.java
new file mode 100644 (file)
index 0000000..757268a
--- /dev/null
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+@FunctionalInterface
+public interface Printable {
+
+    void println(final String value);
+
+}
diff --git a/site-manager/src/test/java/org/onap/policy/common/sitemanager/MainTest.java b/site-manager/src/test/java/org/onap/policy/common/sitemanager/MainTest.java
new file mode 100644 (file)
index 0000000..d8cb5f5
--- /dev/null
@@ -0,0 +1,495 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+import javax.persistence.TypedQuery;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.onap.policy.common.im.jpa.ResourceRegistrationEntity;
+import org.onap.policy.common.im.jpa.StateManagementEntity;
+import org.onap.policy.common.sitemanager.MainTestRunner.ExitCodeTestException;
+import org.onap.policy.common.sitemanager.data.service.DatabaseAccessService;
+import org.onap.policy.common.sitemanager.data.service.DatabaseAccessServiceImpl;
+import org.onap.policy.common.sitemanager.utils.Constants;
+import org.onap.policy.common.sitemanager.utils.ErrorMessages;
+import org.onap.policy.common.sitemanager.utils.PrintableImpl;
+import org.onap.policy.common.utils.jpa.EntityMgrCloser;
+import org.onap.policy.common.utils.jpa.EntityTransCloser;
+
+/**
+ * This class contains the main entry point for Site Manager.
+ */
+public class MainTest {
+
+    private static final String SITE_NAME = "SITE";
+
+    private static final String PROPERTY_FILE_NAME = "siteManagerPropertyFile.properties";
+
+    private static final String RESOURCE_LOCAL = "RESOURCE_LOCAL";
+
+    private static final String DROP_AND_CREATE_TABLES = "drop-and-create-tables";
+
+    private static final String NULL_STRING = "NULL";
+
+    private static final String DATABASE_H2_PLATFORM = "org.eclipse.persistence.platform.database.H2Platform";
+
+    private static final String ECLIPSELINK_ID_VALIDATION = "eclipselink.id-validation";
+
+    private static final String ECLIPSELINK_TARGET_DATABASE = "eclipselink.target-database";
+
+    private static final String DDL_GENERATION = "eclipselink.ddl-generation";
+
+    private static final String TRANSACTION_TYPE = "javax.persistence.transactionType";
+
+    private static final String RESOURCE_NAME = "RESOURCE_NAME";
+
+    private static final String ADMIN_STATE_NEW_VALUE = "NEW_VALUE";
+
+    private static final Date CURRENT_DATE = new Date();
+
+    private static final String COMMENTS = "";
+
+    private static final String DEFAULT_DB_URL_PREFIX = "jdbc:h2:mem:";
+
+    private static final String IN_MEMORY_DB_URL = DEFAULT_DB_URL_PREFIX + "myDb";
+
+    private static final String H2_DB_DRIVER = "org.h2.Driver";
+
+    private final Properties properties = new Properties();
+
+    @Rule
+    public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+    private EntityManagerFactory managerFactory;
+
+    private final MainTestRunner testRunner = new MainTestRunner();
+
+    @Before
+    public void setUp() throws Exception {
+
+        properties.put(Constants.JDBC_DRIVER_PROPERTY_NAME, H2_DB_DRIVER);
+        properties.put(Constants.JDBC_URL_PROPERTY_NAME, IN_MEMORY_DB_URL);
+        properties.put(Constants.JDBC_USER_PROPERTY_NAME, "test");
+        properties.put(Constants.JDBC_PASSWORD_PROPERTY_NAME, "test");
+        properties.put(TRANSACTION_TYPE, RESOURCE_LOCAL);
+        properties.put(DDL_GENERATION, DROP_AND_CREATE_TABLES);
+        properties.put(ECLIPSELINK_TARGET_DATABASE, DATABASE_H2_PLATFORM);
+        properties.put(ECLIPSELINK_ID_VALIDATION, NULL_STRING);
+
+        final File file = temporaryFolder.newFile(PROPERTY_FILE_NAME);
+        creatPropertyFile(file, properties);
+        System.setProperty(Constants.SITE_MANAGER_PROPERTIES_PROPERTY_NAME, file.toString());
+        managerFactory = Persistence.createEntityManagerFactory(Constants.OPERATIONAL_PERSISTENCE_UNIT, properties);
+
+        testRunner.setUp();
+    }
+
+    @After
+    public void destroy() {
+        Main.stateManagementTable.clear();
+        Main.resourceRegistrationTable.clear();
+        testRunner.destroy();
+        properties.clear();;
+        if (managerFactory.isOpen()) {
+            managerFactory.close();
+        }
+    }
+
+    @Test
+    public void test_process_initializitonWithOutException() throws IOException {
+
+        persist(managerFactory.createEntityManager(), getStateManagementEntity());
+
+        persist(managerFactory.createEntityManager(), getResourceRegistrationEntity());
+
+        final String[] args = new String[] {"show"};
+        final PrintableImpl printable = new PrintableImpl();
+        final Main objUnderTest = getMain();
+        objUnderTest.process(args, printable);
+
+        assertEquals(1, Main.resourceRegistrationTable.size());
+        assertEquals(1, Main.stateManagementTable.size());
+        assertTrue(printable.getResult().isEmpty());
+
+    }
+
+    @Test
+    public void test_process_setAdminStateWithResourceNameArgument() throws IOException {
+        persist(managerFactory.createEntityManager(), getStateManagementEntity());
+        persist(managerFactory.createEntityManager(), getResourceRegistrationEntity());
+
+        final String[] args = new String[] {"setAdminState", "-r", RESOURCE_NAME, ADMIN_STATE_NEW_VALUE};
+        final PrintableImpl printable = new PrintableImpl();
+        final Main objUnderTest = getMain();
+        objUnderTest.process(args, printable);
+
+        assertEquals(1, Main.resourceRegistrationTable.size());
+        assertEquals(1, Main.stateManagementTable.size());
+        assertTrue(printable.getResult().isEmpty());
+
+        final List<StateManagementEntity> execute = execute(managerFactory.createEntityManager(),
+                StateManagementEntity.class, Constants.STATE_MANAGEMENT_QUERY);
+
+        assertEquals(ADMIN_STATE_NEW_VALUE, execute.get(0).getAdminState());
+
+    }
+
+    @Test
+    public void test_process_setAdminStateWithStateArgument() throws IOException {
+        persist(managerFactory.createEntityManager(), getStateManagementEntity());
+        persist(managerFactory.createEntityManager(), getResourceRegistrationEntity());
+
+        final String[] args = new String[] {"setAdminState", "-s", SITE_NAME, RESOURCE_NAME};
+        final PrintableImpl printable = new PrintableImpl();
+        final Main objUnderTest = getMain();
+        objUnderTest.process(args, printable);
+
+        assertEquals(1, Main.resourceRegistrationTable.size());
+        assertEquals(1, Main.stateManagementTable.size());
+        final List<String> result = printable.getResult();
+        assertTrue(result.isEmpty());
+
+    }
+
+    @Test
+    public void test_process_propertyFileNotAvailable() throws IOException {
+
+        final File file = temporaryFolder.newFile("New" + PROPERTY_FILE_NAME);
+        System.setProperty(Constants.SITE_MANAGER_PROPERTIES_PROPERTY_NAME, file.toString());
+
+        final String[] args = new String[] {"setAdminState", "-s", SITE_NAME, RESOURCE_NAME};
+        final PrintableImpl printable = new PrintableImpl();
+        try {
+            final Main objUnderTest = getMain();
+            objUnderTest.process(args, printable);
+            fail("ExitCodeTestException must be thrown in MainTestRunner class when System.exit() is called in Main class");
+        } catch (final ExitCodeTestException exitCodeTestException) {
+            assertEquals(3, exitCodeTestException.exitCode);
+
+        }
+        assertTrue(Main.stateManagementTable.isEmpty());
+        assertTrue(Main.resourceRegistrationTable.isEmpty());
+        assertFalse(printable.getResult().isEmpty());
+
+    }
+
+    @Test
+    public void test_process_emptyPropertyFile() throws IOException {
+
+        final File file = temporaryFolder.newFile("New" + PROPERTY_FILE_NAME);
+        System.setProperty(Constants.SITE_MANAGER_PROPERTIES_PROPERTY_NAME, file.toString());
+        creatPropertyFile(file, new Properties());
+        final String[] args = new String[] {"setAdminState", "-s", SITE_NAME, RESOURCE_NAME};
+        final PrintableImpl printable = new PrintableImpl();
+        try {
+            final Main objUnderTest = getMain();
+            objUnderTest.process(args, printable);
+            fail("ExitCodeTestException must be thrown in MainTestRunner class when System.exit() is called in Main class");
+        } catch (final ExitCodeTestException exitCodeTestException) {
+            assertEquals(3, exitCodeTestException.exitCode);
+
+        }
+        assertTrue(Main.stateManagementTable.isEmpty());
+        assertTrue(Main.resourceRegistrationTable.isEmpty());
+        assertFalse(printable.getResult().isEmpty());
+
+    }
+
+    @Test
+    public void test_process_MissingAttributesInPropertyFile() throws IOException {
+
+        final File file = temporaryFolder.newFile("New" + PROPERTY_FILE_NAME);
+        System.setProperty(Constants.SITE_MANAGER_PROPERTIES_PROPERTY_NAME, file.toString());
+        final Properties properties = new Properties();
+        properties.put(Constants.JDBC_DRIVER_PROPERTY_NAME, H2_DB_DRIVER);
+        creatPropertyFile(file, properties);
+        final String[] args = new String[] {"setAdminState", "-s", SITE_NAME, RESOURCE_NAME};
+        final PrintableImpl printable = new PrintableImpl();
+        try {
+            final Main objUnderTest = getMain();
+            objUnderTest.process(args, printable);
+            fail("ExitCodeTestException must be thrown in MainTestRunner class when System.exit() is called in Main class");
+        } catch (final ExitCodeTestException exitCodeTestException) {
+            assertEquals(3, exitCodeTestException.exitCode);
+
+        }
+        assertTrue(Main.stateManagementTable.isEmpty());
+        assertTrue(Main.resourceRegistrationTable.isEmpty());
+        assertFalse(printable.getResult().isEmpty());
+
+    }
+
+    @Test
+    public void test_process_MissingOneAttributesInPropertyFile() throws IOException {
+
+        final File file = temporaryFolder.newFile("New" + PROPERTY_FILE_NAME);
+        System.setProperty(Constants.SITE_MANAGER_PROPERTIES_PROPERTY_NAME, file.toString());
+        final Properties properties = new Properties();
+        properties.put(Constants.JDBC_DRIVER_PROPERTY_NAME, H2_DB_DRIVER);
+        properties.put(Constants.JDBC_URL_PROPERTY_NAME, IN_MEMORY_DB_URL);
+        properties.put(Constants.JDBC_USER_PROPERTY_NAME, "test");
+        creatPropertyFile(file, properties);
+        final String[] args = new String[] {"setAdminState", "-s", SITE_NAME, RESOURCE_NAME};
+        final PrintableImpl printable = new PrintableImpl();
+        try {
+            final Main objUnderTest = getMain();
+            objUnderTest.process(args, printable);
+            fail("ExitCodeTestException must be thrown in MainTestRunner class when System.exit() is called in Main class");
+        } catch (final ExitCodeTestException exitCodeTestException) {
+            assertEquals(3, exitCodeTestException.exitCode);
+
+        }
+        assertTrue(Main.stateManagementTable.isEmpty());
+        assertTrue(Main.resourceRegistrationTable.isEmpty());
+        assertFalse(printable.getResult().isEmpty());
+
+    }
+
+    @Test
+    public void test_process_emptyArguments_printError() throws IOException {
+
+        final PrintableImpl printable = new PrintableImpl();
+        try {
+            final String[] args = new String[] {};
+            final Main objUnderTest = getMain();
+            objUnderTest.process(args, printable);
+            fail("ExitCodeTestException must be thrown in MainTestRunner class when System.exit() is called in Main class");
+        } catch (final ExitCodeTestException exitCodeTestException) {
+            assertEquals(2, exitCodeTestException.exitCode);
+
+        }
+
+        assertTrue(Main.stateManagementTable.isEmpty());
+        assertTrue(Main.resourceRegistrationTable.isEmpty());
+        final List<String> actualMessages = printable.getResult();
+        assertFalse(actualMessages.isEmpty());
+
+        assertEquals(Arrays.asList(ErrorMessages.NO_COMMAND_SPECIFIED, ErrorMessages.HELP_STRING), actualMessages);
+
+    }
+
+    @Test
+    public void test_process_nonEmptyWithHelpArguments_printHelp() throws IOException {
+
+        final PrintableImpl printable = new PrintableImpl();
+        try {
+            final String[] args = new String[] {"---", ""};
+            final Main objUnderTest = getMain();
+            objUnderTest.process(args, printable);
+            fail("ExitCodeTestException must be thrown in MainTestRunner class when System.exit() is called in Main class");
+        } catch (final ExitCodeTestException exitCodeTestException) {
+            assertEquals(1, exitCodeTestException.exitCode);
+
+        }
+        assertTrue(Main.stateManagementTable.isEmpty());
+        assertTrue(Main.resourceRegistrationTable.isEmpty());
+        final List<String> actualMessages = printable.getResult();
+        assertFalse(actualMessages.isEmpty());
+        assertEquals(Arrays.asList("Unrecognized option: ---", ErrorMessages.HELP_STRING), actualMessages);
+
+    }
+
+    @Test
+    public void test_process_HelpArguments_printHelp() {
+
+        final PrintableImpl printable = new PrintableImpl();
+        try {
+            final String[] args = new String[] {"-h"};
+            final Main objUnderTest = getMain();
+            objUnderTest.process(args, printable);
+            fail("ExitCodeTestException must be thrown in MainTestRunner class when System.exit() is called in Main class");
+        } catch (final ExitCodeTestException exitCodeTestException) {
+            assertEquals(0, exitCodeTestException.exitCode);
+
+        }
+        assertTrue(Main.stateManagementTable.isEmpty());
+        assertTrue(Main.resourceRegistrationTable.isEmpty());
+        final List<String> actualMessages = printable.getResult();
+        assertFalse(actualMessages.isEmpty());
+        assertEquals(Arrays.asList(ErrorMessages.HELP_STRING), actualMessages);
+
+    }
+
+    @Test
+    public void test_process_missingArguments_printHelpAndErrorMessage() {
+
+        final PrintableImpl printable = new PrintableImpl();
+        try {
+            final String[] args = new String[] {"setAdminState", "-s", RESOURCE_NAME};
+            final Main objUnderTest = getMain();
+            objUnderTest.process(args, printable);
+            fail("ExitCodeTestException must be thrown in MainTestRunner class when System.exit() is called in Main class");
+        } catch (final ExitCodeTestException exitCodeTestException) {
+            assertEquals(2, exitCodeTestException.exitCode);
+
+        }
+        assertTrue(Main.stateManagementTable.isEmpty());
+        assertTrue(Main.resourceRegistrationTable.isEmpty());
+        final List<String> actualMessages = printable.getResult();
+        assertFalse(actualMessages.isEmpty());
+        assertEquals(Arrays.asList(ErrorMessages.SET_ADMIN_STATE_MISSING_NEW_STATE_VALUE, ErrorMessages.HELP_STRING),
+                actualMessages);
+
+    }
+
+    @Test
+    public void test_process_extraShowArguments_printHelpAndErrorMessage() {
+        final String[] args = new String[] {"show", RESOURCE_NAME};
+
+        runAndAssertErrorMessage(args, ErrorMessages.SHOW_EXTRA_ARGUMENTS, ErrorMessages.HELP_STRING);
+    }
+
+    @Test
+    public void test_process_lockShowArguments_printHelpAndErrorMessage() {
+        final String[] args = new String[] {"lock", RESOURCE_NAME};
+
+        runAndAssertErrorMessage(args, ErrorMessages.LOCK_EXTRA_ARGUMENTS,
+                ErrorMessages.LOCK_EITHER_S_OR_R_OPTION_IS_NEEDED, ErrorMessages.HELP_STRING);
+    }
+
+    @Test
+    public void test_process_unknowArguments_printHelpAndErrorMessage() {
+        final String[] args = new String[] {"x", RESOURCE_NAME};
+
+        runAndAssertErrorMessage(args, "x" + ErrorMessages.UNKNOWN_COMMAND, ErrorMessages.HELP_STRING);
+    }
+
+    @Test
+    public void test_process_SetAdminStateArguments_printHelpAndErrorMessage() {
+        final String[] args = new String[] {"setAdminState", RESOURCE_NAME, RESOURCE_NAME};
+
+        runAndAssertErrorMessage(args, ErrorMessages.SET_ADMIN_STATE_EXTRA_ARGUMENTS,
+                ErrorMessages.SET_ADMIN_STATE_EITHER_S_OR_R_OPTION_IS_NEEDED, ErrorMessages.HELP_STRING);
+    }
+
+    @Test
+    public void test_process_SetAdminStateArguments_printHelpAndErrorMessage2() {
+        final String[] args = new String[] {"lock", "-s", SITE_NAME, "-r", RESOURCE_NAME};
+
+        runAndAssertErrorMessage(args, "lock" + ErrorMessages.R_AND_S_OPTIONS_ARE_MUTUALLY_EXCLUSIVE,
+                ErrorMessages.HELP_STRING);
+    }
+
+    @Test
+    public void test_process_unlockShowArguments_printHelpAndErrorMessage() {
+        final String[] args = new String[] {"unlock", RESOURCE_NAME};
+
+        runAndAssertErrorMessage(args, ErrorMessages.UNLOCK_EXTRA_ARGUMENTS,
+                ErrorMessages.UNLOCK_EITHER_S_OR_R_OPTION_IS_NEEDED, ErrorMessages.HELP_STRING);
+    }
+
+    @Test
+    public void test_process_StateAndResourceArguments_printHelpAndErrorMessage() {
+        final String[] args = new String[] {"-s", SITE_NAME, "-r", RESOURCE_NAME};
+
+        runAndAssertErrorMessage(args, ErrorMessages.NO_COMMAND_SPECIFIED, ErrorMessages.HELP_STRING);
+
+    }
+
+    private void runAndAssertErrorMessage(final String[] args, final String... expectedErrorMessages) {
+        final PrintableImpl printable = new PrintableImpl();
+        try {
+            final Main objUnderTest = getMain();
+            objUnderTest.process(args, printable);
+            fail("ExitCodeTestException must be thrown in MainTestRunner class when System.exit() is called in Main class");
+        } catch (final ExitCodeTestException exitCodeTestException) {
+            assertEquals(2, exitCodeTestException.exitCode);
+
+        }
+        assertTrue(Main.stateManagementTable.isEmpty());
+        assertTrue(Main.resourceRegistrationTable.isEmpty());
+        final List<String> actualMessages = printable.getResult();
+        assertFalse(actualMessages.isEmpty());
+        assertEquals(Arrays.asList(expectedErrorMessages), actualMessages);
+    }
+
+    private <T> void persist(final EntityManager entityManager, final T entity) {
+        final EntityTransaction entityTransaction = entityManager.getTransaction();
+        try (final EntityMgrCloser emc = new EntityMgrCloser(entityManager);
+                final EntityTransCloser transaction = new EntityTransCloser(entityTransaction)) {
+            entityManager.persist(entity);
+            transaction.commit();
+        }
+    }
+
+    public <T> List<T> execute(final EntityManager entityManager, final Class<T> clazz, final String query) {
+        try (final EntityMgrCloser entityMgrCloser = new EntityMgrCloser(entityManager);) {
+            final TypedQuery<T> typedQuery = entityManager.createQuery(query, clazz);
+            return typedQuery.getResultList();
+        }
+    }
+
+    private Main getMain() {
+        final Main objUnderTest = new Main() {
+            @Override
+            DatabaseAccessService getDatabaseAccessService(final String persistenceUnitName,
+                    final Properties properties) {
+                return new DatabaseAccessServiceImpl(managerFactory);
+            };
+        };
+        return objUnderTest;
+    }
+
+    private StateManagementEntity getStateManagementEntity() {
+        final StateManagementEntity entity = new StateManagementEntity();
+        entity.setModifiedDate(CURRENT_DATE);
+        entity.setAdminState("AdminState");
+        entity.setResourceName(RESOURCE_NAME);
+        entity.setAvailStatus("AvailStatus");
+        entity.setOpState("OpState");
+        entity.setStandbyStatus("StandbyStatus");
+        return entity;
+    }
+
+    private ResourceRegistrationEntity getResourceRegistrationEntity() {
+        final ResourceRegistrationEntity entity = new ResourceRegistrationEntity();
+        entity.setLastUpdated(CURRENT_DATE);
+        entity.setNodeType("NODE_NAME");
+        entity.setResourceName(RESOURCE_NAME);
+        entity.setResourceUrl("/path/to/something");
+        entity.setSite(SITE_NAME);
+        return entity;
+    }
+
+    private void creatPropertyFile(final File file, final Properties properties) throws IOException {
+        try (final BufferedWriter bufferedWriter = Files.newBufferedWriter(file.toPath());) {
+            properties.store(bufferedWriter, COMMENTS);
+        }
+    }
+}
diff --git a/site-manager/src/test/java/org/onap/policy/common/sitemanager/MainTestRunner.java b/site-manager/src/test/java/org/onap/policy/common/sitemanager/MainTestRunner.java
new file mode 100644 (file)
index 0000000..f763d4a
--- /dev/null
@@ -0,0 +1,73 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager;
+
+import java.security.Permission;
+
+public class MainTestRunner {
+
+    private SecurityManager savedSecurityManager;
+    private final ExitCodeSecurityManager exitCodeSecurityManager = new ExitCodeSecurityManager();;
+    private boolean isSetUp = false;
+
+    public void setUp() {
+        if (!isSetUp) {
+            savedSecurityManager = System.getSecurityManager();
+            System.setSecurityManager(exitCodeSecurityManager);
+            isSetUp = true;
+        }
+    }
+
+    public void destroy() {
+        if (isSetUp) {
+            System.setSecurityManager(savedSecurityManager);
+            isSetUp = false;
+        }
+    }
+
+    class ExitCodeTestException extends SecurityException {
+        private static final long serialVersionUID = 2690072276259821984L;
+        public final int exitCode;
+
+        public ExitCodeTestException(final int exitCode) {
+            super("Test specific exit code exception to handle System.exit, value: " + exitCode);
+            this.exitCode = exitCode;
+        }
+    }
+
+    private class ExitCodeSecurityManager extends SecurityManager {
+
+        @Override
+        public void checkPermission(final Permission perm) {
+        }
+
+        @Override
+        public void checkPermission(final Permission perm, final Object context) {
+        }
+
+        @Override
+        public void checkExit(final int status) {
+            super.checkExit(status);
+            throw new ExitCodeTestException(status);
+        }
+
+    }
+}
diff --git a/site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/IllegalCommandLineArgumentExceptionTest.java b/site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/IllegalCommandLineArgumentExceptionTest.java
new file mode 100644 (file)
index 0000000..73a5691
--- /dev/null
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.exception;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.onap.policy.common.sitemanager.exception.IllegalCommandLineArgumentException;
+import org.onap.policy.common.utils.test.ExceptionsTester;
+
+public class IllegalCommandLineArgumentExceptionTest extends ExceptionsTester {
+
+    @Test
+    public void testIllegalCommandLineArgumentException() throws Exception {
+        assertEquals(1, test(IllegalCommandLineArgumentException.class));
+    }
+
+}
diff --git a/site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/MissingPropertyExceptionTest.java b/site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/MissingPropertyExceptionTest.java
new file mode 100644 (file)
index 0000000..7a9963f
--- /dev/null
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.exception;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.onap.policy.common.sitemanager.exception.MissingPropertyException;
+import org.onap.policy.common.utils.test.ExceptionsTester;
+
+public class MissingPropertyExceptionTest extends ExceptionsTester {
+
+    @Test
+    public void testMissingPropertyException() throws Exception {
+        assertEquals(1, test(MissingPropertyException.class));
+    }
+
+}
diff --git a/site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/NoMatchingEntryFoundExceptionTest.java b/site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/NoMatchingEntryFoundExceptionTest.java
new file mode 100644 (file)
index 0000000..1b7bfa3
--- /dev/null
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.exception;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.onap.policy.common.sitemanager.exception.NoMatchingEntryFoundException;
+import org.onap.policy.common.utils.test.ExceptionsTester;
+
+public class NoMatchingEntryFoundExceptionTest extends ExceptionsTester {
+
+    @Test
+    public void testNoMatchingEntryFoundException() throws Exception {
+        assertEquals(1, test(NoMatchingEntryFoundException.class));
+    }
+
+}
diff --git a/site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/PropertyFileProcessingExceptionTest.java b/site-manager/src/test/java/org/onap/policy/common/sitemanager/exception/PropertyFileProcessingExceptionTest.java
new file mode 100644 (file)
index 0000000..5289a81
--- /dev/null
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.exception;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.onap.policy.common.sitemanager.exception.PropertyFileProcessingException;
+import org.onap.policy.common.utils.test.ExceptionsTester;
+
+public class PropertyFileProcessingExceptionTest extends ExceptionsTester {
+
+    @Test
+    public void testPropertyFileProcessingException() throws Exception {
+        assertEquals(2, test(PropertyFileProcessingException.class));
+    }
+
+}
diff --git a/site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/CommandLineHelperTest.java b/site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/CommandLineHelperTest.java
new file mode 100644 (file)
index 0000000..d15c1dc
--- /dev/null
@@ -0,0 +1,194 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.onap.policy.common.sitemanager.utils.ExtraCommandLineArgument.LOCK;
+import static org.onap.policy.common.sitemanager.utils.ExtraCommandLineArgument.SET_ADMIN_STATE;
+import static org.onap.policy.common.sitemanager.utils.ExtraCommandLineArgument.SHOW;
+import static org.onap.policy.common.sitemanager.utils.ExtraCommandLineArgument.UNLOCK;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Test;
+import org.onap.policy.common.sitemanager.exception.IllegalCommandLineArgumentException;
+
+public class CommandLineHelperTest {
+
+    private static final String STATE_NAME = "STATE_NAME";
+    private static final String RESOURCE_NAME = "RESOURCE_NAME";
+
+    @Test
+    public void test_CommandLineHelper_emptyArgs() throws IOException {
+        final String[] args = new String[] {};
+        final PrintableImpl printable = new PrintableImpl();
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertFalse(objUnderTest.isValid());
+        assertEquals(Arrays.asList(ErrorMessages.NO_COMMAND_SPECIFIED), printable.getResult());
+    }
+
+    @Test
+    public void test_CommandLineHelper_NullArgs() throws IOException {
+        final String[] args = null;
+        final PrintableImpl printable = new PrintableImpl();
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertFalse(objUnderTest.isValid());
+        assertEquals(Arrays.asList(ErrorMessages.NO_COMMAND_SPECIFIED), printable.getResult());
+    }
+
+    @Test
+    public void test_CommandLineHelper_ShowValidArgs() throws IOException {
+        final String[] args = new String[] {SHOW.getValue(), "-s", RESOURCE_NAME};
+        final PrintableImpl printable = new PrintableImpl();
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertTrue(objUnderTest.isValid());
+        assertTrue(printable.getResult().isEmpty());
+    }
+
+    @Test
+    public void test_CommandLineHelper_LockValidArgs() throws IOException {
+        final String[] args = new String[] {LOCK.getValue(), "-s", RESOURCE_NAME};
+        final PrintableImpl printable = new PrintableImpl();
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertTrue(objUnderTest.isValid());
+        assertTrue(printable.getResult().isEmpty());
+    }
+
+    @Test
+    public void test_CommandLineHelper_UnLockValidArgs() throws IOException {
+        final String[] args = new String[] {UNLOCK.getValue(), "-s", RESOURCE_NAME};
+        final PrintableImpl printable = new PrintableImpl();
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertTrue(objUnderTest.isValid());
+        assertTrue(printable.getResult().isEmpty());
+    }
+
+    @Test
+    public void test_CommandLineHelper_SetAdminStateValidArgs() throws IOException {
+        final String[] args = new String[] {SET_ADMIN_STATE.getValue(), RESOURCE_NAME, "-r", RESOURCE_NAME};
+        final PrintableImpl printable = new PrintableImpl();
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertTrue(objUnderTest.isValid());
+        assertTrue(printable.getResult().isEmpty());
+        assertEquals(RESOURCE_NAME, objUnderTest.getResourceName());
+    }
+
+    @Test
+    public void test_CommandLineHelper_SetAdminStateWithStateValidArgs() throws IOException {
+        final String[] args = new String[] {SET_ADMIN_STATE.getValue(), RESOURCE_NAME, "-s", STATE_NAME};
+        final PrintableImpl printable = new PrintableImpl();
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertTrue(objUnderTest.isValid());
+        assertTrue(printable.getResult().isEmpty());
+        assertEquals(STATE_NAME, objUnderTest.getSite());
+
+        assertEquals(Arrays.asList(SET_ADMIN_STATE.getValue(), RESOURCE_NAME), objUnderTest.getArgList());
+    }
+
+    @Test
+    public void test_CommandLineHelper_HelpValidArgs() throws IOException {
+        final String[] args = new String[] {"-h"};
+        final PrintableImpl printable = new PrintableImpl();
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+        assertTrue(objUnderTest.isHelpArgumentSet());
+    }
+
+    @Test(expected = IllegalCommandLineArgumentException.class)
+    public void test_CommandLineHelper_invaidArgs_printHelp() throws IOException {
+
+        final PrintableImpl printable = new PrintableImpl();
+
+        final String[] args = new String[] {"---", ""};
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertFalse(objUnderTest.isValid());
+
+    }
+
+    @Test
+    public void test_CommandLineHelper_invaidArgsMissingAttributes_printHelp() throws IOException {
+
+        final PrintableImpl printable = new PrintableImpl();
+        final String[] args = new String[] {SET_ADMIN_STATE.getValue(), "-s", RESOURCE_NAME};
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertFalse(objUnderTest.isValid());
+        final List<String> actualMessages = printable.getResult();
+
+        assertEquals(Arrays.asList(ErrorMessages.SET_ADMIN_STATE_MISSING_NEW_STATE_VALUE), actualMessages);
+
+    }
+
+    @Test
+    public void test_CommandLineHelper_invaidShowArgsExtraAttributes_printHelp() throws IOException {
+
+        final PrintableImpl printable = new PrintableImpl();
+        final String[] args = new String[] {SHOW.getValue(), RESOURCE_NAME};
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertFalse(objUnderTest.isValid());
+        final List<String> actualMessages = printable.getResult();
+
+        assertEquals(Arrays.asList(ErrorMessages.SHOW_EXTRA_ARGUMENTS), actualMessages);
+
+    }
+
+    @Test
+    public void test_CommandLineHelper_invaidLockArgsExtraAttributes_printHelp() throws IOException {
+
+        final PrintableImpl printable = new PrintableImpl();
+        final String[] args = new String[] {LOCK.getValue(), RESOURCE_NAME};
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertFalse(objUnderTest.isValid());
+        final List<String> actualMessages = printable.getResult();
+
+        assertEquals(
+                Arrays.asList(ErrorMessages.LOCK_EXTRA_ARGUMENTS, ErrorMessages.LOCK_EITHER_S_OR_R_OPTION_IS_NEEDED),
+                actualMessages);
+
+    }
+
+    @Test
+    public void test_CommandLineHelper_invaidUnLockArgsExtraAttributes_printHelp() throws IOException {
+
+        final PrintableImpl printable = new PrintableImpl();
+        final String[] args = new String[] {UNLOCK.getValue(), RESOURCE_NAME};
+        final CommandLineHelper objUnderTest = new CommandLineHelper(args, printable);
+
+        assertFalse(objUnderTest.isValid());
+        final List<String> actualMessages = printable.getResult();
+
+        assertEquals(Arrays.asList(ErrorMessages.UNLOCK_EXTRA_ARGUMENTS,
+                ErrorMessages.UNLOCK_EITHER_S_OR_R_OPTION_IS_NEEDED), actualMessages);
+
+    }
+
+}
diff --git a/site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/ExtraCommandLineArgumentTest.java b/site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/ExtraCommandLineArgumentTest.java
new file mode 100644 (file)
index 0000000..b1b465b
--- /dev/null
@@ -0,0 +1,84 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.onap.policy.common.sitemanager.utils.ExtraCommandLineArgument.LOCK;
+import static org.onap.policy.common.sitemanager.utils.ExtraCommandLineArgument.SET_ADMIN_STATE;
+import static org.onap.policy.common.sitemanager.utils.ExtraCommandLineArgument.SHOW;
+import java.io.IOException;
+import java.util.Arrays;
+import org.junit.Test;
+
+public class ExtraCommandLineArgumentTest {
+
+    private static final String EMPTY_STRING = "";
+    private static final String RESOURCE_NAME = "RESOURCE_NAME";
+
+    @Test
+    public void test_ExtraCommandLineArgument_ShowValidArgs() throws IOException {
+        final PrintableImpl printable = new PrintableImpl();
+
+        final ExtraCommandLineArgument objUnderTest =
+                ExtraCommandLineArgument.getExtraCommandLineArgument(SHOW.getValue());
+
+        assertTrue(objUnderTest.isValid(Arrays.asList(SHOW.getValue()), printable));
+        assertTrue(printable.getResult().isEmpty());
+    }
+
+    @Test
+    public void test_ExtraCommandLineArgument_SetAdminStateValidArgs() throws IOException {
+        final PrintableImpl printable = new PrintableImpl();
+
+        final ExtraCommandLineArgument objUnderTest =
+                ExtraCommandLineArgument.getExtraCommandLineArgument(SET_ADMIN_STATE.getValue());
+
+        assertTrue(objUnderTest.isValid(Arrays.asList(SET_ADMIN_STATE.getValue(), RESOURCE_NAME), printable, true));
+        assertTrue(printable.getResult().isEmpty());
+    }
+
+    @Test
+    public void test_ExtraCommandLineArgument_LockStateValidArgs() throws IOException {
+        final PrintableImpl printable = new PrintableImpl();
+
+        final ExtraCommandLineArgument objUnderTest =
+                ExtraCommandLineArgument.getExtraCommandLineArgument(LOCK.getValue());
+
+        assertTrue(objUnderTest.isValid(Arrays.asList(LOCK.getValue()), printable, true));
+        assertTrue(printable.getResult().isEmpty());
+    }
+
+    @Test
+    public void test_ExtraCommandLineArgument_InValidArgs() throws IOException {
+        final PrintableImpl printable = new PrintableImpl();
+
+        final ExtraCommandLineArgument objUnderTest =
+                ExtraCommandLineArgument.getExtraCommandLineArgument(EMPTY_STRING);
+
+        assertTrue(objUnderTest.equals(ExtraCommandLineArgument.INVALID));
+        assertFalse(objUnderTest.isValid(Arrays.asList(EMPTY_STRING), printable, false));
+        assertFalse(printable.getResult().isEmpty());
+        assertEquals(Arrays.asList(ErrorMessages.UNKNOWN_COMMAND), printable.getResult());
+    }
+
+}
diff --git a/site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/PersistenceUnitPropertiesProviderTest.java b/site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/PersistenceUnitPropertiesProviderTest.java
new file mode 100644 (file)
index 0000000..5f4e4eb
--- /dev/null
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+import static org.junit.Assert.assertEquals;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Properties;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.onap.policy.common.sitemanager.exception.MissingPropertyException;
+import org.onap.policy.common.sitemanager.exception.PropertyFileProcessingException;
+
+public class PersistenceUnitPropertiesProviderTest {
+    private static final String PROPERTIES_FILE_NAME = "file.properties";
+
+    private static final String COMMENTS = "";
+
+    @Rule
+    public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+    @Test(expected = PropertyFileProcessingException.class)
+    public void test_getProperties_null_throwException() {
+        final Printable printable = new PrintableImpl();
+
+        PersistenceUnitPropertiesProvider.getProperties(null, printable);
+    }
+
+    @Test(expected = PropertyFileProcessingException.class)
+    public void test_getProperties_emptyString_throwException() {
+        final Printable printable = new PrintableImpl();
+
+        PersistenceUnitPropertiesProvider.getProperties("", printable);
+    }
+
+    @Test(expected = MissingPropertyException.class)
+    public void test_getProperties_emptyPropertyFile_throwException() throws IOException {
+        final Printable printable = new PrintableImpl();
+        final File file = temporaryFolder.newFile(PROPERTIES_FILE_NAME);
+        creatPropertyFile(file, new Properties());
+        PersistenceUnitPropertiesProvider.getProperties(file.toString(), printable);
+    }
+
+    @Test(expected = MissingPropertyException.class)
+    public void test_getProperties_PropertyFileWithMissingProperties_throwException() throws IOException {
+        final Printable printable = new PrintableImpl();
+        final File file = temporaryFolder.newFile(PROPERTIES_FILE_NAME);
+        final Properties properties = new Properties();
+        properties.put(Constants.JDBC_DRIVER_PROPERTY_NAME, "org.h2");
+        creatPropertyFile(file, properties);
+        PersistenceUnitPropertiesProvider.getProperties(file.toString(), printable);
+    }
+
+    @Test
+    public void test_getProperties_PropertyFileValidProperties_throwException() throws IOException {
+        final Printable printable = new PrintableImpl();
+        final File file = temporaryFolder.newFile(PROPERTIES_FILE_NAME);
+
+        final Properties properties = new Properties();
+        properties.put(Constants.JDBC_DRIVER_PROPERTY_NAME, "Driver");
+        properties.put(Constants.JDBC_URL_PROPERTY_NAME, "inMem:Database");
+        properties.put(Constants.JDBC_USER_PROPERTY_NAME, "test");
+        properties.put(Constants.JDBC_PASSWORD_PROPERTY_NAME, "test");
+        creatPropertyFile(file, properties);
+        final Properties actualProperties = PersistenceUnitPropertiesProvider.getProperties(file.toString(), printable);
+
+        assertEquals(properties, actualProperties);
+    }
+
+    private void creatPropertyFile(final File file, final Properties properties) throws IOException {
+        try (final BufferedWriter bufferedWriter = Files.newBufferedWriter(file.toPath());) {
+            properties.store(bufferedWriter, COMMENTS);
+        }
+    }
+
+}
diff --git a/site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/PrintableImpl.java b/site-manager/src/test/java/org/onap/policy/common/sitemanager/utils/PrintableImpl.java
new file mode 100644 (file)
index 0000000..dd0512f
--- /dev/null
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * site-manager
+ * ================================================================================
+ * Copyright (C) 2018 Ericsson. 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.common.sitemanager.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PrintableImpl implements Printable {
+
+    private final List<String> result = new ArrayList<>();
+
+    @Override
+    public void println(final String value) {
+        result.add(value);
+    }
+
+    public List<String> getResult() {
+        return result;
+    }
+
+}