diff options
-rw-r--r-- | site-manager/src/main/java/org/onap/policy/common/sitemanager/Main.java | 352 |
1 files changed, 170 insertions, 182 deletions
diff --git a/site-manager/src/main/java/org/onap/policy/common/sitemanager/Main.java b/site-manager/src/main/java/org/onap/policy/common/sitemanager/Main.java index 25cd145f..45be87c4 100644 --- a/site-manager/src/main/java/org/onap/policy/common/sitemanager/Main.java +++ b/site-manager/src/main/java/org/onap/policy/common/sitemanager/Main.java @@ -20,6 +20,8 @@ package org.onap.policy.common.sitemanager; +import java.io.BufferedReader; + /* * Site Manager argument list: * @@ -34,47 +36,61 @@ package org.onap.policy.common.sitemanager; */ import java.io.File; -import java.io.FileInputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.TreeSet; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.EntityTransaction; -import javax.persistence.Query; -import javax.persistence.Persistence; import javax.management.JMX; 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.jpa.ResourceRegistrationEntity; -import org.onap.policy.common.im.jpa.StateManagementEntity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.onap.policy.common.im.jmx.ComponentAdminMBean; +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.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * This class contains the main entry point for Site Manager. */ public class Main { - private static final Logger logger = LoggerFactory.getLogger(Main.class.getName()); + 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()); // table mapping 'resourceName' to 'StateManagmentEntity' - static HashMap<String, StateManagementEntity> stateManagementTable = - new HashMap<String, StateManagementEntity>(); + static Map<String, StateManagementEntity> stateManagementTable = new HashMap<>(); // table mapping 'resourceName' to 'StateManagmentEntity' - static HashMap<String, ResourceRegistrationEntity> resourceRegistrationTable = - new HashMap<String, ResourceRegistrationEntity>(); + static Map<String, ResourceRegistrationEntity> resourceRegistrationTable = new HashMap<>(); /** * Print out help information regarding command arguments. @@ -99,7 +115,7 @@ public class Main * * @param propertiesFileName the path to the properties file */ - private static void helpProperties(String propertiesFileName) + private static void helpProperties(final String propertiesFileName) { if (propertiesFileName == null) { @@ -111,7 +127,7 @@ public class Main } else { - File file = new File(propertiesFileName); + final File file = new File(propertiesFileName); if (!file.exists()) { // file name specified, but does not exist @@ -148,50 +164,25 @@ public class Main * * @param args these are command-line arguments to 'siteManager' */ - public static void main(String... args) + public static void main(final String[] args) { - 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 - CommandLineParser parser = new DefaultParser(); - CommandLine cmd = null; - - try - { - cmd = parser.parse(options, args); - } - catch (ParseException e) - { - System.out.println(e.getMessage()); - help(); - System.exit(1); - } - - if (cmd == null || cmd.getOptionValue('h') != null || cmd.getOptionValue('?') != null) - { - help(); - System.exit(0); - } + CommandLine cmd = getCommandLine(args); // fetch options, and remaining arguments - String sOption = cmd.getOptionValue('s'); - String rOption = cmd.getOptionValue('r'); - List<String> argList = cmd.getArgList(); + final String sOption = cmd.getOptionValue('s'); + final String rOption = cmd.getOptionValue('r'); + final List<String> argList = cmd.getArgList(); // a number of commands require either the '-r' option or '-s' option - boolean optionLetterSpecified = (rOption != null || sOption != null); + final boolean optionLetterSpecified = (rOption != null || sOption != null); // used to accumulate any error messages that are generated - StringBuilder error = new StringBuilder(); + final StringBuilder error = new StringBuilder(); // first non-option argument String arg0 = null; - if (argList.size() == 0) + if (argList.isEmpty()) { error.append("No command specified\n"); } @@ -272,115 +263,55 @@ public class Main } // read in properties used to access the database - String propertiesFileName = System.getProperty("siteManager.properties"); - File propertiesFile = null; - - if (propertiesFileName == null - || !(propertiesFile = new File(propertiesFileName)).exists()) - { - helpProperties(propertiesFileName); - System.exit(3); - } - FileInputStream fis = null; - Properties properties = new Properties(); - try - { - fis = new FileInputStream(propertiesFile); - properties.load(fis); - } - catch (Exception e) - { - System.out.println("Exception loading properties: " + e); - helpProperties(propertiesFileName); - System.exit(3); - } - finally - { - try - { - fis.close(); - } - catch (Exception e) - { - System.err.println(e); - } - } - - // 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); - } + final String propertiesFileName = System.getProperty("siteManager.properties"); + final Properties properties= getProperties(propertiesFileName); // access database through 'EntityManager' - EntityManagerFactory emf = + final EntityManagerFactory emf = Persistence.createEntityManagerFactory("operationalPU", properties); - EntityManager em = emf.createEntityManager(); + final EntityManager em = emf.createEntityManager(); // sQuery - used for StateManagementEntity table // rQuery - used for ResourceRegistrationEntity table - Query sQuery, rQuery; - - if (rOption != null) - { - // 'resourceName' specified -- both queries are limited to this - // resource - sQuery = em.createQuery("SELECT s FROM StateManagementEntity s" - + " WHERE s.resourceName = :resourceName") - .setParameter("resourceName", rOption); - rQuery = em.createQuery("SELECT r FROM ResourceRegistrationEntity r" - + " WHERE r.resourceName = :resourceName") - .setParameter("resourceName", rOption); - } - else if (sOption != null) - { - // 'site' is specified -- 'ResourceRegistrationEntity' has a 'site' - // field, but 'StateManagementEntity' does not - sQuery = em.createQuery("SELECT s FROM StateManagementEntity s"); - rQuery = em.createQuery("SELECT r FROM ResourceRegistrationEntity r" - + " WHERE r.site = :site") - .setParameter("site", sOption); - } - else - { - // query all entries - sQuery = em.createQuery("SELECT s FROM StateManagementEntity s"); - rQuery = em.createQuery("SELECT r FROM ResourceRegistrationEntity r"); - } - - // perform 'StateManagementEntity' query, and place matching entries - // in 'stateManagementTable' - for (Object o : sQuery.getResultList()) - { - if (o instanceof StateManagementEntity) - { - StateManagementEntity s = (StateManagementEntity) o; - stateManagementTable.put(s.getResourceName(), s); - } - } - - // perform 'ResourceRegistrationQuery', and place matching entries - // in 'resourceRegistrationTable' ONLY if there is also an associated - // 'stateManagementTable' entry - for (Object o : rQuery.getResultList()) - { - if (o instanceof ResourceRegistrationEntity) - { - ResourceRegistrationEntity r = (ResourceRegistrationEntity) o; - String resourceName = r.getResourceName(); - if (stateManagementTable.get(resourceName) != null) - { - // only include entries that have a corresponding - // state table entry -- silently ignore the rest - resourceRegistrationTable.put(resourceName, r); - } - } - } + TypedQuery<StateManagementEntity> sQuery; + TypedQuery<ResourceRegistrationEntity> rQuery; + + if (rOption != null) { + // 'resourceName' specified -- both queries are limited to this + // resource + sQuery = em.createQuery(STATE_MANAGEMENT_QUERY + WHERE_S_RESOURCE_NAME + RESOURCE_NAME, + StateManagementEntity.class).setParameter(RESOURCE_NAME, rOption); + rQuery = 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 + sQuery = em.createQuery(STATE_MANAGEMENT_QUERY, StateManagementEntity.class); + rQuery = em.createQuery(RESOURCE_REGISTRATION_QUERY + WHERE_R_SITE_SITE, + ResourceRegistrationEntity.class).setParameter(SITE_NAME, sOption); + } else { + // query all entries + sQuery = em.createQuery(STATE_MANAGEMENT_QUERY, StateManagementEntity.class); + rQuery = em.createQuery(RESOURCE_REGISTRATION_QUERY, ResourceRegistrationEntity.class); + } + + // perform 'StateManagementEntity' query, and place matching entries + // in 'stateManagementTable' + for (final StateManagementEntity stateManagementEntity : sQuery.getResultList()) { + 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 : rQuery.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); + } + } if (resourceRegistrationTable.size() == 0) { @@ -391,20 +322,18 @@ public class Main if ("setAdminState".equalsIgnoreCase(arg0)) { // update admin state on all of the nodes - String adminState = argList.get(1); - EntityTransaction et = em.getTransaction(); + final String adminState = argList.get(1); + final EntityTransaction et = em.getTransaction(); et.begin(); try { // iterate over all matching 'ResourceRegistrationEntity' instances - for (ResourceRegistrationEntity r : - resourceRegistrationTable.values()) + for (final ResourceRegistrationEntity r : resourceRegistrationTable.values()) { // we know the corresponding 'StateManagementEntity' exists -- // 'ResourceRegistrationEntity' entries without a matching // 'StateManagementEntity' entry were not placed in the table - StateManagementEntity s = - stateManagementTable.get(r.getResourceName()); + final StateManagementEntity s = stateManagementTable.get(r.getResourceName()); // update the admin state, and save the changes s.setAdminState(adminState); @@ -421,7 +350,7 @@ public class Main else if ("lock".equalsIgnoreCase(arg0) || "unlock".equalsIgnoreCase(arg0)) { // these use the JMX interface - for (ResourceRegistrationEntity r : + for (final ResourceRegistrationEntity r : resourceRegistrationTable.values()) { // lock or unlock the entity @@ -446,10 +375,10 @@ public class Main * @param arg0 this is the string "lock" or "unlock" * @param r this is the ResourceRegistrationEntity to lock or unlock */ - static void jmxOp(String arg0, ResourceRegistrationEntity r) + static void jmxOp(final String arg0, final ResourceRegistrationEntity r) { - String resourceName = r.getResourceName(); - String jmxUrl = r.getResourceUrl(); + final String resourceName = r.getResourceName(); + final String jmxUrl = r.getResourceUrl(); if (jmxUrl == null) { System.out.println(arg0 + ": no resource URL for '" @@ -461,7 +390,7 @@ public class Main try { connector = JMXConnectorFactory.connect(new JMXServiceURL(jmxUrl)); - ComponentAdminMBean admin = JMX.newMXBeanProxy + final ComponentAdminMBean admin = JMX.newMXBeanProxy (connector.getMBeanServerConnection(), new ObjectName("ONAP_POLICY_COMP:name=" + resourceName), ComponentAdminMBean.class); @@ -475,7 +404,7 @@ public class Main admin.unlock(); } } - catch (Exception e) + catch (final Exception e) { // e.printStackTrace(); System.out.println(arg0 + " failed for '" + resourceName + "': " + e); @@ -488,7 +417,7 @@ public class Main { connector.close(); } - catch (Exception e) + catch (final Exception e) { System.err.println(e); } @@ -504,7 +433,7 @@ public class Main * @return a negative value if s1<s2, 0 if they are equal, * and positive if s1>s2 */ - static private int stringCompare(String s1, String s2) + private static int stringCompare(final String s1, final String s2) { return ((s1 == null) ? (s2 == null ? 0 : -1) : @@ -521,12 +450,12 @@ public class Main * @param s this is an array of length 7, containing the current String * entry for each column */ - static private void updateLengths(int[] current, String[] s) + private static void updateLengths(final int[] current, final String[] s) { for (int i = 0 ; i < 7 ; i += 1) { - String str = s[i]; - int newLength = (str == null ? 4 : str.length()); + final String str = s[i]; + final int newLength = (str == null ? 4 : str.length()); if (current[i] < newLength) { // this column needs to be expanded @@ -540,10 +469,10 @@ public class Main */ static void display() { - TreeSet<String[]> treeset = new TreeSet<String[]> + final TreeSet<String[]> treeset = new TreeSet<String[]> (new Comparator<String[]>() { - public int compare(String[] r1, String[] r2) + public int compare(final String[] r1, final String[] r2) { int rval = 0; @@ -558,28 +487,28 @@ public class Main } }); - String[] labels = new String[] + final String[] labels = new String[] {"Site", "NodeType", "ResourceName", "AdminState", "OpState", "AvailStatus", "StandbyStatus"}; - String[] underlines = new String[] + final String[] underlines = new String[] {"----", "--------", "------------", "----------", "-------", "-----------", "-------------"}; // each column needs to be at least wide enough to fit the column label - int lengths[] = new int[7]; + final int lengths[] = new int[7]; updateLengths(lengths, labels); // Go through the 'resourceRegistrationTable', and generate the // associated table row. Maximum column widths are updated, and the // entry is inserted into tree, which has the effect of sorting the // entries. - for (ResourceRegistrationEntity r : resourceRegistrationTable.values()) + for (final ResourceRegistrationEntity r : resourceRegistrationTable.values()) { - StateManagementEntity s = + final StateManagementEntity s = stateManagementTable.get(r.getResourceName()); // these are the entries to be displayed for this row - String[] values = new String[] + final String[] values = new String[] { r.getSite(), r.getNodeType(), r.getResourceName(), s.getAdminState(), s.getOpState(), @@ -591,23 +520,82 @@ public class Main } // generate format string - StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(); for (int i = 0 ; i < 7 ; i += 1) { sb.append('%').append(i+1).append("$-") .append(lengths[i]).append("s "); } sb.setCharAt(sb.length()-1, '\n'); - String formatString = sb.toString(); + final String formatString = sb.toString(); // display column headers logger.info(formatString, (Object[])labels); logger.info(formatString, (Object[])underlines); // display all of the rows - for (String[] values : treeset) + for (final String[] values : treeset) { logger.info(formatString, (Object[])values); } } + + 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; + } + + 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); + } + + if (cmd == null || cmd.getOptionValue('h') != null || cmd.getOptionValue('?') != null) { + help(); + System.exit(0); + } + return cmd; + } } |