Refactor of command line classes 65/120765/3
authoradheli.tavares <adheli.tavares@est.tech>
Tue, 13 Apr 2021 13:51:44 +0000 (14:51 +0100)
committerAdheli Tavares <adheli.tavares@est.tech>
Thu, 22 Apr 2021 08:12:06 +0000 (08:12 +0000)
ApexCommandLineArguments class to have parse() overriden to keep
remainingArgs taking the tosca file without -p.

Issue-ID: POLICY-3129
Change-Id: Ib067bf4c32992c4477cb6751f65269c103513d10
Signed-off-by: adheli.tavares <adheli.tavares@est.tech>
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexCommandLineArguments.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java
services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexCommandLineArgumentsTest.java
services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java
services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/ApexStarterCommandLineArguments.java
services/services-onappf/src/main/java/org/onap/policy/apex/services/onappf/ApexStarterMain.java
services/services-onappf/src/test/java/org/onap/policy/apex/services/onappf/TestApexStarterCommandLineArguments.java [new file with mode: 0644]
services/services-onappf/src/test/java/org/onap/policy/apex/services/onappf/comm/TestPdpStateChangeListener.java
services/services-onappf/src/test/java/org/onap/policy/apex/services/onappf/comm/TestPdpUpdateListener.java
services/services-onappf/src/test/java/org/onap/policy/apex/services/onappf/parameters/TestApexStarterParameterHandler.java

index 31131b4..0d7560f 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
- *  Modification Copyright (C) 2020 Nordix Foundation.
+ *  Modification Copyright (C) 2020-2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 package org.onap.policy.apex.service.engine.main;
 
 import java.io.File;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.net.URL;
 import java.util.Arrays;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.DefaultParser;
-import org.apache.commons.cli.HelpFormatter;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexRuntimeException;
-import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.common.utils.cmd.CommandLineArgumentsHandler;
+import org.onap.policy.common.utils.cmd.CommandLineException;
+import org.onap.policy.common.utils.resources.MessageConstants;
 import org.onap.policy.common.utils.validation.ParameterValidationUtils;
 
 /**
@@ -45,30 +43,34 @@ import org.onap.policy.common.utils.validation.ParameterValidationUtils;
  *
  * @author Liam Fallon (liam.fallon@ericsson.com)
  */
