From 3fce2a6b2ba5b556995622f368e97bb1d4f4151e Mon Sep 17 00:00:00 2001 From: "adheli.tavares" Date: Tue, 13 Apr 2021 14:51:44 +0100 Subject: Refactor of command line classes 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 --- .../engine/main/ApexCommandLineArguments.java | 180 +++++++-------------- .../policy/apex/service/engine/main/ApexMain.java | 7 +- .../engine/main/ApexCommandLineArgumentsTest.java | 83 +++++----- .../apex/service/engine/main/ApexMainTest.java | 2 +- 4 files changed, 109 insertions(+), 163 deletions(-) (limited to 'services/services-engine/src') diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexCommandLineArguments.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexCommandLineArguments.java index 31131b465..0d7560f89 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexCommandLineArguments.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexCommandLineArguments.java @@ -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. @@ -22,21 +22,19 @@ 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. */ diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java index 3e9072dd4..9757c57e8 100644 --- a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java +++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java @@ -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); } diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexCommandLineArgumentsTest.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexCommandLineArgumentsTest.java index 09663c0bf..b5b68c9fc 100644 --- a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexCommandLineArgumentsTest.java +++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexCommandLineArgumentsTest.java @@ -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"); @@ -22,12 +22,14 @@ 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(); } } diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java index 5764a5275..b7532aba2 100644 --- a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java +++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java @@ -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); } -- cgit 1.2.3-korg