From e80efa0dbe903e976f5b2799144658c7ba02e534 Mon Sep 17 00:00:00 2001 From: ramverma Date: Thu, 13 Sep 2018 16:31:35 +0100 Subject: [PATCH] Adding policy decoder to extract file from csar * Adding decoder configuration parameters infrastructure to support plugin based architecture. Adding a new policy decoder after this will be just creating a new decoder class and its corresponding parameter class. * Adding a new decoder which extracts policy file from given csar. It is written in a generic way to extract file for any pdp like apex, drools. * Adding configuration parameters for the new decoder. The policy file name and policy type is passed as parameter to the decoder. * Fixing few broken package declaration in pdpx decoder tests. * Adding test cases for all code changes. Change-Id: I95e68cebce0f9747ca63b090f9b9116ce8836939 Issue-ID: POLICY-1101 Signed-off-by: ramverma --- .../parameters/DistributionParameterGroup.java | 43 ++++++-- .../parameters/DistributionParameterHandler.java | 9 +- .../main/startstop/DistributionActivator.java | 36 +++++-- .../main/parameters/CommonTestData.java | 33 ++++++- .../parameters/TestDistributionParameterGroup.java | 40 +++++--- .../TestDistributionParameterHandler.java | 90 ++++++++++++----- .../parameters/TestPolicyDecoderParameters.java | 42 ++++---- .../main/testclasses/DummyDecoder.java | 3 + .../DummyPolicyDecoderParameterGroup.java | 64 ++++++++++++ .../parameters/DistributionConfigParameters.json | 12 ++- ...ibutionConfigParameters_EmptyPolicyDecoder.json | 9 ++ ...utionConfigParameters_EmptyPolicyForwarder.json | 12 ++- ...tionConfigParameters_EmptyReceptionHandler.json | 9 ++ ...onfigParameters_EmptyReceptionHandlerClass.json | 12 ++- ...eters_InvalidDecoderAndForwarderParameters.json | 18 +++- ...eters_InvalidDecoderConfigurationClassName.json | 64 ++++++++++++ ...ers_InvalidForwarderConfigurationClassName.json | 12 ++- .../DistributionConfigParameters_InvalidName.json | 12 ++- ...figParameters_InvalidReceptionHandlerClass.json | 12 ++- ...rameters_InvalidReceptionHandlerParameters.json | 12 ++- ...nfigParameters_InvalidRestServerParameters.json | 12 ++- ...stributionConfigParameters_NoPolicyDecoder.json | 9 ++ ...ributionConfigParameters_NoPolicyForwarder.json | 12 ++- ...eters_UnknownDecoderConfigurationClassName.json | 64 ++++++++++++ ...ers_UnknownForwarderConfigurationClassName.json | 37 +++---- .../resources/parameters/MinimumParameters.json | 12 ++- .../{ApexPdpPolicy.java => PolicyAsString.java} | 29 +++--- .../apex/pdp/ApexPdpPolicyForwarder.java | 18 ++-- .../ApexPdpPolicyForwarderParameterGroupTest.java | 5 + .../apex/pdp/ApexPdpPolicyForwarderTest.java | 30 +++--- .../xacml/pdp/testclasses/DummyDecoder.java | 3 + .../decoding/pdpx/PolicyDecoderCsarPdpx.java | 55 +++++------ .../decoding/pdpx/PolicyDecoderToscaPdpx.java | 14 ++- .../file/PolicyDecoderFileInCsarToPolicy.java | 94 ++++++++++++++++++ ...icyDecoderFileInCsarToPolicyParameterGroup.java | 70 +++++++++++++ .../decoding/pdpx/TestAttribute.java | 0 .../{handling => }/decoding/pdpx/TestContent.java | 0 .../decoding/pdpx/TestDirective.java | 0 .../decoding/pdpx/TestFlavorFeature.java | 0 .../decoding/pdpx/TestFlavorProperty.java | 0 .../decoding/pdpx/TestHpaFeatureAttribute.java | 0 .../decoding/pdpx/TestPolicyDecoderCsarPdpx.java | 0 ...ecoderFileInCsarToPolicyParameterGroupTest.java | 65 ++++++++++++ .../file/PolicyDecoderFileInCsarToPolicyTest.java | 109 +++++++++++++++++++++ .../reception/handling/sdc/DummyDecoder.java | 3 + .../handling/sdc/TestSdcReceptionHandler.java | 2 +- .../src/test/resources/sampleTestService.csar | Bin 0 -> 198643 bytes .../reception/decoding/PolicyDecoder.java | 8 ++ .../reception/handling/PluginHandler.java | 1 + .../PolicyDecoderConfigurationParameterGroup.java | 45 +++++++++ ...yDecoderConfigurationParametersJsonAdapter.java | 84 ++++++++++++++++ .../parameters/PolicyDecoderParameters.java | 15 ++- .../handling/AbstractReceptionHandlerTest.java | 5 +- .../reception/handling/DummyDecoder.java | 3 + 54 files changed, 1163 insertions(+), 185 deletions(-) create mode 100644 main/src/test/java/org/onap/policy/distribution/main/testclasses/DummyPolicyDecoderParameterGroup.java create mode 100644 main/src/test/resources/parameters/DistributionConfigParameters_InvalidDecoderConfigurationClassName.json create mode 100644 main/src/test/resources/parameters/DistributionConfigParameters_UnknownDecoderConfigurationClassName.json rename model/src/main/java/org/onap/policy/distribution/model/{ApexPdpPolicy.java => PolicyAsString.java} (66%) create mode 100644 plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicy.java create mode 100644 plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyParameterGroup.java rename plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/{handling => }/decoding/pdpx/TestAttribute.java (100%) rename plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/{handling => }/decoding/pdpx/TestContent.java (100%) rename plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/{handling => }/decoding/pdpx/TestDirective.java (100%) rename plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/{handling => }/decoding/pdpx/TestFlavorFeature.java (100%) rename plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/{handling => }/decoding/pdpx/TestFlavorProperty.java (100%) rename plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/{handling => }/decoding/pdpx/TestHpaFeatureAttribute.java (100%) rename plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/{handling => }/decoding/pdpx/TestPolicyDecoderCsarPdpx.java (100%) create mode 100644 plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyParameterGroupTest.java create mode 100644 plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyTest.java create mode 100644 plugins/reception-plugins/src/test/resources/sampleTestService.csar create mode 100644 reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderConfigurationParameterGroup.java create mode 100644 reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderConfigurationParametersJsonAdapter.java diff --git a/main/src/main/java/org/onap/policy/distribution/main/parameters/DistributionParameterGroup.java b/main/src/main/java/org/onap/policy/distribution/main/parameters/DistributionParameterGroup.java index 1f3e48e6..4bcd1a32 100644 --- a/main/src/main/java/org/onap/policy/distribution/main/parameters/DistributionParameterGroup.java +++ b/main/src/main/java/org/onap/policy/distribution/main/parameters/DistributionParameterGroup.java @@ -23,10 +23,12 @@ package org.onap.policy.distribution.main.parameters; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; + 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; +import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParameterGroup; import org.onap.policy.distribution.reception.parameters.ReceptionHandlerConfigurationParameterGroup; import org.onap.policy.distribution.reception.parameters.ReceptionHandlerParameters; @@ -43,6 +45,9 @@ public class DistributionParameterGroup implements ParameterGroup { new LinkedHashMap<>(); private Map policyForwarderConfigurationParameters = new LinkedHashMap<>(); + private Map policyDecoderConfigurationParameters = + new LinkedHashMap<>(); + /** @@ -53,12 +58,14 @@ public class DistributionParameterGroup implements ParameterGroup { public DistributionParameterGroup(final String name, final RestServerParameters restServerParameters, final Map receptionHandlerParameters, final Map receptionHandlerConfigurationParameters, - final Map policyForwarderConfigurationParameters) { + final Map policyForwarderConfigurationParameters, + final Map policyDecoderConfigurationParameters) { this.name = name; this.restServerParameters = restServerParameters; this.receptionHandlerParameters = receptionHandlerParameters; this.receptionHandlerConfigurationParameters = receptionHandlerConfigurationParameters; this.policyForwarderConfigurationParameters = policyForwarderConfigurationParameters; + this.policyDecoderConfigurationParameters = policyDecoderConfigurationParameters; } /** @@ -130,13 +137,32 @@ public class DistributionParameterGroup implements ParameterGroup { /** * Sets the policy forwarder configuration parameter map. * - * @param eventInputParameters the policy forwarder configuration parameters + * @param policyForwarderConfigurationParameters the policy forwarder configuration parameters */ public void setPolicyForwarderConfigurationParameters( final Map policyForwarderConfigurationParameters) { this.policyForwarderConfigurationParameters = policyForwarderConfigurationParameters; } + /** + * Returns the policy decoder configuration parameter map. + * + * @return the policyDecoderConfigurationParameters + */ + public Map getPolicyDecoderConfigurationParameters() { + return policyDecoderConfigurationParameters; + } + + /** + * Set the policy decoder configuration parameter map. + * + * @param policyDecoderConfigurationParameters the policyDecoderConfigurationParameters to set + */ + public void setPolicyDecoderConfigurationParameters( + final Map policyDecoderConfigurationParameters) { + this.policyDecoderConfigurationParameters = policyDecoderConfigurationParameters; + } + /** * Validate the parameter group. * @@ -156,13 +182,10 @@ public class DistributionParameterGroup implements ParameterGroup { } validateReceptionHandlers(validationResult); validateForwarderConfigurations(validationResult); + validateDecoderConfigurations(validationResult); return validationResult; } - /** - * Validate the reception handlers. - * - */ private void validateReceptionHandlers(final GroupValidationResult validationResult) { if (receptionHandlerParameters == null || receptionHandlerParameters.size() == 0) { validationResult.setResult("receptionHandlerParameters", ValidationStatus.INVALID, @@ -183,4 +206,12 @@ public class DistributionParameterGroup implements ParameterGroup { configurationParameters.getValue().validate()); } } + + private void validateDecoderConfigurations(final GroupValidationResult validationResult) { + for (final Entry configurationParameters : policyDecoderConfigurationParameters + .entrySet()) { + validationResult.setResult("policyDecoderConfigurationParameters", configurationParameters.getKey(), + configurationParameters.getValue().validate()); + } + } } diff --git a/main/src/main/java/org/onap/policy/distribution/main/parameters/DistributionParameterHandler.java b/main/src/main/java/org/onap/policy/distribution/main/parameters/DistributionParameterHandler.java index c1c64f7e..603c9869 100644 --- a/main/src/main/java/org/onap/policy/distribution/main/parameters/DistributionParameterHandler.java +++ b/main/src/main/java/org/onap/policy/distribution/main/parameters/DistributionParameterHandler.java @@ -22,18 +22,21 @@ package org.onap.policy.distribution.main.parameters; import com.google.gson.Gson; import com.google.gson.GsonBuilder; + import java.io.FileReader; + import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.common.parameters.GroupValidationResult; import org.onap.policy.distribution.main.PolicyDistributionException; import org.onap.policy.distribution.main.startstop.DistributionCommandLineArguments; +import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParameterGroup; +import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParametersJsonAdapter; import org.onap.policy.distribution.reception.parameters.ReceptionHandlerConfigurationParameterGroup; import org.onap.policy.distribution.reception.parameters.ReceptionHandlerConfigurationParametersJsonAdapter; /** - * This class handles reading, parsing and validating of policy distribution parameters from JSON - * files. + * This class handles reading, parsing and validating of policy distribution parameters from JSON files. */ public class DistributionParameterHandler { private static final Logger LOGGER = FlexLogger.getLogger(DistributionParameterHandler.class); @@ -57,6 +60,8 @@ public class DistributionParameterHandler { new PolicyForwarderConfigurationParametersJsonAdapter()) .registerTypeAdapter(ReceptionHandlerConfigurationParameterGroup.class, new ReceptionHandlerConfigurationParametersJsonAdapter()) + .registerTypeAdapter(PolicyDecoderConfigurationParameterGroup.class, + new PolicyDecoderConfigurationParametersJsonAdapter()) .create(); distributionParameterGroup = gson.fromJson(new FileReader(arguments.getFullConfigurationFilePath()), DistributionParameterGroup.class); diff --git a/main/src/main/java/org/onap/policy/distribution/main/startstop/DistributionActivator.java b/main/src/main/java/org/onap/policy/distribution/main/startstop/DistributionActivator.java index 91052580..1395b283 100644 --- a/main/src/main/java/org/onap/policy/distribution/main/startstop/DistributionActivator.java +++ b/main/src/main/java/org/onap/policy/distribution/main/startstop/DistributionActivator.java @@ -23,6 +23,7 @@ package org.onap.policy.distribution.main.startstop; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; + import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.common.parameters.ParameterService; @@ -32,12 +33,13 @@ import org.onap.policy.distribution.main.parameters.PolicyForwarderConfiguration import org.onap.policy.distribution.main.rest.DistributionRestServer; import org.onap.policy.distribution.reception.decoding.PluginInitializationException; import org.onap.policy.distribution.reception.handling.AbstractReceptionHandler; +import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParameterGroup; import org.onap.policy.distribution.reception.parameters.ReceptionHandlerConfigurationParameterGroup; import org.onap.policy.distribution.reception.parameters.ReceptionHandlerParameters; /** - * This class wraps a distributor so that it can be activated as a complete service together with - * all its distribution and forwarding handlers. + * This class wraps a distributor so that it can be activated as a complete service together with all its distribution + * and forwarding handlers. */ public class DistributionActivator { // The logger for this class @@ -148,16 +150,23 @@ public class DistributionActivator { ParameterService.register(params); ParameterService.register(params.getPluginHandlerParameters()); } - for (final Entry forwarderConfiguration : distributionParameterGroup - .getPolicyForwarderConfigurationParameters().entrySet()) { + //@formatter:off + for (final Entry forwarderConfiguration + : distributionParameterGroup.getPolicyForwarderConfigurationParameters().entrySet()) { forwarderConfiguration.getValue().setName(forwarderConfiguration.getKey()); ParameterService.register(forwarderConfiguration.getValue()); } - for (final Entry receptionHandlerConfiguration : distributionParameterGroup - .getReceptionHandlerConfigurationParameters().entrySet()) { + for (final Entry receptionHandlerConfiguration + : distributionParameterGroup.getReceptionHandlerConfigurationParameters().entrySet()) { receptionHandlerConfiguration.getValue().setName(receptionHandlerConfiguration.getKey()); ParameterService.register(receptionHandlerConfiguration.getValue()); } + for (final Entry decoderConfiguration + : distributionParameterGroup.getPolicyDecoderConfigurationParameters().entrySet()) { + decoderConfiguration.getValue().setName(decoderConfiguration.getKey()); + ParameterService.register(decoderConfiguration.getValue()); + } + //@formatter:on } /** @@ -172,16 +181,23 @@ public class DistributionActivator { ParameterService.deregister((params.getName())); ParameterService.deregister((params.getPluginHandlerParameters().getName())); } - for (final Entry forwarderConfiguration : distributionParameterGroup - .getPolicyForwarderConfigurationParameters().entrySet()) { + //@formatter:off + for (final Entry forwarderConfiguration + : distributionParameterGroup.getPolicyForwarderConfigurationParameters().entrySet()) { forwarderConfiguration.getValue().setName(forwarderConfiguration.getKey()); ParameterService.deregister(forwarderConfiguration.getKey()); } - for (final Entry receptionHandlerConfiguration : distributionParameterGroup - .getReceptionHandlerConfigurationParameters().entrySet()) { + for (final Entry receptionHandlerConfiguration + : distributionParameterGroup.getReceptionHandlerConfigurationParameters().entrySet()) { receptionHandlerConfiguration.getValue().setName(receptionHandlerConfiguration.getKey()); ParameterService.deregister(receptionHandlerConfiguration.getKey()); } + for (final Entry decoderConfiguration + : distributionParameterGroup.getPolicyDecoderConfigurationParameters().entrySet()) { + decoderConfiguration.getValue().setName(decoderConfiguration.getKey()); + ParameterService.deregister(decoderConfiguration.getKey()); + } + //@formatter:on } /** diff --git a/main/src/test/java/org/onap/policy/distribution/main/parameters/CommonTestData.java b/main/src/test/java/org/onap/policy/distribution/main/parameters/CommonTestData.java index b1903152..96ec9f93 100644 --- a/main/src/test/java/org/onap/policy/distribution/main/parameters/CommonTestData.java +++ b/main/src/test/java/org/onap/policy/distribution/main/parameters/CommonTestData.java @@ -24,12 +24,15 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; + import org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters; +import org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup; import org.onap.policy.distribution.main.testclasses.DummyPolicyForwarderParameterGroup; import org.onap.policy.distribution.main.testclasses.DummyPolicyForwarderParameterGroup.DummyPolicyForwarderParameterGroupBuilder; import org.onap.policy.distribution.main.testclasses.DummyReceptionHandlerParameterGroup; import org.onap.policy.distribution.main.testclasses.DummyReceptionHandlerParameterGroup.DummyReceptionHandlerParameterGroupBuilder; import org.onap.policy.distribution.reception.parameters.PluginHandlerParameters; +import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParameterGroup; import org.onap.policy.distribution.reception.parameters.PolicyDecoderParameters; import org.onap.policy.distribution.reception.parameters.ReceptionHandlerConfigurationParameterGroup; import org.onap.policy.distribution.reception.parameters.ReceptionHandlerParameters; @@ -65,6 +68,10 @@ public class CommonTestData { public static final String DUMMY_ENGINE_FORWARDER_KEY = "DummyForwarder"; public static final String DUMMY_DECODER_KEY = "DummyDecoder"; + public static final String POLICY_TYPE = "DUMMY"; + public static final String POLICY_NAME = "SamplePolicy"; + public static final String DECODER_CONFIGURATION_PARAMETERS = "dummyDecoderConfiguration"; + /** * Returns an instance of ReceptionHandlerParameters for test cases. * @@ -117,7 +124,7 @@ public class CommonTestData { messageBusAddress.add("localhost"); final List artifactTypes = new ArrayList<>(); artifactTypes.add("TOSCA_CSAR"); - DummyReceptionHandlerParameterGroup dummyReceptionHandlerParameterGroup = + final DummyReceptionHandlerParameterGroup dummyReceptionHandlerParameterGroup = new DummyReceptionHandlerParameterGroupBuilder().setMyStringParameter(MY_STRING_PARAMETER_VALUE) .setMyIntegerParameter(MY_INTEGER_PARAMETER_VALUE) .setMyBooleanParameter(MY_BOOLEAN_PARAMETER_VALUE).build(); @@ -167,7 +174,8 @@ public class CommonTestData { public Map getPolicyDecoders(final boolean isEmpty) { final Map policyDecoders = new HashMap(); if (!isEmpty) { - final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters(DECODER_TYPE, DECODER_CLASS_NAME); + final PolicyDecoderParameters pDParameters = + new PolicyDecoderParameters(DECODER_TYPE, DECODER_CLASS_NAME, DECODER_CONFIGURATION_PARAMETERS); policyDecoders.put(DUMMY_DECODER_KEY, pDParameters); } return policyDecoders; @@ -184,7 +192,7 @@ public class CommonTestData { final Map policyForwarderConfigurationParameters = new HashMap(); if (!isEmpty) { - DummyPolicyForwarderParameterGroup dummyPolicyForwarderParameterGroup = + final DummyPolicyForwarderParameterGroup dummyPolicyForwarderParameterGroup = new DummyPolicyForwarderParameterGroupBuilder().setUseHttps(true).setHostname(FORWARDER_HOST) .setPort(1234).setUserName("myUser").setPassword("myPassword").setIsManaged(true).build(); policyForwarderConfigurationParameters.put(FORWARDER_CONFIGURATION_PARAMETERS, @@ -192,4 +200,23 @@ public class CommonTestData { } return policyForwarderConfigurationParameters; } + + /** + * Returns PolicyDecoderConfigurationParameterGroups for test cases. + * + * @param isEmpty boolean value to represent that object created should be empty or not + * @return the PolicyDecoderConfigurationParameterGroups + */ + public Map getPolicyDecoderConfigurationParameters( + final boolean isEmpty) { + final Map policyDecoderConfigurationParameters = + new HashMap(); + if (!isEmpty) { + final DummyPolicyDecoderParameterGroup dummyPolicyForwarderParameterGroup = + new DummyPolicyDecoderParameterGroup(POLICY_NAME, POLICY_TYPE); + policyDecoderConfigurationParameters.put(DECODER_CONFIGURATION_PARAMETERS, + dummyPolicyForwarderParameterGroup); + } + return policyDecoderConfigurationParameters; + } } diff --git a/main/src/test/java/org/onap/policy/distribution/main/parameters/TestDistributionParameterGroup.java b/main/src/test/java/org/onap/policy/distribution/main/parameters/TestDistributionParameterGroup.java index 6f6ddd81..8a33ac2c 100644 --- a/main/src/test/java/org/onap/policy/distribution/main/parameters/TestDistributionParameterGroup.java +++ b/main/src/test/java/org/onap/policy/distribution/main/parameters/TestDistributionParameterGroup.java @@ -26,10 +26,12 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Map; + import org.junit.Test; import org.onap.policy.common.parameters.GroupValidationResult; import org.onap.policy.distribution.main.testclasses.DummyPolicyForwarderParameterGroup; import org.onap.policy.distribution.main.testclasses.DummyReceptionHandlerParameterGroup; +import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParameterGroup; import org.onap.policy.distribution.reception.parameters.ReceptionHandlerConfigurationParameterGroup; import org.onap.policy.distribution.reception.parameters.ReceptionHandlerParameters; @@ -50,10 +52,12 @@ public class TestDistributionParameterGroup { commonTestData.getReceptionHandlerConfigurationParameters(false); final Map forwarderConfigurations = commonTestData.getPolicyForwarderConfigurationParameters(false); + final Map decoderConfigurations = + commonTestData.getPolicyDecoderConfigurationParameters(false); - final DistributionParameterGroup distributionParameters = - new DistributionParameterGroup(CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, - receptionHandlerParameters, receptionHandlerConfigurations, forwarderConfigurations); + final DistributionParameterGroup distributionParameters = new DistributionParameterGroup( + CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, receptionHandlerParameters, + receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations); final GroupValidationResult validationResult = distributionParameters.validate(); assertTrue(validationResult.isValid()); assertEquals(restServerParameters.getHost(), distributionParameters.getRestServerParameters().getHost()); @@ -102,10 +106,12 @@ public class TestDistributionParameterGroup { commonTestData.getReceptionHandlerConfigurationParameters(false); final Map forwarderConfigurations = commonTestData.getPolicyForwarderConfigurationParameters(false); + final Map decoderConfigurations = + commonTestData.getPolicyDecoderConfigurationParameters(false); final DistributionParameterGroup distributionParameters = new DistributionParameterGroup(null, restServerParameters, receptionHandlerParameters, - receptionHandlerConfigurations, forwarderConfigurations); + receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations); final GroupValidationResult validationResult = distributionParameters.validate(); assertFalse(validationResult.isValid()); assertEquals(null, distributionParameters.getName()); @@ -135,10 +141,12 @@ public class TestDistributionParameterGroup { commonTestData.getReceptionHandlerConfigurationParameters(false); final Map forwarderConfigurations = commonTestData.getPolicyForwarderConfigurationParameters(false); + final Map decoderConfigurations = + commonTestData.getPolicyDecoderConfigurationParameters(false); final DistributionParameterGroup distributionParameters = new DistributionParameterGroup("", restServerParameters, receptionHandlerParameters, - receptionHandlerConfigurations, forwarderConfigurations); + receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations); final GroupValidationResult validationResult = distributionParameters.validate(); assertFalse(validationResult.isValid()); assertEquals("", distributionParameters.getName()); @@ -166,10 +174,12 @@ public class TestDistributionParameterGroup { commonTestData.getReceptionHandlerConfigurationParameters(false); final Map forwarderConfigurations = commonTestData.getPolicyForwarderConfigurationParameters(false); + final Map decoderConfigurations = + commonTestData.getPolicyDecoderConfigurationParameters(false); try { final DistributionParameterGroup distributionParameters = new DistributionParameterGroup(CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, null, - receptionHandlerConfigurations, forwarderConfigurations); + receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations); distributionParameters.validate(); fail("test should throw an exception here"); } catch (final Exception e) { @@ -187,11 +197,13 @@ public class TestDistributionParameterGroup { commonTestData.getReceptionHandlerConfigurationParameters(false); final Map forwarderConfigurations = commonTestData.getPolicyForwarderConfigurationParameters(false); - final DistributionParameterGroup distributionParameters = - new DistributionParameterGroup(CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, - receptionHandlerParameters, receptionHandlerConfigurations, forwarderConfigurations); + final Map decoderConfigurations = + commonTestData.getPolicyDecoderConfigurationParameters(false); + final DistributionParameterGroup distributionParameters = new DistributionParameterGroup( + CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, receptionHandlerParameters, + receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations); distributionParameters.validate(); - GroupValidationResult result = distributionParameters.validate(); + final GroupValidationResult result = distributionParameters.validate(); assertFalse(result.isValid()); assertTrue(result.getResult().endsWith("must have at least one reception handler\n")); } @@ -205,10 +217,12 @@ public class TestDistributionParameterGroup { commonTestData.getReceptionHandlerConfigurationParameters(false); final Map forwarderConfigurations = commonTestData.getPolicyForwarderConfigurationParameters(false); + final Map decoderConfigurations = + commonTestData.getPolicyDecoderConfigurationParameters(false); - final DistributionParameterGroup distributionParameters = - new DistributionParameterGroup(CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, - receptionHandlerParameters, receptionHandlerConfigurations, forwarderConfigurations); + final DistributionParameterGroup distributionParameters = new DistributionParameterGroup( + CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, receptionHandlerParameters, + receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations); final GroupValidationResult validationResult = distributionParameters.validate(); assertFalse(validationResult.isValid()); assertTrue(validationResult.getResult() diff --git a/main/src/test/java/org/onap/policy/distribution/main/parameters/TestDistributionParameterHandler.java b/main/src/test/java/org/onap/policy/distribution/main/parameters/TestDistributionParameterHandler.java index a5eab8b1..b66da8e6 100644 --- a/main/src/test/java/org/onap/policy/distribution/main/parameters/TestDistributionParameterHandler.java +++ b/main/src/test/java/org/onap/policy/distribution/main/parameters/TestDistributionParameterHandler.java @@ -31,6 +31,7 @@ import java.nio.file.Paths; import org.junit.Test; import org.onap.policy.distribution.main.PolicyDistributionException; import org.onap.policy.distribution.main.startstop.DistributionCommandLineArguments; +import org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup; import org.onap.policy.distribution.main.testclasses.DummyPolicyForwarderParameterGroup; /** @@ -42,7 +43,7 @@ public class TestDistributionParameterHandler { @Test public void testParameterHandlerNoParameterFile() throws PolicyDistributionException { final String[] noArgumentString = - { "-c", "parameters/NoParameterFile.json" }; + { "-c", "parameters/NoParameterFile.json" }; final DistributionCommandLineArguments noArguments = new DistributionCommandLineArguments(); noArguments.parse(noArgumentString); @@ -58,7 +59,7 @@ public class TestDistributionParameterHandler { @Test public void testParameterHandlerEmptyParameters() throws PolicyDistributionException { final String[] emptyArgumentString = - { "-c", "parameters/EmptyParameters.json" }; + { "-c", "parameters/EmptyParameters.json" }; final DistributionCommandLineArguments emptyArguments = new DistributionCommandLineArguments(); emptyArguments.parse(emptyArgumentString); @@ -74,7 +75,7 @@ public class TestDistributionParameterHandler { @Test public void testParameterHandlerBadParameters() throws PolicyDistributionException { final String[] badArgumentString = - { "-c", "parameters/BadParameters.json" }; + { "-c", "parameters/BadParameters.json" }; final DistributionCommandLineArguments badArguments = new DistributionCommandLineArguments(); badArguments.parse(badArgumentString); @@ -92,7 +93,7 @@ public class TestDistributionParameterHandler { @Test public void testParameterHandlerInvalidParameters() throws PolicyDistributionException { final String[] invalidArgumentString = - { "-c", "parameters/InvalidParameters.json" }; + { "-c", "parameters/InvalidParameters.json" }; final DistributionCommandLineArguments invalidArguments = new DistributionCommandLineArguments(); invalidArguments.parse(invalidArgumentString); @@ -110,7 +111,7 @@ public class TestDistributionParameterHandler { @Test public void testParameterHandlerNoParameters() throws PolicyDistributionException { final String[] noArgumentString = - { "-c", "parameters/NoParameters.json" }; + { "-c", "parameters/NoParameters.json" }; final DistributionCommandLineArguments noArguments = new DistributionCommandLineArguments(); noArguments.parse(noArgumentString); @@ -126,7 +127,7 @@ public class TestDistributionParameterHandler { @Test public void testParameterHandlerMinumumParameters() throws PolicyDistributionException { final String[] minArgumentString = - { "-c", "parameters/MinimumParameters.json" }; + { "-c", "parameters/MinimumParameters.json" }; final DistributionCommandLineArguments minArguments = new DistributionCommandLineArguments(); minArguments.parse(minArgumentString); @@ -138,7 +139,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionParameterGroup() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters.json" }; + { "-c", "parameters/DistributionConfigParameters.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -159,13 +160,19 @@ public class TestDistributionParameterHandler { assertEquals(CommonTestData.FORWARDER_HOST, ((DummyPolicyForwarderParameterGroup) parGroup.getPolicyForwarderConfigurationParameters() .get(CommonTestData.FORWARDER_CONFIGURATION_PARAMETERS)).getHostname()); + assertEquals(CommonTestData.POLICY_TYPE, + ((DummyPolicyDecoderParameterGroup) parGroup.getPolicyDecoderConfigurationParameters() + .get(CommonTestData.DECODER_CONFIGURATION_PARAMETERS)).getPolicyType()); + assertEquals(CommonTestData.POLICY_NAME, + ((DummyPolicyDecoderParameterGroup) parGroup.getPolicyDecoderConfigurationParameters() + .get(CommonTestData.DECODER_CONFIGURATION_PARAMETERS)).getPolicyName()); } @Test public void testDistributionParameterGroup_InvalidForwarderConfigurationClassName() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_InvalidForwarderConfigurationClassName.json" }; + { "-c", "parameters/DistributionConfigParameters_InvalidForwarderConfigurationClassName.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -182,7 +189,7 @@ public class TestDistributionParameterHandler { public void testDistributionParameterGroup_UnknownForwarderConfigurationClassName() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_UnknownForwarderConfigurationClassName.json" }; + { "-c", "parameters/DistributionConfigParameters_UnknownForwarderConfigurationClassName.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -199,7 +206,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionParameterGroup_InvalidName() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_InvalidName.json" }; + { "-c", "parameters/DistributionConfigParameters_InvalidName.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -216,7 +223,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionParameterGroup_NoReceptionHandler() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_NoReceptionHandler.json" }; + { "-c", "parameters/DistributionConfigParameters_NoReceptionHandler.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -232,7 +239,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionParameterGroup_EmptyReceptionHandler() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_EmptyReceptionHandler.json" }; + { "-c", "parameters/DistributionConfigParameters_EmptyReceptionHandler.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -248,7 +255,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionParameterGroup_NoPolicyDecoder() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_NoPolicyDecoder.json" }; + { "-c", "parameters/DistributionConfigParameters_NoPolicyDecoder.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -264,7 +271,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionParameterGroup_NoPolicyForwarder() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_NoPolicyForwarder.json" }; + { "-c", "parameters/DistributionConfigParameters_NoPolicyForwarder.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -280,7 +287,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionParameterGroup_EmptyPolicyDecoder() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_EmptyPolicyDecoder.json" }; + { "-c", "parameters/DistributionConfigParameters_EmptyPolicyDecoder.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -296,7 +303,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionParameterGroup_EmptyPolicyForwarder() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_EmptyPolicyForwarder.json" }; + { "-c", "parameters/DistributionConfigParameters_EmptyPolicyForwarder.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -313,7 +320,7 @@ public class TestDistributionParameterHandler { public void testDistributionParameterGroup_InvalidReceptionHandlerParameters() throws PolicyDistributionException, IOException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_InvalidReceptionHandlerParameters.json" }; + { "-c", "parameters/DistributionConfigParameters_InvalidReceptionHandlerParameters.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -333,7 +340,7 @@ public class TestDistributionParameterHandler { public void testDistributionParameterGroup_InvalidDecoderAndForwarderParameters() throws PolicyDistributionException, IOException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_InvalidDecoderAndForwarderParameters.json" }; + { "-c", "parameters/DistributionConfigParameters_InvalidDecoderAndForwarderParameters.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -353,7 +360,7 @@ public class TestDistributionParameterHandler { public void testDistributionParameterGroup_InvalidRestServerParameters() throws PolicyDistributionException, IOException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_InvalidRestServerParameters.json" }; + { "-c", "parameters/DistributionConfigParameters_InvalidRestServerParameters.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -372,7 +379,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionVersion() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-v" }; + { "-v" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); final String version = arguments.parse(distributionConfigParameters); assertTrue(version.startsWith("ONAP Policy Framework Distribution Service")); @@ -381,7 +388,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionHelp() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-h" }; + { "-h" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); final String help = arguments.parse(distributionConfigParameters); assertTrue(help.startsWith("usage:")); @@ -390,7 +397,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionInvalidOption() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-d" }; + { "-d" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); try { arguments.parse(distributionConfigParameters); @@ -402,7 +409,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionParameterGroup_InvalidReceptionHandlerClass() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_InvalidReceptionHandlerClass.json" }; + { "-c", "parameters/DistributionConfigParameters_InvalidReceptionHandlerClass.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -417,7 +424,7 @@ public class TestDistributionParameterHandler { @Test public void testDistributionParameterGroup_EmptyReceptionHandlerClass() throws PolicyDistributionException { final String[] distributionConfigParameters = - { "-c", "parameters/DistributionConfigParameters_EmptyReceptionHandlerClass.json" }; + { "-c", "parameters/DistributionConfigParameters_EmptyReceptionHandlerClass.json" }; final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); arguments.parse(distributionConfigParameters); @@ -428,4 +435,39 @@ public class TestDistributionParameterHandler { assertTrue(e.getMessage().contains("invalid in JSON file")); } } + + @Test + public void testDistributionParameterGroup_InvalidDecoderConfigurationClassName() + throws PolicyDistributionException { + final String[] distributionConfigParameters = + { "-c", "parameters/DistributionConfigParameters_InvalidDecoderConfigurationClassName.json" }; + + final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); + arguments.parse(distributionConfigParameters); + + try { + new DistributionParameterHandler().getParameters(arguments); + fail("test should throw an exception here"); + } catch (final Exception e) { + assertTrue(e.getMessage().contains("parameter \"parameterClassName\" value \"\" invalid in JSON file")); + } + } + + @Test + public void testDistributionParameterGroup_UnknownDecoderConfigurationClassName() + throws PolicyDistributionException { + final String[] distributionConfigParameters = + { "-c", "parameters/DistributionConfigParameters_UnknownDecoderConfigurationClassName.json" }; + + final DistributionCommandLineArguments arguments = new DistributionCommandLineArguments(); + arguments.parse(distributionConfigParameters); + + try { + new DistributionParameterHandler().getParameters(arguments); + fail("test should throw an exception here"); + } catch (final Exception e) { + assertTrue(e.getMessage().contains( + "parameter \"parameterClassName\" value \"org.onap.policy.Unknown\", could not find class")); + } + } } diff --git a/main/src/test/java/org/onap/policy/distribution/main/parameters/TestPolicyDecoderParameters.java b/main/src/test/java/org/onap/policy/distribution/main/parameters/TestPolicyDecoderParameters.java index c2ab38d8..7b9e6095 100644 --- a/main/src/test/java/org/onap/policy/distribution/main/parameters/TestPolicyDecoderParameters.java +++ b/main/src/test/java/org/onap/policy/distribution/main/parameters/TestPolicyDecoderParameters.java @@ -23,6 +23,9 @@ package org.onap.policy.distribution.main.parameters; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.onap.policy.distribution.main.parameters.CommonTestData.DECODER_CLASS_NAME; +import static org.onap.policy.distribution.main.parameters.CommonTestData.DECODER_CONFIGURATION_PARAMETERS; +import static org.onap.policy.distribution.main.parameters.CommonTestData.DECODER_TYPE; import org.junit.Test; import org.onap.policy.common.parameters.GroupValidationResult; @@ -38,19 +41,21 @@ public class TestPolicyDecoderParameters { @Test public void testPolicyDecoderParameters() { final PolicyDecoderParameters pDParameters = - new PolicyDecoderParameters(CommonTestData.DECODER_TYPE, CommonTestData.DECODER_CLASS_NAME); + new PolicyDecoderParameters(DECODER_TYPE, DECODER_CLASS_NAME, DECODER_CONFIGURATION_PARAMETERS); final GroupValidationResult validationResult = pDParameters.validate(); - assertEquals(CommonTestData.DECODER_TYPE, pDParameters.getDecoderType()); - assertEquals(CommonTestData.DECODER_CLASS_NAME, pDParameters.getDecoderClassName()); + assertEquals(DECODER_TYPE, pDParameters.getDecoderType()); + assertEquals(DECODER_CLASS_NAME, pDParameters.getDecoderClassName()); + assertEquals(DECODER_CONFIGURATION_PARAMETERS, pDParameters.getDecoderConfigurationName()); assertTrue(validationResult.isValid()); } @Test public void testPolicyDecoderParameters_InvalidDecoderType() { - final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters("", CommonTestData.DECODER_CLASS_NAME); + final PolicyDecoderParameters pDParameters = + new PolicyDecoderParameters("", DECODER_CLASS_NAME, DECODER_CONFIGURATION_PARAMETERS); final GroupValidationResult validationResult = pDParameters.validate(); assertEquals("", pDParameters.getDecoderType()); - assertEquals(CommonTestData.DECODER_CLASS_NAME, pDParameters.getDecoderClassName()); + assertEquals(DECODER_CLASS_NAME, pDParameters.getDecoderClassName()); assertFalse(validationResult.isValid()); assertTrue(validationResult.getResult().contains( "field \"decoderType\" type \"java.lang.String\" value \"\" INVALID, must be a non-blank string")); @@ -58,9 +63,10 @@ public class TestPolicyDecoderParameters { @Test public void testPolicyDecoderParameters_InvalidDecoderClassName() { - final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters(CommonTestData.DECODER_TYPE, ""); + final PolicyDecoderParameters pDParameters = + new PolicyDecoderParameters(DECODER_TYPE, "", DECODER_CONFIGURATION_PARAMETERS); final GroupValidationResult validationResult = pDParameters.validate(); - assertEquals(CommonTestData.DECODER_TYPE, pDParameters.getDecoderType()); + assertEquals(DECODER_TYPE, pDParameters.getDecoderType()); assertEquals("", pDParameters.getDecoderClassName()); assertFalse(validationResult.isValid()); assertTrue(validationResult.getResult() @@ -70,7 +76,8 @@ public class TestPolicyDecoderParameters { @Test public void testPolicyDecoderParameters_InvalidDecoderTypeAndClassName() { - final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters("", ""); + final PolicyDecoderParameters pDParameters = + new PolicyDecoderParameters("", "", DECODER_CONFIGURATION_PARAMETERS); final GroupValidationResult validationResult = pDParameters.validate(); assertEquals("", pDParameters.getDecoderType()); assertEquals("", pDParameters.getDecoderClassName()); @@ -84,11 +91,11 @@ public class TestPolicyDecoderParameters { @Test public void testPolicyDecoderParameters_NullDecoderType() { - final PolicyDecoderParameters pDParameters = - new PolicyDecoderParameters(null, CommonTestData.DECODER_CLASS_NAME); + final PolicyDecoderParameters pDParameters = + new PolicyDecoderParameters(null, DECODER_CLASS_NAME, DECODER_CONFIGURATION_PARAMETERS); final GroupValidationResult validationResult = pDParameters.validate(); assertEquals(null, pDParameters.getDecoderType()); - assertEquals(CommonTestData.DECODER_CLASS_NAME, pDParameters.getDecoderClassName()); + assertEquals(DECODER_CLASS_NAME, pDParameters.getDecoderClassName()); assertFalse(validationResult.isValid()); assertTrue(validationResult.getResult().contains( "field \"decoderType\" type \"java.lang.String\" value \"null\" INVALID, must be a non-blank string")); @@ -96,9 +103,10 @@ public class TestPolicyDecoderParameters { @Test public void testPolicyDecoderParameters_NullDecoderClassName() { - final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters(CommonTestData.DECODER_TYPE, null); + final PolicyDecoderParameters pDParameters = + new PolicyDecoderParameters(DECODER_TYPE, null, DECODER_CONFIGURATION_PARAMETERS); final GroupValidationResult validationResult = pDParameters.validate(); - assertEquals(CommonTestData.DECODER_TYPE, pDParameters.getDecoderType()); + assertEquals(DECODER_TYPE, pDParameters.getDecoderType()); assertEquals(null, pDParameters.getDecoderClassName()); assertFalse(validationResult.isValid()); assertTrue(validationResult.getResult() @@ -108,11 +116,11 @@ public class TestPolicyDecoderParameters { @Test public void testPolicyDecoderParameters_InvalidDecoderClass() { - final PolicyDecoderParameters pDParameters = - new PolicyDecoderParameters(CommonTestData.DECODER_TYPE, CommonTestData.DECODER_CLASS_NAME + "Invalid"); + final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters(DECODER_TYPE, + DECODER_CLASS_NAME + "Invalid", DECODER_CONFIGURATION_PARAMETERS); final GroupValidationResult validationResult = pDParameters.validate(); - assertEquals(CommonTestData.DECODER_TYPE, pDParameters.getDecoderType()); - assertEquals(CommonTestData.DECODER_CLASS_NAME + "Invalid", pDParameters.getDecoderClassName()); + assertEquals(DECODER_TYPE, pDParameters.getDecoderType()); + assertEquals(DECODER_CLASS_NAME + "Invalid", pDParameters.getDecoderClassName()); assertFalse(validationResult.isValid()); assertTrue(validationResult.getResult().contains("policy decoder class not found in classpath")); } diff --git a/main/src/test/java/org/onap/policy/distribution/main/testclasses/DummyDecoder.java b/main/src/test/java/org/onap/policy/distribution/main/testclasses/DummyDecoder.java index 19e30933..d210d970 100644 --- a/main/src/test/java/org/onap/policy/distribution/main/testclasses/DummyDecoder.java +++ b/main/src/test/java/org/onap/policy/distribution/main/testclasses/DummyDecoder.java @@ -56,4 +56,7 @@ public class DummyDecoder implements PolicyDecoder { public Collection decode(final PolicyInput input) throws PolicyDecodingException { return policesToReturn; } + + @Override + public void configure(final String parameterGroupName) {} } diff --git a/main/src/test/java/org/onap/policy/distribution/main/testclasses/DummyPolicyDecoderParameterGroup.java b/main/src/test/java/org/onap/policy/distribution/main/testclasses/DummyPolicyDecoderParameterGroup.java new file mode 100644 index 00000000..5d1738c5 --- /dev/null +++ b/main/src/test/java/org/onap/policy/distribution/main/testclasses/DummyPolicyDecoderParameterGroup.java @@ -0,0 +1,64 @@ +/*- + * ============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.distribution.main.testclasses; + +import org.onap.policy.common.parameters.GroupValidationResult; +import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParameterGroup; + +/** + * Dummy policy decoder parameter group. + * + * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com) + */ +public class DummyPolicyDecoderParameterGroup extends PolicyDecoderConfigurationParameterGroup { + + private String policyName; + private String policyType; + + /** + * Constructor for instantiating the {@link DummyPolicyDecoderParameterGroup} class. + * + * @param policyName the policy name + * @param policyType the policy type + */ + public DummyPolicyDecoderParameterGroup(final String policyName, final String policyType) { + super(); + this.policyName = policyName; + this.policyType = policyType; + } + + + public String getPolicyName() { + return policyName; + } + + + public String getPolicyType() { + return policyType; + } + + @Override + public GroupValidationResult validate() { + final GroupValidationResult validationResult = new GroupValidationResult(this); + return validationResult; + } + +} diff --git a/main/src/test/resources/parameters/DistributionConfigParameters.json b/main/src/test/resources/parameters/DistributionConfigParameters.json index acf56764..71ca92e3 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters.json @@ -15,7 +15,8 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -50,5 +51,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_EmptyPolicyDecoder.json b/main/src/test/resources/parameters/DistributionConfigParameters_EmptyPolicyDecoder.json index e22af281..9e83ac19 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_EmptyPolicyDecoder.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_EmptyPolicyDecoder.json @@ -46,5 +46,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_EmptyPolicyForwarder.json b/main/src/test/resources/parameters/DistributionConfigParameters_EmptyPolicyForwarder.json index 4d271308..2a7174e0 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_EmptyPolicyForwarder.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_EmptyPolicyForwarder.json @@ -15,7 +15,8 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -45,5 +46,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_EmptyReceptionHandler.json b/main/src/test/resources/parameters/DistributionConfigParameters_EmptyReceptionHandler.json index c25b2e35..3560dbca 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_EmptyReceptionHandler.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_EmptyReceptionHandler.json @@ -30,5 +30,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } \ No newline at end of file diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_EmptyReceptionHandlerClass.json b/main/src/test/resources/parameters/DistributionConfigParameters_EmptyReceptionHandlerClass.json index ef129fd6..65ba903f 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_EmptyReceptionHandlerClass.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_EmptyReceptionHandlerClass.json @@ -15,7 +15,8 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -50,5 +51,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidDecoderAndForwarderParameters.json b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidDecoderAndForwarderParameters.json index bd52e186..28f2195e 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidDecoderAndForwarderParameters.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidDecoderAndForwarderParameters.json @@ -15,15 +15,18 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" }, "APEXDecoder":{ "decoderType":"", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.PolicyDecoderApexPdpa" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.PolicyDecoderApexPdpa", + "decoderConfigurationParameters": "dummyDecoderConfiguration" }, "DROOLSDecoder":{ "decoderType":"DROOLS", - "decoderClassName":"" + "decoderClassName":"", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -69,5 +72,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidDecoderConfigurationClassName.json b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidDecoderConfigurationClassName.json new file mode 100644 index 00000000..cba76644 --- /dev/null +++ b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidDecoderConfigurationClassName.json @@ -0,0 +1,64 @@ +{ + "name":"SDCDistributionGroup", + "restServerParameters":{ + "host":"0.0.0.0", + "port":6969, + "userName":"healthcheck", + "password":"zb!XztG34" + }, + "receptionHandlerParameters":{ + "DummyReceptionHandler":{ + "receptionHandlerType":"DummyReceptionHandler", + "receptionHandlerClassName":"org.onap.policy.distribution.main.testclasses.DummyReceptionHandler", + "receptionHandlerConfigurationName":"dummyReceptionHandlerConfiguration", + "pluginHandlerParameters":{ + "policyDecoders":{ + "DummyDecoder":{ + "decoderType":"DummyDecoder", + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" + } + }, + "policyForwarders":{ + "DummyForwarder":{ + "forwarderType":"DummyForwarder", + "forwarderClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyForwarder", + "forwarderConfigurationParameters": "dummyConfiguration" + } + } + } + } + }, + "receptionHandlerConfigurationParameters":{ + "dummyReceptionHandlerConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyReceptionHandlerParameterGroup", + "parameters":{ + "myStringParameter": "stringValue", + "myIntegerParameter":20, + "myBooleanParameter": true + } + } + }, + "policyForwarderConfigurationParameters":{ + "dummyConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyForwarderParameterGroup", + "parameters":{ + "useHttps": false, + "hostname": "192.168.99.100", + "port": 8081, + "userName": "user", + "password": "pw123", + "isManaged": true + } + } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } + } +} diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidForwarderConfigurationClassName.json b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidForwarderConfigurationClassName.json index 60c28e08..13265c8a 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidForwarderConfigurationClassName.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidForwarderConfigurationClassName.json @@ -15,7 +15,8 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -50,5 +51,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidName.json b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidName.json index 46207204..9a0b309f 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidName.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidName.json @@ -15,7 +15,8 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -50,5 +51,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidReceptionHandlerClass.json b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidReceptionHandlerClass.json index d033a730..350ace9e 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidReceptionHandlerClass.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidReceptionHandlerClass.json @@ -15,7 +15,8 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -50,5 +51,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidReceptionHandlerParameters.json b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidReceptionHandlerParameters.json index 123ff203..6776c370 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidReceptionHandlerParameters.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidReceptionHandlerParameters.json @@ -15,7 +15,8 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -50,5 +51,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidRestServerParameters.json b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidRestServerParameters.json index 47528ce0..b5fd9a7a 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_InvalidRestServerParameters.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_InvalidRestServerParameters.json @@ -15,7 +15,8 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -50,5 +51,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_NoPolicyDecoder.json b/main/src/test/resources/parameters/DistributionConfigParameters_NoPolicyDecoder.json index f78bb65f..a007c30b 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_NoPolicyDecoder.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_NoPolicyDecoder.json @@ -44,5 +44,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_NoPolicyForwarder.json b/main/src/test/resources/parameters/DistributionConfigParameters_NoPolicyForwarder.json index 3ac54f73..72608b3b 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_NoPolicyForwarder.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_NoPolicyForwarder.json @@ -15,7 +15,8 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } } } @@ -30,5 +31,14 @@ "myBooleanParameter": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_UnknownDecoderConfigurationClassName.json b/main/src/test/resources/parameters/DistributionConfigParameters_UnknownDecoderConfigurationClassName.json new file mode 100644 index 00000000..2ce665f9 --- /dev/null +++ b/main/src/test/resources/parameters/DistributionConfigParameters_UnknownDecoderConfigurationClassName.json @@ -0,0 +1,64 @@ +{ + "name":"SDCDistributionGroup", + "restServerParameters":{ + "host":"0.0.0.0", + "port":6969, + "userName":"healthcheck", + "password":"zb!XztG34" + }, + "receptionHandlerParameters":{ + "DummyReceptionHandler":{ + "receptionHandlerType":"DummyReceptionHandler", + "receptionHandlerClassName":"org.onap.policy.distribution.main.testclasses.DummyReceptionHandler", + "receptionHandlerConfigurationName":"dummyReceptionHandlerConfiguration", + "pluginHandlerParameters":{ + "policyDecoders":{ + "DummyDecoder":{ + "decoderType":"DummyDecoder", + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" + } + }, + "policyForwarders":{ + "DummyForwarder":{ + "forwarderType":"DummyForwarder", + "forwarderClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyForwarder", + "forwarderConfigurationParameters": "dummyConfiguration" + } + } + } + } + }, + "receptionHandlerConfigurationParameters":{ + "dummyReceptionHandlerConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyReceptionHandlerParameterGroup", + "parameters":{ + "myStringParameter": "stringValue", + "myIntegerParameter":20, + "myBooleanParameter": true + } + } + }, + "policyForwarderConfigurationParameters":{ + "dummyConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyForwarderParameterGroup", + "parameters":{ + "useHttps": false, + "hostname": "192.168.99.100", + "port": 8081, + "userName": "user", + "password": "pw123", + "isManaged": true + } + } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.Unknown", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } + } +} diff --git a/main/src/test/resources/parameters/DistributionConfigParameters_UnknownForwarderConfigurationClassName.json b/main/src/test/resources/parameters/DistributionConfigParameters_UnknownForwarderConfigurationClassName.json index 3118631b..1883b221 100644 --- a/main/src/test/resources/parameters/DistributionConfigParameters_UnknownForwarderConfigurationClassName.json +++ b/main/src/test/resources/parameters/DistributionConfigParameters_UnknownForwarderConfigurationClassName.json @@ -10,35 +10,13 @@ "DummyReceptionHandler":{ "receptionHandlerType":"DummyReceptionHandler", "receptionHandlerClassName":"org.onap.policy.distribution.main.testclasses.DummyReceptionHandler", - "pssdConfiguration":{ - "asdcAddress": "localhost", - "messageBusAddress": [ - "a.com", - "b.com", - "c.com" - ], - "user": "tbdsdc-1480", - "password": "tbdsdc-1480", - "pollingInterval":20, - "pollingTimeout":30, - "consumerId": "policy-id", - "artifactTypes": [ - "TOSCA_CSAR", - "HEAT" - ], - "consumerGroup": "policy-group", - "environmentName": "environmentName", - "keystorePath": "null", - "keystorePassword": "null", - "activeserverTlsAuth": false, - "isFilterinEmptyResources": true, - "isUseHttpsWithDmaap": false - }, + "receptionHandlerConfigurationName":"dummyReceptionHandlerConfiguration", "pluginHandlerParameters":{ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationParameters": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -73,5 +51,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/main/src/test/resources/parameters/MinimumParameters.json b/main/src/test/resources/parameters/MinimumParameters.json index fc6b16aa..5401d924 100644 --- a/main/src/test/resources/parameters/MinimumParameters.json +++ b/main/src/test/resources/parameters/MinimumParameters.json @@ -15,7 +15,8 @@ "policyDecoders":{ "DummyDecoder":{ "decoderType":"DummyDecoder", - "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder" + "decoderClassName":"org.onap.policy.distribution.main.testclasses.DummyDecoder", + "decoderConfigurationName": "dummyDecoderConfiguration" } }, "policyForwarders":{ @@ -50,5 +51,14 @@ "isManaged": true } } + }, + "policyDecoderConfigurationParameters":{ + "dummyDecoderConfiguration":{ + "parameterClassName":"org.onap.policy.distribution.main.testclasses.DummyPolicyDecoderParameterGroup", + "parameters":{ + "policyName": "SamplePolicy", + "policyType": "DUMMY" + } + } } } diff --git a/model/src/main/java/org/onap/policy/distribution/model/ApexPdpPolicy.java b/model/src/main/java/org/onap/policy/distribution/model/PolicyAsString.java similarity index 66% rename from model/src/main/java/org/onap/policy/distribution/model/ApexPdpPolicy.java rename to model/src/main/java/org/onap/policy/distribution/model/PolicyAsString.java index a8f45764..1600d8f7 100644 --- a/model/src/main/java/org/onap/policy/distribution/model/ApexPdpPolicy.java +++ b/model/src/main/java/org/onap/policy/distribution/model/PolicyAsString.java @@ -20,35 +20,36 @@ package org.onap.policy.distribution.model; -import java.io.InputStream; - /** - * This class represents an apex-pdp policy which can be decoded by a relevant {@link PolicyDecoder}. + * This class represents a policy which can be decoded by a relevant {@link PolicyDecoder}. * * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com) */ -public class ApexPdpPolicy implements Policy { +public class PolicyAsString implements Policy { private String policyName; - private InputStream policyInputStream; + private String policyType; + private String policy; /** - * Constructor for creating instance of {@link ApexPdpPolicy}. + * Constructor for creating instance of {@link PolicyAsString}. * * @param policyName the policy file name - * @param policyInputStream the input stream + * @param policyType the policy type + * @param policy the policy */ - public ApexPdpPolicy(final String policyName, final InputStream policyInputStream) { + public PolicyAsString(final String policyName, final String policyType, final String policy) { this.policyName = policyName; - this.policyInputStream = policyInputStream; + this.policyType = policyType; + this.policy = policy; } /** - * Returns the policyInputStream of this ApexPdpPolicy instance. + * Returns the policy of this {@link PolicyAsString} instance. * - * @return the policyInputStream + * @return the policy */ - public InputStream getPolicyInputStream() { - return policyInputStream; + public String getPolicy() { + return policy; } /** @@ -64,6 +65,6 @@ public class ApexPdpPolicy implements Policy { */ @Override public String getPolicyType() { - return "Method not supported"; + return policyType; } } diff --git a/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarder.java b/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarder.java index 1a603f04..f71c6aee 100644 --- a/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarder.java +++ b/plugins/forwarding-plugins/src/main/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarder.java @@ -20,8 +20,11 @@ package org.onap.policy.distribution.forwarding.apex.pdp; +import java.io.IOException; +import java.io.InputStream; import java.util.Collection; +import org.apache.commons.io.IOUtils; import org.onap.policy.apex.core.deployment.EngineServiceFacade; import org.onap.policy.apex.model.basicmodel.concepts.ApexException; import org.onap.policy.common.logging.flexlogger.FlexLogger; @@ -30,8 +33,8 @@ import org.onap.policy.common.parameters.ParameterService; import org.onap.policy.distribution.forwarding.PolicyForwarder; import org.onap.policy.distribution.forwarding.PolicyForwardingException; import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpPolicyForwarder; -import org.onap.policy.distribution.model.ApexPdpPolicy; import org.onap.policy.distribution.model.Policy; +import org.onap.policy.distribution.model.PolicyAsString; /** * This class provides an implementation of {@link PolicyForwarder} interface for forwarding the given policies to @@ -42,6 +45,7 @@ import org.onap.policy.distribution.model.Policy; public class ApexPdpPolicyForwarder implements PolicyForwarder { private static final Logger LOGGER = FlexLogger.getLogger(XacmlPdpPolicyForwarder.class); + private static final String POLICY_TYPE = "APEX"; private ApexPdpPolicyForwarderParameterGroup apexForwarderParameters; private EngineServiceFacade engineServiceFacade; @@ -69,8 +73,9 @@ public class ApexPdpPolicyForwarder implements PolicyForwarder { } else { final Policy policy = (Policy) policies.toArray()[0]; - if (policy.getClass().isAssignableFrom(ApexPdpPolicy.class)) { - forwardPolicy((ApexPdpPolicy) policy); + if (policy.getClass().isAssignableFrom(PolicyAsString.class) + && policy.getPolicyType().equalsIgnoreCase(POLICY_TYPE)) { + forwardPolicy((PolicyAsString) policy); } else { final String message = "Ignoring the policy as it is not an apex-pdp policy"; LOGGER.debug(message); @@ -85,16 +90,17 @@ public class ApexPdpPolicyForwarder implements PolicyForwarder { * @param apexPolicy the apex policy * @throws PolicyForwardingException if any exception occurs while forwarding policy */ - private void forwardPolicy(final ApexPdpPolicy apexPolicy) throws PolicyForwardingException { + private void forwardPolicy(final PolicyAsString apexPolicy) throws PolicyForwardingException { try { engineServiceFacade.init(); - engineServiceFacade.deployModel(apexPolicy.getPolicyName(), apexPolicy.getPolicyInputStream(), + final InputStream policyInputStream = IOUtils.toInputStream(apexPolicy.getPolicy(), "UTF-8"); + engineServiceFacade.deployModel(apexPolicy.getPolicyName(), policyInputStream, apexForwarderParameters.isIgnoreConflicts(), apexForwarderParameters.isForceUpdate()); LOGGER.debug("Sucessfully forwarded the policy to apex-pdp egine at " + apexForwarderParameters.getHostname() + ":" + apexForwarderParameters.getPort()); - } catch (final ApexException exp) { + } catch (final ApexException | IOException exp) { final String message = "Error sending policy to apex-pdp engine at" + apexForwarderParameters.getHostname() + ":" + apexForwarderParameters.getPort(); LOGGER.error(message, exp); diff --git a/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarderParameterGroupTest.java b/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarderParameterGroupTest.java index ca0efb5c..7feef452 100644 --- a/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarderParameterGroupTest.java +++ b/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarderParameterGroupTest.java @@ -27,6 +27,11 @@ import static org.junit.Assert.assertTrue; import org.junit.Test; import org.onap.policy.common.parameters.ValidationStatus; +/** + * Class to perform unit test of {@link ApexPdpPolicyForwarderParameterGroup}. + * + * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com) + */ public class ApexPdpPolicyForwarderParameterGroupTest { @Test diff --git a/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarderTest.java b/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarderTest.java index abf5b508..a4d1b9fd 100644 --- a/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarderTest.java +++ b/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/apex/pdp/ApexPdpPolicyForwarderTest.java @@ -22,11 +22,11 @@ package org.onap.policy.distribution.forwarding.apex.pdp; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.Field; @@ -45,9 +45,14 @@ import org.onap.policy.apex.model.basicmodel.concepts.ApexException; import org.onap.policy.common.parameters.ParameterGroup; import org.onap.policy.common.parameters.ParameterService; import org.onap.policy.distribution.forwarding.PolicyForwardingException; -import org.onap.policy.distribution.model.ApexPdpPolicy; import org.onap.policy.distribution.model.Policy; +import org.onap.policy.distribution.model.PolicyAsString; +/** + * Class to perform unit test of {@link ApexPdpPolicyForwarder}. + * + * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com) + */ @RunWith(MockitoJUnitRunner.class) public class ApexPdpPolicyForwarderTest { @@ -84,7 +89,6 @@ public class ApexPdpPolicyForwarderTest { public void testForwardPolicy() throws ApexException, FileNotFoundException, IOException, PolicyForwardingException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { - final FileInputStream fis = new FileInputStream(File.createTempFile("policy1", null)); final Collection policies = new ArrayList<>(); final ApexPdpPolicyForwarder forwarder = new ApexPdpPolicyForwarder(); forwarder.configure(GROUP_NAME); @@ -93,13 +97,14 @@ public class ApexPdpPolicyForwarderTest { forwarderField.setAccessible(true); forwarderField.set(forwarder, engineServiceFacade); - final ApexPdpPolicy policy = new ApexPdpPolicy("policy", fis); + final PolicyAsString policy = new PolicyAsString("policy", "APEX", "Sample Policy of apex"); policies.add(policy); try { forwarder.forward(policies); verify(engineServiceFacade, times(1)).init(); - verify(engineServiceFacade, times(1)).deployModel("policy", fis, IGNORE_CONFLICTS, FORCE_UPDATE); + verify(engineServiceFacade, times(1)).deployModel(eq("policy"), anyObject(), eq(IGNORE_CONFLICTS), + eq(FORCE_UPDATE)); } catch (final Exception exp) { fail("Test must not throw an exception"); } @@ -110,19 +115,18 @@ public class ApexPdpPolicyForwarderTest { throws ApexException, FileNotFoundException, IOException, PolicyForwardingException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { - final FileInputStream fis = new FileInputStream(File.createTempFile("policy1", null)); final Collection policies = new ArrayList<>(); final ApexPdpPolicyForwarder forwarder = new ApexPdpPolicyForwarder(); forwarder.configure(GROUP_NAME); - Mockito.doThrow(new ApexException("Failed")).when(engineServiceFacade).deployModel("policy1", fis, - IGNORE_CONFLICTS, FORCE_UPDATE); + Mockito.doThrow(new ApexException("Failed")).when(engineServiceFacade).deployModel(eq("policy1"), anyObject(), + eq(IGNORE_CONFLICTS), eq(FORCE_UPDATE)); final Field decodersField = forwarder.getClass().getDeclaredField("engineServiceFacade"); decodersField.setAccessible(true); decodersField.set(forwarder, engineServiceFacade); - final ApexPdpPolicy policy1 = new ApexPdpPolicy("policy1", fis); + final PolicyAsString policy1 = new PolicyAsString("policy1", "APEX", "Sample Policy of apex"); policies.add(policy1); try { @@ -147,12 +151,10 @@ public class ApexPdpPolicyForwarderTest { forwarderField.setAccessible(true); forwarderField.set(forwarder, engineServiceFacade); - final ApexPdpPolicy policy1 = - new ApexPdpPolicy("policy1", new FileInputStream(File.createTempFile("policy1", null))); + final PolicyAsString policy1 = new PolicyAsString("policy1", "APEX", "Sample Policy of apex"); policies.add(policy1); - final ApexPdpPolicy policy2 = - new ApexPdpPolicy("policy2", new FileInputStream(File.createTempFile("policy2", null))); + final PolicyAsString policy2 = new PolicyAsString("policy2", "APEX", "Sample Policy of apex"); policies.add(policy2); try { diff --git a/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/testclasses/DummyDecoder.java b/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/testclasses/DummyDecoder.java index e09357cf..c90917b8 100644 --- a/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/testclasses/DummyDecoder.java +++ b/plugins/forwarding-plugins/src/test/java/org/onap/policy/distribution/forwarding/xacml/pdp/testclasses/DummyDecoder.java @@ -56,4 +56,7 @@ public class DummyDecoder implements PolicyDecoder { public Collection decode(final PolicyInput input) throws PolicyDecodingException { return policesToReturn; } + + @Override + public void configure(final String parameterGroupName) {} } diff --git a/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/pdpx/PolicyDecoderCsarPdpx.java b/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/pdpx/PolicyDecoderCsarPdpx.java index 0cd7bc16..6c4f285a 100644 --- a/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/pdpx/PolicyDecoderCsarPdpx.java +++ b/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/pdpx/PolicyDecoderCsarPdpx.java @@ -5,15 +5,15 @@ * 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========================================================= */ @@ -22,26 +22,18 @@ package org.onap.policy.distribution.reception.decoding.pdpx; import java.io.File; import java.util.ArrayList; -import java.util.List; - import java.util.Collection; -import java.util.Collections; - +import java.util.List; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; - -import org.onap.policy.distribution.model.PolicyInput; import org.onap.policy.distribution.model.Csar; +import org.onap.policy.distribution.model.PolicyInput; import org.onap.policy.distribution.reception.decoding.PolicyDecoder; import org.onap.policy.distribution.reception.decoding.PolicyDecodingException; - import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; -import org.onap.sdc.tosca.parser.impl.SdcCsarHelperImpl; import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; - import org.onap.sdc.toscaparser.api.NodeTemplate; -import org.onap.sdc.toscaparser.api.elements.Metadata; /** * Decodes PDP-X policies from a TOSCA file. @@ -51,16 +43,16 @@ public class PolicyDecoderCsarPdpx implements PolicyDecoder { private static final Logger LOGGER = FlexLogger.getLogger(PolicyDecoderCsarPdpx.class); @Override - public Collection decode(Csar csar) throws PolicyDecodingException { - // logic for generating the policies from the CSAR. - List lPdpxPolicy = new ArrayList<>(); - ISdcCsarHelper sdcCsarHelper = parseCsar(csar); - List lnodeVf = sdcCsarHelper.getServiceVfList(); + public Collection decode(final Csar csar) throws PolicyDecodingException { + // logic for generating the policies from the CSAR. + final List lPdpxPolicy = new ArrayList<>(); + final ISdcCsarHelper sdcCsarHelper = parseCsar(csar); + final List lnodeVf = sdcCsarHelper.getServiceVfList(); LOGGER.debug("the size of Vf = " + lnodeVf.size()); - ExtractFromNode extractFromNode = new ExtractFromNode(); + final ExtractFromNode extractFromNode = new ExtractFromNode(); extractFromNode.setSdcCsarHelper(sdcCsarHelper); - for ( NodeTemplate node : lnodeVf) { - PdpxPolicy ret = extractFromNode.extractInfo(node); + for (final NodeTemplate node : lnodeVf) { + final PdpxPolicy ret = extractFromNode.extractInfo(node); if (ret != null) { lPdpxPolicy.add(ret); } @@ -69,34 +61,37 @@ public class PolicyDecoderCsarPdpx implements PolicyDecoder { } @Override - public boolean canHandle(PolicyInput policyInput) { + public boolean canHandle(final PolicyInput policyInput) { return policyInput.getClass().isAssignableFrom(Csar.class); } - /** + /** * Parse the input Csar by SDC tosca tool. * * @param csar represents the service TOSCA Csar * @return the object to represents the content of input csar * @throws PolicyDecodingException if parse fails */ - public ISdcCsarHelper parseCsar(Csar csar) throws PolicyDecodingException { - ISdcCsarHelper sdcCsarHelper ; + public ISdcCsarHelper parseCsar(final Csar csar) throws PolicyDecodingException { + ISdcCsarHelper sdcCsarHelper; try { - SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();//Autoclosable + final SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance();// Autoclosable LOGGER.debug("tosca File Path = " + csar.getCsarPath()); - File spoolFile = new File(csar.getCsarPath()); + final File spoolFile = new File(csar.getCsarPath()); sdcCsarHelper = factory.getSdcCsarHelper(spoolFile.getAbsolutePath()); - } catch (Exception e) { - LOGGER.error("Exception got in parseTosca",e); - throw new PolicyDecodingException ("Exception caught when passing the csar file to the parser ", e); + } catch (final Exception e) { + LOGGER.error("Exception got in parseTosca", e); + throw new PolicyDecodingException("Exception caught when passing the csar file to the parser ", e); } return sdcCsarHelper; } + @Override + public void configure(final String parameterGroupName) {} + } diff --git a/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/pdpx/PolicyDecoderToscaPdpx.java b/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/pdpx/PolicyDecoderToscaPdpx.java index fa993579..40b33359 100644 --- a/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/pdpx/PolicyDecoderToscaPdpx.java +++ b/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/pdpx/PolicyDecoderToscaPdpx.java @@ -5,15 +5,15 @@ * 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========================================================= */ @@ -22,6 +22,7 @@ package org.onap.policy.distribution.reception.decoding.pdpx; import java.util.Collection; import java.util.Collections; + import org.onap.policy.distribution.model.PolicyInput; import org.onap.policy.distribution.model.Tosca; import org.onap.policy.distribution.reception.decoding.PolicyDecoder; @@ -32,14 +33,17 @@ import org.onap.policy.distribution.reception.decoding.PolicyDecoder; public class PolicyDecoderToscaPdpx implements PolicyDecoder { @Override - public Collection decode(Tosca tosca) { + public Collection decode(final Tosca tosca) { // Add logic for generating the policies from the TOSCA return Collections.emptySet(); } @Override - public boolean canHandle(PolicyInput policyInput) { + public boolean canHandle(final PolicyInput policyInput) { return policyInput.getClass().isAssignableFrom(Tosca.class); } + @Override + public void configure(final String parameterGroupName) {} + } diff --git a/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicy.java b/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicy.java new file mode 100644 index 00000000..9516ad70 --- /dev/null +++ b/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicy.java @@ -0,0 +1,94 @@ +/*- + * ============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.distribution.reception.decoding.policy.file; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import org.apache.commons.io.IOUtils; +import org.onap.policy.common.logging.flexlogger.FlexLogger; +import org.onap.policy.common.logging.flexlogger.Logger; +import org.onap.policy.common.parameters.ParameterService; +import org.onap.policy.distribution.model.Csar; +import org.onap.policy.distribution.model.PolicyAsString; +import org.onap.policy.distribution.model.PolicyInput; +import org.onap.policy.distribution.reception.decoding.PolicyDecoder; +import org.onap.policy.distribution.reception.decoding.PolicyDecodingException; + +/** + * This class extracts policy files from a CSAR file. + * + * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com) + */ +public class PolicyDecoderFileInCsarToPolicy implements PolicyDecoder { + + private static final Logger LOGGER = FlexLogger.getLogger(PolicyDecoderFileInCsarToPolicy.class); + PolicyDecoderFileInCsarToPolicyParameterGroup decoderParameters; + + /** + * {@inheritDoc}. + */ + @Override + public void configure(final String parameterGroupName) { + decoderParameters = ParameterService.get(parameterGroupName); + } + + /** + * {@inheritDoc}. + */ + @Override + public boolean canHandle(final PolicyInput policyInput) { + return policyInput.getClass().isAssignableFrom(Csar.class); + } + + /** + * {@inheritDoc}. + */ + @Override + public Collection decode(final Csar csar) throws PolicyDecodingException { + final Collection policyList = new ArrayList<>(); + + try (ZipFile zipFile = new ZipFile(csar.getCsarPath())) { + final Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + final ZipEntry entry = entries.nextElement(); + if (entry.getName().contains(decoderParameters.getPolicyFileName())) { + final StringWriter writer = new StringWriter(); + IOUtils.copy(zipFile.getInputStream(entry), writer, "UTF-8"); + final PolicyAsString poilcy = new PolicyAsString(decoderParameters.getPolicyFileName(), + decoderParameters.getPolicyType(), writer.toString()); + policyList.add(poilcy); + } + } + } catch (final IOException exp) { + final String message = "Failed decoding the policy"; + LOGGER.error(message, exp); + throw new PolicyDecodingException(message, exp); + } + + return policyList; + } +} diff --git a/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyParameterGroup.java b/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyParameterGroup.java new file mode 100644 index 00000000..958180db --- /dev/null +++ b/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyParameterGroup.java @@ -0,0 +1,70 @@ +/*- + * ============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.distribution.reception.decoding.policy.file; + +import org.onap.policy.common.parameters.GroupValidationResult; +import org.onap.policy.common.parameters.ValidationStatus; +import org.onap.policy.common.utils.validation.ParameterValidationUtils; +import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParameterGroup; + +/** + * Holds the parameters for the{@link PolicyDecoderFileInCsarToPolicy}. + * + * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com) + */ +public class PolicyDecoderFileInCsarToPolicyParameterGroup extends PolicyDecoderConfigurationParameterGroup { + + private String policyFileName; + private String policyType; + + /** + * Constructor for instantiating {@link PolicyDecoderFileInCsarToPolicyParameterGroup} class. + * + * @param policyFileName the policy file name + * @param policyType the policy type + */ + public PolicyDecoderFileInCsarToPolicyParameterGroup(final String policyFileName, final String policyType) { + this.policyFileName = policyFileName; + this.policyType = policyType; + } + + public String getPolicyFileName() { + return policyFileName; + } + + public String getPolicyType() { + return policyType; + } + + @Override + public GroupValidationResult validate() { + final GroupValidationResult validationResult = new GroupValidationResult(this); + if (!ParameterValidationUtils.validateStringParameter(policyFileName)) { + validationResult.setResult("policyFileName", ValidationStatus.INVALID, + "must be a non-blank string containing the policy file name"); + } + if (!ParameterValidationUtils.validateStringParameter(policyType)) { + validationResult.setResult("policyType", ValidationStatus.INVALID, + "must be a non-blank string containing the policy type"); + } + return validationResult; + } +} diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestAttribute.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestAttribute.java similarity index 100% rename from plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestAttribute.java rename to plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestAttribute.java diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestContent.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestContent.java similarity index 100% rename from plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestContent.java rename to plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestContent.java diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestDirective.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestDirective.java similarity index 100% rename from plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestDirective.java rename to plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestDirective.java diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestFlavorFeature.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestFlavorFeature.java similarity index 100% rename from plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestFlavorFeature.java rename to plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestFlavorFeature.java diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestFlavorProperty.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestFlavorProperty.java similarity index 100% rename from plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestFlavorProperty.java rename to plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestFlavorProperty.java diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestHpaFeatureAttribute.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestHpaFeatureAttribute.java similarity index 100% rename from plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestHpaFeatureAttribute.java rename to plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestHpaFeatureAttribute.java diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestPolicyDecoderCsarPdpx.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestPolicyDecoderCsarPdpx.java similarity index 100% rename from plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/decoding/pdpx/TestPolicyDecoderCsarPdpx.java rename to plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/pdpx/TestPolicyDecoderCsarPdpx.java diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyParameterGroupTest.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyParameterGroupTest.java new file mode 100644 index 00000000..0ea08905 --- /dev/null +++ b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyParameterGroupTest.java @@ -0,0 +1,65 @@ +/*- + * ============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.distribution.reception.decoding.policy.file; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.onap.policy.common.parameters.ValidationStatus; +import org.onap.policy.distribution.reception.decoding.policy.file.PolicyDecoderFileInCsarToPolicyParameterGroup; + +/** + * Class to perform unit test of {@link PolicyDecoderFileInCsarToPolicyParameterGroup}. + * + * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com) + */ +public class PolicyDecoderFileInCsarToPolicyParameterGroupTest { + + @Test + public void testConstructorAndGetters() { + final PolicyDecoderFileInCsarToPolicyParameterGroup configurationParameters = + new PolicyDecoderFileInCsarToPolicyParameterGroup("SamplePolicy", "APEX"); + configurationParameters.setName("myConfiguration"); + + assertEquals("myConfiguration", configurationParameters.getName()); + assertEquals("SamplePolicy", configurationParameters.getPolicyFileName()); + assertEquals("APEX", configurationParameters.getPolicyType()); + assertEquals(ValidationStatus.CLEAN, configurationParameters.validate().getStatus()); + } + + @Test + public void testInvalidPolicyFileName() { + final PolicyDecoderFileInCsarToPolicyParameterGroup configurationParameters = + new PolicyDecoderFileInCsarToPolicyParameterGroup("", "APEX"); + configurationParameters.setName("myConfiguration"); + + assertEquals(ValidationStatus.INVALID, configurationParameters.validate().getStatus()); + } + + @Test + public void testInvalidPolicyType() { + final PolicyDecoderFileInCsarToPolicyParameterGroup configurationParameters = + new PolicyDecoderFileInCsarToPolicyParameterGroup("SamplePolicy", ""); + configurationParameters.setName("myConfiguration"); + + assertEquals(ValidationStatus.INVALID, configurationParameters.validate().getStatus()); + } +} diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyTest.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyTest.java new file mode 100644 index 00000000..e40ab3fe --- /dev/null +++ b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyTest.java @@ -0,0 +1,109 @@ +/*- + * ============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.distribution.reception.decoding.policy.file; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; +import org.onap.policy.common.parameters.ParameterService; +import org.onap.policy.distribution.model.Csar; +import org.onap.policy.distribution.model.PolicyAsString; + +/** + * Class to perform unit test of {@link PolicyDecoderFileInCsarToPolicy}. + * + * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com) + */ +@RunWith(MockitoJUnitRunner.class) +public class PolicyDecoderFileInCsarToPolicyTest { + + private static final String POLICY_FILE_NAME = "SamplePolicyModelJAVASCRIPT"; + private static final String POLICY_TYPE = "APEX"; + private static final String GROUP_NAME = "apexPdpDecoderConfiguration"; + + /** + * Set up. + */ + @BeforeClass + public static void setUp() { + final PolicyDecoderFileInCsarToPolicyParameterGroup configurationParameters = + new PolicyDecoderFileInCsarToPolicyParameterGroup(POLICY_FILE_NAME, POLICY_TYPE); + configurationParameters.setName(GROUP_NAME); + ParameterService.register(configurationParameters); + } + + /** + * Tear down. + */ + @AfterClass + public static void tearDown() { + ParameterService.deregister(GROUP_NAME); + } + + @Test + public void testDecodePolicy() { + + final PolicyDecoderFileInCsarToPolicy decoder = new PolicyDecoderFileInCsarToPolicy(); + decoder.configure(GROUP_NAME); + + final File file = new File("src/test/resources/sampleTestService.csar"); + final Csar csar = new Csar(file.getAbsolutePath()); + + try { + decoder.canHandle(csar); + final Collection policyHolders = decoder.decode(csar); + for (final PolicyAsString policy : policyHolders) { + assertEquals(POLICY_FILE_NAME, policy.getPolicyName()); + assertEquals(POLICY_TYPE, policy.getPolicyType()); + } + } catch (final Exception exp) { + fail("Test must not throw an exception"); + } + } + + @Test + public void testDecodePolicyError() throws IOException { + + final PolicyDecoderFileInCsarToPolicy decoder = new PolicyDecoderFileInCsarToPolicy(); + decoder.configure(GROUP_NAME); + + final File file = new File("unknown.csar"); + final Csar csar = new Csar(file.getAbsolutePath()); + + try { + decoder.canHandle(csar); + decoder.decode(csar); + fail("Test must throw an exception"); + } catch (final Exception exp) { + assertTrue(exp.getMessage().contains("Failed decoding the policy")); + } + } +} diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/sdc/DummyDecoder.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/sdc/DummyDecoder.java index 6a33e787..fd61c43d 100644 --- a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/sdc/DummyDecoder.java +++ b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/sdc/DummyDecoder.java @@ -64,4 +64,7 @@ public class DummyDecoder implements PolicyDecoder { public DummyPolicy getDecodedPolicy() { return decodedPolicy; } + + @Override + public void configure(final String parameterGroupName) {} } diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/sdc/TestSdcReceptionHandler.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/sdc/TestSdcReceptionHandler.java index c4020a41..231c50ff 100644 --- a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/sdc/TestSdcReceptionHandler.java +++ b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/handling/sdc/TestSdcReceptionHandler.java @@ -322,7 +322,7 @@ public class TestSdcReceptionHandler { private Map getPolicyDecoders() { final Map policyDecoders = new HashMap(); final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters("DummyDecoder", - "org.onap.policy.distribution.reception.handling.sdc.DummyDecoder"); + "org.onap.policy.distribution.reception.handling.sdc.DummyDecoder", "DummyDecoderConfiguration"); policyDecoders.put("DummyDecoderKey", pDParameters); return policyDecoders; } diff --git a/plugins/reception-plugins/src/test/resources/sampleTestService.csar b/plugins/reception-plugins/src/test/resources/sampleTestService.csar new file mode 100644 index 0000000000000000000000000000000000000000..387f1baef7f61bb58b2aeeac8603c18d25b2aef2 GIT binary patch literal 198643 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 { + /** + * Configure the policy decoder. This method will be invoked immediately after instantiation in order for the policy + * decoder to configure itself. + * + * @param parameterGroupName the name of the parameter group which contains the configuration for the policy decoder + */ + void configure(String parameterGroupName); + /** * Can the decoder handle input of the specified type. * diff --git a/reception/src/main/java/org/onap/policy/distribution/reception/handling/PluginHandler.java b/reception/src/main/java/org/onap/policy/distribution/reception/handling/PluginHandler.java index e6bfefea..74b8eb16 100644 --- a/reception/src/main/java/org/onap/policy/distribution/reception/handling/PluginHandler.java +++ b/reception/src/main/java/org/onap/policy/distribution/reception/handling/PluginHandler.java @@ -92,6 +92,7 @@ public class PluginHandler { (Class>) Class .forName(decoderParameters.getDecoderClassName()); final PolicyDecoder decoder = policyDecoderClass.newInstance(); + decoder.configure(decoderParameters.getDecoderConfigurationName()); policyDecoders.add(decoder); } catch (final ClassNotFoundException | InstantiationException | IllegalAccessException exp) { LOGGER.error("exception occured while initializing decoders", exp); diff --git a/reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderConfigurationParameterGroup.java b/reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderConfigurationParameterGroup.java new file mode 100644 index 00000000..00ae0a3a --- /dev/null +++ b/reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderConfigurationParameterGroup.java @@ -0,0 +1,45 @@ +/*- + * ============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.distribution.reception.parameters; + +import org.onap.policy.common.parameters.ParameterGroup; +import org.onap.policy.distribution.reception.decoding.PolicyDecoder; + +/** + * Base class of all {@link ParameterGroup} classes for configuration parameters for {@link PolicyDecoder} classes. + * + * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com) + */ +public abstract class PolicyDecoderConfigurationParameterGroup implements ParameterGroup { + + private String name; + + @Override + public String getName() { + return name; + } + + @Override + public void setName(final String name) { + this.name = name; + } + +} diff --git a/reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderConfigurationParametersJsonAdapter.java b/reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderConfigurationParametersJsonAdapter.java new file mode 100644 index 00000000..64eb4ed7 --- /dev/null +++ b/reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderConfigurationParametersJsonAdapter.java @@ -0,0 +1,84 @@ +/*- + * ============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.distribution.reception.parameters; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; + +import java.lang.reflect.Type; + +import org.slf4j.ext.XLogger; +import org.slf4j.ext.XLoggerFactory; + +/** + * This class deserialises policy decoder parameters from JSON. + * + * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com) + */ +public class PolicyDecoderConfigurationParametersJsonAdapter + implements JsonDeserializer { + private static final XLogger LOGGER = + XLoggerFactory.getXLogger(PolicyDecoderConfigurationParametersJsonAdapter.class); + + private static final String PARAMETER_CLASS_NAME = "parameterClassName"; + private static final String POLICY_DECODER_PARAMETERS = "parameters"; + + @Override + public PolicyDecoderConfigurationParameterGroup deserialize(final JsonElement json, final Type typeOfT, + final JsonDeserializationContext context) { + final JsonObject jsonObject = json.getAsJsonObject(); + + final String policyDecoderParameterClassName = getParameterGroupClassName(jsonObject); + final Class policyDecoderParameterClass = getParameterGroupClass(policyDecoderParameterClassName); + + return context.deserialize(jsonObject.get(POLICY_DECODER_PARAMETERS), policyDecoderParameterClass); + } + + private String getParameterGroupClassName(final JsonObject jsonObject) { + final JsonPrimitive classNameJsonPrimitive = ((JsonPrimitive) jsonObject.get(PARAMETER_CLASS_NAME)); + + if (classNameJsonPrimitive == null || classNameJsonPrimitive.getAsString().length() == 0) { + final String errorMessage = "parameter \"" + PARAMETER_CLASS_NAME + "\" value \"" + + (classNameJsonPrimitive != null ? classNameJsonPrimitive.getAsString() : "null") + + "\" invalid in JSON file"; + LOGGER.warn(errorMessage); + throw new IllegalArgumentException(errorMessage); + } + return classNameJsonPrimitive.getAsString().replaceAll("\\s+", ""); + } + + private Class getParameterGroupClass(final String policyDecoderParameterClassName) { + Class policyDecoderParameterClass = null; + try { + policyDecoderParameterClass = Class.forName(policyDecoderParameterClassName); + } catch (final ClassNotFoundException exp) { + final String errorMessage = "parameter \"" + PARAMETER_CLASS_NAME + "\" value \"" + + policyDecoderParameterClassName + "\", could not find class"; + LOGGER.warn(errorMessage, exp); + throw new IllegalArgumentException(errorMessage, exp); + } + return policyDecoderParameterClass; + } + +} diff --git a/reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderParameters.java b/reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderParameters.java index 0b7ae0b7..91ada5ff 100644 --- a/reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderParameters.java +++ b/reception/src/main/java/org/onap/policy/distribution/reception/parameters/PolicyDecoderParameters.java @@ -37,16 +37,20 @@ public class PolicyDecoderParameters implements ParameterGroup { private String decoderType; private String decoderClassName; + private String decoderConfigurationName; /** * Constructor for instantiating PolicyDecoderParameters. * * @param decoderType the policy decoder type * @param decoderClassName the policy decoder class name + * @param decoderConfigurationName the policy decoder configuration name */ - public PolicyDecoderParameters(final String decoderType, final String decoderClassName) { + public PolicyDecoderParameters(final String decoderType, final String decoderClassName, + final String decoderConfigurationName) { this.decoderType = decoderType; this.decoderClassName = decoderClassName; + this.decoderConfigurationName = decoderConfigurationName; } /** @@ -67,6 +71,15 @@ public class PolicyDecoderParameters implements ParameterGroup { return decoderClassName; } + /** + * Return the name of the decoder configuration of this {@link PolicyDecoderParameters} instance. + * + * @return the the name of the decoder configuration + */ + public String getDecoderConfigurationName() { + return decoderConfigurationName; + } + /** * {@inheritDoc} */ diff --git a/reception/src/test/java/org/onap/policy/distribution/reception/handling/AbstractReceptionHandlerTest.java b/reception/src/test/java/org/onap/policy/distribution/reception/handling/AbstractReceptionHandlerTest.java index d339507c..8dc84621 100644 --- a/reception/src/test/java/org/onap/policy/distribution/reception/handling/AbstractReceptionHandlerTest.java +++ b/reception/src/test/java/org/onap/policy/distribution/reception/handling/AbstractReceptionHandlerTest.java @@ -29,6 +29,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; + import org.junit.Test; import org.onap.policy.common.parameters.ParameterService; import org.onap.policy.distribution.forwarding.PolicyForwarder; @@ -57,6 +58,7 @@ public class AbstractReceptionHandlerTest { private static final String FORWARDER_CLASS_NAME = "org.onap.policy.distribution.reception.handling.DummyPolicyForwarder"; private static final String FORWARDER_CONFIGURATION_PARAMETERS = "DummyConfiguration"; + private static final String DECODER_CONFIGURATION_PARAMETERS = "DummyDecoderConfiguration"; @Test public void testInputReceived() throws PolicyDecodingException, NoSuchFieldException, SecurityException, @@ -171,7 +173,8 @@ public class AbstractReceptionHandlerTest { private Map getPolicyDecoders() { final Map policyDecoders = new HashMap(); - final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters(DECODER_TYPE, DECODER_CLASS_NAME); + final PolicyDecoderParameters pDParameters = + new PolicyDecoderParameters(DECODER_TYPE, DECODER_CLASS_NAME, DECODER_CONFIGURATION_PARAMETERS); policyDecoders.put(DECODER_KEY, pDParameters); return policyDecoders; } diff --git a/reception/src/test/java/org/onap/policy/distribution/reception/handling/DummyDecoder.java b/reception/src/test/java/org/onap/policy/distribution/reception/handling/DummyDecoder.java index 2de1737e..74792b1e 100644 --- a/reception/src/test/java/org/onap/policy/distribution/reception/handling/DummyDecoder.java +++ b/reception/src/test/java/org/onap/policy/distribution/reception/handling/DummyDecoder.java @@ -56,4 +56,7 @@ public class DummyDecoder implements PolicyDecoder { public Collection decode(final PolicyInput input) throws PolicyDecodingException { return policesToReturn; } + + @Override + public void configure(final String parameterGroupName) {} } -- 2.16.6