-public class ApexCommandLineArguments {
+public class ApexCommandLineArguments extends CommandLineArgumentsHandler {
     // A system property holding the root directory for relative paths in the
     // configuration file
     public static final String APEX_RELATIVE_FILE_ROOT = "APEX_RELATIVE_FILE_ROOT";
-
-    // Recurring string constants
-    private static final String FILE_PREAMBLE = " file \"";
     private static final String RELATIVE_FILE_ROOT = "relative file root \"";
-    private static final int HELP_LINE_LENGTH = 120;
-
-    // Apache Commons CLI options
-    private final Options options;
 
     @Getter
     @Setter
     private String toscaPolicyFilePath = null;
+
+    @Getter
     private String relativeFileRoot = null;
 
+    private CommandLine cmd = null;
+
     /**
      * Construct the options for the CLI editor.
      */
     public ApexCommandLineArguments() {
+        super(ApexMain.class.getName(), MessageConstants.POLICY_APEX_PDP, apexCustomOptions());
+    }
+
+    /**
+     * Builds Apex custom options.
+     */
+    private static Options apexCustomOptions() {
         //@formatter:off
-        options = new Options();
+        Options options = new Options();
         options.addOption(Option.builder("h")
                 .longOpt("help")
                 .desc("outputs the usage of this command")
@@ -76,25 +78,26 @@ public class ApexCommandLineArguments {
                 .type(Boolean.class)
                 .build());
         options.addOption(Option.builder("v")
-                        .longOpt("version")
-                        .desc("outputs the version of Apex")
-                        .required(false)
-                        .type(Boolean.class)
-                        .build());
+                .longOpt("version")
+                .desc("outputs the version of Apex")
+                .required(false)
+                .type(Boolean.class)
+                .build());
         options.addOption(Option.builder("rfr")
-                        .longOpt("relative-file-root")
-                        .desc("the root file path for relative file paths specified in the Apex configuration file, "
-                                        + "defaults to the current directory from where Apex is executed")
-                        .hasArg()
-                        .argName(APEX_RELATIVE_FILE_ROOT)
-                        .required(false)
-                        .type(String.class)
-                        .build());
+                .longOpt("relative-file-root")
+                .desc("the root file path for relative file paths specified in the Apex configuration file, "
+                        + "defaults to the current directory from where Apex is executed")
+                .hasArg()
+                .argName(APEX_RELATIVE_FILE_ROOT)
+                .required(false)
+                .type(String.class)
+                .build());
         options.addOption(Option.builder("p").longOpt("tosca-policy-file")
             .desc("the full path to the ToscaPolicy file to use.").hasArg().argName("TOSCA_POLICY_FILE")
             .required(false)
             .type(String.class).build());
         //@formatter:on
+        return options;
     }
 
     /**
@@ -109,105 +112,71 @@ public class ApexCommandLineArguments {
         // Parse the arguments
         try {
             parse(args);
-        } catch (final ApexException e) {
+        } catch (final CommandLineException e) {
             throw new ApexRuntimeException("parse error on Apex parameters", e);
         }
     }
 
-    /**
-     * Parse the command line options.
-     *
-     * @param args The command line arguments
-     * @return a string with a message for help and version, or null if there is no
-     *         message
-     * @throws ApexException on command argument errors
-     */
-    public String parse(final String[] args) throws ApexException {
+    @Override
+    public String parse(final String[] args) throws CommandLineException {
         // Clear all our arguments
         setToscaPolicyFilePath(null);
-        CommandLine commandLine = null;
+        setRelativeFileRoot(null);
+
         try {
-            commandLine = new DefaultParser().parse(options, args);
+            cmd = new DefaultParser().parse(apexCustomOptions(), args);
         } catch (final ParseException e) {
-            throw new ApexException("invalid command line arguments specified : " + e.getMessage());
+            throw new CommandLineException("invalid command line arguments specified", e);
         }
 
         // Arguments left over after Commons CLI does its stuff
-        final String[] remainingArgs = commandLine.getArgs();
+        final String[] remainingArgs = cmd.getArgs();
 
-        if (remainingArgs.length > 0 && commandLine.hasOption('p') || remainingArgs.length > 1) {
-            throw new ApexException("too many command line arguments specified : " + Arrays.toString(args));
+        if (remainingArgs.length > 0 && cmd.hasOption('p') || remainingArgs.length > 1) {
+            throw new CommandLineException("too many command line arguments specified: " + Arrays.toString(args));
         }
 
         if (remainingArgs.length == 1) {
             toscaPolicyFilePath = remainingArgs[0];
         }
 
-        if (commandLine.hasOption('h')) {
-            return help(ApexMain.class.getName());
+        if (cmd.hasOption('h')) {
+            return help();
         }
 
-        if (commandLine.hasOption('v')) {
+        if (cmd.hasOption('v')) {
             return version();
         }
 
-        if (commandLine.hasOption("rfr")) {
-            setRelativeFileRoot(commandLine.getOptionValue("rfr"));
-        } else {
-            setRelativeFileRoot(null);
+        if (cmd.hasOption("rfr")) {
+            setRelativeFileRoot(cmd.getOptionValue("rfr"));
         }
 
-        if (commandLine.hasOption('p')) {
-            toscaPolicyFilePath = commandLine.getOptionValue('p');
+        if (cmd.hasOption('p')) {
+            setToscaPolicyFilePath(cmd.getOptionValue('p'));
         }
         return null;
     }
 
+    @Override
+    public CommandLine getCommandLine() {
+        return this.cmd;
+    }
+
     /**
      * Validate the command line options.
      *
      * @throws ApexException on command argument validation errors
      */
-    public void validate() throws ApexException {
-        validateReadableFile("Tosca Policy", toscaPolicyFilePath);
+    public void validateInputFiles() throws ApexException {
+        try {
+            validateReadableFile("Tosca Policy", toscaPolicyFilePath);
+        } catch (CommandLineException e) {
+            throw new ApexException(e.getMessage());
+        }
         validateRelativeFileRoot();
     }
 
-    /**
-     * Print version information for Apex.
-     *
-     * @return the version string
-     */
-    public String version() {
-        return ResourceUtils.getResourceAsString("version.txt");
-    }
-
-    /**
-     * Print help information for Apex.
-     *
-     * @param mainClassName the main class name
-     * @return the help string
-     */
-    public String help(final String mainClassName) {
-        final StringWriter stringWriter = new StringWriter();
-        final PrintWriter stringPrintWriter = new PrintWriter(stringWriter);
-
-        new HelpFormatter().printHelp(stringPrintWriter, HELP_LINE_LENGTH, mainClassName + " [options...]", "options",
-            options, 0, 0, "");
-
-        return stringWriter.toString();
-    }
-
-    /**
-     * Gets the root file path for relative file paths in the configuration file.
-     *
-     * @return the root file path
-     */
-    public String getRelativeFileRoot() {
-        return relativeFileRoot;
-    }
-
-
     /**
      * Sets the root file path for relative file paths in the configuration file.
      *
@@ -230,37 +199,6 @@ public class ApexCommandLineArguments {
         System.setProperty(APEX_RELATIVE_FILE_ROOT, relativeFileRootValue);
     }
 
-    /**
-     * Validate readable file.
-     *
-     * @param fileTag  the file tag
-     * @param fileName the file name
-     * @throws ApexException the apex exception
-     */
-    private void validateReadableFile(final String fileTag, final String fileName) throws ApexException {
-        if (fileName == null || fileName.length() == 0) {
-            throw new ApexException(fileTag + " file was not specified as an argument");
-        }
-
-        // The file name can refer to a resource on the local file system or on the
-        // class path
-        final URL fileUrl = ResourceUtils.getUrl4Resource(fileName);
-        if (fileUrl == null) {
-            throw new ApexException(fileTag + FILE_PREAMBLE + fileName + "\" does not exist");
-        }
-
-        final File theFile = new File(fileUrl.getPath());
-        if (!theFile.exists()) {
-            throw new ApexException(fileTag + FILE_PREAMBLE + fileName + "\" does not exist");
-        }
-        if (!theFile.isFile()) {
-            throw new ApexException(fileTag + FILE_PREAMBLE + fileName + "\" is not a normal file");
-        }
-        if (!theFile.canRead()) {
-            throw new ApexException(fileTag + FILE_PREAMBLE + fileName + "\" is ureadable");
-        }
-    }
-
     /**
      * Validate the relative file root.
      */
index 3e9072d..9757c57 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
- *  Modification Copyright (C) 2019-2021 Nordix Foundation.
+ *  Modifications Copyright (C) 2019-2021 Nordix Foundation.
  *  Modifications Copyright (C) 2020-2021 Bell Canada. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -38,6 +38,7 @@ import org.onap.policy.apex.service.parameters.ApexParameters;
 import org.onap.policy.apex.service.parameters.engineservice.EngineServiceParameters;
 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerParameters;
 import org.onap.policy.common.parameters.ParameterService;
+import org.onap.policy.common.utils.cmd.CommandLineException;
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 
@@ -110,8 +111,8 @@ public class ApexMain {
             }
 
             // Validate that the arguments are sane
-            arguments.validate();
-        } catch (final ApexException e) {
+            arguments.validateInputFiles();
+        } catch (final ApexException | CommandLineException e) {
             LOGGER.error("Arguments validation failed.", e);
             throw new ApexException("Arguments validation failed.", e);
         }
index 09663c0..b5b68c9 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
- *  Modifications Copyright (C) 2020 Nordix Foundation
+ *  Modifications Copyright (C) 2020-2021 Nordix Foundation.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 
 package org.onap.policy.apex.service.engine.main;
 
+import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertTrue;
 
 import org.junit.After;
 import org.junit.Test;
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
+import org.onap.policy.common.utils.cmd.CommandLineException;
 
 /**
  * Test Apex Command Line Arguments.
@@ -41,14 +43,9 @@ public class ApexCommandLineArgumentsTest {
     }
 
     @Test
-    public void testCommandLineArguments() throws ApexException {
+    public void testCommandLineArguments() throws ApexException, CommandLineException {
         final ApexCommandLineArguments apexArguments = new ApexCommandLineArguments();
 
-        final String[] args00 = {""};
-        apexArguments.parse(args00);
-        assertThatThrownBy(() -> apexArguments.validate())
-            .hasMessage("Tosca Policy file was not specified as an argument");
-
         final String[] args01 = {"-h"};
         final String result = apexArguments.parse(args01);
         assertTrue(result.startsWith("usage: org.onap.policy.apex.service.engine.main.ApexMain [options...]"));
@@ -65,70 +62,80 @@ public class ApexCommandLineArgumentsTest {
         final String result04 = apexArguments.parse(args04);
         assertTrue(result04.startsWith("usage: org.onap.policy.apex.service.engine.main.ApexMain [options...]"));
 
-        final String[] args05 = {"-a"};
-        assertThatThrownBy(() -> apexArguments.parse(args05))
-            .hasMessage("invalid command line arguments specified : Unrecognized option: -a");
-
         final String[] args06 = {"-p", "goodbye", "-h", "-v"};
         final String result06 = apexArguments.parse(args06);
         assertTrue(result06.startsWith("usage: org.onap.policy.apex.service.engine.main.ApexMain [options...]"));
+    }
+
+    @Test
+    public void testCommandLineArgumentsExceptions() throws ApexException, CommandLineException {
+        final ApexCommandLineArguments apexArguments = new ApexCommandLineArguments();
+
+        final String[] args00 = {""};
+        apexArguments.parse(args00);
+        assertThatThrownBy(() -> apexArguments.validateInputFiles())
+                .hasMessage("Tosca Policy file was not specified as an argument");
+
+        final String[] args05 = {"-a"};
+        assertThatThrownBy(() -> apexArguments.parse(args05)).hasMessage("invalid command line arguments specified")
+                .hasRootCauseMessage("Unrecognized option: -a");
 
         final String[] args07 = {"-p", "goodbye", "-h", "aaa"};
         assertThatThrownBy(() -> apexArguments.parse(args07))
-            .hasMessage("too many command line arguments specified : [-p, goodbye, -h, aaa]");
+                .hasMessage("too many command line arguments specified: [-p, goodbye, -h, aaa]");
+    }
+
+    @Test
+    public void testCommandLineFileParameters() throws ApexException, CommandLineException {
+        final ApexCommandLineArguments apexArguments = new ApexCommandLineArguments();
+
+        final String[] args02 = {"-p", "src/test/resources/parameters/goodParams.json"};
+        apexArguments.parse(args02);
+        assertThatCode(() -> apexArguments.validateInputFiles()).doesNotThrowAnyException();
     }
 
     @Test
-    public void testCommandLineFileParameters() throws ApexException {
+    public void testCommandLineFileParametersExceptions() throws ApexException, CommandLineException {
         final ApexCommandLineArguments apexArguments = new ApexCommandLineArguments();
 
         final String[] args00 = {"-c", "zooby"};
-        assertThatThrownBy(() -> apexArguments.parse(args00))
-            .hasMessage("invalid command line arguments specified : Unrecognized option: -c");
+        assertThatThrownBy(() -> apexArguments.parse(args00)).hasMessage("invalid command line arguments specified")
+                .hasRootCauseMessage("Unrecognized option: -c");
 
         final String[] args01 = {"-p"};
-        assertThatThrownBy(() -> apexArguments.parse(args01))
-            .hasMessage("invalid command line arguments specified : Missing argument for option: p");
-
-        final String[] args02 = {"-p", "src/test/resources/parameters/goodParams.json"};
-        apexArguments.parse(args02);
-        apexArguments.validate();
+        assertThatThrownBy(() -> apexArguments.parse(args01)).hasMessage("invalid command line arguments specified")
+                .hasRootCauseMessage("Missing argument for option: p");
 
         final String[] args03 = {"-p", "src/test/resources/parameters/goodParams.json", "-m", "zooby"};
-        assertThatThrownBy(() -> apexArguments.parse(args03))
-            .hasMessage("invalid command line arguments specified : Unrecognized option: -m");
-
-        final String[] args06 = {"-p", "src/test/resources/parameters/goodParams.json"};
-        apexArguments.parse(args06);
-        apexArguments.validate();
+        assertThatThrownBy(() -> apexArguments.parse(args03)).hasMessage("invalid command line arguments specified")
+                .hasRootCauseMessage("Unrecognized option: -m");
     }
 
     @Test
-    public void testCommandLineRelativeRootParameters() throws ApexException {
+    public void testCommandLineRelativeRootParameters() throws ApexException, CommandLineException {
         final ApexCommandLineArguments apexArguments = new ApexCommandLineArguments();
 
         final String[] args00 = {"-p", "src/test/resources/parameters/goodParams.json", "-rfr", "zooby"};
         apexArguments.parse(args00);
-        assertThatThrownBy(() -> apexArguments.validate())
-            .hasMessageContaining("zooby\" does not exist or is not a directory");
+        assertThatThrownBy(() -> apexArguments.validateInputFiles())
+                .hasMessageContaining("zooby\" does not exist or is not a directory");
 
         final String[] args01 = {"-rfr"};
-        assertThatThrownBy(() -> apexArguments.parse(args01))
-            .hasMessage("invalid command line arguments specified : Missing argument for option: rfr");
+        assertThatThrownBy(() -> apexArguments.parse(args01)).hasMessage("invalid command line arguments specified")
+                .hasRootCauseMessage("Missing argument for option: rfr");
 
         final String[] args02 = {"-p", "src/test/resources/parameters/goodParams.json", "-rfr", "pom.xml"};
         apexArguments.parse(args02);
-        assertThatThrownBy(() -> apexArguments.validate())
-            .hasMessageContaining("pom.xml\" does not exist or is not a directory");
+        assertThatThrownBy(() -> apexArguments.validateInputFiles())
+                .hasMessageContaining("pom.xml\" does not exist or is not a directory");
 
         final String[] args03 = {"-p", "src/test/resources/parameters/goodParams.json", "-rfr", "target"};
         apexArguments.parse(args03);
-        apexArguments.validate();
+        assertThatCode(() -> apexArguments.validateInputFiles()).doesNotThrowAnyException();
 
-        final String[] args04 =
-            {"-p", "src/test/resources/parameters/goodParamsRelative.json", "-rfr", "src/test/resources"};
+        final String[] args04 = {"-p", "parameters/goodParamsRelative.json", "-rfr", "src/test/resources"};
         apexArguments.parse(args04);
-        apexArguments.validate();
+        assertThatCode(() -> apexArguments.validateInputFiles()).doesNotThrowAnyException();
 
     }
 }
index 5764a52..b7532ab 100644 (file)
@@ -89,7 +89,7 @@ public class ApexMainTest {
 
         apexMain1 = new ApexMain(args);
         await().atMost(200, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
-                .contains("invalid command line arguments specified : Unrecognized option: -whee"));
+                .contains("invalid command line arguments specified"));
         assertNotNull(apexMain1);
     }
 
index cad2ffa..dfc43e0 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2019-2021 Nordix Foundation.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 
 package org.onap.policy.apex.services.onappf;
 
-import java.io.File;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.Arrays;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.DefaultParser;
-import org.apache.commons.cli.HelpFormatter;
 import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.onap.policy.apex.services.onappf.exception.ApexStarterException;
 import org.onap.policy.apex.services.onappf.exception.ApexStarterRunTimeException;
-import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.common.utils.cmd.CommandLineArgumentsHandler;
+import org.onap.policy.common.utils.cmd.CommandLineException;
 
 /**
  * This class reads and handles command line parameters for the apex starter.
  *
  * @author Ajith Sreekumar (ajith.sreekumar@est.tech)
  */
-public class ApexStarterCommandLineArguments {
-
-    private static final String FILE_MESSAGE_PREAMBLE = " file \"";
-    private static final int HELP_LINE_LENGTH = 120;
-
-    private final Options options;
-    private String configurationFilePath = null;
-    private String propertyFilePath = null;
+public class ApexStarterCommandLineArguments extends CommandLineArgumentsHandler {
+    private static final String APEX_COMPONENT = "policy apex starter";
 
     /**
      * Construct the options for the CLI editor.
      */
     public ApexStarterCommandLineArguments() {
-        //@formatter:off
-        options = new Options();
-        options.addOption(Option.builder("h")
-                .longOpt("help")
-                .desc("outputs the usage of this command")
-                .required(false)
-                .type(Boolean.class)
-                .build());
-        options.addOption(Option.builder("v")
-                .longOpt("version")
-                .desc("outputs the version of apex starter")
-                .required(false)
-                .type(Boolean.class)
-                .build());
-        options.addOption(Option.builder("c")
-                .longOpt("config-file")
-                .desc("the full path to the configuration file to use, "
-                        + "the configuration file must be a Json file containing the apex starter parameters")
-                .hasArg()
-                .argName("CONFIG_FILE")
-                .required(false)
-                .type(String.class)
-                .build());
-        options.addOption(Option.builder("p")
-                .longOpt("property-file")
-                .desc("the full path to the topic property file to use, "
-                        + "the property file contains the apex starter topic properties")
-                .hasArg()
-                .argName("PROP_FILE")
-                .required(false)
-                .type(String.class)
-                .build());
-        //@formatter:on
+        super(ApexStarterMain.class.getName(), APEX_COMPONENT, apexPropertyFileOpt());
     }
 
     /**
@@ -95,203 +47,24 @@ public class ApexStarterCommandLineArguments {
      * @param args The command line arguments
      */
     public ApexStarterCommandLineArguments(final String[] args) {
-        // Set up the options with the default constructor
         this();
 
-        // Parse the arguments
         try {
             parse(args);
-        } catch (final ApexStarterException e) {
+        } catch (final CommandLineException e) {
             throw new ApexStarterRunTimeException("parse error on apex starter parameters", e);
         }
     }
 
     /**
-     * Parse the command line options.
-     *
-     * @param args The command line arguments
-     * @return a string with a message for help and version, or null if there is no message
-     * @throws ApexStarterException on command argument errors
-     */
-    public String parse(final String[] args) throws ApexStarterException {
-        // Clear all our arguments
-        setConfigurationFilePath(null);
-        setPropertyFilePath(null);
-
-        CommandLine commandLine = null;
-        try {
-            commandLine = new DefaultParser().parse(options, args);
-        } catch (final ParseException e) {
-            throw new ApexStarterException("invalid command line arguments specified : " + e.getMessage());
-        }
-
-        // Arguments left over after Commons CLI does its stuff
-        final String[] remainingArgs = commandLine.getArgs();
-
-        if (remainingArgs.length > 0 && commandLine.hasOption('c') || remainingArgs.length > 0) {
-            throw new ApexStarterException("too many command line arguments specified : " + Arrays.toString(args));
-        }
-
-        if (remainingArgs.length == 1) {
-            configurationFilePath = remainingArgs[0];
-        }
-
-        if (commandLine.hasOption('h')) {
-            return help(ApexStarterMain.class.getName());
-        }
-
-        if (commandLine.hasOption('v')) {
-            return version();
-        }
-
-        if (commandLine.hasOption('c')) {
-            setConfigurationFilePath(commandLine.getOptionValue('c'));
-        }
-
-        if (commandLine.hasOption('p')) {
-            setPropertyFilePath(commandLine.getOptionValue('p'));
-        }
-
-        return null;
-    }
-
-    /**
-     * Validate the command line options.
-     *
-     * @throws ApexStarterException on command argument validation errors
-     */
-    public void validate() throws ApexStarterException {
-        validateReadableFile("apex starter configuration", configurationFilePath);
-    }
-
-    /**
-     * Print version information for apex starter.
-     *
-     * @return the version string
-     */
-    public String version() {
-        return ResourceUtils.getResourceAsString("src/main/resources/version.txt");
-    }
-
-    /**
-     * Print help information for apex starter.
-     *
-     * @param mainClassName the main class name
-     * @return the help string
-     */
-    public String help(final String mainClassName) {
-        final HelpFormatter helpFormatter = new HelpFormatter();
-        final StringWriter stringWriter = new StringWriter();
-        final PrintWriter printWriter = new PrintWriter(stringWriter);
-
-        helpFormatter.printHelp(printWriter, HELP_LINE_LENGTH, mainClassName + " [options...]", "options", options, 0,
-                0, "");
-
-        return stringWriter.toString();
-    }
-
-    /**
-     * Gets the configuration file path.
-     *
-     * @return the configuration file path
-     */
-    public String getConfigurationFilePath() {
-        return configurationFilePath;
-    }
-
-    /**
-     * Gets the full expanded configuration file path.
-     *
-     * @return the configuration file path
-     */
-    public String getFullConfigurationFilePath() {
-        return ResourceUtils.getFilePath4Resource(getConfigurationFilePath());
-    }
-
-    /**
-     * Sets the configuration file path.
-     *
-     * @param configurationFilePath the configuration file path
-     */
-    public void setConfigurationFilePath(final String configurationFilePath) {
-        this.configurationFilePath = configurationFilePath;
-
-    }
-
-    /**
-     * Check set configuration file path.
+     * Build the extra option property-file for ApexStarter.
      *
-     * @return true, if check set configuration file path
+     * @return the property-file option
      */
-    public boolean checkSetConfigurationFilePath() {
-        return configurationFilePath != null && configurationFilePath.length() > 0;
-    }
-
-    /**
-     * Gets the property file path.
-     *
-     * @return the property file path
-     */
-    public String getPropertyFilePath() {
-        return propertyFilePath;
-    }
-
-    /**
-     * Gets the full expanded property file path.
-     *
-     * @return the property file path
-     */
-    public String getFullPropertyFilePath() {
-        return ResourceUtils.getFilePath4Resource(getPropertyFilePath());
-    }
-
-    /**
-     * Sets the property file path.
-     *
-     * @param propertyFilePath the property file path
-     */
-    public void setPropertyFilePath(final String propertyFilePath) {
-        this.propertyFilePath = propertyFilePath;
-
-    }
-
-    /**
-     * Check set property file path.
-     *
-     * @return true, if check set property file path
-     */
-    public boolean checkSetPropertyFilePath() {
-        return propertyFilePath != null && propertyFilePath.length() > 0;
-    }
-
-    /**
-     * Validate readable file.
-     *
-     * @param fileTag the file tag
-     * @param fileName the file name
-     * @throws ApexStarterException on the file name passed as a parameter
-     */
-    private void validateReadableFile(final String fileTag, final String fileName) throws ApexStarterException {
-        if (fileName == null || fileName.length() == 0) {
-            throw new ApexStarterException(fileTag + " file was not specified as an argument");
-        }
-
-        // The file name refers to a resource on the local file system
-        final URL fileUrl = ResourceUtils.getUrl4Resource(fileName);
-        if (fileUrl == null) {
-            throw new ApexStarterException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
-        }
-
-        final File theFile = new File(fileUrl.getPath());
-        if (!theFile.exists()) {
-            throw new ApexStarterException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
-        }
-        if (!theFile.isFile()) {
-            throw new ApexStarterException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is not a normal file");
-        }
-        if (!theFile.canRead()) {
-            throw new ApexStarterException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is ureadable");
-        }
+    private static Option apexPropertyFileOpt() {
+        return Option.builder("p").longOpt("property-file")
+                .desc("the full path to the topic property file to use, "
+                        + "the property file contains the policy apex starter properties")
+                .hasArg().argName("PROP_FILE").required(false).type(String.class).build();
     }
-
 }
index 7daa228..c9362bc 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019-2020 Nordix Foundation.
+ *  Copyright (C) 2019-2021 Nordix Foundation.
  *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
@@ -28,6 +28,7 @@ import org.onap.policy.apex.services.onappf.exception.ApexStarterException;
 import org.onap.policy.apex.services.onappf.exception.ApexStarterRunTimeException;
 import org.onap.policy.apex.services.onappf.parameters.ApexStarterParameterGroup;
 import org.onap.policy.apex.services.onappf.parameters.ApexStarterParameterHandler;
+import org.onap.policy.common.utils.cmd.CommandLineException;
 import org.onap.policy.common.utils.resources.MessageConstants;
 import org.onap.policy.common.utils.services.Registry;
 import org.slf4j.Logger;
@@ -77,7 +78,7 @@ public class ApexStarterMain {
 
             // Start the activator
             activator.initialize();
-        } catch (final ApexStarterException e) {
+        } catch (final ApexStarterException | CommandLineException e) {
             if (null != activator) {
                 Registry.unregister(ApexStarterConstants.REG_APEX_STARTER_ACTIVATOR);
             }
diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/services/onappf/TestApexStarterCommandLineArguments.java b/services/services-onappf/src/test/java/org/onap/policy/apex/services/onappf/TestApexStarterCommandLineArguments.java
new file mode 100644 (file)
index 0000000..e564d38
--- /dev/null
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.apex.services.onappf;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class TestApexStarterCommandLineArguments {
+
+    /**
+     * Test method for {@link org.onap.policy.apex.services.onappf.ApexStarterCommandLineArguments
+     * #getPropertyFilePath()}.
+     * Assert custom option was added to options object from super.
+     */
+    @Test
+    public void testCommandLineHasPropertyFileOption() {
+        String[] args = {"-p", "someFile.json"};
+        ApexStarterCommandLineArguments sut = new ApexStarterCommandLineArguments(args);
+        assertEquals("someFile.json", sut.getPropertyFilePath());
+    }
+
+    /**
+     * Test method for {@link org.onap.policy.apex.services.onappf.ApexStarterCommandLineArguments#version()}.
+     * Assert method consults version.txt from Apex module.
+     */
+    @Test
+    public void testVersion() {
+        String[] args = {"-v"};
+        ApexStarterCommandLineArguments sut = new ApexStarterCommandLineArguments(args);
+        assertThat(sut.version()).startsWith("ONAP Policy Framework Apex Starter Service");
+    }
+
+}
index 1d491ea..b4308b8 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019-2020 Nordix Foundation.
+ *  Copyright (C) 2019-2021 Nordix Foundation.
  *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
@@ -45,6 +45,7 @@ import org.onap.policy.apex.services.onappf.handler.ApexEngineHandler;
 import org.onap.policy.apex.services.onappf.parameters.ApexStarterParameterGroup;
 import org.onap.policy.apex.services.onappf.parameters.ApexStarterParameterHandler;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.utils.cmd.CommandLineException;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.services.Registry;
 import org.onap.policy.models.pdp.concepts.PdpStateChange;
@@ -73,9 +74,10 @@ public class TestPdpStateChangeListener {
      * @throws ApexStarterException if some error occurs while starting up the apex starter
      * @throws FileNotFoundException if the file is missing
      * @throws IOException if IO exception occurs
+     * @throws CommandLineException if any parsing of args has errors
      */
     @Before
-    public void setUp() throws ApexStarterException, FileNotFoundException, IOException {
+    public void setUp() throws ApexStarterException, FileNotFoundException, IOException, CommandLineException {
         pdpUpdateMessageListener = new PdpUpdateListener();
         pdpStateChangeListener = new PdpStateChangeListener();
         Registry.newRegistry();
index d9b8fc0..28e230e 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2019-2021 Nordix Foundation.
  *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
@@ -44,6 +44,7 @@ import org.onap.policy.apex.services.onappf.handler.PdpMessageHandler;
 import org.onap.policy.apex.services.onappf.parameters.ApexStarterParameterGroup;
 import org.onap.policy.apex.services.onappf.parameters.ApexStarterParameterHandler;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.utils.cmd.CommandLineException;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.services.Registry;
 import org.onap.policy.models.pdp.concepts.PdpStateChange;
@@ -72,9 +73,10 @@ public class TestPdpUpdateListener {
      * @throws ApexStarterException if some error occurs while starting up the apex starter
      * @throws FileNotFoundException if the file is missing
      * @throws IOException if IO exception occurs
+     * @throws CommandLineException if any parsing of args has errors
      */
     @Before
-    public void setUp() throws ApexStarterException, FileNotFoundException, IOException {
+    public void setUp() throws ApexStarterException, FileNotFoundException, IOException, CommandLineException {
         Registry.newRegistry();
         final String[] apexStarterConfigParameters = {"-c", "src/test/resources/ApexStarterConfigParametersNoop.json"};
         final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments();
index d39cbec..dd424c1 100644 (file)
@@ -1,7 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019 Nordix Foundation.
- *  Modifications Copyright (C) 2020 Nordix Foundation
+ *  Copyright (C) 2019-2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,6 +28,7 @@ import java.io.FileNotFoundException;
 import org.junit.Test;
 import org.onap.policy.apex.services.onappf.ApexStarterCommandLineArguments;
 import org.onap.policy.apex.services.onappf.exception.ApexStarterException;
+import org.onap.policy.common.utils.cmd.CommandLineException;
 import org.onap.policy.common.utils.coder.CoderException;
 
 /**
@@ -39,7 +39,7 @@ import org.onap.policy.common.utils.coder.CoderException;
 public class TestApexStarterParameterHandler {
 
     @Test
-    public void testParameterHandlerNoParameterFile() throws ApexStarterException {
+    public void testParameterHandlerNoParameterFile() throws ApexStarterException, CommandLineException {
         final String[] emptyArgumentString = { "-c", "src/test/resources/NoParametersFile.json" };
 
         final ApexStarterCommandLineArguments emptyArguments = new ApexStarterCommandLineArguments();
@@ -51,7 +51,7 @@ public class TestApexStarterParameterHandler {
     }
 
     @Test
-    public void testParameterHandlerEmptyParameters() throws ApexStarterException {
+    public void testParameterHandlerEmptyParameters() throws ApexStarterException, CommandLineException {
         final String[] noArgumentString = { "-c", "src/test/resources/NoParameters.json" };
 
         final ApexStarterCommandLineArguments noArguments = new ApexStarterCommandLineArguments();
@@ -62,7 +62,7 @@ public class TestApexStarterParameterHandler {
     }
 
     @Test
-    public void testParameterHandlerInvalidParameters() throws ApexStarterException {
+    public void testParameterHandlerInvalidParameters() throws ApexStarterException, CommandLineException {
         final String[] invalidArgumentString = { "-c", "src/test/resources/InvalidParameters.json" };
 
         final ApexStarterCommandLineArguments invalidArguments = new ApexStarterCommandLineArguments();
@@ -74,7 +74,7 @@ public class TestApexStarterParameterHandler {
     }
 
     @Test
-    public void testParameterHandlerNoParameters() throws ApexStarterException {
+    public void testParameterHandlerNoParameters() throws ApexStarterException, CommandLineException {
         final String[] noArgumentString = { "-c", "src/test/resources/EmptyConfigParameters.json" };
 
         final ApexStarterCommandLineArguments noArguments = new ApexStarterCommandLineArguments();
@@ -85,7 +85,7 @@ public class TestApexStarterParameterHandler {
     }
 
     @Test
-    public void testApexStarterParameterGroup() throws ApexStarterException {
+    public void testApexStarterParameterGroup() throws ApexStarterException, CommandLineException {
         final String[] apexStarterConfigParameters = { "-c", "src/test/resources/ApexStarterConfigParameters.json" };
 
         final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments();
@@ -97,7 +97,7 @@ public class TestApexStarterParameterHandler {
     }
 
     @Test
-    public void testApexStarterParameterGroup_InvalidName() throws ApexStarterException {
+    public void testApexStarterParameterGroup_InvalidName() throws ApexStarterException, CommandLineException {
         final String[] apexStarterConfigParameters =
         { "-c", "src/test/resources/ApexStarterConfigParameters_InvalidName.json" };
 
@@ -110,7 +110,7 @@ public class TestApexStarterParameterHandler {
     }
 
     @Test
-    public void testApexStarterVersion() throws ApexStarterException {
+    public void testApexStarterVersion() throws ApexStarterException, CommandLineException {
         final String[] apexStarterConfigParameters = { "-v" };
         final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments();
         final String version = arguments.parse(apexStarterConfigParameters);
@@ -118,7 +118,7 @@ public class TestApexStarterParameterHandler {
     }
 
     @Test
-    public void testApexStarterHelp() throws ApexStarterException {
+    public void testApexStarterHelp() throws ApexStarterException, CommandLineException {
         final String[] apexStarterConfigParameters = { "-h" };
         final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments();
         final String help = arguments.parse(apexStarterConfigParameters);