Adding services-onappf module to apex-pdp 55/83355/1
authora.sreekumar <ajith.sreekumar@est.tech>
Tue, 26 Mar 2019 13:54:45 +0000 (13:54 +0000)
committera.sreekumar <ajith.sreekumar@est.tech>
Tue, 26 Mar 2019 13:54:45 +0000 (13:54 +0000)
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 <ajith.sreekumar@est.tech>
22 files changed:
services/pom.xml
services/services-onappf/pom.xml [new file with mode: 0644]
services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterActivator.java [new file with mode: 0644]
services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterCommandLineArguments.java [new file with mode: 0644]
services/services-onappf/src/main/java/org/onap/policy/apex/starter/ApexStarterMain.java [new file with mode: 0644]
services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterException.java [new file with mode: 0644]
services/services-onappf/src/main/java/org/onap/policy/apex/starter/exception/ApexStarterRunTimeException.java [new file with mode: 0644]
services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterGroup.java [new file with mode: 0644]
services/services-onappf/src/main/java/org/onap/policy/apex/starter/parameters/ApexStarterParameterHandler.java [new file with mode: 0644]
services/services-onappf/src/main/resources/version.txt [new file with mode: 0644]
services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterActivator.java [new file with mode: 0644]
services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterMain.java [new file with mode: 0644]
services/services-onappf/src/test/java/org/onap/policy/apex/starter/exception/TestExceptions.java [new file with mode: 0644]
services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/CommonTestData.java [new file with mode: 0644]
services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterGroup.java [new file with mode: 0644]
services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterHandler.java [new file with mode: 0644]
services/services-onappf/src/test/resources/ApexStarterConfigParameters.json [new file with mode: 0644]
services/services-onappf/src/test/resources/ApexStarterConfigParameters_InvalidName.json [new file with mode: 0644]
services/services-onappf/src/test/resources/EmptyConfigParameters.json [new file with mode: 0644]
services/services-onappf/src/test/resources/InvalidParameters.json [new file with mode: 0644]
services/services-onappf/src/test/resources/NoParameters.json [new file with mode: 0644]
services/services-onappf/src/test/resources/topic.properties [new file with mode: 0644]

index 582d6cc..6ffd639 100644 (file)
@@ -1,6 +1,7 @@
 <!--
   ============LICENSE_START=======================================================
    Copyright (C) 2018 Ericsson. All rights reserved.
+   Modifications 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.
@@ -17,7 +18,6 @@
   SPDX-License-Identifier: Apache-2.0
   ============LICENSE_END=========================================================
 -->
-
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
@@ -35,6 +35,7 @@
 
     <modules>
         <module>services-engine</module>
+        <module>services-onappf</module>
     </modules>
 
     <profiles>
