Removed GroupValidationResult, replacing it with BeanValidationResult.
Modified the ParameterGroup subclasses to use BeanValidator, adding
annotations where needed to trigger the validations that had been
automatically performed by GroupValidationResult.
Issue-ID: POLICY-2059
Change-Id: Ib5c0dc0ac3762e68307e63f5ce29efb49208e55d
Signed-off-by: Jim Hahn <jrh3@att.com>
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 
 package org.onap.policy.distribution.forwarding.parameters;
 
-import org.onap.policy.common.parameters.GroupValidationResult;
+import lombok.Getter;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.common.parameters.BeanValidator;
 import org.onap.policy.common.parameters.ParameterGroup;
-import org.onap.policy.common.parameters.ValidationStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.onap.policy.common.parameters.annotations.ClassName;
+import org.onap.policy.common.parameters.annotations.NotBlank;
+import org.onap.policy.common.parameters.annotations.NotNull;
 
 /**
  * Class to hold all the policy forwarder parameters.
  *
  * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com)
  */
+@Getter
+@NotBlank
 public class PolicyForwarderParameters implements ParameterGroup {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(PolicyForwarderParameters.class);
-
-    private String forwarderType;
-    private String forwarderClassName;
+    private @NotNull String forwarderType;
+    private @NotNull @ClassName String forwarderClassName;
     private String forwarderConfigurationName;
 
     /**
         this.forwarderConfigurationName = forwarderConfigurationName;
     }
 
-    /**
-     * Return the forwarderType of this PolicyForwarderParameters instance.
-     *
-     * @return the forwarderType
-     */
-    public String getForwarderType() {
-        return forwarderType;
-    }
-
-    /**
-     * Return the forwarderClassName of this PolicyForwarderParameters instance.
-     *
-     * @return the forwarderClassName
-     */
-    public String getForwarderClassName() {
-        return forwarderClassName;
-    }
-
-    /**
-     * Return the name of the forwarder configuration of this PolicyForwarderParameters instance.
-     *
-     * @return the the name of the forwarder configuration
-     */
-    public String getForwarderConfigurationName() {
-        return forwarderConfigurationName;
-    }
-
     /**
      * {@inheritDoc}.
      */
      * {@inheritDoc}.
      */
     @Override
-    public GroupValidationResult validate() {
-        final GroupValidationResult validationResult = new GroupValidationResult(this);
-        if (forwarderType == null || forwarderType.trim().length() == 0) {
-            validationResult.setResult("forwarderType", ValidationStatus.INVALID, "must be a non-blank string");
-        }
-        if (forwarderClassName == null || forwarderClassName.trim().length() == 0) {
-            validationResult.setResult("forwarderClassName", ValidationStatus.INVALID,
-                    "must be a non-blank string containing full class name of the forwarder");
-        } else {
-            validatePolicyForwarderClass(validationResult);
-        }
-        return validationResult;
-    }
-
-    private void validatePolicyForwarderClass(final GroupValidationResult validationResult) {
-        try {
-            Class.forName(forwarderClassName);
-        } catch (final ClassNotFoundException exp) {
-            LOGGER.trace("policy forwarder class not found in classpath", exp);
-            validationResult.setResult("forwarderClassName", ValidationStatus.INVALID,
-                    "policy forwarder class not found in classpath");
-        }
+    public BeanValidationResult validate() {
+        return new BeanValidator().validateTop(getClass().getSimpleName(), this);
     }
 }
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
- *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ *  Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property. 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.
 
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Map.Entry;
+import lombok.Getter;
+import lombok.Setter;
 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
-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.common.parameters.ParameterGroupImpl;
+import org.onap.policy.common.parameters.annotations.NotBlank;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.parameters.annotations.Size;
+import org.onap.policy.common.parameters.annotations.Valid;
 import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParameterGroup;
 import org.onap.policy.distribution.reception.parameters.ReceptionHandlerConfigurationParameterGroup;
 import org.onap.policy.distribution.reception.parameters.ReceptionHandlerParameters;
  *
  * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com)
  */
-public class DistributionParameterGroup implements ParameterGroup {
+@Getter
+@Setter
+@NotNull
+@NotBlank
+public class DistributionParameterGroup extends ParameterGroupImpl {
     // @formatter:off
-    private String name;
+    @Valid
     private RestServerParameters restServerParameters;
-    private Map<String, ReceptionHandlerParameters> receptionHandlerParameters;
-    private Map<String, ReceptionHandlerConfigurationParameterGroup> receptionHandlerConfigurationParameters
-        = new LinkedHashMap<>();
-    private Map<String, PolicyForwarderConfigurationParameterGroup> policyForwarderConfigurationParameters
-        = new LinkedHashMap<>();
-    private Map<String, PolicyDecoderConfigurationParameterGroup> policyDecoderConfigurationParameters
-        = new LinkedHashMap<>();
+
+    @Size(min = 1)
+    private Map<String, @NotNull @Valid ReceptionHandlerParameters> receptionHandlerParameters;
+
+    private Map<String, @NotNull @Valid ReceptionHandlerConfigurationParameterGroup>
+                receptionHandlerConfigurationParameters = new LinkedHashMap<>();
+
+    private Map<String, @NotNull @Valid PolicyForwarderConfigurationParameterGroup>
+                policyForwarderConfigurationParameters = new LinkedHashMap<>();
+
+    private Map<String, @NotNull @Valid PolicyDecoderConfigurationParameterGroup>
+                policyDecoderConfigurationParameters = new LinkedHashMap<>();
     // @formatter:on
 
     /**
         final Map<String, ReceptionHandlerConfigurationParameterGroup> receptionHandlerConfigurationParameters,
         final Map<String, PolicyForwarderConfigurationParameterGroup> policyForwarderConfigurationParameters,
         final Map<String, PolicyDecoderConfigurationParameterGroup> policyDecoderConfigurationParameters) {
-        this.name = name;
+        super(name);
         this.restServerParameters = restServerParameters;
         this.receptionHandlerParameters = receptionHandlerParameters;
         this.receptionHandlerConfigurationParameters = receptionHandlerConfigurationParameters;
         this.policyForwarderConfigurationParameters = policyForwarderConfigurationParameters;
         this.policyDecoderConfigurationParameters = policyDecoderConfigurationParameters;
     }
-
-    /**
-     * Return the name of this parameter group instance.
-     *
-     * @return name the parameter group name
-     */
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set the name of this parameter group instance.
-     *
-     * @param name the parameter group name
-     */
-    @Override
-    public void setName(final String name) {
-        this.name = name;
-    }
-
-    /**
-     * Return the receptionHandlerParameters of this parameter group instance.
-     *
-     * @return the receptionHandlerParameters
-     */
-    public Map<String, ReceptionHandlerParameters> getReceptionHandlerParameters() {
-        return receptionHandlerParameters;
-    }
-
-    /**
-     * Return the restServerParameters of this parameter group instance.
-     *
-     * @return the restServerParameters
-     */
-    public RestServerParameters getRestServerParameters() {
-        return restServerParameters;
-    }
-
-    /**
-     * Gets the reception handler configuration parameter map.
-     *
-     * @return the reception handler configuration parameter map
-     */
-    public Map<String, ReceptionHandlerConfigurationParameterGroup> getReceptionHandlerConfigurationParameters() {
-        return receptionHandlerConfigurationParameters;
-    }
-
-    /**
-     * Sets the reception handler configuration parameter map.
-     *
-     * @param receptionHandlerConfigurationParameters the reception handler configuration parameters
-     */
-    public void setReceptionHandlerConfigurationParameters(
-        final Map<String, ReceptionHandlerConfigurationParameterGroup> receptionHandlerConfigurationParameters) {
-        this.receptionHandlerConfigurationParameters = receptionHandlerConfigurationParameters;
-    }
-
-    /**
-     * Gets the policy forwarder configuration parameter map.
-     *
-     * @return the policy forwarder configuration parameter map
-     */
-    public Map<String, PolicyForwarderConfigurationParameterGroup> getPolicyForwarderConfigurationParameters() {
-        return policyForwarderConfigurationParameters;
-    }
-
-    /**
-     * Sets the policy forwarder configuration parameter map.
-     *
-     * @param policyForwarderConfigurationParameters the policy forwarder configuration parameters
-     */
-    public void setPolicyForwarderConfigurationParameters(
-        final Map<String, PolicyForwarderConfigurationParameterGroup> policyForwarderConfigurationParameters) {
-        this.policyForwarderConfigurationParameters = policyForwarderConfigurationParameters;
-    }
-
-    /**
-     * Returns the policy decoder configuration parameter map.
-     *
-     * @return the policyDecoderConfigurationParameters
-     */
-    public Map<String, PolicyDecoderConfigurationParameterGroup> getPolicyDecoderConfigurationParameters() {
-        return policyDecoderConfigurationParameters;
-    }
-
-    /**
-     * Set the policy decoder configuration parameter map.
-     *
-     * @param policyDecoderConfigurationParameters the policyDecoderConfigurationParameters to set
-     */
-    public void setPolicyDecoderConfigurationParameters(
-        final Map<String, PolicyDecoderConfigurationParameterGroup> policyDecoderConfigurationParameters) {
-        this.policyDecoderConfigurationParameters = policyDecoderConfigurationParameters;
-    }
-
-    /**
-     * Validate the parameter group.
-     *
-     * @return the result of the validation
-     */
-    @Override
-    public GroupValidationResult validate() {
-        final GroupValidationResult validationResult = new GroupValidationResult(this);
-        if (!ParameterValidationUtils.validateStringParameter(name)) {
-            validationResult.setResult("name", ValidationStatus.INVALID, "must be a non-blank string");
-        }
-        if (restServerParameters == null) {
-            validationResult.setResult("restServerParameters", ValidationStatus.INVALID,
-                "must have restServerParameters to configure distribution rest server");
-        } else {
-            validationResult.setResult("restServerParameters", restServerParameters.validate());
-        }
-        validateReceptionHandlers(validationResult);
-        validateForwarderConfigurations(validationResult);
-        validateDecoderConfigurations(validationResult);
-        return validationResult;
-    }
-
-    private void validateReceptionHandlers(final GroupValidationResult validationResult) {
-        if (receptionHandlerParameters == null || receptionHandlerParameters.size() == 0) {
-            validationResult.setResult("receptionHandlerParameters", ValidationStatus.INVALID,
-                "must have at least one reception handler");
-        } else {
-            for (final Entry<String, ReceptionHandlerParameters> nestedGroupEntry : receptionHandlerParameters
-                .entrySet()) {
-                validationResult.setResult("receptionHandlerParameters", nestedGroupEntry.getKey(),
-                    nestedGroupEntry.getValue().validate());
-            }
-        }
-    }
-
-    private void validateForwarderConfigurations(final GroupValidationResult validationResult) {
-        // @formatter:off
-        for (final Entry<String, PolicyForwarderConfigurationParameterGroup> configurationParameters :
-            policyForwarderConfigurationParameters.entrySet()) {
-            validationResult.setResult("policyForwarderConfigurationParameters", configurationParameters.getKey(),
-                configurationParameters.getValue().validate());
-        }
-        // @formatter:on
-    }
-
-    private void validateDecoderConfigurations(final GroupValidationResult validationResult) {
-        // @formatter:off
-        for (final Entry<String, PolicyDecoderConfigurationParameterGroup> configurationParameters :
-            policyDecoderConfigurationParameters.entrySet()) {
-            validationResult.setResult("policyDecoderConfigurationParameters", configurationParameters.getKey(),
-                configurationParameters.getValue().validate());
-        }
-        // @formatter:on
-    }
 }
 
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
  *  Copyright (C) 2019 Nordix Foundation.
- *  Modifications Copyright (C) 2020 AT&T Inc.
+ *  Modifications Copyright (C) 2020-2021 AT&T Intellectual Property. 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.
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import java.io.FileReader;
-import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.distribution.main.PolicyDistributionException;
 import org.onap.policy.distribution.main.startstop.DistributionCommandLineArguments;
 import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParameterGroup;
         }
 
         // validate the parameters
