Create basic structure of pap component

1) Creating the basic code structure of pap component which includes
main sub-module having Main, PapActivator, PapCommandLineArguments,
PapParameterGroup & PapParameterHandler. Along with few exception
classes. Basicalliy the structure follows the pattern developed in
policy/distribution component.

2) Created the related unit test cases and required test resources.

Change-Id: I67c82f9d072e6c8a306cb983accb693da70e58a2
Issue-ID: POLICY-1476
Signed-off-by: ramverma <ram.krishna.verma@est.tech>
diff --git a/main/src/main/java/org/onap/policy/pap/main/PolicyPapException.java b/main/src/main/java/org/onap/policy/pap/main/PolicyPapException.java
new file mode 100644
index 0000000..6459d6b
--- /dev/null
+++ b/main/src/main/java/org/onap/policy/pap/main/PolicyPapException.java
@@ -0,0 +1,49 @@
+/*-
+ * ============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.pap.main;
+
+/**
+ * This exception will be called if an error occurs in policy pap service.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class PolicyPapException extends Exception {
+    private static final long serialVersionUID = -8507246953751956974L;
+
+    /**
+     * Instantiates a new policy pap exception with a message.
+     *
+     * @param message the message
+     */
+    public PolicyPapException(final String message) {
+        super(message);
+    }
+
+    /**
+     * Instantiates a new policy pap exception with a message and a caused by exception.
+     *
+     * @param message the message
+     * @param exp the exception that caused this exception to be thrown
+     */
+    public PolicyPapException(final String message, final Exception exp) {
+        super(message, exp);
+    }
+}
diff --git a/main/src/main/java/org/onap/policy/pap/main/PolicyPapRuntimeException.java b/main/src/main/java/org/onap/policy/pap/main/PolicyPapRuntimeException.java
new file mode 100644
index 0000000..e1df1b1
--- /dev/null
+++ b/main/src/main/java/org/onap/policy/pap/main/PolicyPapRuntimeException.java
@@ -0,0 +1,49 @@
+/*-
+ * ============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.pap.main;
+
+/**
+ * This runtime exception will be called if a runtime error occurs when using policy pap.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class PolicyPapRuntimeException extends RuntimeException {
+    private static final long serialVersionUID = -8507246953751956974L;
+
+    /**
+     * Instantiates a new policy pap runtime exception with a message.
+     *
+     * @param message the message
+     */
+    public PolicyPapRuntimeException(final String message) {
+        super(message);
+    }
+
+    /**
+     * Instantiates a new policy pap runtime exception with a message and a caused by exception.
+     *
+     * @param message the message
+     * @param exp the exception that caused this exception to be thrown
+     */
+    public PolicyPapRuntimeException(final String message, final Exception exp) {
+        super(message, exp);
+    }
+}
diff --git a/main/src/main/java/org/onap/policy/pap/main/parameters/PapParameterGroup.java b/main/src/main/java/org/onap/policy/pap/main/parameters/PapParameterGroup.java
new file mode 100644
index 0000000..01032c5
--- /dev/null
+++ b/main/src/main/java/org/onap/policy/pap/main/parameters/PapParameterGroup.java
@@ -0,0 +1,78 @@
+/*-
+ * ============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.pap.main.parameters;
+
+import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.parameters.ParameterGroup;
+import org.onap.policy.common.parameters.ValidationStatus;
+import org.onap.policy.common.utils.validation.ParameterValidationUtils;
+
+/**
+ * Class to hold all parameters needed for pap component.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class PapParameterGroup implements ParameterGroup {
+    private String name;
+
+    /**
+     * Create the pap parameter group.
+     *
+     * @param name the parameter group name
+     */
+    public PapParameterGroup(final String name) {
+        this.name = name;
+    }
+
+    /**
+     * Return the name of this parameter group instance.
+     *
+     * @return name the parameter group name
+     */
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Set the name of this parameter group instance.
+     *
+     * @param name the parameter group name
+     */
+    @Override
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+    /**
+     * Validate the parameter group.
+     *
+     * @return the result of the validation
+     */
+    @Override
+    public GroupValidationResult validate() {
+        final GroupValidationResult validationResult = new GroupValidationResult(this);
+        if (!ParameterValidationUtils.validateStringParameter(name)) {
+            validationResult.setResult("name", ValidationStatus.INVALID, "must be a non-blank string");
+        }
+        return validationResult;
+    }
+}
diff --git a/main/src/main/java/org/onap/policy/pap/main/parameters/PapParameterHandler.java b/main/src/main/java/org/onap/policy/pap/main/parameters/PapParameterHandler.java
new file mode 100644
index 0000000..f397dae
--- /dev/null
+++ b/main/src/main/java/org/onap/policy/pap/main/parameters/PapParameterHandler.java
@@ -0,0 +1,85 @@
+/*-
+ * ============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.pap.main.parameters;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import java.io.FileReader;
+
+import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.pap.main.PolicyPapException;
+import org.onap.policy.pap.main.startstop.PapCommandLineArguments;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+/**
+ * This class handles reading, parsing and validating of policy pap parameters from JSON files.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class PapParameterHandler {
+    private static final XLogger LOGGER = XLoggerFactory.getXLogger(PapParameterHandler.class);
+
+    /**
+     * Read the parameters from the parameter file.
+     *
+     * @param arguments the arguments passed to policy pap
+     * @return the parameters read from the configuration file
+     * @throws PolicyPapException on parameter exceptions
+     */
+    public PapParameterGroup getParameters(final PapCommandLineArguments arguments) throws PolicyPapException {
+        PapParameterGroup papParameterGroup = null;
+
+        // Read the parameters
+        try {
+            // Read the parameters from JSON using Gson
+            final Gson gson = new GsonBuilder().create();
+            papParameterGroup =
+                    gson.fromJson(new FileReader(arguments.getFullConfigurationFilePath()), PapParameterGroup.class);
+        } catch (final Exception e) {
+            final String errorMessage = "error reading parameters from \"" + arguments.getConfigurationFilePath()
+                    + "\"\n" + "(" + e.getClass().getSimpleName() + "):" + e.getMessage();
+            LOGGER.error(errorMessage, e);
+            throw new PolicyPapException(errorMessage, e);
+        }
+
+        // The JSON processing returns null if there is an empty file
+        if (papParameterGroup == null) {
+            final String errorMessage = "no parameters found in \"" + arguments.getConfigurationFilePath() + "\"";
+            LOGGER.error(errorMessage);
+            throw new PolicyPapException(errorMessage);
+        }
+
+        // validate the parameters
+        final GroupValidationResult validationResult = papParameterGroup.validate();
+        if (!validationResult.isValid()) {
+            String returnMessage =
+                    "validation error(s) on parameters from \"" + arguments.getConfigurationFilePath() + "\"\n";
+            returnMessage += validationResult.getResult();
+
+            LOGGER.error(returnMessage);
+            throw new PolicyPapException(returnMessage);
+        }
+
+        return papParameterGroup;
+    }
+}
diff --git a/main/src/main/java/org/onap/policy/pap/main/startstop/Main.java b/main/src/main/java/org/onap/policy/pap/main/startstop/Main.java
new file mode 100644
index 0000000..63d41a0
--- /dev/null
+++ b/main/src/main/java/org/onap/policy/pap/main/startstop/Main.java
@@ -0,0 +1,143 @@
+/*-
+ * ============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.pap.main.startstop;
+
+import java.util.Arrays;
+
+import org.onap.policy.pap.main.PolicyPapException;
+import org.onap.policy.pap.main.parameters.PapParameterGroup;
+import org.onap.policy.pap.main.parameters.PapParameterHandler;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+/**
+ * This class initiates ONAP Policy Framework PAP component.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class Main {
+    private static final XLogger LOGGER = XLoggerFactory.getXLogger(Main.class);
+
+    private PapActivator activator;
+    private PapParameterGroup parameterGroup;
+
+    /**
+     * Instantiates the policy pap service.
+     *
+     * @param args the command line arguments
+     */
+    public Main(final String[] args) {
+        final String argumentString = Arrays.toString(args);
+        LOGGER.info("Starting policy pap service with arguments - {}", argumentString);
+
+        // Check the arguments
+        final PapCommandLineArguments arguments = new PapCommandLineArguments();
+        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 PolicyPapException e) {
+            LOGGER.error("start of policy pap service failed", e);
+            return;
+        }
+
+        // Read the parameters
+        try {
+            parameterGroup = new PapParameterHandler().getParameters(arguments);
+        } catch (final Exception e) {
+            LOGGER.error("start of policy pap service failed", e);
+            return;
+        }
+
+        // Now, create the activator for the policy pap service
+        activator = new PapActivator(parameterGroup);
+
+        // Start the activator
+        try {
+            activator.initialize();
+        } catch (final PolicyPapException e) {
+            LOGGER.error("start of policy pap service 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 PolicyPapShutdownHookClass());
+        LOGGER.info("Started policy pap service");
+    }
+
+    /**
+     * Get the parameters specified in JSON.
+     *
+     * @return the parameters
+     */
+    public PapParameterGroup getParameters() {
+        return parameterGroup;
+    }
+
+    /**
+     * Shut down Execution.
+     *
+     * @throws PolicyPapException on shutdown errors
+     */
+    public void shutdown() throws PolicyPapException {
+        // clear the parameterGroup variable
+        parameterGroup = null;
+
+        // clear the pap activator
+        if (activator != null) {
+            activator.terminate();
+        }
+    }
+
+    /**
+     * The Class PolicyPapShutdownHookClass terminates the policy pap service when its run method is called.
+     */
+    private class PolicyPapShutdownHookClass extends Thread {
+        /*
+         * (non-Javadoc)
+         *
+         * @see java.lang.Runnable#run()
+         */
+        @Override
+        public void run() {
+            try {
+                // Shutdown the policy pap service and wait for everything to stop
+                activator.terminate();
+            } catch (final PolicyPapException e) {
+                LOGGER.warn("error occured during shut down of the policy pap service", e);
+            }
+        }
+    }
+
+    /**
+     * The main method.
+     *
+     * @param args the arguments
+     */
+    public static void main(final String[] args) {
+        new Main(args);
+    }
+}
diff --git a/main/src/main/java/org/onap/policy/pap/main/startstop/PapActivator.java b/main/src/main/java/org/onap/policy/pap/main/startstop/PapActivator.java
new file mode 100644
index 0000000..8aec2ad
--- /dev/null
+++ b/main/src/main/java/org/onap/policy/pap/main/startstop/PapActivator.java
@@ -0,0 +1,130 @@
+/*-
+ * ============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.pap.main.startstop;
+
+import org.onap.policy.common.parameters.ParameterService;
+import org.onap.policy.pap.main.PolicyPapException;
+import org.onap.policy.pap.main.parameters.PapParameterGroup;
+import org.slf4j.ext.XLogger;
+import org.slf4j.ext.XLoggerFactory;
+
+/**
+ * This class wraps a distributor so that it can be activated as a complete service together with all its pap and
+ * forwarding handlers.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class PapActivator {
+    // The logger for this class
+    private static final XLogger LOGGER = XLoggerFactory.getXLogger(PapActivator.class);
+
+    // The parameters of this policy pap activator
+    private final PapParameterGroup papParameterGroup;
+
+    private static boolean alive = false;
+
+    /**
+     * Instantiate the activator for policy pap as a complete service.
+     *
+     * @param papParameterGroup the parameters for the pap service
+     */
+    public PapActivator(final PapParameterGroup papParameterGroup) {
+        this.papParameterGroup = papParameterGroup;
+    }
+
+    /**
+     * Initialize pap as a complete service.
+     *
+     * @throws PolicyPapException on errors in initializing the service
+     */
+    public void initialize() throws PolicyPapException {
+        try {
+            LOGGER.debug("Policy pap starting as a service . . .");
+            registerToParameterService(papParameterGroup);
+            PapActivator.setAlive(true);
+            LOGGER.debug("Policy pap started as a service");
+        } catch (final Exception exp) {
+            LOGGER.error("Policy pap service startup failed", exp);
+            throw new PolicyPapException(exp.getMessage(), exp);
+        }
+    }
+
+    /**
+     * Terminate policy pap.
+     *
+     * @throws PolicyPapException on errors in terminating the service
+     */
+    public void terminate() throws PolicyPapException {
+        try {
+            deregisterToParameterService(papParameterGroup);
+            PapActivator.setAlive(false);
+
+        } catch (final Exception exp) {
+            LOGGER.error("Policy pap service termination failed", exp);
+            throw new PolicyPapException(exp.getMessage(), exp);
+        }
+    }
+
+    /**
+     * Get the parameters used by the activator.
+     *
+     * @return the parameters of the activator
+     */
+    public PapParameterGroup getParameterGroup() {
+        return papParameterGroup;
+    }
+
+    /**
+     * Method to register the parameters to Common Parameter Service.
+     *
+     * @param papParameterGroup the pap parameter group
+     */
+    public void registerToParameterService(final PapParameterGroup papParameterGroup) {
+        ParameterService.register(papParameterGroup);
+    }
+
+    /**
+     * Method to deregister the parameters from Common Parameter Service.
+     *
+     * @param papParameterGroup the pap parameter group
+     */
+    public void deregisterToParameterService(final PapParameterGroup papParameterGroup) {
+        ParameterService.deregister(papParameterGroup.getName());
+    }
+
+    /**
+     * Returns the alive status of pap service.
+     *
+     * @return the alive
+     */
+    public static boolean isAlive() {
+        return alive;
+    }
+
+    /**
+     * Change the alive status of pap service.
+     *
+     * @param status the status
+     */
+    public static void setAlive(final boolean status) {
+        alive = status;
+    }
+}
diff --git a/main/src/main/java/org/onap/policy/pap/main/startstop/PapCommandLineArguments.java b/main/src/main/java/org/onap/policy/pap/main/startstop/PapCommandLineArguments.java
new file mode 100644
index 0000000..4b8bc34
--- /dev/null
+++ b/main/src/main/java/org/onap/policy/pap/main/startstop/PapCommandLineArguments.java
@@ -0,0 +1,244 @@
+/*-
+ * ============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.pap.main.startstop;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.Arrays;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.pap.main.PolicyPapException;
+import org.onap.policy.pap.main.PolicyPapRuntimeException;
+
+
+/**
+ * This class reads and handles command line parameters for the policy pap service.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class PapCommandLineArguments {
+    private static final String FILE_MESSAGE_PREAMBLE = " file \"";
+    private static final int HELP_LINE_LENGTH = 120;
+
+    private final Options options;
+    private String configurationFilePath = null;
+
+    /**
+     * Construct the options for the CLI editor.
+     */
+    public PapCommandLineArguments() {
+        //@formatter:off
+        options = new Options();
+        options.addOption(Option.builder("h")
+                .longOpt("help")
+                .desc("outputs the usage of this command")
+                .required(false)
+                .type(Boolean.class)
+                .build());
+        options.addOption(Option.builder("v")
+                .longOpt("version")
+                .desc("outputs the version of policy pap")
+                .required(false)
+                .type(Boolean.class)
+                .build());
+        options.addOption(Option.builder("c")
+                .longOpt("config-file")
+                .desc("the full path to the configuration file to use, "
+                        + "the configuration file must be a Json file containing the policy pap parameters")
+                .hasArg()
+                .argName("CONFIG_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 PapCommandLineArguments(final String[] args) {
+        // Set up the options with the default constructor
+        this();
+
+        // Parse the arguments
+        try {
+            parse(args);
+        } catch (final PolicyPapException e) {
+            throw new PolicyPapRuntimeException("parse error on policy pap 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 PolicyPapException on command argument errors
+     */
+    public String parse(final String[] args) throws PolicyPapException {
+        // Clear all our arguments
+        setConfigurationFilePath(null);
+
+        CommandLine commandLine = null;
+        try {
+            commandLine = new DefaultParser().parse(options, args);
+        } catch (final ParseException e) {
+            throw new PolicyPapException("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 PolicyPapException("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'));
+        }
+
+        return null;
+    }
+
+    /**
+     * Validate the command line options.
+     *
+     * @throws PolicyPapException on command argument validation errors
+     */
+    public void validate() throws PolicyPapException {
+        validateReadableFile("policy pap configuration", configurationFilePath);
+    }
+
+    /**
+     * Print version information for policy pap.
+     *
+     * @return the version string
+     */
+    public String version() {
+        return ResourceUtils.getResourceAsString("version.txt");
+    }
+
+    /**
+     * Print help information for policy pap.
+     *
+     * @param mainClassName the main class name
+     * @return the help string
+     */
+    public String help(final String mainClassName) {
+        final HelpFormatter helpFormatter = new HelpFormatter();
+        final StringWriter stringWriter = new StringWriter();
+        final PrintWriter printWriter = new PrintWriter(stringWriter);
+
+        helpFormatter.printHelp(printWriter, HELP_LINE_LENGTH, mainClassName + " [options...]", "options", options, 0,
+                0, "");
+
+        return stringWriter.toString();
+    }
+
+    /**
+     * Gets the configuration file path.
+     *
+     * @return the configuration file path
+     */
+    public String getConfigurationFilePath() {
+        return configurationFilePath;
+    }
+
+    /**
+     * Gets the full expanded configuration file path.
+     *
+     * @return the configuration file path
+     */
+    public String getFullConfigurationFilePath() {
+        return ResourceUtils.getFilePath4Resource(getConfigurationFilePath());
+    }
+
+    /**
+     * Sets the configuration file path.
+     *
+     * @param configurationFilePath the configuration file path
+     */
+    public void setConfigurationFilePath(final String configurationFilePath) {
+        this.configurationFilePath = configurationFilePath;
+
+    }
+
+    /**
+     * Check set configuration file path.
+     *
+     * @return true, if check set configuration file path
+     */
+    public boolean checkSetConfigurationFilePath() {
+        return configurationFilePath != null && configurationFilePath.length() > 0;
+    }
+
+    /**
+     * Validate readable file.
+     *
+     * @param fileTag the file tag
+     * @param fileName the file name
+     * @throws PolicyPapException on the file name passed as a parameter
+     */
+    private void validateReadableFile(final String fileTag, final String fileName) throws PolicyPapException {
+        if (fileName == null || fileName.length() == 0) {
+            throw new PolicyPapException(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 PolicyPapException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
+        }
+
+        final File theFile = new File(fileUrl.getPath());
+        if (!theFile.exists()) {
+            throw new PolicyPapException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
+        }
+        if (!theFile.isFile()) {
+            throw new PolicyPapException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is not a normal file");
+        }
+        if (!theFile.canRead()) {
+            throw new PolicyPapException(fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is ureadable");
+        }
+    }
+}
diff --git a/main/src/main/resources/version.txt b/main/src/main/resources/version.txt
new file mode 100644
index 0000000..c691f9e
--- /dev/null
+++ b/main/src/main/resources/version.txt
@@ -0,0 +1,4 @@
+ONAP Policy Framework PAP Service
+Version: ${project.version}
+Built (UTC): ${maven.build.timestamp}
+ONAP https://wiki.onap.org
\ No newline at end of file
diff --git a/main/src/test/java/org/onap/policy/pap/main/TestExceptions.java b/main/src/test/java/org/onap/policy/pap/main/TestExceptions.java
new file mode 100644
index 0000000..b45cdab
--- /dev/null
+++ b/main/src/test/java/org/onap/policy/pap/main/TestExceptions.java
@@ -0,0 +1,44 @@
+/*-
+ * ============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.pap.main;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+/**
+ * Class to perform unit test of {@link PolicyPapException PolicyPapRuntimeException}}.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class TestExceptions {
+
+    @Test
+    public void test() {
+        assertNotNull(new PolicyPapException("Message"));
+        assertNotNull(new PolicyPapException("Message", new IOException()));
+
+        assertNotNull(new PolicyPapRuntimeException("Message"));
+        assertNotNull(new PolicyPapRuntimeException("Message", new IOException()));
+    }
+}
diff --git a/main/src/test/java/org/onap/policy/pap/main/parameters/CommonTestData.java b/main/src/test/java/org/onap/policy/pap/main/parameters/CommonTestData.java
new file mode 100644
index 0000000..5e62ba6
--- /dev/null
+++ b/main/src/test/java/org/onap/policy/pap/main/parameters/CommonTestData.java
@@ -0,0 +1,32 @@
+/*-
+ * ============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.pap.main.parameters;
+
+/**
+ * Class to hold/create all parameters for test cases.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class CommonTestData {
+
+    public static final String PAP_GROUP_NAME = "PapGroup";
+
+}
diff --git a/main/src/test/java/org/onap/policy/pap/main/parameters/TestPapParameterGroup.java b/main/src/test/java/org/onap/policy/pap/main/parameters/TestPapParameterGroup.java
new file mode 100644
index 0000000..086d7c2
--- /dev/null
+++ b/main/src/test/java/org/onap/policy/pap/main/parameters/TestPapParameterGroup.java
@@ -0,0 +1,73 @@
+/*-
+ * ============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.pap.main.parameters;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.onap.policy.common.parameters.GroupValidationResult;
+
+/**
+ * Class to perform unit test of {@link PapParameterGroup}.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class TestPapParameterGroup {
+
+    @Test
+    public void testPapParameterGroup() {
+        final PapParameterGroup papParameters = new PapParameterGroup(CommonTestData.PAP_GROUP_NAME);
+        final GroupValidationResult validationResult = papParameters.validate();
+        assertTrue(validationResult.isValid());
+        assertEquals(CommonTestData.PAP_GROUP_NAME, papParameters.getName());
+    }
+
+    @Test
+    public void testPapParameterGroup_NullName() {
+        final PapParameterGroup papParameters = new PapParameterGroup(null);
+        final GroupValidationResult validationResult = papParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertEquals(null, papParameters.getName());
+        assertTrue(validationResult.getResult().contains(
+                "field \"name\" type \"java.lang.String\" value \"null\" INVALID, " + "must be a non-blank string"));
+    }
+
+    @Test
+    public void testPapParameterGroup_EmptyName() {
+        final PapParameterGroup papParameters = new PapParameterGroup("");
+        final GroupValidationResult validationResult = papParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertEquals("", papParameters.getName());
+        assertTrue(validationResult.getResult().contains(
+                "field \"name\" type \"java.lang.String\" value \"\" INVALID, " + "must be a non-blank string"));
+    }
+
+    @Test
+    public void testPapParameterGroup_SetName() {
+        final PapParameterGroup papParameters = new PapParameterGroup(CommonTestData.PAP_GROUP_NAME);
+        papParameters.setName("PapNewGroup");
+        final GroupValidationResult validationResult = papParameters.validate();
+        assertTrue(validationResult.isValid());
+        assertEquals("PapNewGroup", papParameters.getName());
+    }
+}
diff --git a/main/src/test/java/org/onap/policy/pap/main/parameters/TestPapParameterHandler.java b/main/src/test/java/org/onap/policy/pap/main/parameters/TestPapParameterHandler.java
new file mode 100644
index 0000000..cb14748
--- /dev/null
+++ b/main/src/test/java/org/onap/policy/pap/main/parameters/TestPapParameterHandler.java
@@ -0,0 +1,166 @@
+/*-
+ * ============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.pap.main.parameters;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+import org.onap.policy.pap.main.PolicyPapException;
+import org.onap.policy.pap.main.startstop.PapCommandLineArguments;
+
+/**
+ * Class to perform unit test of {@link PapParameterHandler}.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class TestPapParameterHandler {
+
+    @Test
+    public void testParameterHandlerNoParameterFile() throws PolicyPapException {
+        final String[] noArgumentString = { "-c", "parameters/NoParameterFile.json" };
+
+        final PapCommandLineArguments noArguments = new PapCommandLineArguments();
+        noArguments.parse(noArgumentString);
+
+        try {
+            new PapParameterHandler().getParameters(noArguments);
+            fail("test should throw an exception here");
+        } catch (final Exception e) {
+            assertTrue(e.getMessage().contains("FileNotFoundException"));
+        }
+    }
+
+    @Test
+    public void testParameterHandlerEmptyParameters() throws PolicyPapException {
+        final String[] emptyArgumentString = { "-c", "parameters/EmptyParameters.json" };
+
+        final PapCommandLineArguments emptyArguments = new PapCommandLineArguments();
+        emptyArguments.parse(emptyArgumentString);
+
+        try {
+            new PapParameterHandler().getParameters(emptyArguments);
+            fail("test should throw an exception here");
+        } catch (final Exception e) {
+            assertEquals("no parameters found in \"parameters/EmptyParameters.json\"", e.getMessage());
+        }
+    }
+
+    @Test
+    public void testParameterHandlerInvalidParameters() throws PolicyPapException {
+        final String[] invalidArgumentString = { "-c", "parameters/InvalidParameters.json" };
+
+        final PapCommandLineArguments invalidArguments = new PapCommandLineArguments();
+        invalidArguments.parse(invalidArgumentString);
+
+        try {
+            new PapParameterHandler().getParameters(invalidArguments);
+            fail("test should throw an exception here");
+        } catch (final Exception e) {
+            assertEquals("error reading parameters from \"parameters/InvalidParameters.json\"\n"
+                    + "(JsonSyntaxException):java.lang.IllegalStateException: "
+                    + "Expected a string but was BEGIN_ARRAY at line 2 column 15 path $.name", e.getMessage());
+        }
+    }
+
+    @Test
+    public void testParameterHandlerNoParameters() throws PolicyPapException {
+        final String[] noArgumentString = { "-c", "parameters/NoParameters.json" };
+
+        final PapCommandLineArguments noArguments = new PapCommandLineArguments();
+        noArguments.parse(noArgumentString);
+
+        try {
+            new PapParameterHandler().getParameters(noArguments);
+            fail("test should throw an exception here");
+        } catch (final Exception e) {
+            assertTrue(e.getMessage().contains(
+                    "field \"name\" type \"java.lang.String\" value \"null\" INVALID, must be a non-blank string"));
+        }
+    }
+
+    @Test
+    public void testParameterHandlerMinumumParameters() throws PolicyPapException {
+        final String[] minArgumentString = { "-c", "parameters/MinimumParameters.json" };
+
+        final PapCommandLineArguments minArguments = new PapCommandLineArguments();
+        minArguments.parse(minArgumentString);
+
+        final PapParameterGroup parGroup = new PapParameterHandler().getParameters(minArguments);
+        assertEquals(CommonTestData.PAP_GROUP_NAME, parGroup.getName());
+    }
+
+    @Test
+    public void testPapParameterGroup() throws PolicyPapException {
+        final String[] papConfigParameters = { "-c", "parameters/PapConfigParameters.json" };
+
+        final PapCommandLineArguments arguments = new PapCommandLineArguments();
+        arguments.parse(papConfigParameters);
+
+        final PapParameterGroup parGroup = new PapParameterHandler().getParameters(arguments);
+        assertTrue(arguments.checkSetConfigurationFilePath());
+        assertEquals(CommonTestData.PAP_GROUP_NAME, parGroup.getName());
+    }
+
+    @Test
+    public void testPapParameterGroup_InvalidName() throws PolicyPapException {
+        final String[] papConfigParameters = { "-c", "parameters/PapConfigParameters_InvalidName.json" };
+
+        final PapCommandLineArguments arguments = new PapCommandLineArguments();
+        arguments.parse(papConfigParameters);
+
+        try {
+            new PapParameterHandler().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 testPapVersion() throws PolicyPapException {
+        final String[] papConfigParameters = { "-v" };
+        final PapCommandLineArguments arguments = new PapCommandLineArguments();
+        final String version = arguments.parse(papConfigParameters);
+        assertTrue(version.startsWith("ONAP Policy Framework PAP Service"));
+    }
+
+    @Test
+    public void testPapHelp() throws PolicyPapException {
+        final String[] papConfigParameters = { "-h" };
+        final PapCommandLineArguments arguments = new PapCommandLineArguments();
+        final String help = arguments.parse(papConfigParameters);
+        assertTrue(help.startsWith("usage:"));
+    }
+
+    @Test
+    public void testPapInvalidOption() throws PolicyPapException {
+        final String[] papConfigParameters = { "-d" };
+        final PapCommandLineArguments arguments = new PapCommandLineArguments();
+        try {
+            arguments.parse(papConfigParameters);
+        } catch (final Exception exp) {
+            assertTrue(exp.getMessage().startsWith("invalid command line arguments specified"));
+        }
+    }
+}
diff --git a/main/src/test/java/org/onap/policy/pap/main/startstop/TestMain.java b/main/src/test/java/org/onap/policy/pap/main/startstop/TestMain.java
new file mode 100644
index 0000000..8bc544b
--- /dev/null
+++ b/main/src/test/java/org/onap/policy/pap/main/startstop/TestMain.java
@@ -0,0 +1,72 @@
+/*-
+ * ============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.pap.main.startstop;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.onap.policy.pap.main.PolicyPapException;
+import org.onap.policy.pap.main.parameters.CommonTestData;
+
+/**
+ * Class to perform unit test of {@link Main}}.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class TestMain {
+
+    @Test
+    public void testMain() throws PolicyPapException {
+        final String[] papConfigParameters = { "-c", "parameters/PapConfigParameters.json" };
+        final Main main = new Main(papConfigParameters);
+        assertTrue(main.getParameters().isValid());
+        assertEquals(CommonTestData.PAP_GROUP_NAME, main.getParameters().getName());
+        main.shutdown();
+    }
+
+    @Test
+    public void testMain_NoArguments() {
+        final String[] papConfigParameters = {};
+        final Main main = new Main(papConfigParameters);
+        assertTrue(main.getParameters() == null);
+    }
+
+    @Test
+    public void testMain_InvalidArguments() {
+        final String[] papConfigParameters = { "parameters/PapConfigParameters.json" };
+        final Main main = new Main(papConfigParameters);
+        assertTrue(main.getParameters() == null);
+    }
+
+    @Test
+    public void testMain_Help() {
+        final String[] papConfigParameters = { "-h" };
+        Main.main(papConfigParameters);
+    }
+
+    @Test
+    public void testMain_InvalidParameters() {
+        final String[] papConfigParameters = { "-c", "parameters/PapConfigParameters_InvalidName.json" };
+        final Main main = new Main(papConfigParameters);
+        assertTrue(main.getParameters() == null);
+    }
+}
diff --git a/main/src/test/java/org/onap/policy/pap/main/startstop/TestPapActivator.java b/main/src/test/java/org/onap/policy/pap/main/startstop/TestPapActivator.java
new file mode 100644
index 0000000..03c3413
--- /dev/null
+++ b/main/src/test/java/org/onap/policy/pap/main/startstop/TestPapActivator.java
@@ -0,0 +1,54 @@
+/*-
+ * ============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.pap.main.startstop;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.onap.policy.pap.main.PolicyPapException;
+import org.onap.policy.pap.main.parameters.CommonTestData;
+import org.onap.policy.pap.main.parameters.PapParameterGroup;
+import org.onap.policy.pap.main.parameters.PapParameterHandler;
+
+
+/**
+ * Class to perform unit test of {@link PapActivator}}.
+ *
+ * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
+ */
+public class TestPapActivator {
+
+    @Test
+    public void testPapActivator() throws PolicyPapException {
+        final String[] papConfigParameters = { "-c", "parameters/PapConfigParameters.json" };
+
+        final PapCommandLineArguments arguments = new PapCommandLineArguments(papConfigParameters);
+
+        final PapParameterGroup parGroup = new PapParameterHandler().getParameters(arguments);
+
+        final PapActivator activator = new PapActivator(parGroup);
+        activator.initialize();
+        assertTrue(activator.getParameterGroup().isValid());
+        assertEquals(CommonTestData.PAP_GROUP_NAME, activator.getParameterGroup().getName());
+        activator.terminate();
+    }
+}
diff --git a/main/src/test/resources/parameters/EmptyParameters.json b/main/src/test/resources/parameters/EmptyParameters.json
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/main/src/test/resources/parameters/EmptyParameters.json
diff --git a/main/src/test/resources/parameters/InvalidParameters.json b/main/src/test/resources/parameters/InvalidParameters.json
new file mode 100644
index 0000000..de2040c
--- /dev/null
+++ b/main/src/test/resources/parameters/InvalidParameters.json
@@ -0,0 +1,3 @@
+{
+    "name" : []
+}
\ No newline at end of file
diff --git a/main/src/test/resources/parameters/MinimumParameters.json b/main/src/test/resources/parameters/MinimumParameters.json
new file mode 100644
index 0000000..ec79d58
--- /dev/null
+++ b/main/src/test/resources/parameters/MinimumParameters.json
@@ -0,0 +1,3 @@
+{  
+    "name":"PapGroup"
+}
diff --git a/main/src/test/resources/parameters/NoParameters.json b/main/src/test/resources/parameters/NoParameters.json
new file mode 100644
index 0000000..7a73a41
--- /dev/null
+++ b/main/src/test/resources/parameters/NoParameters.json
@@ -0,0 +1,2 @@
+{
+}
\ No newline at end of file
diff --git a/main/src/test/resources/parameters/PapConfigParameters.json b/main/src/test/resources/parameters/PapConfigParameters.json
new file mode 100644
index 0000000..88d0051
--- /dev/null
+++ b/main/src/test/resources/parameters/PapConfigParameters.json
@@ -0,0 +1,3 @@
+{
+    "name":"PapGroup"
+}
diff --git a/main/src/test/resources/parameters/PapConfigParameters_InvalidName.json b/main/src/test/resources/parameters/PapConfigParameters_InvalidName.json
new file mode 100644
index 0000000..1a466d0
--- /dev/null
+++ b/main/src/test/resources/parameters/PapConfigParameters_InvalidName.json
@@ -0,0 +1,3 @@
+{
+    "name":" "
+}