diff --git a/services/services-onappf/pom.xml b/services/services-onappf/pom.xml
new file mode 100644 (file)
index 0000000..dd7afdc
--- /dev/null
@@ -0,0 +1,67 @@
+<!--
+  ============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=========================================================
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onap.policy.apex-pdp.services</groupId>
+        <artifactId>services</artifactId>
+        <version>2.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>services-onappf</artifactId>
+
+    <name>services-onappf</name>
+    <description>This module handles the registration/deregistration of apex-pdp to ONAP Policy Framework.</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.apex-pdp.services</groupId>
+            <artifactId>services-engine</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.common</groupId>
+            <artifactId>pdp-common</artifactId>
+            <version>${version.policy.common}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.common</groupId>
+            <artifactId>policy-endpoints</artifactId>
+            <version>${version.policy.common}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.policy.common</groupId>
+            <artifactId>utils-test</artifactId>
+            <version>${version.policy.common}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
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 (file)
index 0000000..e1fb88a
--- /dev/null
@@ -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 (file)
index 0000000..f1d082f
--- /dev/null
@@ -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 (file)
index 0000000..f576bdf
--- /dev/null
@@ -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 (file)
index 0000000..7062e37
--- /dev/null
@@ -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 (file)
index 0000000..f15b55d
--- /dev/null
@@ -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 (file)
index 0000000..2500133
--- /dev/null
@@ -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 (file)
index 0000000..dae4b83
--- /dev/null
@@ -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;
+    }
+
+}
diff --git a/services/services-onappf/src/main/resources/version.txt b/services/services-onappf/src/main/resources/version.txt
new file mode 100644 (file)
index 0000000..579f78f
--- /dev/null
@@ -0,0 +1,4 @@
+ONAP Policy Framework Apex Starter Service
+Version: ${project.version}
+Built (UTC): ${maven.build.timestamp}
+ONAP https://wiki.onap.org
\ No newline at end of file
diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterActivator.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterActivator.java
new file mode 100644 (file)
index 0000000..3b7df83
--- /dev/null
@@ -0,0 +1,114 @@
+/*-
+ * ============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 static org.assertj.core.api.Assertions.assertThatIllegalStateException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileInputStream;
+import java.util.Properties;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+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.onap.policy.apex.starter.parameters.CommonTestData;
+
+
+
+/**
+ * Class to perform unit test of {@link ApexStarterActivator}}.
+ *
+ * @author Ajith Sreekumar (ajith.sreekumar@est.tech)
+ */
+public class TestApexStarterActivator {
+
+    private ApexStarterActivator activator;
+
+    /**
+     * Initializes an activator.
+     *
+     * @throws Exception if an error occurs
+     */
+    @Before
+    public void setUp() throws Exception {
+        final String[] apexStarterConfigParameters = { "-c", "src/test/resources/ApexStarterConfigParameters.json",
+            "-p", "src/test/resources/topic.properties" };
+        final ApexStarterCommandLineArguments arguments =
+                new ApexStarterCommandLineArguments(apexStarterConfigParameters);
+        final ApexStarterParameterGroup parGroup = new ApexStarterParameterHandler().getParameters(arguments);
+
+        final Properties props = new Properties();
+        final String propFile = arguments.getFullPropertyFilePath();
+        try (FileInputStream stream = new FileInputStream(propFile)) {
+            props.load(stream);
+        }
+
+        activator = new ApexStarterActivator(parGroup, props);
+    }
+
+    /**
+     * Method for cleanup after each test.
+     *
+     * @throws Exception if an error occurs
+     */
+    @After
+    public void teardown() throws Exception {
+        if (activator != null && activator.isAlive()) {
+            activator.terminate();
+        }
+    }
+
+    @Test
+    public void testApexStarterActivator() throws ApexStarterException {
+        assertFalse(activator.isAlive());
+        activator.initialize();
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameterGroup().isValid());
+        assertEquals(CommonTestData.APEX_STARTER_GROUP_NAME, activator.getParameterGroup().getName());
+
+        // repeat - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.initialize());
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameterGroup().isValid());
+    }
+
+    @Test
+    public void testGetCurrent_testSetCurrent() {
+        assertSame(activator, ApexStarterActivator.getCurrent());
+    }
+
+    @Test
+    public void testTerminate() throws Exception {
+        activator.initialize();
+        activator.terminate();
+        assertFalse(activator.isAlive());
+
+        // repeat - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.terminate());
+        assertFalse(activator.isAlive());
+    }
+}
diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterMain.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/TestApexStarterMain.java
new file mode 100644 (file)
index 0000000..5d52d85
--- /dev/null
@@ -0,0 +1,91 @@
+/*-
+ * ============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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.After;
+import org.junit.Test;
+import org.onap.policy.apex.starter.exception.ApexStarterException;
+import org.onap.policy.apex.starter.parameters.CommonTestData;
+
+/**
+ * Class to perform unit test of {@link ApexStarterMain}}.
+ *
+ * @author Ajith Sreekumar (ajith.sreekumar@est.tech)
+ */
+public class TestApexStarterMain {
+    private ApexStarterMain apexStarter;
+
+    /**
+     * Shuts "main" down.
+     *
+     * @throws Exception if an error occurs
+     */
+    @After
+    public void tearDown() throws Exception {
+        // shut down activator
+        final ApexStarterActivator activator = ApexStarterActivator.getCurrent();
+        if (activator != null && activator.isAlive()) {
+            activator.terminate();
+        }
+    }
+
+    @Test
+    public void testApexStarter() throws ApexStarterException {
+        final String[] apexStarterConfigParameters = { "-c", "src/test/resources/ApexStarterConfigParameters.json",
+            "-p", "src/test/resources/topic.properties" };
+        apexStarter = new ApexStarterMain(apexStarterConfigParameters);
+        assertTrue(apexStarter.getParameters().isValid());
+        assertEquals(CommonTestData.APEX_STARTER_GROUP_NAME, apexStarter.getParameters().getName());
+
+        apexStarter.shutdown();
+    }
+
+    @Test
+    public void testApexStarter_NoArguments() {
+        final String[] apexStarterConfigParameters = {};
+        apexStarter = new ApexStarterMain(apexStarterConfigParameters);
+        assertTrue(apexStarter.getParameters() == null);
+    }
+
+    @Test
+    public void testApexStarter_InvalidArguments() {
+        final String[] apexStarterConfigParameters = { "src/test/resources/ApexStarterConfigParameters.json" };
+        apexStarter = new ApexStarterMain(apexStarterConfigParameters);
+        assertTrue(apexStarter.getParameters() == null);
+    }
+
+    @Test
+    public void testApexStarter_Help() {
+        final String[] apexStarterConfigParameters = { "-h" };
+        ApexStarterMain.main(apexStarterConfigParameters);
+    }
+
+    @Test
+    public void testApexStarter_InvalidParameters() {
+        final String[] apexStarterConfigParameters =
+                { "-c", "src/test/resources/ApexStarterConfigParameters_InvalidName.json" };
+        apexStarter = new ApexStarterMain(apexStarterConfigParameters);
+        assertTrue(apexStarter.getParameters() == null);
+    }
+}
diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/exception/TestExceptions.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/exception/TestExceptions.java
new file mode 100644 (file)
index 0000000..63ebeb6
--- /dev/null
@@ -0,0 +1,38 @@
+/*-
+ * ============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;
+
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ExceptionsTester;
+
+/**
+ * Class to perform unit test of {@link ApexStarterException ApexStarterRunTimeException}}.
+ *
+ * @author Ajith Sreekumar (ajith.sreekumar@est.tech)
+ */
+public class TestExceptions {
+
+    @Test
+    public void test() {
+        new ExceptionsTester().test(ApexStarterException.class);
+        new ExceptionsTester().test(ApexStarterRunTimeException.class);
+    }
+}
diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/CommonTestData.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/CommonTestData.java
new file mode 100644 (file)
index 0000000..08a33b9
--- /dev/null
@@ -0,0 +1,92 @@
+/*-
+ * ============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.util.Map;
+import java.util.TreeMap;
+
+import org.onap.policy.common.parameters.ParameterGroup;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+
+/**
+ * Class to hold/create all parameters for test cases.
+ *
+ * @author Ajith Sreekumar (ajith.sreekumar@est.tech)
+ */
+public class CommonTestData {
+
+    public static final String APEX_STARTER_GROUP_NAME = "ApexStarterParameterGroup";
+    public static final int APEX_STARTER_TIME_INTERVAL = 5;
+
+    private static final Coder coder = new StandardCoder();
+
+    /**
+     * Converts the contents of a map to a parameter class.
+     *
+     * @param source property map
+     * @param clazz class of object to be created from the map
+     * @return a new object represented by the map
+     */
+    public <T extends ParameterGroup> T toObject(final Map<String, Object> source, final Class<T> clazz) {
+        try {
+            return coder.decode(coder.encode(source), clazz);
+
+        } catch (final CoderException e) {
+            throw new RuntimeException("cannot create " + clazz.getName() + " from map", e);
+        }
+    }
+
+    /**
+     * Returns a property map for a ApexStarterParameterGroup map for test cases.
+     *
+     * @param name name of the parameters
+     *
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getApexStarterParameterGroupMap(final String name) {
+        final Map<String, Object> map = new TreeMap<>();
+
+        map.put("name", name);
+        map.put("timeInterval", getTimeInterval(false));
+
+        return map;
+    }
+
+
+
+    /**
+     * Determines whether to return null or a valid time interval
+     *
+     * @param isNullField flag to determine what to return
+     * @return time interval based on the flag
+     */
+    public Object getTimeInterval(final boolean isNullField) {
+        if (isNullField) {
+            return null;
+        } else {
+            return APEX_STARTER_TIME_INTERVAL;
+        }
+
+    }
+
+}
diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterGroup.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterGroup.java
new file mode 100644 (file)
index 0000000..d224552
--- /dev/null
@@ -0,0 +1,104 @@
+/*-
+ * ============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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Map;
+
+import org.junit.Test;
+import org.onap.policy.common.parameters.GroupValidationResult;
+
+/**
+ * Class to perform unit test of {@link ApexStarterParameterGroup}.
+ *
+ * @author Ajith Sreekumar (ajith.sreekumar@est.tech)
+ */
+public class TestApexStarterParameterGroup {
+    CommonTestData commonTestData = new CommonTestData();
+
+    @Test
+    public void testApexStarterParameterGroup_Named() {
+        final ApexStarterParameterGroup apexStarterParameters = new ApexStarterParameterGroup("my-name");
+        assertEquals("my-name", apexStarterParameters.getName());
+    }
+
+    @Test
+    public void testApexStarterParameterGroup() {
+        final ApexStarterParameterGroup apexStarterParameters = commonTestData.toObject(
+                commonTestData.getApexStarterParameterGroupMap(CommonTestData.APEX_STARTER_GROUP_NAME),
+                ApexStarterParameterGroup.class);
+        final GroupValidationResult validationResult = apexStarterParameters.validate();
+        assertTrue(validationResult.isValid());
+        assertEquals(CommonTestData.APEX_STARTER_GROUP_NAME, apexStarterParameters.getName());
+        assertEquals(CommonTestData.APEX_STARTER_TIME_INTERVAL, apexStarterParameters.getTimeInterval());
+    }
+
+    @Test
+    public void testApexStarterParameterGroup_NullName() {
+        final ApexStarterParameterGroup apexStarterParameters = commonTestData
+                .toObject(commonTestData.getApexStarterParameterGroupMap(null), ApexStarterParameterGroup.class);
+        final GroupValidationResult validationResult = apexStarterParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertEquals(null, apexStarterParameters.getName());
+        assertEquals(CommonTestData.APEX_STARTER_TIME_INTERVAL, apexStarterParameters.getTimeInterval());
+        assertTrue(validationResult.getResult().contains("is null"));
+    }
+
+    @Test
+    public void testApexStarterParameterGroup_EmptyName() {
+        final ApexStarterParameterGroup apexStarterParameters = commonTestData
+                .toObject(commonTestData.getApexStarterParameterGroupMap(""), ApexStarterParameterGroup.class);
+        final GroupValidationResult validationResult = apexStarterParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertEquals("", apexStarterParameters.getName());
+        assertEquals(CommonTestData.APEX_STARTER_TIME_INTERVAL, apexStarterParameters.getTimeInterval());
+        assertTrue(validationResult.getResult().contains(
+                "field \"name\" type \"java.lang.String\" value \"\" INVALID, " + "must be a non-blank string"));
+    }
+
+    @Test
+    public void testApexStarterParameterGroup_SetName() {
+        final ApexStarterParameterGroup apexStarterParameters = commonTestData.toObject(
+                commonTestData.getApexStarterParameterGroupMap(CommonTestData.APEX_STARTER_GROUP_NAME),
+                ApexStarterParameterGroup.class);
+        apexStarterParameters.setName("ApexStarterNewGroup");
+        final GroupValidationResult validationResult = apexStarterParameters.validate();
+        assertTrue(validationResult.isValid());
+        assertEquals("ApexStarterNewGroup", apexStarterParameters.getName());
+    }
+
+    @Test
+    public void testApexStarterParameterGroup_EmptyTimeInterval() {
+        final Map<String, Object> map =
+                commonTestData.getApexStarterParameterGroupMap(CommonTestData.APEX_STARTER_GROUP_NAME);
+        map.put("timeInterval", commonTestData.getTimeInterval(true));
+        final ApexStarterParameterGroup apexStarterParameters =
+                commonTestData.toObject(map, ApexStarterParameterGroup.class);
+        final GroupValidationResult validationResult = apexStarterParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertTrue(validationResult.getResult()
+                .contains("field \"timeInterval\" type \"int\" value \"0\" INVALID, must be >= 1")
+                && validationResult.getResult().contains("parameter group has status INVALID"));
+    }
+}
diff --git a/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterHandler.java b/services/services-onappf/src/test/java/org/onap/policy/apex/starter/parameters/TestApexStarterParameterHandler.java
new file mode 100644 (file)
index 0000000..3889b2a
--- /dev/null
@@ -0,0 +1,158 @@
+/*-
+ * ============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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.FileNotFoundException;
+
+import org.junit.Test;
+import org.onap.policy.apex.starter.ApexStarterCommandLineArguments;
+import org.onap.policy.apex.starter.exception.ApexStarterException;
+import org.onap.policy.common.utils.coder.CoderException;
+
+/**
+ * Class to perform unit test of {@link ApexStarterParameterHandler}.
+ *
+ * @author Ajith Sreekumar (ajith.sreekumar@est.tech)
+ */
+public class TestApexStarterParameterHandler {
+
+    @Test
+    public void testParameterHandlerNoParameterFile() throws ApexStarterException {
+        final String[] emptyArgumentString = { "-c", "src/test/resources/NoParametersFile.json" };
+
+        final ApexStarterCommandLineArguments emptyArguments = new ApexStarterCommandLineArguments();
+        emptyArguments.parse(emptyArgumentString);
+
+        try {
+            new ApexStarterParameterHandler().getParameters(emptyArguments);
+            fail("test should throw an exception here");
+        } catch (final Exception e) {
+            assertTrue(e.getCause() instanceof CoderException);
+            assertTrue(e.getCause().getCause() instanceof FileNotFoundException);
+        }
+    }
+
+    @Test
+    public void testParameterHandlerEmptyParameters() throws ApexStarterException {
+        final String[] noArgumentString = { "-c", "src/test/resources/NoParameters.json" };
+
+        final ApexStarterCommandLineArguments noArguments = new ApexStarterCommandLineArguments();
+        noArguments.parse(noArgumentString);
+
+        try {
+            new ApexStarterParameterHandler().getParameters(noArguments);
+            fail("test should throw an exception here");
+        } catch (final Exception e) {
+            assertTrue(e.getMessage().contains("no parameters found"));
+        }
+    }
+
+    @Test
+    public void testParameterHandlerInvalidParameters() throws ApexStarterException {
+        final String[] invalidArgumentString = { "-c", "src/test/resources/InvalidParameters.json" };
+
+        final ApexStarterCommandLineArguments invalidArguments = new ApexStarterCommandLineArguments();
+        invalidArguments.parse(invalidArgumentString);
+
+        try {
+            new ApexStarterParameterHandler().getParameters(invalidArguments);
+            fail("test should throw an exception here");
+        } catch (final Exception e) {
+            assertTrue(e.getMessage().startsWith("error reading parameters from"));
+            assertTrue(e.getCause() instanceof CoderException);
+        }
+    }
+
+    @Test
+    public void testParameterHandlerNoParameters() throws ApexStarterException {
+        final String[] noArgumentString = { "-c", "src/test/resources/EmptyConfigParameters.json" };
+
+        final ApexStarterCommandLineArguments noArguments = new ApexStarterCommandLineArguments();
+        noArguments.parse(noArgumentString);
+
+        try {
+            new ApexStarterParameterHandler().getParameters(noArguments);
+        } catch (final Exception e) {
+            assertTrue(e.getMessage().contains("is null"));
+        }
+    }
+
+    @Test
+    public void testApexStarterParameterGroup() throws ApexStarterException {
+        final String[] apexStarterConfigParameters = { "-c", "src/test/resources/ApexStarterConfigParameters.json" };
+
+        final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments();
+        arguments.parse(apexStarterConfigParameters);
+
+        final ApexStarterParameterGroup parGroup = new ApexStarterParameterHandler().getParameters(arguments);
+        assertTrue(arguments.checkSetConfigurationFilePath());
+        assertEquals(CommonTestData.APEX_STARTER_GROUP_NAME, parGroup.getName());
+        assertEquals(CommonTestData.APEX_STARTER_TIME_INTERVAL, parGroup.getTimeInterval());
+    }
+
+    @Test
+    public void testApexStarterParameterGroup_InvalidName() throws ApexStarterException {
+        final String[] apexStarterConfigParameters =
+                { "-c", "src/test/resources/ApexStarterConfigParameters_InvalidName.json" };
+
+        final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments();
+        arguments.parse(apexStarterConfigParameters);
+
+        try {
+            new ApexStarterParameterHandler().getParameters(arguments);
+            fail("test should throw an exception here");
+        } catch (final Exception e) {
+            assertTrue(e.getMessage().contains(
+                    "field \"name\" type \"java.lang.String\" value \" \" INVALID, must be a non-blank string"));
+        }
+    }
+
+    @Test
+    public void testApexStarterVersion() throws ApexStarterException {
+        final String[] apexStarterConfigParameters = { "-v" };
+        final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments();
+        final String version = arguments.parse(apexStarterConfigParameters);
+        assertTrue(version.startsWith("ONAP Policy Framework Apex Starter Service"));
+    }
+
+    @Test
+    public void testApexStarterHelp() throws ApexStarterException {
+        final String[] apexStarterConfigParameters = { "-h" };
+        final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments();
+        final String help = arguments.parse(apexStarterConfigParameters);
+        assertTrue(help.startsWith("usage:"));
+    }
+
+    @Test
+    public void testApexStarterInvalidOption() throws ApexStarterException {
+        final String[] apexStarterConfigParameters = { "-d" };
+        final ApexStarterCommandLineArguments arguments = new ApexStarterCommandLineArguments();
+        try {
+            arguments.parse(apexStarterConfigParameters);
+        } catch (final Exception exp) {
+            assertTrue(exp.getMessage().startsWith("invalid command line arguments specified"));
+        }
+    }
+}
diff --git a/services/services-onappf/src/test/resources/ApexStarterConfigParameters.json b/services/services-onappf/src/test/resources/ApexStarterConfigParameters.json
new file mode 100644 (file)
index 0000000..2720cde
--- /dev/null
@@ -0,0 +1,4 @@
+{
+    "name":"ApexStarterParameterGroup",
+    "timeInterval": 5
+}
diff --git a/services/services-onappf/src/test/resources/ApexStarterConfigParameters_InvalidName.json b/services/services-onappf/src/test/resources/ApexStarterConfigParameters_InvalidName.json
new file mode 100644 (file)
index 0000000..a7273ae
--- /dev/null
@@ -0,0 +1,4 @@
+{
+    "name":" ",
+    "timeInterval": 5
+}
\ No newline at end of file
diff --git a/services/services-onappf/src/test/resources/EmptyConfigParameters.json b/services/services-onappf/src/test/resources/EmptyConfigParameters.json
new file mode 100644 (file)
index 0000000..7a73a41
--- /dev/null
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
diff --git a/services/services-onappf/src/test/resources/InvalidParameters.json b/services/services-onappf/src/test/resources/InvalidParameters.json
new file mode 100644 (file)
index 0000000..de2040c
--- /dev/null
@@ -0,0 +1,3 @@
+{
+    "name" : []
+}
\ No newline at end of file
diff --git a/services/services-onappf/src/test/resources/NoParameters.json b/services/services-onappf/src/test/resources/NoParameters.json
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/services/services-onappf/src/test/resources/topic.properties b/services/services-onappf/src/test/resources/topic.properties
new file mode 100644 (file)
index 0000000..87c6ebd
--- /dev/null
@@ -0,0 +1,4 @@
+noop.sink.topics=POLICY-PDP-PAP
+noop.sink.topics.POLICY-PDP-PAP.servers=anyserver
+noop.source.topics=POLICY-PDP-PAP
+noop.source.topics.POLICY-PDP-PAP.servers=anyserver
\ No newline at end of file