-        final GroupValidationResult validationResult = distributionParameterGroup.validate();
+        final ValidationResult validationResult = distributionParameterGroup.validate();
         if (!validationResult.isValid()) {
             String returnMessage =
                     "validation error(s) on parameters from \"" + arguments.getConfigurationFilePath() + "\"\n";
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
- *  Modifications Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ *  Modifications Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2020-2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 package org.onap.policy.distribution.main.parameters;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import java.util.Map;
 import org.junit.Test;
 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
-import org.onap.policy.common.parameters.GroupValidationResult;
-import org.onap.policy.common.parameters.ParameterRuntimeException;
+import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.distribution.main.testclasses.DummyPolicyForwarderParameterGroup;
 import org.onap.policy.distribution.main.testclasses.DummyReceptionHandlerParameterGroup;
 import org.onap.policy.distribution.reception.parameters.PolicyDecoderConfigurationParameterGroup;
         final DistributionParameterGroup distributionParameters = new DistributionParameterGroup(
                 CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, receptionHandlerParameters,
                 receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations);
-        final GroupValidationResult validationResult = distributionParameters.validate();
+        final ValidationResult validationResult = distributionParameters.validate();
         assertTrue(validationResult.isValid());
         assertEquals(restServerParameters.getHost(), distributionParameters.getRestServerParameters().getHost());
         assertEquals(restServerParameters.getPort(), distributionParameters.getRestServerParameters().getPort());
         final DistributionParameterGroup distributionParameters =
                 new DistributionParameterGroup(null, restServerParameters, receptionHandlerParameters,
                         receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations);
-        final GroupValidationResult validationResult = distributionParameters.validate();
+        final ValidationResult validationResult = distributionParameters.validate();
         assertFalse(validationResult.isValid());
         assertEquals(null, distributionParameters.getName());
         assertEquals(
                 receptionHandlerParameters.get(CommonTestData.DUMMY_RECEPTION_HANDLER_KEY).getPluginHandlerParameters(),
                 distributionParameters.getReceptionHandlerParameters().get(CommonTestData.DUMMY_RECEPTION_HANDLER_KEY)
                         .getPluginHandlerParameters());
-        assertTrue(validationResult.getResult().contains(
-                "field \"name\" type \"java.lang.String\" value \"null\" INVALID, " + "must be a non-blank string"));
+        assertThat(validationResult.getResult()).contains("\"name\" value \"null\" INVALID, is null");
     }
 
     @Test
         final DistributionParameterGroup distributionParameters =
                 new DistributionParameterGroup("", restServerParameters, receptionHandlerParameters,
                         receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations);
-        final GroupValidationResult validationResult = distributionParameters.validate();
+        final ValidationResult validationResult = distributionParameters.validate();
         assertFalse(validationResult.isValid());
         assertEquals("", distributionParameters.getName());
         assertEquals(
                 receptionHandlerParameters.get(CommonTestData.DUMMY_RECEPTION_HANDLER_KEY).getPluginHandlerParameters(),
                 distributionParameters.getReceptionHandlerParameters().get(CommonTestData.DUMMY_RECEPTION_HANDLER_KEY)
                         .getPluginHandlerParameters());
-        assertTrue(validationResult.getResult().contains(
-                "field \"name\" type \"java.lang.String\" value \"\" INVALID, " + "must be a non-blank string"));
+        assertThat(validationResult.getResult()).contains("\"name\" value \"\" INVALID, is blank");
     }
 
     @Test
                 commonTestData.getPolicyDecoderConfigurationParameters(false);
         final DistributionParameterGroup distributionParameters =
                 new DistributionParameterGroup(CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, null,
-                        receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations);
-        assertThatThrownBy(distributionParameters::validate).isInstanceOf(ParameterRuntimeException.class)
-            .hasMessageContaining("map parameter \"receptionHandlerParameters\" is null");
+                                        receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations);
+        assertThat(distributionParameters.validate().getResult())
+                        .contains("\"receptionHandlerParameters\" value \"null\" INVALID, is null");
     }
 
     @Test
                 CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, receptionHandlerParameters,
                 receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations);
         distributionParameters.validate();
-        final GroupValidationResult result = distributionParameters.validate();
+        final ValidationResult result = distributionParameters.validate();
         assertFalse(result.isValid());
-        assertTrue(result.getResult().endsWith("must have at least one reception handler\n"));
+        assertThat(result.getResult()).contains("minimum");
     }
 
     @Test
         final DistributionParameterGroup distributionParameters = new DistributionParameterGroup(
                 CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, receptionHandlerParameters,
                 receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations);
-        final GroupValidationResult validationResult = distributionParameters.validate();
+        final ValidationResult validationResult = distributionParameters.validate();
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult()
-                .contains("\"org.onap.policy.common.endpoints.parameters.RestServerParameters\" INVALID, "
-                        + "parameter group has status INVALID"));
+        assertThat(validationResult.getResult()).contains("\"RestServerParameters\" INVALID");
     }
 
     @Test
         final DistributionParameterGroup distributionParameters = new DistributionParameterGroup(
                 CommonTestData.DISTRIBUTION_GROUP_NAME, restServerParameters, receptionHandlerParameters,
                 receptionHandlerConfigurations, forwarderConfigurations, decoderConfigurations);
-        final GroupValidationResult validationResult = distributionParameters.validate();
+        final ValidationResult validationResult = distributionParameters.validate();
         assertFalse(validationResult.isValid());
-        assertThat(validationResult.getResult())
-                .contains("parameter group \"UNDEFINED\" INVALID, "
-                        + "must have restServerParameters to configure distribution rest server");
+        assertThat(validationResult.getResult()).contains("\"restServerParameters\" value \"null\" INVALID, is null");
     }
 }
 
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
  *  Modifications Copyright (C) 2020-2021 Nordix Foundation.
