Refactor ApiCommandLineArguments class

CMD Class to use CMD Handler from Common.

Issue-ID: POLICY-3129
Change-Id: I7a1b960b1e3ecc6df0f7dde6b3301d640f4feb11
Signed-off-by: adheli.tavares <adheli.tavares@est.tech>
diff --git a/main/src/main/java/org/onap/policy/api/main/startstop/ApiCommandLineArguments.java b/main/src/main/java/org/onap/policy/api/main/startstop/ApiCommandLineArguments.java
index 8073f7c..47f004e 100644
--- a/main/src/main/java/org/onap/policy/api/main/startstop/ApiCommandLineArguments.java
+++ b/main/src/main/java/org/onap/policy/api/main/startstop/ApiCommandLineArguments.java
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
+ *  Modifications 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.
@@ -20,62 +21,21 @@
 
 package org.onap.policy.api.main.startstop;
 
-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.api.main.exception.PolicyApiException;
 import org.onap.policy.api.main.exception.PolicyApiRuntimeException;
-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;
 
 /**
  * This class reads and handles command line parameters for the policy api main program.
  */
-public class ApiCommandLineArguments {
-    private static final String FILE_MESSAGE_PREAMBLE = " file \"";
-    private static final int HELP_LINE_LENGTH = 120;
-
-    // Apache Commons CLI options
-    private final Options options;
-
-    // The command line options
-    private String configurationFilePath = null;
+public class ApiCommandLineArguments extends CommandLineArgumentsHandler {
 
     /**
-     * Construct the options for the CLI editor.
+     * Construct the options for the CLI editor from super.
      */
     public ApiCommandLineArguments() {
-        //@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 policy api")
-                .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 policy api parameters")
-                .hasArg()
-                .argName("CONFIG_FILE")
-                .required(false)
-                .type(String.class)
-                .build());
-        //@formatter:on
+        super(Main.class.getName(), MessageConstants.POLICY_API);
     }
 
     /**
@@ -84,154 +44,12 @@
      * @param args The command line arguments
      */
     public ApiCommandLineArguments(final String[] args) {
-        // Set up the options with the default constructor
         this();
 
-        // Parse the arguments
         try {
             parse(args);
-        } catch (final PolicyApiException e) {
+        } catch (final CommandLineException e) {
             throw new PolicyApiRuntimeException("parse error on policy api 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 PolicyApiException on command argument errors
-     */
-    public String parse(final String[] args) throws PolicyApiException {
-        // Clear all our arguments
-        setConfigurationFilePath(null);
-
-        CommandLine commandLine = null;
-        try {
-            commandLine = new DefaultParser().parse(options, args);
-        } catch (final ParseException e) {
-            throw new PolicyApiException("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 PolicyApiException("too many command line arguments specified : " + Arrays.toString(args));
-        }
-
-        if (remainingArgs.length == 1) {
-            configurationFilePath = remainingArgs[0];
-        }
-
-        if (commandLine.hasOption('h')) {
-            return help(Main.class.getName());
-        }
-
-        if (commandLine.hasOption('v')) {
-            return version();
-        }
-
-        if (commandLine.hasOption('c')) {
-            setConfigurationFilePath(commandLine.getOptionValue('c'));
-        }
-
-        return null;
-    }
-
-    /**
-     * Validate the command line options.
-     *
-     * @throws PolicyApiException on command argument validation errors
-     */
-    public void validate() throws PolicyApiException {
-        validateReadableFile("policy api configuration", configurationFilePath);
-    }
-
-    /**
-     * Print version information for policy api.
-     *
-     * @return the version string
-     */
-    public String version() {
-        return ResourceUtils.getResourceAsString("version.txt");
-    }
-
-    /**
-     * Print help information for policy api.
-     *
-     * @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.
-     *
-     * @return true, if check set configuration file path
-     */
-    public boolean checkSetConfigurationFilePath() {
-        return configurationFilePath != null && configurationFilePath.length() > 0;
-    }
-
-    /**
-     * Validate readable file.
-     *
-     * @param fileTag the file tag
-     * @param fileName the file name
-     * @throws PolicyApiException on the file name passed as a parameter
-     */
-    private void validateReadableFile(final String fileTag, final String fileName) throws PolicyApiException {
-        if (fileName == null || fileName.length() == 0) {
-            throw new PolicyApiException(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 PolicyApiException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
-        }
-
-        final File theFile = new File(fileUrl.getPath());
-        if (!theFile.exists()) {
-            throw new PolicyApiException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
-        }
-    }
 }
diff --git a/main/src/main/java/org/onap/policy/api/main/startstop/Main.java b/main/src/main/java/org/onap/policy/api/main/startstop/Main.java
index c8bce6f..36734f3 100644
--- a/main/src/main/java/org/onap/policy/api/main/startstop/Main.java
+++ b/main/src/main/java/org/onap/policy/api/main/startstop/Main.java
@@ -5,6 +5,7 @@
  * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
+ * Modifications 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.
@@ -29,6 +30,7 @@
 import org.onap.policy.api.main.exception.PolicyApiRuntimeException;
 import org.onap.policy.api.main.parameters.ApiParameterGroup;
 import org.onap.policy.api.main.parameters.ApiParameterHandler;
+import org.onap.policy.common.utils.cmd.CommandLineException;
 import org.onap.policy.common.utils.resources.MessageConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -79,7 +81,7 @@
 
             // Start the activator
             activator.initialize();
-        } catch (final PolicyApiException e) {
+        } catch (final PolicyApiException | CommandLineException e) {
             throw new PolicyApiRuntimeException(
                 String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_API), e);
         }
diff --git a/main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterHandler.java b/main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterHandler.java
index 3437908..5e1b7eb 100644
--- a/main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterHandler.java
+++ b/main/src/test/java/org/onap/policy/api/main/parameters/TestApiParameterHandler.java
@@ -2,6 +2,7 @@
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
  *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ *  Modifications 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.
@@ -31,6 +32,7 @@
 import org.junit.Test;
 import org.onap.policy.api.main.exception.PolicyApiException;
 import org.onap.policy.api.main.startstop.ApiCommandLineArguments;
+import org.onap.policy.common.utils.cmd.CommandLineException;
 
 /**
  * Class to perform unit test of ApiParameterHandler.
@@ -38,7 +40,7 @@
  */
 public class TestApiParameterHandler {
     @Test
-    public void testParameterHandlerNoParameterFile() throws PolicyApiException {
+    public void testParameterHandlerNoParameterFile() throws PolicyApiException, CommandLineException {
         final String[] noArgumentString = {"-c", "parameters/NoParameterFile.json"};
         final ApiCommandLineArguments noArguments = new ApiCommandLineArguments();
         noArguments.parse(noArgumentString);
@@ -52,7 +54,7 @@
     }
 
     @Test
-    public void testParameterHandlerEmptyParameters() throws PolicyApiException {
+    public void testParameterHandlerEmptyParameters() throws PolicyApiException, CommandLineException {
         final String[] emptyArgumentString = {"-c", "parameters/EmptyParameters.json"};
         final ApiCommandLineArguments emptyArguments = new ApiCommandLineArguments();
         emptyArguments.parse(emptyArgumentString);
@@ -66,7 +68,7 @@
     }
 
     @Test
-    public void testParameterHandlerBadParameters() throws PolicyApiException {
+    public void testParameterHandlerBadParameters() throws PolicyApiException, CommandLineException {
         final String[] badArgumentString = {"-c", "parameters/BadParameters.json"};
         final ApiCommandLineArguments badArguments = new ApiCommandLineArguments();
         badArguments.parse(badArgumentString);
@@ -82,7 +84,7 @@
     }
 
     @Test
-    public void testParameterHandlerInvalidParameters() throws PolicyApiException {
+    public void testParameterHandlerInvalidParameters() throws PolicyApiException, CommandLineException {
         final String[] invalidArgumentString = {"-c", "parameters/InvalidParameters.json"};
         final ApiCommandLineArguments invalidArguments = new ApiCommandLineArguments();
         invalidArguments.parse(invalidArgumentString);
@@ -98,7 +100,7 @@
     }
 
     @Test
-    public void testParameterHandlerNoParameters() throws PolicyApiException {
+    public void testParameterHandlerNoParameters() throws PolicyApiException, CommandLineException {
         final String[] noArgumentString = {"-c", "parameters/NoParameters.json"};
         final ApiCommandLineArguments noArguments = new ApiCommandLineArguments();
         noArguments.parse(noArgumentString);
@@ -116,7 +118,7 @@
     }
 
     @Test
-    public void testParameterHandlerMinumumParameters() throws PolicyApiException {
+    public void testParameterHandlerMinumumParameters() throws PolicyApiException, CommandLineException {
         final String[] minArgumentString = {"-c", "parameters/MinimumParameters.json"};
         final ApiCommandLineArguments minArguments = new ApiCommandLineArguments();
         minArguments.parse(minArgumentString);
@@ -125,7 +127,7 @@
     }
 
     @Test
-    public void testApiParameterGroup() throws PolicyApiException {
+    public void testApiParameterGroup() throws PolicyApiException, CommandLineException {
         final String[] apiConfigParameters = {"-c", "parameters/ApiConfigParameters_Https.json"};
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         arguments.parse(apiConfigParameters);
@@ -135,7 +137,7 @@
     }
 
     @Test
-    public void testApiParameterGroup_InvalidName() throws PolicyApiException {
+    public void testApiParameterGroup_InvalidName() throws PolicyApiException, CommandLineException {
         final String[] apiConfigParameters = {"-c", "parameters/ApiConfigParameters_InvalidName.json"};
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         arguments.parse(apiConfigParameters);
@@ -150,7 +152,8 @@
     }
 
     @Test
-    public void testApiParameterGroup_InvalidRestServerParameters() throws PolicyApiException, IOException {
+    public void testApiParameterGroup_InvalidRestServerParameters()
+            throws PolicyApiException, IOException, CommandLineException {
         final String[] apiConfigParameters = {"-c", "parameters/ApiConfigParameters_InvalidRestServerParameters.json"};
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         arguments.parse(apiConfigParameters);
@@ -167,7 +170,7 @@
     }
 
     @Test
-    public void testApiVersion() throws PolicyApiException {
+    public void testApiVersion() throws PolicyApiException, CommandLineException {
         final String[] apiConfigParameters = {"-v"};
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         final String version = arguments.parse(apiConfigParameters);
@@ -175,7 +178,7 @@
     }
 
     @Test
-    public void testApiHelp() throws PolicyApiException {
+    public void testApiHelp() throws PolicyApiException, CommandLineException {
         final String[] apiConfigParameters = {"-h"};
         final ApiCommandLineArguments arguments = new ApiCommandLineArguments();
         final String help = arguments.parse(apiConfigParameters);
diff --git a/main/src/test/java/org/onap/policy/api/main/startstop/TestApiCommandLineArguments.java b/main/src/test/java/org/onap/policy/api/main/startstop/TestApiCommandLineArguments.java
index 8adfacc..8d3c42c 100644
--- a/main/src/test/java/org/onap/policy/api/main/startstop/TestApiCommandLineArguments.java
+++ b/main/src/test/java/org/onap/policy/api/main/startstop/TestApiCommandLineArguments.java
@@ -3,6 +3,7 @@
  * ONAP Policy API
  * ================================================================================
  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications 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.
@@ -22,10 +23,10 @@
 
 package org.onap.policy.api.main.startstop;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.junit.Test;
-import org.onap.policy.api.main.exception.PolicyApiException;
 import org.onap.policy.api.main.exception.PolicyApiRuntimeException;
 
 public class TestApiCommandLineArguments {
@@ -33,38 +34,35 @@
 
     @Test(expected = PolicyApiRuntimeException.class)
     public void testApiCommandLineArgumentsStringArray() {
-        String [] args = {"---d"};
+        String[] args = {"---d"};
         new ApiCommandLineArguments(args);
     }
 
     @Test
     public void testNonExistentFileValidateReadableFile() {
         apiCmdArgs.setConfigurationFilePath("src/test/resources/filetest/nonexist.json ");
-        assertThatThrownBy(
-                apiCmdArgs::validate
-            )
-            .isInstanceOf(PolicyApiException.class)
-            .hasMessageContaining("file \"src/test/resources/filetest/nonexist.json \" does not exist");
+        assertThatThrownBy(apiCmdArgs::validate)
+                .hasMessageContaining("file \"src/test/resources/filetest/nonexist.json \" does not exist");
     }
 
     @Test
     public void testEmptyFileNameValidateReadableFile() {
         apiCmdArgs.setConfigurationFilePath("");
-        assertThatThrownBy(
-                 apiCmdArgs::validate
-            )
-            .isInstanceOf(PolicyApiException.class)
-            .hasMessageContaining("policy api configuration file was not specified as an argument");
+        assertThatThrownBy(apiCmdArgs::validate)
+                .hasMessageContaining("policy-api configuration file was not specified as an argument");
     }
 
     @Test
     public void testInvalidUrlValidateReadableFile() {
         apiCmdArgs.setConfigurationFilePath("src/test\\resources/filetest\\n");
-        assertThatThrownBy(
-                apiCmdArgs::validate
-            )
-            .isInstanceOf(PolicyApiException.class)
-            .hasMessageContaining(
-                    "policy api configuration file \"src/test\\resources/filetest\\n\" does not exist");
+        assertThatThrownBy(apiCmdArgs::validate).hasMessageContaining(
+                "policy-api configuration file \"src/test\\resources/filetest\\n\" does not exist");
+    }
+
+    @Test
+    public void testVersion() {
+        String[] testArgs = {"-v"};
+        ApiCommandLineArguments cmdArgs = new ApiCommandLineArguments(testArgs);
+        assertThat(cmdArgs.version()).startsWith("ONAP Policy Framework Api Service");
     }
 }