Add Java property parameters for HTTPS 39/74839/1
authorliamfallon <liam.fallon@est.tech>
Tue, 18 Dec 2018 17:18:45 +0000 (17:18 +0000)
committerliamfallon <liam.fallon@est.tech>
Tue, 18 Dec 2018 17:18:53 +0000 (17:18 +0000)
Issue-ID: POLICY-1222
Change-Id: I4a683cf2f52e7f1d28164954f84d0744b5ca7e9c
Signed-off-by: liamfallon <liam.fallon@est.tech>
13 files changed:
plugins/plugins-event/plugins-event-carrier/plugins-event-carrier-restclient/src/main/java/org/onap/policy/apex/plugins/event/carrier/restclient/RestClientCarrierTechnologyParameters.java
services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java
services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameters.java
services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java [new file with mode: 0644]
services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/ApexParametersTest.java [new file with mode: 0644]
services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyStateFinalizerExecutor.java [new file with mode: 0644]
services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskExecutor.java [new file with mode: 0644]
services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskSelectExecutor.java [new file with mode: 0644]
services/services-engine/src/test/resources/parameters/correctParams.json [new file with mode: 0644]
services/services-engine/src/test/resources/parameters/correctParamsJavaProperties.json [new file with mode: 0644]
services/services-engine/src/test/resources/parameters/javaPropertiesBad.json [new file with mode: 0644]
services/services-engine/src/test/resources/parameters/javaPropertiesEmpty.json [new file with mode: 0644]
services/services-engine/src/test/resources/parameters/javaPropertiesOK.json [new file with mode: 0644]

index 2b15b14..3b20d3d 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.policy.apex.service.engine.main;
 
 import java.util.Arrays;
+import java.util.Base64;
 import java.util.Map.Entry;
 
 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
@@ -77,15 +78,18 @@ public class ApexMain {
             return;
         }
 