- *  Modifications Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ *  Modifications Copyright (C) 2020-2021 AT&T Intellectual Property. 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.
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import org.junit.Test;
-import org.onap.policy.common.parameters.ParameterRuntimeException;
 import org.onap.policy.common.utils.cmd.CommandLineException;
 import org.onap.policy.distribution.main.PolicyDistributionException;
 import org.onap.policy.distribution.main.startstop.DistributionCommandLineArguments;
 
     @Test
     public void testParameterHandlerNoParameters() throws PolicyDistributionException, CommandLineException {
-        verifyFailure("NoParameters.json", ParameterRuntimeException.class,
-                "map parameter \"receptionHandlerParameters\" is null");
+        verifyFailure("NoParameters.json", PolicyDistributionException.class,
+                "\"receptionHandlerParameters\" value \"null\" INVALID, is null");
     }
 
     @Test
     @Test
     public void testDistributionParameterGroup_InvalidName() throws PolicyDistributionException, CommandLineException {
         verifyFailure("DistributionConfigParameters_InvalidName.json", PolicyDistributionException.class,
-                "field \"name\" type \"java.lang.String\" value \" \" INVALID, must be a non-blank string");
+                "\"name\" value \" \" INVALID, is blank");
     }
 
     @Test
     public void testDistributionParameterGroup_NoReceptionHandler()
             throws PolicyDistributionException, CommandLineException {
-        verifyFailure("DistributionConfigParameters_NoReceptionHandler.json", ParameterRuntimeException.class,
-                "map parameter \"receptionHandlerParameters\" is null");
+        verifyFailure("DistributionConfigParameters_NoReceptionHandler.json", PolicyDistributionException.class,
+                "\"receptionHandlerParameters\" value \"null\" INVALID, is null");
     }
 
     @Test
     public void testDistributionParameterGroup_EmptyReceptionHandler()
             throws PolicyDistributionException, CommandLineException {
         verifyFailure("DistributionConfigParameters_EmptyReceptionHandler.json", PolicyDistributionException.class,
-                "must have at least one reception handler\n");
+                "\"receptionHandlerParameters\" value \"{}\" INVALID, minimum number of elements: 1");
     }
 
     @Test
     public void testDistributionParameterGroup_NoPolicyDecoder()
             throws PolicyDistributionException, CommandLineException {
-        verifyFailure("DistributionConfigParameters_NoPolicyDecoder.json", ParameterRuntimeException.class,
-                "map parameter \"policyDecoders\" is null");
+        verifyFailure("DistributionConfigParameters_NoPolicyDecoder.json", PolicyDistributionException.class,
+                "\"policyDecoders\" value \"null\" INVALID, is null");
     }
 
     @Test
     public void testDistributionParameterGroup_NoPolicyForwarder()
             throws PolicyDistributionException, CommandLineException {
-        verifyFailure("DistributionConfigParameters_NoPolicyForwarder.json", ParameterRuntimeException.class,
-                "map parameter \"policyForwarders\" is null");
+        verifyFailure("DistributionConfigParameters_NoPolicyForwarder.json", PolicyDistributionException.class,
+                "\"policyForwarderConfigurationParameters\" value \"null\" INVALID, is null");
     }
 
     @Test
     public void testDistributionParameterGroup_EmptyPolicyDecoder()
             throws PolicyDistributionException, CommandLineException {
         verifyFailure("DistributionConfigParameters_EmptyPolicyDecoder.json", PolicyDistributionException.class,
-                "must have at least one policy decoder\n");
+                "\"policyDecoders\" value \"{}\" INVALID, minimum number of elements: 1");
     }
 
     @Test
     public void testDistributionParameterGroup_EmptyPolicyForwarder()
             throws PolicyDistributionException, CommandLineException {
         verifyFailure("DistributionConfigParameters_EmptyPolicyForwarder.json", PolicyDistributionException.class,
-                "must have at least one policy forwarder\n");
+                "\"policyForwarders\" value \"{}\" INVALID, minimum number of elements: 1");
     }
 
     @Test
 
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
  *  Modifications Copyright (C) 2020 Nordix Foundation
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 
 package org.onap.policy.distribution.main.parameters;
 
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import java.util.Map;
 import org.junit.Test;
-import org.onap.policy.common.parameters.GroupValidationResult;
-import org.onap.policy.common.parameters.ParameterRuntimeException;
+import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters;
 import org.onap.policy.distribution.reception.parameters.PluginHandlerParameters;
 import org.onap.policy.distribution.reception.parameters.PolicyDecoderParameters;
         final Map<String, PolicyDecoderParameters> policyDecoders = commonTestData.getPolicyDecoders(false);
         final Map<String, PolicyForwarderParameters> policyForwarders = commonTestData.getPolicyForwarders(false);
         final PluginHandlerParameters pHParameters = new PluginHandlerParameters(policyDecoders, policyForwarders);
-        final GroupValidationResult validationResult = pHParameters.validate();
+        final ValidationResult validationResult = pHParameters.validate();
         assertEquals(policyDecoders.get(CommonTestData.DUMMY_DECODER_KEY),
                         pHParameters.getPolicyDecoders().get(CommonTestData.DUMMY_DECODER_KEY));
         assertEquals(policyForwarders.get(CommonTestData.DUMMY_ENGINE_FORWARDER_KEY),
     public void testPluginHandlerParameters_NullPolicyDecoders() {
         final Map<String, PolicyForwarderParameters> policyForwarders = commonTestData.getPolicyForwarders(false);
         final PluginHandlerParameters pHParameters = new PluginHandlerParameters(null, policyForwarders);
-        assertThatThrownBy(pHParameters::validate).isInstanceOf(ParameterRuntimeException.class)
-        .hasMessage("map parameter \"policyDecoders\" is null");
+        assertThat(pHParameters.validate().getResult()).contains("\"policyDecoders\" value \"null\" INVALID, is null");
     }
 
     @Test
     public void testPluginHandlerParameters_NullPolicyForwarders() {
         final Map<String, PolicyDecoderParameters> policyDecoders = commonTestData.getPolicyDecoders(false);
         final PluginHandlerParameters pHParameters = new PluginHandlerParameters(policyDecoders, null);
-        assertThatThrownBy(pHParameters::validate).isInstanceOf(ParameterRuntimeException.class)
-        .hasMessage("map parameter \"policyForwarders\" is null");
+        assertThat(pHParameters.validate().getResult())
+                        .contains("\"policyForwarders\" value \"null\" INVALID, is null");
     }
 
     @Test
         final Map<String, PolicyDecoderParameters> policyDecoders = commonTestData.getPolicyDecoders(true);
         final Map<String, PolicyForwarderParameters> policyForwarders = commonTestData.getPolicyForwarders(false);
         final PluginHandlerParameters pHParameters = new PluginHandlerParameters(policyDecoders, policyForwarders);
-        GroupValidationResult result = pHParameters.validate();
+        ValidationResult result = pHParameters.validate();
         assertFalse(result.isValid());
-        assertTrue(result.getResult().endsWith("must have at least one policy decoder\n"));
+        assertThat(pHParameters.validate().getResult()).contains("\"policyDecoders\"", "minimum");
     }
 
     @Test
         final Map<String, PolicyForwarderParameters> policyForwarders = commonTestData.getPolicyForwarders(true);
         final Map<String, PolicyDecoderParameters> policyDecoders = commonTestData.getPolicyDecoders(false);
         final PluginHandlerParameters pHParameters = new PluginHandlerParameters(policyDecoders, policyForwarders);
-        GroupValidationResult result = pHParameters.validate();
+        ValidationResult result = pHParameters.validate();
         assertFalse(result.isValid());
-        assertTrue(result.getResult().endsWith("must have at least one policy forwarder\n"));
+        assertThat(pHParameters.validate().getResult()).contains("\"policyForwarders\"", "minimum");
     }
 }
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 
 package org.onap.policy.distribution.main.parameters;
 
+import static org.assertj.core.api.Assertions.assertThat;
 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_TYPE;
 
 import org.junit.Test;
