aboutsummaryrefslogtreecommitdiffstats
path: root/services/services-engine
diff options
context:
space:
mode:
Diffstat (limited to 'services/services-engine')
-rw-r--r--services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java37
-rw-r--r--services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameters.java137
-rw-r--r--services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java149
-rw-r--r--services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/ApexParametersTest.java110
-rw-r--r--services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyStateFinalizerExecutor.java42
-rw-r--r--services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskExecutor.java60
-rw-r--r--services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskSelectExecutor.java50
-rw-r--r--services/services-engine/src/test/resources/parameters/correctParams.json43
-rw-r--r--services/services-engine/src/test/resources/parameters/correctParamsJavaProperties.json47
-rw-r--r--services/services-engine/src/test/resources/parameters/javaPropertiesBad.json53
-rw-r--r--services/services-engine/src/test/resources/parameters/javaPropertiesEmpty.json46
-rw-r--r--services/services-engine/src/test/resources/parameters/javaPropertiesOK.json49
12 files changed, 775 insertions, 48 deletions
diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java
index 2b15b145f..3b20d3d68 100644
--- a/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java
+++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/engine/main/ApexMain.java
@@ -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 {
/*
@@ -149,6 +153,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.
*
* @param args the arguments
diff --git a/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameters.java b/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameters.java
index 4bbc5fc85..07cf7811e 100644
--- a/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameters.java
+++ b/services/services-engine/src/main/java/org/onap/policy/apex/service/parameters/ApexParameters.java
@@ -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
@@ -175,6 +201,37 @@ public class ApexParameters implements ParameterGroup {
}
/**
+ * 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.
*
* @param eventHandlerType the type of the event handler to use on error messages
@@ -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
index 000000000..c6118108f
--- /dev/null
+++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/main/ApexMainTest.java
@@ -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
index 000000000..4a946b111
--- /dev/null
+++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/ApexParametersTest.java
@@ -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
index 000000000..f7c0876d4
--- /dev/null
+++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyStateFinalizerExecutor.java
@@ -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
index 000000000..421cfb9fc
--- /dev/null
+++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskExecutor.java
@@ -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
index 000000000..020e69843
--- /dev/null
+++ b/services/services-engine/src/test/java/org/onap/policy/apex/service/engine/parameters/dummyclasses/DummyTaskSelectExecutor.java
@@ -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
index 000000000..2265134d4
--- /dev/null
+++ b/services/services-engine/src/test/resources/parameters/correctParams.json
@@ -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
index 000000000..0a599d701
--- /dev/null
+++ b/services/services-engine/src/test/resources/parameters/correctParamsJavaProperties.json
@@ -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
index 000000000..dc663bd56
--- /dev/null
+++ b/services/services-engine/src/test/resources/parameters/javaPropertiesBad.json
@@ -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
index 000000000..aca972302
--- /dev/null
+++ b/services/services-engine/src/test/resources/parameters/javaPropertiesEmpty.json
@@ -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
index 000000000..74b967f74
--- /dev/null
+++ b/services/services-engine/src/test/resources/parameters/javaPropertiesOK.json
@@ -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