+        // Set incoming Java properties
+        setJavaProperties(parameters);
+
         // Set the name of the event handler parameters for producers and consumers
         for (final Entry<String, EventHandlerParameters> ehParameterEntry : parameters.getEventOutputParameters()
-                .entrySet()) {
+            .entrySet()) {
             if (!ehParameterEntry.getValue().checkSetName()) {
                 ehParameterEntry.getValue().setName(ehParameterEntry.getKey());
             }
         }
         for (final Entry<String, EventHandlerParameters> ehParameterEntry : parameters.getEventInputParameters()
-                .entrySet()) {
+            .entrySet()) {
             if (!ehParameterEntry.getValue().checkSetName()) {
                 ehParameterEntry.getValue().setName(ehParameterEntry.getKey());
             }
@@ -128,8 +132,8 @@ public class ApexMain {
     }
 
     /**
-     * The Class ApexMainShutdownHookClass terminates the Apex engine for the Apex service when its
-     * run method is called.
+     * The Class ApexMainShutdownHookClass terminates the Apex engine for the Apex service when its run method is
+     * called.
      */
     private class ApexMainShutdownHookClass extends Thread {
         /*
@@ -148,6 +152,31 @@ public class ApexMain {
         }
     }
 
+    /**
+     * Set the Java properties specified in the parameters.
+     *
+     * @param parameters The incoming parameters
+     */
+    private void setJavaProperties(final ApexParameters parameters) {
+        if (!parameters.checkJavaPropertiesSet()) {
+            return;
+        }
+
+        // Set each Java property
+        for (String[] javaProperty : parameters.getJavaProperties()) {
+            String javaPropertyName = javaProperty[0];
+            String javaPropertyValue = javaProperty[1];
+
+            // Passwords are encoded using base64, better than sending passwords in the clear
+            if (javaPropertyName.toLowerCase().contains("password")) {
+                javaPropertyValue = new String(Base64.getDecoder().decode(javaPropertyValue.getBytes()));
+            }
+
+            // Set the Java property
+            System.setProperty(javaPropertyName, javaPropertyValue);
+        }
+    }
+
     /**
      * The main method.
      *
index 4bbc5fc..07cf781 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.apex.service.parameters;
 
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -33,6 +34,7 @@ import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerPeeredMo
 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;
 
 /**
  * The main container parameter class for an Apex service.
@@ -50,11 +52,15 @@ public class ApexParameters implements ParameterGroup {
     private String name;
 
     // Constants for recurring strings
+    private static final String JAVA_PROPERTIES = "javaProperties";
     private static final String PEER_STRING = "peer ";
     private static final String EVENT_INPUT_PARAMETERS_STRING = "eventInputParameters";
     private static final String EVENT_OUTPUT_PARAMETERS_STRING = "eventOutputParameters";
     private static final String FOR_PEERED_MODE_STRING = " for peered mode ";
 
+    // Properties for the Java JVM
+    private String[][] javaProperties = null;
+
     // Parameters for the engine service and the engine threads in the engine service
     private EngineServiceParameters engineServiceParameters;
 
@@ -138,13 +144,33 @@ public class ApexParameters implements ParameterGroup {
         this.name = name;
     }
 
+    /**
+     * Check if Java properties have been specified.
+     *
+     * @return true if Java properties have been specified
+     */
+    public boolean checkJavaPropertiesSet() {
+        return javaProperties != null && javaProperties.length > 0;
+    }
+
+    /**
+     * Gets the Java properties that have been specified.
+     *
+     * @return the Java properties that have been specified
+     */
+    public String[][] getJavaProperties() {
+        return javaProperties;
+    }
+
     @Override
     public GroupValidationResult validate() {
         GroupValidationResult result = new GroupValidationResult(this);
 
+        validateJavaProperties(result);
+
         if (engineServiceParameters == null) {
             result.setResult("engineServiceParameters", ValidationStatus.INVALID,
-                            "engine service parameters are not specified");
+                "engine service parameters are not specified");
         } else {
             result.setResult("engineServiceParameters", engineServiceParameters.validate());
         }
@@ -152,12 +178,12 @@ public class ApexParameters implements ParameterGroup {
         // Sanity check, we must have an entry in both output and input maps
         if (eventInputParameters.isEmpty()) {
             result.setResult(EVENT_INPUT_PARAMETERS_STRING, ValidationStatus.INVALID,
-                            "at least one event input must be specified");
+                "at least one event input must be specified");
         }
 
         if (eventOutputParameters.isEmpty()) {
             result.setResult(EVENT_OUTPUT_PARAMETERS_STRING, ValidationStatus.INVALID,
-                            "at least one event output must be specified");
+                "at least one event output must be specified");
         }
 
         // Validate that the values of all parameters are ok
@@ -174,6 +200,37 @@ public class ApexParameters implements ParameterGroup {
         return result;
     }
 
+    /**
+     * This method validates the java properties variable if it is present.
+     *
+     * @param result the result of the validation
+     */
+    private void validateJavaProperties(GroupValidationResult result) {
+        if (javaProperties == null) {
+            return;
+        }
+
+        StringBuilder errorMessageBuilder = new StringBuilder();
+        for (String[] javaProperty : javaProperties) {
+            if (javaProperty == null) {
+                errorMessageBuilder.append("java properties array entry is null\n");
+            } else if (javaProperty.length != 2) {
+                errorMessageBuilder.append("java properties array entries must have one key and one value: "
+                    + Arrays.deepToString(javaProperty) + "\n");
+            } else if (!ParameterValidationUtils.validateStringParameter(javaProperty[0])) {
+                errorMessageBuilder
+                    .append("java properties key is null or blank: " + Arrays.deepToString(javaProperty) + "\n");
+            } else if (!ParameterValidationUtils.validateStringParameter(javaProperty[1])) {
+                errorMessageBuilder
+                    .append("java properties value is null or blank: " + Arrays.deepToString(javaProperty) + "\n");
+            }
+        }
+
+        if (errorMessageBuilder.length() > 0) {
+            result.setResult(JAVA_PROPERTIES, ValidationStatus.INVALID, errorMessageBuilder.toString());
+        }
+    }
+
     /**
      * This method validates the parameters in an event handler map.
      * 
@@ -182,15 +239,15 @@ public class ApexParameters implements ParameterGroup {
      * @param parsForValidation The event handler parameters to validate (input or output)
      */
     private void validateEventHandlerMap(final String eventHandlerType, final GroupValidationResult result,
-                    final Map<String, EventHandlerParameters> parsForValidation) {
+        final Map<String, EventHandlerParameters> parsForValidation) {
         for (final Entry<String, EventHandlerParameters> parameterEntry : parsForValidation.entrySet()) {
             if (parameterEntry.getKey() == null || parameterEntry.getKey().trim().isEmpty()) {
                 result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID,
-                                "invalid " + eventHandlerType + " name \"" + parameterEntry.getKey() + "\"");
+                    "invalid " + eventHandlerType + " name \"" + parameterEntry.getKey() + "\"");
             } else if (parameterEntry.getValue() == null) {
                 result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID,
-                                "invalid/Null event input prameters specified for " + eventHandlerType + " name \""
-                                                + parameterEntry.getKey() + "\" ");
+                    "invalid/Null event input prameters specified for " + eventHandlerType + " name \""
+                        + parameterEntry.getKey() + "\" ");
             } else {
                 result.setResult(eventHandlerType, parameterEntry.getKey(), parameterEntry.getValue().validate());
             }
