From 1d86d11223e9c60ec65b737301b51ca9a42adff5 Mon Sep 17 00:00:00 2001 From: "a.sreekumar" Date: Tue, 26 Mar 2019 13:54:45 +0000 Subject: Adding services-onappf module to apex-pdp 1) Adding services-onappf module to apex-pdp. 2) Following the code base from policy/pap to build the module. 3) Currently PAP is using property & configuration file for bootstrap. Continuing the same in this module as well. 4) Adding relevant test cases. Change-Id: Id9740ea60ae3ecbd88e5d6d3586ee0dde1054cca Issue-ID: POLICY-1452 Signed-off-by: a.sreekumar --- .../policy/apex/starter/ApexStarterActivator.java | 147 ++++++++++ .../starter/ApexStarterCommandLineArguments.java | 299 +++++++++++++++++++++ .../onap/policy/apex/starter/ApexStarterMain.java | 165 ++++++++++++ .../starter/exception/ApexStarterException.java | 59 ++++ .../exception/ApexStarterRunTimeException.java | 58 ++++ .../parameters/ApexStarterParameterGroup.java | 50 ++++ .../parameters/ApexStarterParameterHandler.java | 88 ++++++ 7 files changed, 866 insertions(+) create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterActivator.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterCommandLineArguments.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterMain.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterException.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterRunTimeException.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterGroup.java create mode 100644 services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterHandler.java (limited to 'services/services-onappf/src/main/java') diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterActivator.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterActivator.java new file mode 100644 index 000000000..e1fb88a0a --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterActivator.java @@ -0,0 +1,147 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.starter; + +import java.util.Properties; + +import lombok.Getter; +import lombok.Setter; + +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.apex.starter.parameters.ApexStarterParameterGroup; +import org.onap.policy.common.endpoints.event.comm.TopicEndpoint; +import org.onap.policy.common.parameters.ParameterService; +import org.onap.policy.common.utils.services.ServiceManager; +import org.onap.policy.common.utils.services.ServiceManagerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class activates the ApexStarter as a complete service together with all its handlers. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterActivator { + + private static final Logger LOGGER = LoggerFactory.getLogger(ApexStarterActivator.class); + private final ApexStarterParameterGroup apexStarterParameterGroup; + + /** + * The current activator. + */ + @Getter + private static volatile ApexStarterActivator current = null; + + /** + * Used to manage the services. + */ + private ServiceManager manager; + + @Getter + @Setter(lombok.AccessLevel.PRIVATE) + private volatile boolean alive = false; + + public ApexStarterActivator(final ApexStarterParameterGroup apexStarterParameterGroup, + final Properties topicProperties) { + + TopicEndpoint.manager.addTopicSinks(topicProperties); + TopicEndpoint.manager.addTopicSources(topicProperties); + + this.apexStarterParameterGroup = apexStarterParameterGroup; + // @formatter:off + this.manager = new ServiceManager() + .addAction("topics", + () -> TopicEndpoint.manager.start(), () -> TopicEndpoint.manager.shutdown()) + .addAction("set alive", + () -> setAlive(true), () -> setAlive(false)) + .addAction("register parameters", + () -> registerToParameterService(apexStarterParameterGroup), + () -> deregisterToParameterService(apexStarterParameterGroup)); + // @formatter:on + current = this; + } + + /** + * Initialize ApexStarter service. + * + * @throws ApexStarterException on errors in initializing the service + */ + public void initialize() throws ApexStarterException { + if (isAlive()) { + throw new IllegalStateException("activator already initialized"); + } + + try { + LOGGER.debug("ApexStarter starting as a service . . ."); + manager.start(); + LOGGER.debug("ApexStarter started as a service"); + } catch (final ServiceManagerException exp) { + LOGGER.error("ApexStarter service startup failed"); + throw new ApexStarterException(exp.getMessage(), exp); + } + } + + /** + * Terminate ApexStarter. + * + * @throws ApexStarterException on errors in terminating the service + */ + public void terminate() throws ApexStarterException { + if (!isAlive()) { + throw new IllegalStateException("activator is not running"); + } + + try { + manager.stop(); + } catch (final ServiceManagerException exp) { + LOGGER.error("ApexStarter termination failed"); + throw new ApexStarterException(exp.getMessage(), exp); + } + } + + /** + * Get the parameters used by the activator. + * + * @return the parameters of the activator + */ + public ApexStarterParameterGroup getParameterGroup() { + return apexStarterParameterGroup; + } + + + /** + * Method to register the parameters to Common Parameter Service. + * + * @param apexStarterParameterGroup the apex starter parameter group + */ + public void registerToParameterService(final ApexStarterParameterGroup apexStarterParameterGroup) { + ParameterService.register(apexStarterParameterGroup); + } + + /** + * Method to deregister the parameters from Common Parameter Service. + * + * @param apexStarterParameterGroup the apex starter parameter group + */ + public void deregisterToParameterService(final ApexStarterParameterGroup apexStarterParameterGroup) { + ParameterService.deregister(apexStarterParameterGroup.getName()); + } +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterCommandLineArguments.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterCommandLineArguments.java new file mode 100644 index 000000000..f1d082fcb --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterCommandLineArguments.java @@ -0,0 +1,299 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.starter; + +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.apache.log4j.chainsaw.Main; +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.apex.starter.exception.ApexStarterRunTimeException; +import org.onap.policy.common.utils.resources.ResourceUtils; + +/** + * 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; + + /** + * 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 + } + + /** + * Construct the options for the CLI editor and parse in the given arguments. + * + * @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) { + 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(Main.class.getCanonicalName()); + } + + 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); + validateReadableFile("apex starter properties", propertyFilePath); + } + + /** + * 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. + * + * @return true, if check set configuration file path + */ + 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"); + } + } + +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterMain.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterMain.java new file mode 100644 index 000000000..f576bdfd4 --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterMain.java @@ -0,0 +1,165 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.starter; + +import java.io.FileInputStream; +import java.util.Arrays; +import java.util.Properties; + +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.apex.starter.parameters.ApexStarterParameterGroup; +import org.onap.policy.apex.starter.parameters.ApexStarterParameterHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class initiates Apex as a service based on instructions from PAP. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterMain { + + private static final Logger LOGGER = LoggerFactory.getLogger(ApexStarterMain.class); + + private ApexStarterActivator activator; + private ApexStarterParameterGroup parameterGroup; + + /** + * Instantiates the ApexStarter. + * + * @param args the command line arguments + */ + ApexStarterMain(final String[] args) { + LOGGER.info("In ApexStarter with parameters " + Arrays.toString(args)); + + // Check the arguments + final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments(); + try { + // The arguments return a string if there is a message to print and we should exit + final String argumentMessage = arguments.parse(args); + if (argumentMessage != null) { + LOGGER.info(argumentMessage); + return; + } + // Validate that the arguments are sane + arguments.validate(); + } catch (final ApexStarterException e) { + LOGGER.error("start of ApexStarter failed", e); + return; + } + + // Read the parameters + try { + parameterGroup = new ApexStarterParameterHandler().getParameters(arguments); + } catch (final Exception e) { + LOGGER.error("start of ApexStarter failed", e); + return; + } + + // Read the properties + final Properties topicProperties = new Properties(); + try { + final String propFile = arguments.getFullPropertyFilePath(); + try (FileInputStream stream = new FileInputStream(propFile)) { + topicProperties.load(stream); + } + } catch (final Exception e) { + LOGGER.error("start of ApexStarter failed", e); + return; + } + + // create the activator + activator = new ApexStarterActivator(parameterGroup, topicProperties); + + // Start the activator + try { + activator.initialize(); + } catch (final ApexStarterException e) { + LOGGER.error("start of ApexStarter failed, used parameters are {}", Arrays.toString(args), e); + return; + } + + // Add a shutdown hook to shut everything down in an orderly manner + Runtime.getRuntime().addShutdownHook(new ApexStarterShutdownHookClass()); + + LOGGER.info("Started ApexStarter service"); + } + + + /** + * Get the parameters specified in JSON. + * + * @return the parameters + */ + public ApexStarterParameterGroup getParameters() { + return parameterGroup; + } + + + /** + * Shut down Execution. + * + * @throws ApexStarterException on shutdown errors + */ + public void shutdown() throws ApexStarterException { + // clear the parameterGroup variable + parameterGroup = null; + + // clear the apex starter activator + if (activator != null && activator.isAlive()) { + activator.terminate(); + } + } + + /** + * The Class ApexStarterShutdownHookClass terminates the Apex starter for the Apex service when its run method is + * called. + */ + private class ApexStarterShutdownHookClass extends Thread { + /* + * (non-Javadoc) + * + * @see java.lang.Runnable#run() + */ + @Override + public void run() { + try { + // Shutdown the apex starter service and wait for everything to stop + if (activator != null && activator.isAlive()) { + activator.terminate(); + } + } catch (final ApexStarterException e) { + LOGGER.warn("error occured during shut down of the apex starter service", e); + } + } + } + + + /** + * The main method. + * + * @param args the arguments + * + */ + public static void main(final String[] args) { + new ApexStarterMain(args); + } +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterException.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterException.java new file mode 100644 index 000000000..7062e377b --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterException.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.starter.exception; + +/** + * This exception will be called if an error occurs in apex starter. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterException extends Exception { + private static final long serialVersionUID = -510646141043975917L; + + /** + * Instantiates a new apex starter exception with a message. + * + * @param message the message + */ + public ApexStarterException(final String message) { + super(message); + } + + /** + * Instantiates a new apex starter exception caused by an exception. + * + * @param exception the exception that caused this exception to be thrown + */ + public ApexStarterException(final Exception exception) { + super(exception); + } + + /** + * Instantiates a new apex starter exception with a message and a caused by an exception. + * + * @param message the message + * @param exception the exception that caused this exception to be thrown + */ + public ApexStarterException(final String message, final Exception exception) { + super(message, exception); + } + +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterRunTimeException.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterRunTimeException.java new file mode 100644 index 000000000..f15b55d33 --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterRunTimeException.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.starter.exception; + +/** + * This runtime exception will be called if a runtime error occurs when using apex starter. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterRunTimeException extends RuntimeException { + private static final long serialVersionUID = -6024353312002272098L; + + /** + * Instantiates a new apex starter runtime exception with a message. + * + * @param message the message + */ + public ApexStarterRunTimeException(final String message) { + super(message); + } + + /** + * Instantiates a new apex starter runtime exception caused by an exception. + * + * @param exception the exception that caused this exception to be thrown + */ + public ApexStarterRunTimeException(final Exception exception) { + super(exception); + } + + /** + * Instantiates a new apex starter runtime exception with a message and caused by an exception. + * + * @param message the message + * @param exception the exception that caused this exception to be thrown + */ + public ApexStarterRunTimeException(final String message, final Exception exception) { + super(message, exception); + } +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterGroup.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterGroup.java new file mode 100644 index 000000000..25001330c --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterGroup.java @@ -0,0 +1,50 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.starter.parameters; + +import lombok.Getter; + +import org.onap.policy.common.parameters.ParameterGroupImpl; +import org.onap.policy.common.parameters.annotations.Min; +import org.onap.policy.common.parameters.annotations.NotBlank; +import org.onap.policy.common.parameters.annotations.NotNull; + +/** + * Class to hold all parameters needed for apex starter component. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +@NotNull +@NotBlank +@Getter +public class ApexStarterParameterGroup extends ParameterGroupImpl { + @Min(value = 1) + private int timeInterval; + + /** + * Create the apex starter parameter group. + * + * @param name the parameter group name + */ + public ApexStarterParameterGroup(final String name) { + super(name); + } +} diff --git a/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterHandler.java b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterHandler.java new file mode 100644 index 000000000..dae4b8334 --- /dev/null +++ b/services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterHandler.java @@ -0,0 +1,88 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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.starter.parameters; + +import java.io.File; + +import org.onap.policy.apex.starter.ApexStarterCommandLineArguments; +import org.onap.policy.apex.starter.exception.ApexStarterException; +import org.onap.policy.common.parameters.GroupValidationResult; +import org.onap.policy.common.utils.coder.Coder; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class handles reading, parsing and validating of apex starter parameters from JSON files. + * + * @author Ajith Sreekumar (ajith.sreekumar@est.tech) + */ +public class ApexStarterParameterHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(ApexStarterParameterHandler.class); + private static final Coder CODER = new StandardCoder(); + + /** + * Read the parameters from the parameter file. + * + * @param arguments the arguments passed to apex starter + * @return the parameters read from the configuration file + * @throws ApexStarterException on parameter exceptions + */ + public ApexStarterParameterGroup getParameters(final ApexStarterCommandLineArguments arguments) + throws ApexStarterException { + ApexStarterParameterGroup apexStarterParameterGroup = null; + + // Read the parameters + try { + // Read the parameters from JSON + final File file = new File(arguments.getFullConfigurationFilePath()); + apexStarterParameterGroup = CODER.decode(file, ApexStarterParameterGroup.class); + } catch (final CoderException e) { + final String errorMessage = "error reading parameters from \"" + arguments.getConfigurationFilePath() + + "\"\n" + "(" + e.getClass().getSimpleName() + "):" + e.getMessage(); + LOGGER.error(errorMessage, e); + throw new ApexStarterException(errorMessage, e); + } + + // The JSON processing returns null if there is an empty file + if (apexStarterParameterGroup == null) { + final String errorMessage = "no parameters found in \"" + arguments.getConfigurationFilePath() + "\""; + LOGGER.error(errorMessage); + throw new ApexStarterException(errorMessage); + } + + // validate the parameters + final GroupValidationResult validationResult = apexStarterParameterGroup.validate(); + if (!validationResult.isValid()) { + String returnMessage = + "validation error(s) on parameters from \"" + arguments.getConfigurationFilePath() + "\"\n"; + returnMessage += validationResult.getResult(); + + LOGGER.error(returnMessage); + throw new ApexStarterException(returnMessage); + } + + return apexStarterParameterGroup; + } + +} -- cgit 1.2.3-korg