* ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
  *  Modifications Copyright (C) 2019 AT&T Intellectual Property.
+ *  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.
 
 package org.onap.policy.distribution.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.common.utils.resources.ResourceUtils;
-import org.onap.policy.distribution.main.PolicyDistributionException;
+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.distribution.main.PolicyDistributionRuntimeException;
 
 /**
  * This class reads and handles command line parameters for the policy distribution main program.
  */
-public class DistributionCommandLineArguments {
-    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 DistributionCommandLineArguments extends CommandLineArgumentsHandler {
 
     /**
-     * Construct the options for the CLI editor.
+     * Construct the options for the CLI editor from super.
      */
     public DistributionCommandLineArguments() {
-        //@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 distribution")
-                .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 distribution parameters")
-                .hasArg()
-                .argName("CONFIG_FILE")
-                .required(false)
-                .type(String.class)
-                .build());
-        //@formatter:on
+        super(Main.class.getName(), MessageConstants.POLICY_DISTRIBUTION);
     }
 
     /**
      * @param args The command line arguments
      */
     public DistributionCommandLineArguments(final String[] args) {
-        // Set up the options with the default constructor
         this();
 
-        // Parse the arguments
         try {
             parse(args);
-        } catch (final PolicyDistributionException e) {
+        } catch (final CommandLineException e) {
             throw new PolicyDistributionRuntimeException("parse error on policy distribution 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 PolicyDistributionException on command argument errors
-     */
-    public String parse(final String[] args) throws PolicyDistributionException {
-        // Clear all our arguments
-        setConfigurationFilePath(null);
-
-        CommandLine commandLine = null;
-        try {
-            commandLine = new DefaultParser().parse(options, args);
-        } catch (final ParseException e) {
-            throw new PolicyDistributionException("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 PolicyDistributionException(
-                    "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 PolicyDistributionException on command argument validation errors
-     */
-    public void validate() throws PolicyDistributionException {
-        validateReadableFile("policy distribution configuration", configurationFilePath);
-    }
-
-    /**
-     * Print version information for policy distribution.
-     *
-     * @return the version string
-     */
-    public String version() {
-        return ResourceUtils.getResourceAsString("version.txt");
-    }
-
-    /**
-     * Print help information for policy distribution.
-     *
-     * @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 PolicyDistributionException on the file name passed as a parameter
-     */
-    private void validateReadableFile(final String fileTag, final String fileName) throws PolicyDistributionException {
-        if (fileName == null || fileName.length() == 0) {
-            throw new PolicyDistributionException(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 PolicyDistributionException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
-        }
-
-        final File theFile = new File(fileUrl.getPath());
-        if (!theFile.exists()) {
-            throw new PolicyDistributionException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
-        }
-        if (!theFile.isFile()) {
-            throw new PolicyDistributionException(
-                    fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is not a normal file");
-        }
-        if (!theFile.canRead()) {
-            throw new PolicyDistributionException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is ureadable");
-        }
-    }
 }
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
- *  Modifications Copyright (C) 2020 Nordix Foundation
+ *  Modifications Copyright (C) 2020-2021 Nordix Foundation.
  *  Modifications Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 import java.nio.file.Paths;
 import org.junit.Test;
 import org.onap.policy.common.parameters.ParameterRuntimeException;
+import org.onap.policy.common.utils.cmd.CommandLineException;
 import org.onap.policy.distribution.main.PolicyDistributionException;
 import org.onap.policy.distribution.main.startstop.DistributionCommandLineArguments;
 import org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup;
  */
 public class TestDistributionParameterHandler {
     @Test
-    public void testParameterHandlerNoParameterFile() throws PolicyDistributionException {
-        verifyFailure("NoParameterFile.json",
-                        PolicyDistributionException.class,
-                        "FileNotFoundException");
+    public void testParameterHandlerNoParameterFile() throws PolicyDistributionException, CommandLineException {
+        verifyFailure("NoParameterFile.json", PolicyDistributionException.class, "FileNotFoundException");
     }
 
     @Test
-    public void testParameterHandlerEmptyParameters() throws PolicyDistributionException {
-        verifyFailure("EmptyParameters.json",
-                        PolicyDistributionException.class,
-                        "no parameters found in \"parameters/EmptyParameters.json\"");
+    public void testParameterHandlerEmptyParameters() throws PolicyDistributionException, CommandLineException {
+        verifyFailure("EmptyParameters.json", PolicyDistributionException.class,
+                "no parameters found in \"parameters/EmptyParameters.json\"");
     }
 
     @Test
-    public void testParameterHandlerBadParameters() throws PolicyDistributionException {
-        verifyFailure("BadParameters.json",
-                        PolicyDistributionException.class,
-                        "error reading parameters from \"parameters/BadParameters.json\"\n"
-                            + "(JsonSyntaxException):java.lang.IllegalStateException: "
-                            + "Expected a string but was BEGIN_ARRAY at line 2 column 15 path $.name");
+    public void testParameterHandlerBadParameters() throws PolicyDistributionException, CommandLineException {
+        verifyFailure("BadParameters.json", PolicyDistributionException.class,
+                "error reading parameters from \"parameters/BadParameters.json\"\n"
+                        + "(JsonSyntaxException):java.lang.IllegalStateException: "
+                        + "Expected a string but was BEGIN_ARRAY at line 2 column 15 path $.name");
     }
 
     @Test
-    public void testParameterHandlerInvalidParameters() throws PolicyDistributionException {
-        verifyFailure("InvalidParameters.json",
-                        PolicyDistributionException.class,
-                        "error reading parameters from \"parameters/InvalidParameters.json\"\n"
-                            + "(JsonSyntaxException):java.lang.IllegalStateException: "
-                            + "Expected a string but was BEGIN_ARRAY at line 2 column 15 path $.name");
+    public void testParameterHandlerInvalidParameters() throws PolicyDistributionException, CommandLineException {
+        verifyFailure("InvalidParameters.json", PolicyDistributionException.class,
+                "error reading parameters from \"parameters/InvalidParameters.json\"\n"
+                        + "(JsonSyntaxException):java.lang.IllegalStateException: "
+                        + "Expected a string but was BEGIN_ARRAY at line 2 column 15 path $.name");
     }
 
     @Test
-    public void testParameterHandlerNoParameters() throws PolicyDistributionException {
-        verifyFailure("NoParameters.json",
-                        ParameterRuntimeException.class,
-                        "map parameter \"receptionHandlerParameters\" is null");
+    public void testParameterHandlerNoParameters() throws PolicyDistributionException, CommandLineException {
+        verifyFailure("NoParameters.json", ParameterRuntimeException.class,
+                "map parameter \"receptionHandlerParameters\" is null");
     }
 
     @Test
-    public void testParameterHandlerMinumumParameters() throws PolicyDistributionException {
-        final String[] minArgumentString =
-            { "-c", "parameters/MinimumParameters.json" };
+    public void testParameterHandlerMinumumParameters() throws PolicyDistributionException, CommandLineException {
+        final String[] minArgumentString = {"-c", "parameters/MinimumParameters.json"};
 
         final DistributionCommandLineArguments minArguments = new DistributionCommandLineArguments();
         minArguments.parse(minArgumentString);
     }
 
     @Test
-    public void testDistributionParameterGroup() throws PolicyDistributionException {
-        final String[] distributionConfigParameters =
-            { "-c", "parameters/DistributionConfigParameters.json" };
+    public void testDistributionParameterGroup() throws PolicyDistributionException, CommandLineException {
+        final String[] distributionConfigParameters = {"-c", "parameters/DistributionConfigParameters.json"};
 
         final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments();
         arguments.parse(distributionConfigParameters);
 
     @Test
     public void testDistributionParameterGroup_InvalidForwarderConfigurationClassName()
-            throws PolicyDistributionException {
+            throws PolicyDistributionException, CommandLineException {
         verifyFailure("DistributionConfigParameters_InvalidForwarderConfigurationClassName.json",
-                        PolicyDistributionException.class,
-                        "parameter \"parameterClassName\" value \"\" invalid in JSON file");
+                PolicyDistributionException.class, "parameter \"parameterClassName\" value \"\" invalid in JSON file");
     }
 
     @Test
     public void testDistributionParameterGroup_UnknownForwarderConfigurationClassName()
-            throws PolicyDistributionException {
+            throws PolicyDistributionException, CommandLineException {
         verifyFailure("DistributionConfigParameters_UnknownForwarderConfigurationClassName.json",
-                        PolicyDistributionException.class,
-                        "parameter \"parameterClassName\" value \"org.onap.policy.Unknown\", could not find class");
+                PolicyDistributionException.class,
+                "parameter \"parameterClassName\" value \"org.onap.policy.Unknown\", could not find class");
     }
 
     @Test
-    public void testDistributionParameterGroup_InvalidName() throws PolicyDistributionException {
-        verifyFailure("DistributionConfigParameters_InvalidName.json",
-                        PolicyDistributionException.class,
-                        "field \"name\" type \"java.lang.String\" value \" \" INVALID, must be a non-blank string");
+    public void testDistributionParameterGroup_InvalidName() throws PolicyDistributionException, CommandLineException {
+        verifyFailure("DistributionConfigParameters_InvalidName.json", PolicyDistributionException.class,
+                "field \"name\" type \"java.lang.String\" value \" \" INVALID, must be a non-blank string");
     }
 
     @Test
-    public void testDistributionParameterGroup_NoReceptionHandler() throws PolicyDistributionException {
-        verifyFailure("DistributionConfigParameters_NoReceptionHandler.json",
-                        ParameterRuntimeException.class,
-                        "map parameter \"receptionHandlerParameters\" is null");
+    public void testDistributionParameterGroup_NoReceptionHandler()
+            throws PolicyDistributionException, CommandLineException {
+        verifyFailure("DistributionConfigParameters_NoReceptionHandler.json", ParameterRuntimeException.class,
+                "map parameter \"receptionHandlerParameters\" is null");
     }
 
     @Test
-    public void testDistributionParameterGroup_EmptyReceptionHandler() throws PolicyDistributionException {
-        verifyFailure("DistributionConfigParameters_EmptyReceptionHandler.json",
-                        PolicyDistributionException.class,
-                        "must have at least one reception handler\n");
+    public void testDistributionParameterGroup_EmptyReceptionHandler()
+            throws PolicyDistributionException, CommandLineException {
+        verifyFailure("DistributionConfigParameters_EmptyReceptionHandler.json", PolicyDistributionException.class,
+                "must have at least one reception handler\n");
     }
 
     @Test
-    public void testDistributionParameterGroup_NoPolicyDecoder() throws PolicyDistributionException {
-        verifyFailure("DistributionConfigParameters_NoPolicyDecoder.json",
-                        ParameterRuntimeException.class,
-                        "map parameter \"policyDecoders\" is null");
+    public void testDistributionParameterGroup_NoPolicyDecoder()
+            throws PolicyDistributionException, CommandLineException {
+        verifyFailure("DistributionConfigParameters_NoPolicyDecoder.json", ParameterRuntimeException.class,
+                "map parameter \"policyDecoders\" is null");
     }
 
     @Test
-    public void testDistributionParameterGroup_NoPolicyForwarder() throws PolicyDistributionException {
-        verifyFailure("DistributionConfigParameters_NoPolicyForwarder.json",
-                        ParameterRuntimeException.class,
-                        "map parameter \"policyForwarders\" is null");
+    public void testDistributionParameterGroup_NoPolicyForwarder()
+            throws PolicyDistributionException, CommandLineException {
+        verifyFailure("DistributionConfigParameters_NoPolicyForwarder.json", ParameterRuntimeException.class,
+                "map parameter \"policyForwarders\" is null");
     }
 
     @Test
-    public void testDistributionParameterGroup_EmptyPolicyDecoder() throws PolicyDistributionException {
-        verifyFailure("DistributionConfigParameters_EmptyPolicyDecoder.json",
-                        PolicyDistributionException.class,
-                        "must have at least one policy decoder\n");
+    public void testDistributionParameterGroup_EmptyPolicyDecoder()
+            throws PolicyDistributionException, CommandLineException {
+        verifyFailure("DistributionConfigParameters_EmptyPolicyDecoder.json", PolicyDistributionException.class,
+                "must have at least one policy decoder\n");
     }
 
     @Test
-    public void testDistributionParameterGroup_EmptyPolicyForwarder() throws PolicyDistributionException {
-        verifyFailure("DistributionConfigParameters_EmptyPolicyForwarder.json",
-                        PolicyDistributionException.class,
-                        "must have at least one policy forwarder\n");
+    public void testDistributionParameterGroup_EmptyPolicyForwarder()
+            throws PolicyDistributionException, CommandLineException {
+        verifyFailure("DistributionConfigParameters_EmptyPolicyForwarder.json", PolicyDistributionException.class,
+                "must have at least one policy forwarder\n");
     }
 
     @Test
     public void testDistributionParameterGroup_InvalidReceptionHandlerParameters()
-            throws PolicyDistributionException, IOException {
+            throws PolicyDistributionException, IOException, CommandLineException {
 
-        String resultString = Files.readString(Paths.get(
-                        "src/test/resources/expectedValidationResults/InvalidReceptionHandlerParameters.txt"))
-                        .trim().replaceAll("\\r\\n", "\\\n");
+        String resultString = Files
+                .readString(
+                        Paths.get("src/test/resources/expectedValidationResults/InvalidReceptionHandlerParameters.txt"))
+                .trim().replaceAll("\\r\\n", "\\\n");
 
         verifyFailure("DistributionConfigParameters_InvalidReceptionHandlerParameters.json",
-                        PolicyDistributionException.class,
-                        resultString);
+                PolicyDistributionException.class, resultString);
     }
 
     @Test
     public void testDistributionParameterGroup_InvalidDecoderAndForwarderParameters()
-            throws PolicyDistributionException, IOException {
+            throws PolicyDistributionException, IOException, CommandLineException {
 
-        String resultString = new String(Files.readString(Paths.get(
-                        "src/test/resources/expectedValidationResults/InvalidDecoderAndForwarderParameters.txt"))
-                        .trim().replaceAll("\\r\\n", "\\\n"));
+        String resultString = new String(Files
+                .readString(Paths
+                        .get("src/test/resources/expectedValidationResults/InvalidDecoderAndForwarderParameters.txt"))
+                .trim().replaceAll("\\r\\n", "\\\n"));
 
         verifyFailure("DistributionConfigParameters_InvalidDecoderAndForwarderParameters.json",
-                        PolicyDistributionException.class,
-                        resultString);
+                PolicyDistributionException.class, resultString);
     }
 
     @Test
     public void testDistributionParameterGroup_InvalidRestServerParameters()
-            throws PolicyDistributionException, IOException {
+            throws PolicyDistributionException, IOException, CommandLineException {
 
-        String resultString = new String(Files.readString(Paths.get(
-                "src/test/resources/expectedValidationResults/InvalidRestServerParameters.txt"))
+        String resultString = new String(Files
+                .readString(Paths.get("src/test/resources/expectedValidationResults/InvalidRestServerParameters.txt"))
                 .trim().replaceAll("\\r\\n", "\\\n"));
 
         verifyFailure("DistributionConfigParameters_InvalidRestServerParameters.json",
-                        PolicyDistributionException.class,
-                        resultString);
+                PolicyDistributionException.class, resultString);
     }
 
     @Test
-    public void testDistributionVersion() throws PolicyDistributionException {
-        final String[] distributionConfigParameters =
-            { "-v" };
+    public void testDistributionVersion() throws PolicyDistributionException, CommandLineException {
+        final String[] distributionConfigParameters = {"-v"};
         final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments();
         final String version = arguments.parse(distributionConfigParameters);
         assertTrue(version.startsWith("ONAP Policy Framework Distribution Service"));
     }
 
     @Test
-    public void testDistributionHelp() throws PolicyDistributionException {
-        final String[] distributionConfigParameters =
-            { "-h" };
+    public void testDistributionHelp() throws PolicyDistributionException, CommandLineException {
+        final String[] distributionConfigParameters = {"-h"};
         final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments();
         final String help = arguments.parse(distributionConfigParameters);
         assertTrue(help.startsWith("usage:"));
 
     @Test
     public void testDistributionInvalidOption() throws PolicyDistributionException {
-        final String[] distributionConfigParameters =
-            { "-d" };
+        final String[] distributionConfigParameters = {"-d"};
         final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments();
-        assertThatThrownBy(() ->
-            arguments.parse(distributionConfigParameters)
-        ).isInstanceOf(PolicyDistributionException.class)
-            .hasMessageContaining("invalid command line arguments specified");
+        assertThatThrownBy(() -> arguments.parse(distributionConfigParameters))
+                .hasMessageContaining("invalid command line arguments specified");
     }
 
     @Test
-    public void testDistributionParameterGroup_InvalidReceptionHandlerClass() throws PolicyDistributionException {
+    public void testDistributionParameterGroup_InvalidReceptionHandlerClass()
+            throws PolicyDistributionException, CommandLineException {
         verifyFailure("DistributionConfigParameters_InvalidReceptionHandlerClass.json",
-                        PolicyDistributionException.class, "could not find class");
+                PolicyDistributionException.class, "could not find class");
     }
 
     @Test
-    public void testDistributionParameterGroup_EmptyReceptionHandlerClass() throws PolicyDistributionException {
-        verifyFailure("DistributionConfigParameters_EmptyReceptionHandlerClass.json",
-                        PolicyDistributionException.class, "invalid in JSON file");
+    public void testDistributionParameterGroup_EmptyReceptionHandlerClass()
+            throws PolicyDistributionException, CommandLineException {
+        verifyFailure("DistributionConfigParameters_EmptyReceptionHandlerClass.json", PolicyDistributionException.class,
+                "invalid in JSON file");
     }
 
     @Test
     public void testDistributionParameterGroup_InvalidDecoderConfigurationClassName()
-            throws PolicyDistributionException {
+            throws PolicyDistributionException, CommandLineException {
         verifyFailure("DistributionConfigParameters_InvalidDecoderConfigurationClassName.json",
-                        PolicyDistributionException.class,
-                        "parameter \"parameterClassName\" value \"\" invalid in JSON file");
+                PolicyDistributionException.class, "parameter \"parameterClassName\" value \"\" invalid in JSON file");
     }
 
     @Test
     public void testDistributionParameterGroup_UnknownDecoderConfigurationClassName()
-            throws PolicyDistributionException {
+            throws PolicyDistributionException, CommandLineException {
         verifyFailure("DistributionConfigParameters_UnknownDecoderConfigurationClassName.json",
-                        PolicyDistributionException.class,
-                        "parameter \"parameterClassName\" value \"org.onap.policy.Unknown\", could not find class");
+                PolicyDistributionException.class,
+                "parameter \"parameterClassName\" value \"org.onap.policy.Unknown\", could not find class");
     }
 
     private <T> void verifyFailure(String fileName, Class<T> clazz, String expectedMessage)
-                    throws PolicyDistributionException {
+            throws PolicyDistributionException, CommandLineException {
         final String[] distributionConfigParameters = {"-c", "parameters/" + fileName};
 
         final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments();
         DistributionParameterHandler paramHandler = new DistributionParameterHandler();
 
         assertThatThrownBy(() -> paramHandler.getParameters(arguments)).isInstanceOf(clazz)
-                        .hasMessageContaining(expectedMessage);
+                .hasMessageContaining(expectedMessage);
     }
 }