@@ -213,30 +270,28 @@ public class ApexParameters implements ParameterGroup {
      * @param peeredMode The mode to check
      */
     private void validatePeeredModeParameters(final String eventHandlerType, final GroupValidationResult result,
-                    final Entry<String, EventHandlerParameters> parameterEntry,
-                    final EventHandlerPeeredMode peeredMode) {
+        final Entry<String, EventHandlerParameters> parameterEntry, final EventHandlerPeeredMode peeredMode) {
         final String messagePreamble = "specified peered mode \"" + peeredMode + "\"";
         final String peer = parameterEntry.getValue().getPeer(peeredMode);
 
         if (parameterEntry.getValue().isPeeredMode(peeredMode)) {
             if (peer == null || peer.trim().isEmpty()) {
                 result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID,
-                                messagePreamble + " mandatory parameter not specified or is null");
+                    messagePreamble + " mandatory parameter not specified or is null");
             }
             if (parameterEntry.getValue().getPeerTimeout(peeredMode) < 0) {
-                result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, messagePreamble
-                                + " timeout value \"" + parameterEntry.getValue().getPeerTimeout(peeredMode)
-                                + "\" is illegal, specify a non-negative timeout value in milliseconds");
+                result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID,
+                    messagePreamble + " timeout value \"" + parameterEntry.getValue().getPeerTimeout(peeredMode)
+                        + "\" is illegal, specify a non-negative timeout value in milliseconds");
             }
         } else {
             if (peer != null) {
                 result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, messagePreamble
-                                + " peer is illegal on " + eventHandlerType + " \"" + parameterEntry.getKey() + "\" ");
+                    + " peer is illegal on " + eventHandlerType + " \"" + parameterEntry.getKey() + "\" ");
             }
             if (parameterEntry.getValue().getPeerTimeout(peeredMode) != 0) {
-                result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID,
-                                messagePreamble + " timeout is illegal on " + eventHandlerType + " \""
-                                                + parameterEntry.getKey() + "\"");
+                result.setResult(eventHandlerType, parameterEntry.getKey(), ValidationStatus.INVALID, messagePreamble
+                    + " timeout is illegal on " + eventHandlerType + " \"" + parameterEntry.getKey() + "\"");
             }
         }
     }
