Use BidirectionalTopicClient from policy-common
[policy/models.git] / models-interactions / model-actors / actorServiceProvider / src / main / java / org / onap / policy / controlloop / actorserviceprovider / parameters / CommonActorParams.java
 package org.onap.policy.controlloop.actorserviceprovider.parameters;
 
 import java.util.Map;
-import lombok.Builder;
-import lombok.Data;
-import org.onap.policy.common.parameters.BeanValidationResult;
+import java.util.TreeMap;
+import java.util.function.Function;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
 import org.onap.policy.common.parameters.BeanValidator;
 import org.onap.policy.common.parameters.ValidationResult;
-import org.onap.policy.common.parameters.annotations.NotBlank;
 import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.controlloop.actorserviceprovider.Util;
 
 /**
- * Parameters used by Actors whose Operators use a pair of Topics, one to publish requests
- * and the other to receive responses.
+ * Superclass for Actor parameters that have default values in "this" object, and
+ * operation-specific values in {@link #operation}.
  */
-@NotNull
-@NotBlank
-@Data
-@Builder
-public class TopicPairActorParams {
+@Getter
+@Setter
+@EqualsAndHashCode
+public class CommonActorParams {
 
     /**
-     * This contains the default parameters that are used when an operation doesn't
-     * specify them. Note: each operation to be used must still have an entry in
-     * {@link #operation}, even if it's empty. Otherwise, the given operation will not be
-     * started.
+     * Maps the operation name to its parameters.
      */
-    private TopicPairParams defaults;
+    @NotNull
+    protected Map<String, Map<String, Object>> operation;
+
 
     /**
-     * Maps an operation name to its individual parameters.
+     * Extracts a specific operation's parameters from "this".
+     *
+     * @param name name of the item containing "this"
+     * @return a function to extract an operation's parameters from "this". Note: the
+     *         returned function is not thread-safe
      */
-    private Map<String, Map<String, Object>> operation;
+    public Function<String, Map<String, Object>> makeOperationParameters(String name) {
+
+        Map<String, Object> defaultParams = Util.translateToMap(name, this);
+        defaultParams.remove("operation");
+
+        return operationName -> {
+            Map<String, Object> specificParams = operation.get(operationName);
+            if (specificParams == null) {
+                return null;
+            }
+
+            // start with a copy of defaults and overlay with specific
+            Map<String, Object> subparams = new TreeMap<>(defaultParams);
+            subparams.putAll(specificParams);
 
+            return Util.translateToMap(name + "." + operationName, subparams);
+        };
+    }
 
     /**
      * Validates the parameters.
@@ -60,7 +80,7 @@ public class TopicPairActorParams {
      * @return "this"
      * @throws IllegalArgumentException if the parameters are invalid
      */
-    public TopicPairActorParams doValidation(String name) {
+    public CommonActorParams doValidation(String name) {
         ValidationResult result = validate(name);
         if (!result.isValid()) {
             throw new ParameterValidationRuntimeException("invalid parameters", result);
@@ -77,17 +97,6 @@ public class TopicPairActorParams {
      * @return the validation result
      */
     public ValidationResult validate(String resultName) {
-        BeanValidationResult result = new BeanValidator().validateTop(resultName, this);
-
-        if (defaults != null) {
-            result.addResult(defaults.validate("defaults"));
-        }
-
-        // @formatter:off
-        result.validateMap("operation", operation,
-            (result2, entry) -> result2.validateNotNull(entry.getKey(), entry.getValue()));
-        // @formatter:on
-
-        return result;
+        return new BeanValidator().validateTop(resultName, this);
     }
 }