-import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.distribution.reception.parameters.PolicyDecoderParameters;
 
 /**
     public void testPolicyDecoderParameters() {
         final PolicyDecoderParameters pDParameters =
                 new PolicyDecoderParameters(DECODER_TYPE, DECODER_CLASS_NAME, DECODER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pDParameters.validate();
+        final ValidationResult validationResult = pDParameters.validate();
         assertEquals(DECODER_TYPE, pDParameters.getDecoderType());
         assertEquals(DECODER_CLASS_NAME, pDParameters.getDecoderClassName());
         assertEquals(DECODER_CONFIGURATION_PARAMETERS, pDParameters.getDecoderConfigurationName());
     public void testPolicyDecoderParameters_InvalidDecoderType() {
         final PolicyDecoderParameters pDParameters =
                 new PolicyDecoderParameters("", DECODER_CLASS_NAME, DECODER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pDParameters.validate();
+        final ValidationResult validationResult = pDParameters.validate();
         assertEquals("", pDParameters.getDecoderType());
         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"));
+        assertThat(validationResult.getResult()).contains("\"decoderType\" value \"\" INVALID, is blank");
     }
 
     @Test
     public void testPolicyDecoderParameters_InvalidDecoderClassName() {
         final PolicyDecoderParameters pDParameters =
                 new PolicyDecoderParameters(DECODER_TYPE, "", DECODER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pDParameters.validate();
+        final ValidationResult validationResult = pDParameters.validate();
         assertEquals(DECODER_TYPE, pDParameters.getDecoderType());
         assertEquals("", pDParameters.getDecoderClassName());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult()
-                .contains("field \"decoderClassName\" type \"java.lang.String\" value \"\" INVALID, "
-                        + "must be a non-blank string containing full class name of the decoder"));
+        assertThat(validationResult.getResult()).contains("\"decoderClassName\" value \"\" INVALID, is blank");
     }
 
     @Test
     public void testPolicyDecoderParameters_InvalidDecoderTypeAndClassName() {
         final PolicyDecoderParameters pDParameters =
                 new PolicyDecoderParameters("", "", DECODER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pDParameters.validate();
+        final ValidationResult validationResult = pDParameters.validate();
         assertEquals("", pDParameters.getDecoderType());
         assertEquals("", pDParameters.getDecoderClassName());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult().contains(
-                "field \"decoderType\" type \"java.lang.String\" value \"\" INVALID, must be a non-blank string"));
-        assertTrue(validationResult.getResult()
-                .contains("field \"decoderClassName\" type \"java.lang.String\" value \"\" INVALID, "
-                        + "must be a non-blank string containing full class name of the decoder"));
+        assertThat(validationResult.getResult()).contains("\"decoderType\" value \"\" INVALID, is blank",
+                        "\"decoderClassName\" value \"\" INVALID, is blank");
     }
 
     @Test
     public void testPolicyDecoderParameters_NullDecoderType() {
         final PolicyDecoderParameters pDParameters =
                 new PolicyDecoderParameters(null, DECODER_CLASS_NAME, DECODER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pDParameters.validate();
+        final ValidationResult validationResult = pDParameters.validate();
         assertEquals(null, pDParameters.getDecoderType());
         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"));
+        assertThat(validationResult.getResult()).contains("\"decoderType\" value \"null\" INVALID, is null");
     }
 
     @Test
     public void testPolicyDecoderParameters_NullDecoderClassName() {
         final PolicyDecoderParameters pDParameters =
                 new PolicyDecoderParameters(DECODER_TYPE, null, DECODER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pDParameters.validate();
+        final ValidationResult validationResult = pDParameters.validate();
         assertEquals(DECODER_TYPE, pDParameters.getDecoderType());
         assertEquals(null, pDParameters.getDecoderClassName());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult()
-                .contains("field \"decoderClassName\" type \"java.lang.String\" value \"null\" INVALID, "
-                        + "must be a non-blank string containing full class name of the decoder"));
+        assertThat(validationResult.getResult()).contains("\"decoderClassName\" value \"null\" INVALID, is null");
     }
 
     @Test
     public void testPolicyDecoderParameters_InvalidDecoderClass() {
         final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters(DECODER_TYPE,
                 DECODER_CLASS_NAME + "Invalid", DECODER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pDParameters.validate();
+        final ValidationResult validationResult = pDParameters.validate();
         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"));
+        assertThat(validationResult.getResult()).contains("\"decoderClassName\"", "classpath");
     }
 }
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 
 package org.onap.policy.distribution.main.parameters;
 
+import static org.assertj.core.api.Assertions.assertThat;
 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.FORWARDER_TYPE;
 
 import org.junit.Test;
-import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters;
 
 /**
     public void testPolicyForwarderParameters() {
         final PolicyForwarderParameters pFParameters =
                 new PolicyForwarderParameters(FORWARDER_TYPE, FORWARDER_CLASS_NAME, FORWARDER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pFParameters.validate();
+        final ValidationResult validationResult = pFParameters.validate();
         assertEquals(FORWARDER_TYPE, pFParameters.getForwarderType());
         assertEquals(FORWARDER_CLASS_NAME, pFParameters.getForwarderClassName());
         assertTrue(validationResult.isValid());
     public void testPolicyForwarderParameters_InvalidForwarderType() {
         final PolicyForwarderParameters pFParameters =
                 new PolicyForwarderParameters("", FORWARDER_CLASS_NAME, FORWARDER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pFParameters.validate();
+        final ValidationResult validationResult = pFParameters.validate();
         assertEquals("", pFParameters.getForwarderType());
         assertEquals(FORWARDER_CLASS_NAME, pFParameters.getForwarderClassName());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult().contains(
-                "field \"forwarderType\" type \"java.lang.String\" value \"\" INVALID, must be a non-blank string"));
+        assertThat(validationResult.getResult()).contains("\"forwarderType\" value \"\" INVALID, is blank");
     }
 
     @Test
     public void testPolicyForwarderParameters_InvalidForwarderClassName() {
         final PolicyForwarderParameters pFParameters =
                 new PolicyForwarderParameters(FORWARDER_TYPE, "", FORWARDER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pFParameters.validate();
+        final ValidationResult validationResult = pFParameters.validate();
         assertEquals(CommonTestData.FORWARDER_TYPE, pFParameters.getForwarderType());
         assertEquals("", pFParameters.getForwarderClassName());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult()
-                .contains("field \"forwarderClassName\" type \"java.lang.String\" value \"\" INVALID, "
-                        + "must be a non-blank string containing full class name of the forwarder"));
+        assertThat(validationResult.getResult()).contains("\"forwarderClassName\" value \"\" INVALID, is blank");
     }
 
     @Test
     public void testPolicyForwarderParameters_InvalidForwarderTypeAndClassName() {
         final PolicyForwarderParameters pFParameters =
                 new PolicyForwarderParameters("", "", FORWARDER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pFParameters.validate();
+        final ValidationResult validationResult = pFParameters.validate();
         assertEquals("", pFParameters.getForwarderType());
         assertEquals("", pFParameters.getForwarderClassName());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult().contains(
-                "field \"forwarderType\" type \"java.lang.String\" value \"\" INVALID, must be a non-blank string"));
-        assertTrue(validationResult.getResult()
-                .contains("field \"forwarderClassName\" type \"java.lang.String\" value \"\" INVALID, "
-                        + "must be a non-blank string containing full class name of the forwarder"));
+        assertThat(validationResult.getResult()).contains("\"forwarderType\" value \"\" INVALID, is blank",
+                        "\"forwarderClassName\" value \"\" INVALID, is blank");
     }
 
     @Test
     public void testPolicyForwarderParameters_NullForwarderType() {
         final PolicyForwarderParameters pFParameters =
                 new PolicyForwarderParameters(null, FORWARDER_CLASS_NAME, FORWARDER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pFParameters.validate();
+        final ValidationResult validationResult = pFParameters.validate();
         assertEquals(null, pFParameters.getForwarderType());
         assertEquals(FORWARDER_CLASS_NAME, pFParameters.getForwarderClassName());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult()
-                .contains("field \"forwarderType\" type \"java.lang.String\" value \"null\" INVALID, "
-                        + "must be a non-blank string"));
+        assertThat(validationResult.getResult()).contains("\"forwarderType\" value \"null\" INVALID, is null");
     }
 
     @Test
     public void testPolicyForwarderParameters_NullForwarderClassName() {
         final PolicyForwarderParameters pFParameters =
                 new PolicyForwarderParameters(FORWARDER_TYPE, null, FORWARDER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pFParameters.validate();
+        final ValidationResult validationResult = pFParameters.validate();
         assertEquals(FORWARDER_TYPE, pFParameters.getForwarderType());
         assertEquals(null, pFParameters.getForwarderClassName());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult()
-                .contains("field \"forwarderClassName\" type \"java.lang.String\" value \"null\" INVALID, "
-                        + "must be a non-blank string containing full class name of the forwarder"));
+        assertThat(validationResult.getResult()).contains("\"forwarderClassName\" value \"null\" INVALID, is null");
     }
 
     @Test
     public void testPolicyForwarderParameters_InvalidForwarderClass() {
         final PolicyForwarderParameters pFParameters = new PolicyForwarderParameters(FORWARDER_TYPE,
                 FORWARDER_CLASS_NAME + "Invalid", FORWARDER_CONFIGURATION_PARAMETERS);
-        final GroupValidationResult validationResult = pFParameters.validate();
+        final ValidationResult validationResult = pFParameters.validate();
         assertEquals(FORWARDER_TYPE, pFParameters.getForwarderType());
         assertEquals(FORWARDER_CLASS_NAME + "Invalid", pFParameters.getForwarderClassName());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult().contains("policy forwarder class not found in classpath"));
+        assertThat(validationResult.getResult()).contains("class is not in the classpath");
     }
 }
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 
 package org.onap.policy.distribution.main.parameters;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
-import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.distribution.reception.parameters.PluginHandlerParameters;
 import org.onap.policy.distribution.reception.parameters.ReceptionHandlerParameters;
 
         final ReceptionHandlerParameters rHParameters = new ReceptionHandlerParameters(
                 CommonTestData.RECEPTION_HANDLER_TYPE, CommonTestData.RECEPTION_HANDLER_CLASS_NAME,
                 CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS, pHParameters);
-        final GroupValidationResult validationResult = rHParameters.validate();
+        final ValidationResult validationResult = rHParameters.validate();
         assertEquals(CommonTestData.RECEPTION_HANDLER_TYPE, rHParameters.getReceptionHandlerType());
         assertEquals(CommonTestData.RECEPTION_HANDLER_CLASS_NAME, rHParameters.getReceptionHandlerClassName());
         assertEquals(CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS,
         final ReceptionHandlerParameters rHParameters =
                 new ReceptionHandlerParameters(null, CommonTestData.RECEPTION_HANDLER_CLASS_NAME,
                         CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS, pHParameters);
-        final GroupValidationResult validationResult = rHParameters.validate();
+        final ValidationResult validationResult = rHParameters.validate();
         assertEquals(null, rHParameters.getReceptionHandlerType());
         assertEquals(CommonTestData.RECEPTION_HANDLER_CLASS_NAME, rHParameters.getReceptionHandlerClassName());
         assertEquals(CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS,
                 rHParameters.getReceptionHandlerConfigurationName());
         assertEquals(pHParameters, rHParameters.getPluginHandlerParameters());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult()
-                .contains("field \"receptionHandlerType\" type \"java.lang.String\" value \"null\" INVALID, "
-                        + "must be a non-blank string"));
+        assertThat(validationResult.getResult()).contains("\"receptionHandlerType\" value \"null\" INVALID, is null");
     }
 
     @Test
         final ReceptionHandlerParameters rHParameters =
                 new ReceptionHandlerParameters(CommonTestData.RECEPTION_HANDLER_TYPE, null,
                         CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS, pHParameters);
-        final GroupValidationResult validationResult = rHParameters.validate();
+        final ValidationResult validationResult = rHParameters.validate();
         assertEquals(CommonTestData.RECEPTION_HANDLER_TYPE, rHParameters.getReceptionHandlerType());
         assertEquals(null, rHParameters.getReceptionHandlerClassName());
         assertEquals(CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS,
                 rHParameters.getReceptionHandlerConfigurationName());
         assertEquals(pHParameters, rHParameters.getPluginHandlerParameters());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult()
-                .contains("field \"receptionHandlerClassName\" type \"java.lang.String\" value \"null\" INVALID, "
-                        + "must be a non-blank string containing full class name " + "of the reception handler"));
+        assertThat(validationResult.getResult())
+                        .contains("\"receptionHandlerClassName\" value \"null\" INVALID, is null");
     }
 
     @Test
         final ReceptionHandlerParameters rHParameters =
                 new ReceptionHandlerParameters("", CommonTestData.RECEPTION_HANDLER_CLASS_NAME,
                         CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS, pHParameters);
-        final GroupValidationResult validationResult = rHParameters.validate();
+        final ValidationResult validationResult = rHParameters.validate();
         assertEquals("", rHParameters.getReceptionHandlerType());
         assertEquals(CommonTestData.RECEPTION_HANDLER_CLASS_NAME, rHParameters.getReceptionHandlerClassName());
         assertEquals(pHParameters, rHParameters.getPluginHandlerParameters());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult()
-                .contains("field \"receptionHandlerType\" type \"java.lang.String\" value \"\" INVALID, "
-                        + "must be a non-blank string"));
+        assertThat(validationResult.getResult()).contains("\"receptionHandlerType\" value \"\" INVALID, is blank");
     }
 
     @Test
         final ReceptionHandlerParameters rHParameters =
                 new ReceptionHandlerParameters(CommonTestData.RECEPTION_HANDLER_TYPE, "",
                         CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS, pHParameters);
-        final GroupValidationResult validationResult = rHParameters.validate();
+        final ValidationResult validationResult = rHParameters.validate();
         assertEquals(CommonTestData.RECEPTION_HANDLER_TYPE, rHParameters.getReceptionHandlerType());
         assertEquals("", rHParameters.getReceptionHandlerClassName());
         assertEquals(CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS,
                 rHParameters.getReceptionHandlerConfigurationName());
         assertEquals(pHParameters, rHParameters.getPluginHandlerParameters());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult()
-                .contains("field \"receptionHandlerClassName\" type \"java.lang.String\" value \"\" INVALID, "
-                        + "must be a non-blank string containing full class name " + "of the reception handler"));
+        assertThat(validationResult.getResult()).contains("\"receptionHandlerClassName\" value \"\" INVALID, is blank");
     }
 
     @Test
         final ReceptionHandlerParameters rHParameters = new ReceptionHandlerParameters(
                 CommonTestData.RECEPTION_HANDLER_TYPE, CommonTestData.RECEPTION_HANDLER_CLASS_NAME,
                 CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS, pHParameters);
-        GroupValidationResult result = rHParameters.validate();
+        ValidationResult result = rHParameters.validate();
         assertFalse(result.isValid());
-        assertTrue(result.getResult().endsWith("must have at least one policy forwarder\n"));
+        assertThat(result.getResult()).contains("\"policyForwarders\"", "minimum");
     }
 
     @Test
         final ReceptionHandlerParameters rHParameters = new ReceptionHandlerParameters(
                 CommonTestData.RECEPTION_HANDLER_TYPE, CommonTestData.RECEPTION_HANDLER_CLASS_NAME + "Invalid",
                 CommonTestData.RECEPTION_CONFIGURATION_PARAMETERS, pHParameters);
-        final GroupValidationResult validationResult = rHParameters.validate();
+        final ValidationResult validationResult = rHParameters.validate();
         assertEquals(CommonTestData.RECEPTION_HANDLER_TYPE, rHParameters.getReceptionHandlerType());
         assertEquals(CommonTestData.RECEPTION_HANDLER_CLASS_NAME + "Invalid",
                 rHParameters.getReceptionHandlerClassName());
                 rHParameters.getReceptionHandlerConfigurationName());
         assertEquals(pHParameters, rHParameters.getPluginHandlerParameters());
         assertFalse(validationResult.isValid());
-        assertTrue(validationResult.getResult().contains("reception handler class not found in classpath"));
+        assertThat(validationResult.getResult()).contains("\"receptionHandlerClassName\"", "classpath");
     }
 }
 
 validation error(s) on parameters from "parameters/DistributionConfigParameters_InvalidDecoderAndForwarderParameters.json"
-parameter group "SDCDistributionGroup" type "org.onap.policy.distribution.main.parameters.DistributionParameterGroup" INVALID, parameter group has status INVALID
-  parameter group map "receptionHandlerParameters" INVALID, parameter group map has status INVALID
-    parameter group "null_DummyReceptionHandler" type "org.onap.policy.distribution.reception.parameters.ReceptionHandlerParameters" INVALID, parameter group has status INVALID
-      parameter group "null_PluginHandler" type "org.onap.policy.distribution.reception.parameters.PluginHandlerParameters" INVALID, parameter group has status INVALID
-        parameter group map "policyDecoders" INVALID, parameter group map has status INVALID
-          parameter group "" type "org.onap.policy.distribution.reception.parameters.PolicyDecoderParameters" INVALID, parameter group has status INVALID
-            field "decoderType" type "java.lang.String" value "" INVALID, must be a non-blank string
-            field "decoderClassName" type "java.lang.String" value "org.onap.policy.distribution.main.testclasses.PolicyDecoderApexPdpa" INVALID, policy decoder class not found in classpath
-          parameter group "DROOLS" type "org.onap.policy.distribution.reception.parameters.PolicyDecoderParameters" INVALID, parameter group has status INVALID
-            field "decoderClassName" type "java.lang.String" value "" INVALID, must be a non-blank string containing full class name of the decoder
-        parameter group map "policyForwarders" INVALID, parameter group map has status INVALID
-          parameter group "" type "org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters" INVALID, parameter group has status INVALID
-            field "forwarderType" type "java.lang.String" value "" INVALID, must be a non-blank string
-            field "forwarderClassName" type "java.lang.String" value "org.onap.policy.distribution.main.testclasses.PapStandalonePolicyForwarder" INVALID, policy forwarder class not found in classpath
-          parameter group "PAPEngineForwarder" type "org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters" INVALID, parameter group has status INVALID
-            field "forwarderClassName" type "java.lang.String" value "" INVALID, must be a non-blank string containing full class name of the forwarder
\ No newline at end of file
+"DistributionParameterGroup" INVALID, item has status INVALID
+  "receptionHandlerParameters" INVALID, item has status INVALID
+    "DummyReceptionHandler" INVALID, item has status INVALID
+      "ReceptionHandlerParameters" INVALID, item has status INVALID
+        "PluginHandlerParameters" INVALID, item has status INVALID
+          "policyDecoders" INVALID, item has status INVALID
+            "APEXDecoder" INVALID, item has status INVALID
+              "PolicyDecoderParameters" INVALID, item has status INVALID
+                item "decoderType" value "" INVALID, is blank
+                item "decoderClassName" value "org.onap.policy.distribution.main.testclasses.PolicyDecoderApexPdpa" INVALID, class is not in the classpath
+            "DROOLSDecoder" INVALID, item has status INVALID
+              "PolicyDecoderParameters" INVALID, item has status INVALID
+                item "decoderClassName" value "" INVALID, is blank
+          "policyForwarders" INVALID, item has status INVALID
+            "PAPStandaloneForwarder" INVALID, item has status INVALID
+              "PolicyForwarderParameters" INVALID, item has status INVALID
+                item "forwarderType" value "" INVALID, is blank
+                item "forwarderClassName" value "org.onap.policy.distribution.main.testclasses.PapStandalonePolicyForwarder" INVALID, class is not in the classpath
+            "PAPEngineForwarder" INVALID, item has status INVALID
+              "PolicyForwarderParameters" INVALID, item has status INVALID
+                item "forwarderClassName" value "" INVALID, is blank
 
 validation error(s) on parameters from "parameters/DistributionConfigParameters_InvalidReceptionHandlerParameters.json"
-parameter group "SDCDistributionGroup" type "org.onap.policy.distribution.main.parameters.DistributionParameterGroup" INVALID, parameter group has status INVALID
-  parameter group map "receptionHandlerParameters" INVALID, parameter group map has status INVALID
-    parameter group "null_" type "org.onap.policy.distribution.reception.parameters.ReceptionHandlerParameters" INVALID, parameter group has status INVALID
-      field "receptionHandlerType" type "java.lang.String" value "" INVALID, must be a non-blank string
-      field "receptionHandlerClassName" type "java.lang.String" value "org.onap.policy.distribution.main.testclasses.InvalidSdcReceptionHandler" INVALID, reception handler class not found in classpath
+"DistributionParameterGroup" INVALID, item has status INVALID
+  "receptionHandlerParameters" INVALID, item has status INVALID
+    "DummyReceptionHandler" INVALID, item has status INVALID
+      "ReceptionHandlerParameters" INVALID, item has status INVALID
+        item "receptionHandlerType" value "" INVALID, is blank
+        item "receptionHandlerClassName" value "org.onap.policy.distribution.main.testclasses.InvalidSdcReceptionHandler" INVALID, class is not in the classpath
 
 validation error(s) on parameters from "parameters/DistributionConfigParameters_InvalidRestServerParameters.json"
-parameter group "SDCDistributionGroup" type "org.onap.policy.distribution.main.parameters.DistributionParameterGroup" INVALID, parameter group has status INVALID
-  parameter group "RestServerParameters" type "org.onap.policy.common.endpoints.parameters.RestServerParameters" INVALID, parameter group has status INVALID
-    field "host" type "java.lang.String" value "" INVALID, must be a non-blank string
-    field "port" type "int" value "-1" INVALID, must be >= 1
-    field "userName" type "java.lang.String" value "" INVALID, must be a non-blank string
-    field "password" type "java.lang.String" value "" INVALID, must be a non-blank string
\ No newline at end of file
+"DistributionParameterGroup" INVALID, item has status INVALID
+  "RestServerParameters" INVALID, item has status INVALID
+    item "host" value "" INVALID, is blank
+    item "port" value "-1" INVALID, is below the minimum value: 1
+    item "userName" value "" INVALID, is blank
+    item "password" value "" INVALID, is blank
 
 import lombok.Getter;
 import org.onap.policy.common.parameters.annotations.NotBlank;
 import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.parameters.annotations.Valid;
 import org.onap.policy.distribution.main.parameters.PolicyForwarderConfigurationParameterGroup;
 
 /**
 public class LifecycleApiForwarderParameters extends PolicyForwarderConfigurationParameterGroup {
     public static final String POLICY_FORWARDER_PLUGIN_CLASS = LifecycleApiPolicyForwarder.class.getName();
 
-    private LifecycleApiParameters apiParameters;
-    private LifecycleApiParameters papParameters;
+    private @Valid LifecycleApiParameters apiParameters;
+    private @Valid LifecycleApiParameters papParameters;
     private boolean isHttps;
     private boolean allowSelfSignedCerts;
     private boolean deployPolicies = true;
 
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Intel. All rights reserved.
  *  Modifications Copyright (C) 2019 Nordix Foundation.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 import java.io.File;
 import lombok.Getter;
 import lombok.Setter;
-import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.common.parameters.BeanValidator;
+import org.onap.policy.common.parameters.ObjectValidationResult;
+import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.common.parameters.ValidationStatus;
 import org.onap.policy.common.parameters.annotations.NotBlank;
 import org.onap.policy.common.parameters.annotations.NotNull;
      * {@inheritDoc}.
      */
     @Override