@@ -266,9 +321,9 @@ public class ApexParameters implements ParameterGroup {
 
         // Validate the parameters for each side of the peered mode parameters
         validatePeeredModePeers(EVENT_INPUT_PARAMETERS_STRING, result, peeredMode, inputParametersUsingMode,
-                        outputParametersUsingMode);
+            outputParametersUsingMode);
         validatePeeredModePeers(EVENT_OUTPUT_PARAMETERS_STRING, result, peeredMode, outputParametersUsingMode,
-                        inputParametersUsingMode);
+            inputParametersUsingMode);
     }
 
     /**
@@ -280,9 +335,8 @@ public class ApexParameters implements ParameterGroup {
      * @param rightModeParameters The mode parameters being referenced by the checked parameters
      */
     private void validatePeeredModePeers(final String handlerMapVariableName, final GroupValidationResult result,
-                    final EventHandlerPeeredMode peeredMode,
-                    final Map<String, EventHandlerParameters> leftModeParameterMap,
-                    final Map<String, EventHandlerParameters> rightModeParameterMap) {
+        final EventHandlerPeeredMode peeredMode, final Map<String, EventHandlerParameters> leftModeParameterMap,
+        final Map<String, EventHandlerParameters> rightModeParameterMap) {
 
         // These sets are used to check for duplicate references on the both sides
         final Set<String> leftCheckDuplicateSet = new HashSet<>();
@@ -299,9 +353,8 @@ public class ApexParameters implements ParameterGroup {
             // Check that the peer reference is OK
             if (rightModeParameters == null) {
                 result.setResult(handlerMapVariableName, leftModeParameterEntry.getKey(), ValidationStatus.INVALID,
-                                PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING
-                                                + peeredMode
-                                                + " does not exist or is not defined with the same peered mode");
+                    PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING + peeredMode
+                        + " does not exist or is not defined with the same peered mode");
                 continue;
             }
 
@@ -309,36 +362,32 @@ public class ApexParameters implements ParameterGroup {
             final String rightSidePeer = rightModeParameters.getPeer(peeredMode);
             if (!rightSidePeer.equals(leftModeParameterEntry.getKey())) {
                 result.setResult(handlerMapVariableName, leftModeParameterEntry.getKey(), ValidationStatus.INVALID,
-                                PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING
-                                                + peeredMode + ", value \"" + rightSidePeer + "\" on peer \""
-                                                + leftSidePeer + "\" does not equal event handler \""
-                                                + leftModeParameterEntry.getKey() + "\"");
+                    PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING + peeredMode
+                        + ", value \"" + rightSidePeer + "\" on peer \"" + leftSidePeer
+                        + "\" does not equal event handler \"" + leftModeParameterEntry.getKey() + "\"");
             } else {
                 // Check for duplicates
                 if (!leftCheckDuplicateSet.add(leftSidePeer)) {
                     result.setResult(handlerMapVariableName, leftModeParameterEntry.getKey(), ValidationStatus.INVALID,
-                                    PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING
-                                                    + peeredMode + ", peer value \"" + leftSidePeer
-                                                    + "\" on event handler \"" + leftModeParameterEntry.getKey()
-                                                    + "\" is used more than once");
+                        PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING + peeredMode
+                            + ", peer value \"" + leftSidePeer + "\" on event handler \""
+                            + leftModeParameterEntry.getKey() + "\" is used more than once");
                 }
                 if (!rightCheckDuplicateSet.add(rightSidePeer)) {
                     result.setResult(handlerMapVariableName, leftModeParameterEntry.getKey(), ValidationStatus.INVALID,
-                                    PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING
-                                                    + peeredMode + ", peer value \"" + rightSidePeer + "\" on peer \""
-                                                    + leftSidePeer + "\" on event handler \""
-                                                    + leftModeParameterEntry.getKey() + "\" is used more than once");
+                        PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING + peeredMode
+                            + ", peer value \"" + rightSidePeer + "\" on peer \"" + leftSidePeer
+                            + "\" on event handler \"" + leftModeParameterEntry.getKey() + "\" is used more than once");
                 }
             }
 
             if (!crossCheckPeeredTimeoutValues(leftModeParameters, rightModeParameters, peeredMode)) {
                 result.setResult(handlerMapVariableName, leftModeParameterEntry.getKey(), ValidationStatus.INVALID,
-                                PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING
-                                                + peeredMode + " timeout "
-                                                + leftModeParameters.getPeerTimeout(peeredMode) + " on event handler \""
-                                                + leftModeParameters.getName() + "\" does not equal timeout "
-                                                + rightModeParameters.getPeerTimeout(peeredMode)
-                                                + " on event handler \"" + rightModeParameters.getName() + "\"");
+                    PEER_STRING + '"' + leftModeParameters.getPeer(peeredMode) + FOR_PEERED_MODE_STRING + peeredMode
+                        + " timeout " + leftModeParameters.getPeerTimeout(peeredMode) + " on event handler \""
+                        + leftModeParameters.getName() + "\" does not equal timeout "
+                        + rightModeParameters.getPeerTimeout(peeredMode) + " on event handler \""
+                        + rightModeParameters.getName() + "\"");
 
             }
         }
@@ -352,7 +401,7 @@ public class ApexParameters implements ParameterGroup {
      * @return true if the timeout values are cross checked as being OK
      */
     private boolean crossCheckPeeredTimeoutValues(final EventHandlerParameters leftModeParameters,
-                    final EventHandlerParameters rightModeParameters, final EventHandlerPeeredMode peeredMode) {
+        final EventHandlerParameters rightModeParameters, final EventHandlerPeeredMode peeredMode) {
         // Cross-set the timeouts if they are not specified
         if (leftModeParameters.getPeerTimeout(peeredMode) != 0) {
             if (rightModeParameters.getPeerTimeout(peeredMode) != 0) {
diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java
new file mode 100644 (file)
index 0000000..c611810
--- /dev/null
@@ -0,0 +1,149 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * 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.service.engine.main;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+import org.junit.Test;
+import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
+import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
+
+/**
+ * Test the ApexMain class.
+ */
+public class ApexMainTest {
+    private PrintStream stdout = System.out;
+
+    @Test
+    public void testNullParameters() throws ApexException {
+        OutputStream outContent = new ByteArrayOutputStream();
+        System.setOut(new PrintStream(outContent));
+
+        ApexMain.main(null);
+        ThreadUtilities.sleep(200);
+
+        final String outString = outContent.toString();
+
+        System.setOut(stdout);
+        
+        assertTrue(outString.contains("Apex configuration file was not specified as an argument"));
+    }
+
+    @Test
+    public void testBadArguments() throws ApexException {
+        OutputStream outContent = new ByteArrayOutputStream();
+        System.setOut(new PrintStream(outContent));
+
+        String[] args = {"-whee"};
+        
+        final ApexMain apexMain = new ApexMain(args);
+        ThreadUtilities.sleep(200);
+        apexMain.shutdown();
+
+        final String outString = outContent.toString();
+
+        System.setOut(stdout);
+        
+        assertTrue(outString.contains("invalid command line arguments specified : Unrecognized option: -whee"));
+    }
+
+    @Test
+    public void testHelp() throws ApexException {
+        OutputStream outContent = new ByteArrayOutputStream();
+        System.setOut(new PrintStream(outContent));
+
+        String[] args = {"-h"};
+        
+        final ApexMain apexMain = new ApexMain(args);
+        ThreadUtilities.sleep(200);
+        apexMain.shutdown();
+
+        final String outString = outContent.toString();
+
+        System.setOut(stdout);
+
+        assertTrue(outString.contains("usage: org.onap.policy.apex.service.engine.main.ApexMain [options...]"));
+    }
+
+    @Test
+    public void testBadParameters() throws ApexException {
+        OutputStream outContent = new ByteArrayOutputStream();
+        System.setOut(new PrintStream(outContent));
+
+        String[] args = {"-c", "src/test/resources/parameters/badParams.json"};
+        
+        final ApexMain apexMain = new ApexMain(args);
+        ThreadUtilities.sleep(200);
+        apexMain.shutdown();
+
+        final String outString = outContent.toString();
+
+        System.setOut(stdout);
+
+        assertTrue(outString.contains("parameter group has status INVALID"));
+    }
+
+    @Test
+    public void testCorrectParameters() throws ApexException {
+        OutputStream outContent = new ByteArrayOutputStream();
+        System.setOut(new PrintStream(outContent));
+
+        String[] args = {"-c", "src/test/resources/parameters/correctParams.json"};
+        
+        final ApexMain apexMain = new ApexMain(args);
+        assertEquals("MyApexEngine", apexMain.getParameters().getEngineServiceParameters().getName());
+        ThreadUtilities.sleep(200);
+        apexMain.shutdown();
+
+        final String outString = outContent.toString();
+
+        System.setOut(stdout);
+
+        assertTrue(outString.contains("Added the action listener to the engine"));
+    }
+
+    @Test
+    public void testjavaProperties() throws ApexException {
+        OutputStream outContent = new ByteArrayOutputStream();
+        System.setOut(new PrintStream(outContent));
+
+        String[] args = {"-c", "src/test/resources/parameters/correctParamsJavaProperties.json"};
+        
+        final ApexMain apexMain = new ApexMain(args);
+        assertEquals("MyApexEngine", apexMain.getParameters().getEngineServiceParameters().getName());
+        
+        assertEquals("trust-store-file", System.getProperty("javax.net.ssl.trustStore"));
+        assertEquals("Pol1cy_0nap", System.getProperty("javax.net.ssl.trustStorePassword"));
+        ThreadUtilities.sleep(200);
+        apexMain.shutdown();
+
+        final String outString = outContent.toString();
+
+        System.setOut(stdout);
+
+        assertTrue(outString.contains("Added the action listener to the engine"));
+    }
+}
diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/ApexParametersTest.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/ApexParametersTest.java
new file mode 100644 (file)
index 0000000..4a946b1
--- /dev/null
@@ -0,0 +1,110 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * 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.service.engine.parameters;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+import org.onap.policy.apex.service.engine.main.ApexCommandLineArguments;
+import org.onap.policy.apex.service.parameters.ApexParameterHandler;
+import org.onap.policy.apex.service.parameters.ApexParameters;
+import org.onap.policy.common.parameters.ParameterException;
+
+/**
+ * Test the ApexParameters class.
+ */
+public class ApexParametersTest {
+
+    @Test
+    public void javaPropertiesOk() throws ParameterException {
+        final String[] args =
+            { "-c", "src/test/resources/parameters/javaPropertiesOK.json" };
+        final ApexCommandLineArguments arguments = new ApexCommandLineArguments(args);
+
+        try {
+            ApexParameters parameters = new ApexParameterHandler().getParameters(arguments);
+            assertTrue(parameters.checkJavaPropertiesSet());
+            assertEquals("property0", parameters.getJavaProperties()[0][0]);
+            assertEquals("property0Value", parameters.getJavaProperties()[0][1]);
+            assertEquals("property1", parameters.getJavaProperties()[1][0]);
+            assertEquals("property1Value", parameters.getJavaProperties()[1][1]);
+        } catch (final ParameterException e) {
+            fail("This test should not throw an exception");
+        }
+    }
+
+    @Test
+    public void javaPropertiesEmpty() throws ParameterException {
+        final String[] args =
+            { "-c", "src/test/resources/parameters/javaPropertiesEmpty.json" };
+        final ApexCommandLineArguments arguments = new ApexCommandLineArguments(args);
+
+        try {
+            ApexParameters parameters = new ApexParameterHandler().getParameters(arguments);
+            assertFalse(parameters.checkJavaPropertiesSet());
+        } catch (final ParameterException pe) {
+            fail("This test should not throw an exception");
+        }
+    }
+    
+
+    @Test
+    public void javaPropertiesBad() throws ParameterException {
+        final String[] args =
+            { "-c", "src/test/resources/parameters/javaPropertiesBad.json" };
+        final ApexCommandLineArguments arguments = new ApexCommandLineArguments(args);
+
+        try {
+            new ApexParameterHandler().getParameters(arguments);
+            fail("This test should throw an exception");
+        } catch (final ParameterException pe) {
+            assertTrue(pe.getMessage().contains("java properties array entries must have one key and one value"));
+            assertTrue(pe.getMessage().contains("java properties key is null or blank"));
+            assertTrue(pe.getMessage().contains("java properties value is null or blank"));
+            assertTrue(pe.getMessage().contains("java properties array entry is null"));
+        }
+    }
+    
+    @Test
+    public void testGettersSetters() {
+        ApexParameters pars = new ApexParameters();
+        assertNotNull(pars);
+        
+        pars.setEngineServiceParameters(null);
+        assertNull(pars.getEngineServiceParameters());
+        
+        pars.setEventInputParameters(null);
+        assertNull(pars.getEventInputParameters());
+        
+        pars.setEventOutputParameters(null);
+        assertNull(pars.getEventOutputParameters());
+        
+        assertFalse(pars.checkJavaPropertiesSet());
+        
+        pars.setName("parName");
+        assertEquals("parName", pars.getName());
+    }
+}
diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyStateFinalizerExecutor.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyStateFinalizerExecutor.java
new file mode 100644 (file)
index 0000000..f7c0876
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * 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.service.engine.parameters.dummyclasses;
+
+import java.util.Map;
+
+import org.onap.policy.apex.context.ContextException;
+import org.onap.policy.apex.core.engine.executor.StateFinalizerExecutor;
+import org.onap.policy.apex.core.engine.executor.exception.StateMachineException;
+
+/**
+ * Dummy state finalizer executor for testing.
+ */
+public class DummyStateFinalizerExecutor extends StateFinalizerExecutor {
+    public DummyStateFinalizerExecutor() {
+    }
+    
+    @Override
+    public String execute(final long executionId, final Map<String, Object> newIncomingFields)
+                    throws StateMachineException, ContextException {
+        
+        return "stateOutput0";
+    }
+}
diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskExecutor.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskExecutor.java
new file mode 100644 (file)
index 0000000..421cfb9
--- /dev/null
@@ -0,0 +1,60 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * 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.service.engine.parameters.dummyclasses;
+
+import java.util.Map;
+
+import org.onap.policy.apex.context.ContextException;
+import org.onap.policy.apex.core.engine.event.EnEvent;
+import org.onap.policy.apex.core.engine.executor.TaskExecutor;
+import org.onap.policy.apex.core.engine.executor.exception.StateMachineException;
+import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
+import org.onap.policy.apex.model.policymodel.concepts.AxTask;
+
+/**
+ * Dummy task executor for testing.
+ */
+public class DummyTaskExecutor extends TaskExecutor {
+    public DummyTaskExecutor() {
+    }
+
+    @Override
+    public void prepare() throws StateMachineException {
+    }
+    
+    @Override
+    public Map<String, Object> execute(final long executionId, final Map<String, Object> newIncomingFields)
+                    throws StateMachineException, ContextException {
+
+        AxArtifactKey event0Key = new AxArtifactKey("Event0:0.0.1");
+        return new EnEvent(event0Key);
+    }
+    
+    @Override
+    public AxTask getSubject() {
+        AxArtifactKey taskKey = new AxArtifactKey("FirstTask:0.0.1");
+        return new AxTask(taskKey);
+    }
+
+    @Override
+    public void cleanUp() throws StateMachineException {
+    }
+}
diff --git a/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskSelectExecutor.java b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskSelectExecutor.java
new file mode 100644 (file)
index 0000000..020e698
--- /dev/null
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2018 Ericsson. All rights reserved.
+ * ================================================================================
+ * 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.service.engine.parameters.dummyclasses;
+
+import org.onap.policy.apex.context.ContextException;
+import org.onap.policy.apex.core.engine.event.EnEvent;
+import org.onap.policy.apex.core.engine.executor.TaskSelectExecutor;
+import org.onap.policy.apex.core.engine.executor.exception.StateMachineException;
+import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
+
+/**
+ * Dummy task selection executor for testing.
+ */
+public class DummyTaskSelectExecutor extends TaskSelectExecutor {
+    public DummyTaskSelectExecutor() {
+    }
+
+    @Override
+    public void prepare() throws StateMachineException {
+    }
+
+    @Override
+    public AxArtifactKey execute(final long executionId, final EnEvent newIncomingEvent)
+                    throws StateMachineException, ContextException {
+        
+        return new AxArtifactKey("task:0.0.1");
+    }
+
+    @Override
+    public void cleanUp() throws StateMachineException {
+    }
+}
diff --git a/services/services-engine/src/test/resources/parameters/correctParams.json b/services/services-engine/src/test/resources/parameters/correctParams.json
new file mode 100644 (file)
index 0000000..2265134
--- /dev/null
@@ -0,0 +1,43 @@
+{
+    "engineServiceParameters": {
+        "name": "MyApexEngine",
+        "version": "0.0.1",
+        "id": 45,
+        "instanceCount": 2,
+        "deploymentPort": 65522,
+        "policyModelFileName": "src/test/resources/policymodels/SmallModel.json",
+        "engineParameters": {
+            "executorParameters": {
+                "JAVASCRIPT": {
+                    "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters"
+                }
+            }
+        }
+    },
+    "eventOutputParameters": {
+        "FirstProducer": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "FILE",
+                "parameters": {
+                    "standardIo": true
+                }
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "JSON"
+            }
+        }
+    },
+    "eventInputParameters": {
+        "TheFileConsumer1": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "FILE",
+                "parameters": {
+                    "standardIo": true
+                }
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "JSON"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/services/services-engine/src/test/resources/parameters/correctParamsJavaProperties.json b/services/services-engine/src/test/resources/parameters/correctParamsJavaProperties.json
new file mode 100644 (file)
index 0000000..0a599d7
--- /dev/null
@@ -0,0 +1,47 @@
+{
+    "javaProperties" : [
+        ["javax.net.ssl.trustStore", "trust-store-file"],
+        ["javax.net.ssl.trustStorePassword", "UG9sMWN5XzBuYXA="]
+    ],
+    "engineServiceParameters": {
+        "name": "MyApexEngine",
+        "version": "0.0.1",
+        "id": 45,
+        "instanceCount": 2,
+        "deploymentPort": 65522,
+        "policyModelFileName": "src/test/resources/policymodels/SmallModel.json",
+        "engineParameters": {
+            "executorParameters": {
+                "JAVASCRIPT": {
+                    "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters"
+                }
+            }
+        }
+    },
+    "eventOutputParameters": {
+        "FirstProducer": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "FILE",
+                "parameters": {
+                    "standardIo": true
+                }
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "JSON"
+            }
+        }
+    },
+    "eventInputParameters": {
+        "TheFileConsumer1": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "FILE",
+                "parameters": {
+                    "standardIo": true
+                }
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "JSON"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/services/services-engine/src/test/resources/parameters/javaPropertiesBad.json b/services/services-engine/src/test/resources/parameters/javaPropertiesBad.json
new file mode 100644 (file)
index 0000000..dc663bd
--- /dev/null
@@ -0,0 +1,53 @@
+{
+    "javaProperties" : [
+        ["property0"],
+        ["property1", "property1Value", "propertyExtraValue"],
+        [],
+        [null, "proeprtyValue"],
+        null,
+        ["propertyname", null]
+    ],
+    "engineServiceParameters": {
+        "name": "MyApexEngine",
+        "version": "0.0.1",
+        "id": 45,
+        "instanceCount": 345,
+        "deploymentPort": 65522,
+        "policyModelFileName": "src/test/resources/policymodels/SmallModel.json",
+        "engineParameters": {
+            "contextParameters": {
+                "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters"
+            },
+            "executorParameters": {
+                "JAVASCRIPT": {
+                    "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters"
+                }
+            }
+        }
+    },
+    "eventOutputParameters": {
+        "FirstProducer": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "FILE",
+                "parameters": {
+                    "fileName": "target/aaa.json"
+                }
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "JSON"
+            }
+        }
+    },
+    "eventInputParameters": {
+        "MySuperDooperConsumer1": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "SUPER_DOOPER",
+                "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperCarrierTechnologyParameters"
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "SUPER_TOK_DEL",
+                "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperTokenDelimitedEventProtocolParameters"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/services/services-engine/src/test/resources/parameters/javaPropertiesEmpty.json b/services/services-engine/src/test/resources/parameters/javaPropertiesEmpty.json
new file mode 100644 (file)
index 0000000..aca9723
--- /dev/null
@@ -0,0 +1,46 @@
+{
+    "javaProperties" : [],
+    "engineServiceParameters": {
+        "name": "MyApexEngine",
+        "version": "0.0.1",
+        "id": 45,
+        "instanceCount": 345,
+        "deploymentPort": 65522,
+        "policyModelFileName": "src/test/resources/policymodels/SmallModel.json",
+        "engineParameters": {
+            "contextParameters": {
+                "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters"
+            },
+            "executorParameters": {
+                "JAVASCRIPT": {
+                    "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters"
+                }
+            }
+        }
+    },
+    "eventOutputParameters": {
+        "FirstProducer": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "FILE",
+                "parameters": {
+                    "fileName": "target/aaa.json"
+                }
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "JSON"
+            }
+        }
+    },
+    "eventInputParameters": {
+        "MySuperDooperConsumer1": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "SUPER_DOOPER",
+                "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperCarrierTechnologyParameters"
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "SUPER_TOK_DEL",
+                "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperTokenDelimitedEventProtocolParameters"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/services/services-engine/src/test/resources/parameters/javaPropertiesOK.json b/services/services-engine/src/test/resources/parameters/javaPropertiesOK.json
new file mode 100644 (file)
index 0000000..74b967f
--- /dev/null
@@ -0,0 +1,49 @@
+{
+    "javaProperties" : [
+        ["property0", "property0Value"],
+        ["property1", "property1Value"]
+    ],
+    "engineServiceParameters": {
+        "name": "MyApexEngine",
+        "version": "0.0.1",
+        "id": 45,
+        "instanceCount": 345,
+        "deploymentPort": 65522,
+        "policyModelFileName": "src/test/resources/policymodels/SmallModel.json",
+        "engineParameters": {
+            "contextParameters": {
+                "parameterClassName": "org.onap.policy.apex.context.parameters.ContextParameters"
+            },
+            "executorParameters": {
+                "JAVASCRIPT": {
+                    "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperExecutorParameters"
+                }
+            }
+        }
+    },
+    "eventOutputParameters": {
+        "FirstProducer": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "FILE",
+                "parameters": {
+                    "fileName": "target/aaa.json"
+                }
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "JSON"
+            }
+        }
+    },
+    "eventInputParameters": {
+        "MySuperDooperConsumer1": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "SUPER_DOOPER",
+                "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperDooperCarrierTechnologyParameters"
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "SUPER_TOK_DEL",
+                "parameterClassName": "org.onap.policy.apex.service.engine.parameters.dummyclasses.SuperTokenDelimitedEventProtocolParameters"
+            }
+        }
+    }
+}
\ No newline at end of file