-    public GroupValidationResult validate() {
-        final GroupValidationResult validationResult = new GroupValidationResult(this);
-        validatePathElement(validationResult, watchPath, "watchPath");
+    public BeanValidationResult validate() {
+        final BeanValidationResult validationResult = new BeanValidator().validateTop(getClass().getSimpleName(), this);
+        validationResult.addResult(validatePathElement(watchPath, "watchPath"));
         return validationResult;
     }
 
     /**
      * Validate the string element.
      *
-     * @param validationResult the result object
      * @param element the element to validate
      * @param elementName the element name for error message
      */
-    private void validatePathElement(final GroupValidationResult validationResult, final String element,
-            final String elementName) {
-        boolean valid = false;
+    private ValidationResult validatePathElement(final String element, final String elementName) {
         if (element != null) {
             final File file = new File(element);
             if (file.exists() && file.isDirectory()) {
-                valid = true;
+                return null;
             }
         }
-        if (!valid) {
-            validationResult.setResult(elementName, ValidationStatus.INVALID,
-                    elementName + " must be a valid directory");
-        }
+
+        return new ObjectValidationResult(elementName, element, ValidationStatus.INVALID, "is not a valid directory");
     }
 }
-
 
  *  Copyright (C) 2018 Intel. All rights reserved.
  *  Copyright (C) 2019 Nordix Foundation.
  *  Modifications Copyright (C) 2020 Nordix Foundation
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 
 package org.onap.policy.distribution.reception.handling.file;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
-import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.parameters.ValidationResult;
 
 /**
  * Class to perform unit test of {@link FileSystemReceptionHandlerConfigurationParameterGroup}.
         configParameters.setWatchPath(validPath);
         configParameters.setMaxThread(2);
 
-        final GroupValidationResult validationResult = configParameters.validate();
+        final ValidationResult validationResult = configParameters.validate();
         assertTrue(validationResult.isValid());
         assertEquals(validPath, configParameters.getWatchPath());
         assertEquals(2, configParameters.getMaxThread());
         final Gson gson = new GsonBuilder().create();
         configParameters = gson.fromJson(new FileReader("src/test/resources/handling-sdcInvalid.json"),
                 FileSystemReceptionHandlerConfigurationParameterGroup.class);
-        final GroupValidationResult validationResult = configParameters.validate();
+        final ValidationResult validationResult = configParameters.validate();
         assertFalse(validationResult.isValid());
 
     }
                 new FileSystemReceptionHandlerConfigurationParameterGroup();
         configParameters.setWatchPath(invalidPath);
 
-        final GroupValidationResult validateResult = configParameters.validate();
+        final ValidationResult validateResult = configParameters.validate();
         assertFalse(validateResult.isValid());
-        assertTrue(validateResult.getResult().contains("must be a valid directory"));
+        assertThat(validateResult.getResult()).contains("is not a valid directory");
     }
 }
 
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Intel. All rights reserved.
  *  Modifications Copyright (C) 2019-2020 Nordix Foundation.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 import java.io.IOException;
 import java.util.Arrays;
 import org.junit.Test;
-import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.common.parameters.ValidationStatus;
 
 /**
         configParameters = gson.fromJson(new FileReader("src/test/resources/handling-sdc.json"),
                SdcReceptionHandlerConfigurationParameterGroup.class);
 
-        final GroupValidationResult validationResult = configParameters.validate();
+        final ValidationResult validationResult = configParameters.validate();
         assertTrue(validationResult.isValid());
         final SdcConfiguration config = new SdcConfiguration(configParameters);
         assertEquals(Arrays.asList("a.com", "b.com", "c.com"), config.getMsgBusAddress());
         configParameters = gson.fromJson(new FileReader("src/test/resources/handling-sdcInvalid.json"),
                 SdcReceptionHandlerConfigurationParameterGroup.class);
 
-        final GroupValidationResult validationResult = configParameters.validate();
+        final ValidationResult validationResult = configParameters.validate();
         assertFalse(validationResult.isValid());
 
     }
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 package org.onap.policy.distribution.reception.parameters;
 
 import java.util.Map;
-import java.util.Map.Entry;
-import org.onap.policy.common.parameters.GroupValidationResult;
+import lombok.Setter;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.common.parameters.BeanValidator;
 import org.onap.policy.common.parameters.ParameterGroup;
-import org.onap.policy.common.parameters.ValidationStatus;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.parameters.annotations.Size;
+import org.onap.policy.common.parameters.annotations.Valid;
 import org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters;
 
 /**
  *
  * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com)
  */
+@NotNull
 public class PluginHandlerParameters implements ParameterGroup {
 
     private static final String PLUGIN_HANDLER = "_PluginHandler";
 
+    @Setter
     private String name;
-    private Map<String, PolicyDecoderParameters> policyDecoders;
-    private Map<String, PolicyForwarderParameters> policyForwarders;
+
+    @Size(min = 1)
+    private Map<String, @NotNull @Valid PolicyDecoderParameters> policyDecoders;
+
+    @Size(min = 1)
+    private Map<String, @NotNull @Valid PolicyForwarderParameters> policyForwarders;
 
     /**
      * Constructor for instantiating PluginHandlerParameters.
      *
      */
     @Override
-    public GroupValidationResult validate() {
-        final GroupValidationResult validationResult = new GroupValidationResult(this);
-        if (policyDecoders == null || policyDecoders.size() == 0) {
-            validationResult.setResult("policyDecoders", ValidationStatus.INVALID,
-                    "must have at least one policy decoder");
-        } else {
-            for (final Entry<String, PolicyDecoderParameters> nestedGroupEntry : policyDecoders.entrySet()) {
-                validationResult.setResult("policyDecoders", nestedGroupEntry.getKey(),
-                        nestedGroupEntry.getValue().validate());
-            }
-        }
-        if (policyForwarders == null || policyForwarders.size() == 0) {
-            validationResult.setResult("policyForwarders", ValidationStatus.INVALID,
-                    "must have at least one policy forwarder");
-        } else {
-            for (final Entry<String, PolicyForwarderParameters> nestedGroupEntry : policyForwarders.entrySet()) {
-                validationResult.setResult("policyForwarders", nestedGroupEntry.getKey(),
-                        nestedGroupEntry.getValue().validate());
-            }
-        }
-        return validationResult;
-    }
-
-    /**
-     * Set the name of this group.
-     *
-     * @param name the name to set.
-     */
-    @Override
-    public void setName(final String name) {
-        this.name = name;
+    public BeanValidationResult validate() {
+        return new BeanValidator().validateTop(getClass().getSimpleName(), this);
     }
 }
 
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 
 package org.onap.policy.distribution.reception.parameters;
 
-import org.onap.policy.common.parameters.GroupValidationResult;
+import lombok.Getter;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.common.parameters.BeanValidator;
 import org.onap.policy.common.parameters.ParameterGroup;
-import org.onap.policy.common.parameters.ValidationStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.onap.policy.common.parameters.annotations.ClassName;
+import org.onap.policy.common.parameters.annotations.NotBlank;
+import org.onap.policy.common.parameters.annotations.NotNull;
 
 /**
  * Class to hold all the policy decoder parameters.
  *
  * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com)
  */
+@Getter
+@NotBlank
 public class PolicyDecoderParameters implements ParameterGroup {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(PolicyDecoderParameters.class);
-
-    private String decoderType;
-    private String decoderClassName;
+    private @NotNull String decoderType;
+    private @NotNull @ClassName String decoderClassName;
     private String decoderConfigurationName;
 
     /**
         this.decoderConfigurationName = decoderConfigurationName;
     }
 
-    /**
-     * Return the decoderType of this PolicyDecoderParameters instance.
-     *
-     * @return the decoderType
-     */
-    public String getDecoderType() {
-        return decoderType;
-    }
-
-    /**
-     * Return the decoderClassName of this PolicyDecoderParameters instance.
-     *
-     * @return the decoderClassName
-     */
-    public String getDecoderClassName() {
-        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}.
      */
      * {@inheritDoc}.
      */
     @Override
-    public GroupValidationResult validate() {
-        final GroupValidationResult validationResult = new GroupValidationResult(this);
-        if (decoderType == null || decoderType.trim().length() == 0) {
-            validationResult.setResult("decoderType", ValidationStatus.INVALID, "must be a non-blank string");
-        }
-        if (decoderClassName == null || decoderClassName.trim().length() == 0) {
-            validationResult.setResult("decoderClassName", ValidationStatus.INVALID,
-                    "must be a non-blank string containing full class name of the decoder");
-        } else {
-            validatePolicyDecoderClass(validationResult);
-        }
-        return validationResult;
-    }
-
-    private void validatePolicyDecoderClass(final GroupValidationResult validationResult) {
-        try {
-            Class.forName(decoderClassName);
-        } catch (final ClassNotFoundException exp) {
-            LOGGER.trace("policy decoder class not found in classpath", exp);
-            validationResult.setResult("decoderClassName", ValidationStatus.INVALID,
-                    "policy decoder class not found in classpath");
-        }
+    public BeanValidationResult validate() {
+        return new BeanValidator().validateTop(getClass().getSimpleName(), this);
     }
 }
 
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 
 package org.onap.policy.distribution.reception.parameters;
 
-import org.onap.policy.common.parameters.GroupValidationResult;
+import lombok.Getter;
+import lombok.Setter;
+import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.common.parameters.BeanValidator;
 import org.onap.policy.common.parameters.ParameterGroup;
-import org.onap.policy.common.parameters.ValidationStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.onap.policy.common.parameters.annotations.ClassName;
+import org.onap.policy.common.parameters.annotations.NotBlank;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.parameters.annotations.Valid;
 
 /**
  * Class to hold all the reception handler parameters.
  *
  * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com)
  */
+@NotNull
+@NotBlank
+@Getter
 public class ReceptionHandlerParameters implements ParameterGroup {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(ReceptionHandlerParameters.class);
-
-    private String name;
+    private @Setter String name;
     private String receptionHandlerType;
-    private String receptionHandlerClassName;
+    private @ClassName String receptionHandlerClassName;
     private String receptionHandlerConfigurationName;
-    private PluginHandlerParameters pluginHandlerParameters;
+    private @Valid PluginHandlerParameters pluginHandlerParameters;
 
     /**
      * Constructor for instantiating ReceptionHandlerParameters.
         this.pluginHandlerParameters = pluginHandlerParameters;
     }
 
-    /**
-     * Return the receptionHandlerType of this ReceptionHandlerParameters instance.
-     *
-     * @return the receptionHandlerType
-     */
-    public String getReceptionHandlerType() {
-        return receptionHandlerType;
-    }
-
-    /**
-     * Return the receptionHandlerClassName of this ReceptionHandlerParameters instance.
-     *
-     * @return the receptionHandlerClassName
-     */
-    public String getReceptionHandlerClassName() {
-        return receptionHandlerClassName;
-    }
-
-    /**
-     * Return the name of the reception handler configuration for this ReceptionHandlerParameters instance.
-     *
-     * @return the PssdConfigurationParametersGroup
-     */
-    public String getReceptionHandlerConfigurationName() {
-        return receptionHandlerConfigurationName;
-    }
-
-    /**
-     * Return the pluginHandlerParameters of this ReceptionHandlerParameters instance.
-     *
-     * @return the pluginHandlerParameters
-     */
-    public PluginHandlerParameters getPluginHandlerParameters() {
-        return pluginHandlerParameters;
-    }
-
     @Override
     public String getName() {
         return name + "_" + receptionHandlerType;
      *
      */
     @Override
-    public GroupValidationResult validate() {
-        final GroupValidationResult validationResult = new GroupValidationResult(this);
-        if (receptionHandlerType == null || receptionHandlerType.trim().length() == 0) {
-            validationResult.setResult("receptionHandlerType", ValidationStatus.INVALID, "must be a non-blank string");
-        }
-        if (receptionHandlerClassName == null || receptionHandlerClassName.trim().length() == 0) {
-            validationResult.setResult("receptionHandlerClassName", ValidationStatus.INVALID,
-                    "must be a non-blank string containing full class name of the reception handler");
-        } else {
-            validateReceptionHandlerClass(validationResult);
-        }
-        if (pluginHandlerParameters == null) {
-            validationResult.setResult("pluginHandlerParameters", ValidationStatus.INVALID,
-                    "must have a plugin handler");
-        } else {
-            validationResult.setResult("pluginHandlerParameters", pluginHandlerParameters.validate());
-        }
-        return validationResult;
-    }
-
-    private void validateReceptionHandlerClass(final GroupValidationResult validationResult) {
-        try {
-            Class.forName(receptionHandlerClassName);
-        } catch (final ClassNotFoundException exp) {
-            LOGGER.error("reception handler class not found in classpath", exp);
-            validationResult.setResult("receptionHandlerClassName", ValidationStatus.INVALID,
-                    "reception handler class not found in classpath");
-        }
-    }
-
-    /**
-     * Set the name of this group.
-     *
-     * @param name the name to set
-     */
-    @Override
-    public void setName(final String name) {
-        this.name = name;
+    public BeanValidationResult validate() {
+        return new BeanValidator().validateTop(getClass().getSimpleName(), this);
     }
 }
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2021 Nordix Foundation.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 import java.util.HashMap;
 import java.util.Map;
 import org.junit.Test;
-import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters;
 
 /**
     public void testValidate_PolicyDecodersEmpty() {
         PluginHandlerParameters emptyDecoder = new PluginHandlerParameters(new HashMap<>(), getPolicyForwarders());
 
-        GroupValidationResult result = emptyDecoder.validate();
+        ValidationResult result = emptyDecoder.validate();
 
-        assertThat(result.getResult())
-                .contains("parameter group map \"policyDecoders\" INVALID, must have at least one policy decoder");
-        assertThat(result.getResult()).doesNotContain(
-                "parameter group map \"policyForwarders\" INVALID, must have at least one policy forwarder");
+        assertThat(result.getResult()).contains("\"policyDecoders\"", "minimum").doesNotContain("\"policyForwarders\"");
     }
 
     @Test
     public void testValidate_PolicyForwardersNullEmpty() {
         PluginHandlerParameters emptyDecoder = new PluginHandlerParameters(getPolicyDecoders(), new HashMap<>());
 
-        GroupValidationResult result = emptyDecoder.validate();
+        ValidationResult result = emptyDecoder.validate();
 
-        assertThat(result.getResult())
-                .contains("parameter group map \"policyForwarders\" INVALID, must have at least one policy forwarder");
-        assertThat(result.getResult()).doesNotContain(
-                "parameter group map \"policyDecoders\" INVALID, must have at least one policy decoder");
+        assertThat(result.getResult()).contains("\"policyForwarders\"", "minimum").doesNotContain("\"policyDecoders\"");
     }
 
     private Map<String, PolicyDecoderParameters> getPolicyDecoders() {
         final Map<String, PolicyDecoderParameters> policyDecoders = new HashMap<>();
         final PolicyDecoderParameters pDParameters =
-                new PolicyDecoderParameters("DummyDecoder", "DummyDecoder", "dummyDecoderConfiguration");
+                new PolicyDecoderParameters("DummyDecoder", getClass().getName(), "dummyDecoderConfiguration");
         policyDecoders.put("DummyDecoder", pDParameters);
 
         return policyDecoders;
     private Map<String, PolicyForwarderParameters> getPolicyForwarders() {
         final Map<String, PolicyForwarderParameters> policyForwarders = new HashMap<>();
         final PolicyForwarderParameters pFParameters =
-                new PolicyForwarderParameters("DummyForwarder", "DummyForwarder", "dummyForwarderConfiguration");
+                new PolicyForwarderParameters("DummyForwarder", getClass().getName(), "dummyForwarderConfiguration");
         policyForwarders.put("DummyForwarder", pFParameters);
 
         return policyForwarders;
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2021 Nordix Foundation.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.junit.Test;
+import org.onap.policy.distribution.reception.handling.DummyDecoder;
 
 /**
  * Class for unit testing PolicyDecoderParameters class.
  */
 public class TestPolicyDecoderParameters {
 
-    static final String DECODER_CLASS_NAME = "org.onap.policy.distribution.reception.handling.DummyDecoder";
+    static final String DECODER_CLASS_NAME = DummyDecoder.class.getName();
     static final String DECODER_CONFIG = "decoderConfigName";
     static final String DECODER_TYPE = "DummyDecoder";
 
     public void testValidate_DecoderTypeEmptyNull() {
         PolicyDecoderParameters sutParams = new PolicyDecoderParameters(null, DECODER_CLASS_NAME, DECODER_CONFIG);
 
-        assertThat(sutParams.validate().getResult()).contains(
-                "field \"decoderType\" type \"java.lang.String\" value \"null\" INVALID, must be a non-blank string");
+        assertThat(sutParams.validate().getResult()).contains("\"decoderType\" value \"null\" INVALID, is null");
 
         sutParams.setName("");
 
-        assertThat(sutParams.validate().getResult()).contains(
-                "field \"decoderType\" type \"java.lang.String\" value \"\" INVALID, must be a non-blank string");
-        assertThat(sutParams.validate().getResult()).doesNotContain("policy decoder class not found in classpath");
+        assertThat(sutParams.validate().getResult()).contains("\"decoderType\" value \"\" INVALID, is blank")
+                        .doesNotContain("not found in classpath");
     }
 
     @Test
         PolicyDecoderParameters nullClassName = new PolicyDecoderParameters(DECODER_TYPE, null, DECODER_CONFIG);
 
         assertThat(nullClassName.validate().getResult())
-                .contains("field \"decoderClassName\" type \"java.lang.String\" value \"null\" INVALID, "
-                        + "must be a non-blank string containing full class name of the decoder");
+                        .contains("\"decoderClassName\" value \"null\" INVALID, is null");
 
         PolicyDecoderParameters emptyClassName = new PolicyDecoderParameters(DECODER_TYPE, "", DECODER_CONFIG);
 
-        assertThat(emptyClassName.validate().getResult())
-                .contains("field \"decoderClassName\" type \"java.lang.String\" value \"\" INVALID, "
-                        + "must be a non-blank string containing full class name of the decoder");
+        assertThat(emptyClassName.validate().getResult()).contains("\"decoderClassName\" value \"\" INVALID, is blank");
     }
 }
 
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2021 Nordix Foundation.
+ *  Modifications Copyright (C) 2021 AT&T Intellectual Property. 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.
 import java.util.Map;
 import org.junit.Test;
 import org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters;
+import org.onap.policy.distribution.reception.handling.DummyDecoder;
 
 /**
  * Class for unit testing ReceptionHandlerParameters class.
         ReceptionHandlerParameters sutParams = getReceptionHandlerParameters(className);
         sutParams.setName(className);
 
-        assertThat(sutParams.validate().getResult()).contains("reception handler class not found in classpath");
+        assertThat(sutParams.validate().getResult()).contains("class is not in the classpath");
     }
 
     @Test
     public void testValidate_ReceptionHandlerTypeNullEmpty() {
-        final String className = "org.onap.policy.distribution.reception.handling.DummyReceptionHandler";
+        final String className = DummyDecoder.class.getName();
         final PluginHandlerParameters pHParameters =
                 new PluginHandlerParameters(getPolicyDecoders(), getPolicyForwarders());
 
         ReceptionHandlerParameters nullType = new ReceptionHandlerParameters(null, className, className, pHParameters);
 
-        assertThat(nullType.validate().getResult()).contains("field \"receptionHandlerType\" type \"java.lang.String\""
-                + " value \"null\" INVALID, must be a non-blank string");
+        assertThat(nullType.validate().getResult())
+                        .contains("\"receptionHandlerType\" value \"null\" INVALID, is null");
 
         ReceptionHandlerParameters emptyType = new ReceptionHandlerParameters("", className, className, pHParameters);
 
-        assertThat(emptyType.validate().getResult()).contains("field \"receptionHandlerType\" type \"java.lang.String\""
-                + " value \"\" INVALID, must be a non-blank string");
-        assertThat(emptyType.validate().getResult()).doesNotContain("reception handler class not found in classpath");
+        assertThat(emptyType.validate().getResult()).contains("\"receptionHandlerType\" value \"\" INVALID, is blank")
+                        .doesNotContain("classpath");
     }
 
     @Test
                 "dummyReceptionHandlerConfiguration", pHParameters);
 
         assertThat(nullType.validate().getResult())
-                .contains("field \"receptionHandlerClassName\" type \"java.lang.String\" value "
-                        + "\"null\" INVALID, must be a non-blank string containing full class name "
-                        + "of the reception handler");
+                .contains("\"receptionHandlerClassName\" value \"null\" INVALID, is null");
 
         ReceptionHandlerParameters emptyType = new ReceptionHandlerParameters("DummyReceptionHandler", "",
                 "dummyReceptionHandlerConfiguration", pHParameters);
 
         assertThat(emptyType.validate().getResult())
-                .contains("field \"receptionHandlerClassName\" type \"java.lang.String\" value "
-                        + "\"\" INVALID, must be a non-blank string containing full class name of "
-                        + "the reception handler");
+                .contains("\"receptionHandlerClassName\" value \"\" INVALID, is blank");
     }
 
     @Test
                 "dummyReceptionHandlerConfiguration", null);
 
         assertThat(sutParams.validate().getResult())
-                .contains("parameter group \"UNDEFINED\" INVALID, must have a plugin handler");
+                .contains("\"pluginHandlerParameters\" value \"null\" INVALID, is null");
     }
 
     private ReceptionHandlerParameters getReceptionHandlerParameters(String className) {
         final Map<String, PolicyDecoderParameters> policyDecoders = new HashMap<>();
 
         final PolicyDecoderParameters pDParameters =
-                new PolicyDecoderParameters("DummyDecoder", "DummyDecoder", "dummyDecoderConfiguration");
+                new PolicyDecoderParameters("DummyDecoder", DummyDecoder.class.getName(), "dummyDecoderConfiguration");
         policyDecoders.put("DummyDecoder", pDParameters);
 
         return policyDecoders;
     private Map<String, PolicyForwarderParameters> getPolicyForwarders() {
         final Map<String, PolicyForwarderParameters> policyForwarders = new HashMap<>();
 
-        final PolicyForwarderParameters pFParameters =
-                new PolicyForwarderParameters("DummyForwarder", "DummyForwarder", "dummyForwarderConfiguration");
+        final PolicyForwarderParameters pFParameters = new PolicyForwarderParameters("DummyForwarder",
+                        DummyDecoder.class.getName(), "dummyForwarderConfiguration");
         policyForwarders.put("DummyForwarder", pFParameters);
 
         return policyForwarders;