Merge "feature-eelf: eelf-core from: 1.0.0 -> 2.0.0-oss"
diff --git a/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/extractor/ClassExtractors.java b/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/extractor/ClassExtractors.java
index 91fbad1..bd75995 100644
--- a/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/extractor/ClassExtractors.java
+++ b/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/extractor/ClassExtractors.java
@@ -3,13 +3,14 @@
  * ONAP
  * ================================================================================
  * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2019-2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -26,7 +27,7 @@
 import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 import org.apache.commons.lang3.StringUtils;
-import org.onap.policy.drools.utils.Pair;
+import org.apache.commons.lang3.tuple.Pair;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,11 +35,11 @@
  * Extractors for each object class. Properties define how the data is to be
  * extracted for a given class, where the properties are similar to the
  * following:
- * 
+ *
  * <pre>
  * <code>&lt;a.prefix>.&lt;class.name> = ${event.reqid}</code>
  * </pre>
- * 
+ *
  * <p>For any given field name (e.g., "reqid"), it first looks for a public "getXxx()"
  * method to extract the specified field. If that fails, then it looks for a public field
  * by the given name. If that also fails, and the object is a <i>Map</i> subclass, then it
@@ -71,7 +72,7 @@
 
     /**
      * Constructor.
-     * 
+     *
      * @param props properties that specify how the data is to be extracted from
      *        a given class
      * @param prefix property name prefix, prepended before the class name
@@ -85,7 +86,7 @@
 
     /**
      * Gets the number of extractors in the map.
-     * 
+     *
      * @return gets the number of extractors in the map
      */
     protected int size() {
@@ -94,7 +95,7 @@
 
     /**
      * Extracts the desired data item from an object.
-     * 
+     *
      * @param object object from which to extract the data item
      * @return the extracted item, or {@code null} if it could not be extracted
      */
@@ -111,7 +112,7 @@
     /**
      * Gets the extractor for the given type of object, creating one if it
      * doesn't exist yet.
-     * 
+     *
      * @param object object whose extracted is desired
      * @return an extractor for the object
      */
@@ -129,9 +130,9 @@
 
     /**
      * Builds an extractor for the class.
-     * 
+     *
      * @param clazz class for which the extractor should be built
-     * 
+     *
      * @return a new extractor
      */
     private Extractor buildExtractor(Class<?> clazz) {
@@ -162,7 +163,7 @@
     /**
      * Builds an extractor for the class, based on the config value extracted
      * from the corresponding property.
-     * 
+     *
      * @param clazz class for which the extractor should be built
      * @param value config value (e.g., "${event.request.id}"
      * @return a new extractor
@@ -209,7 +210,7 @@
     /**
      * Gets the extractor for a class, examining all super classes and
      * interfaces.
-     * 
+     *
      * @param clazz class whose extractor is desired
      * @param addOk {@code true} if the extractor may be added, provided the
      *        property is defined, {@code false} otherwise
@@ -268,7 +269,7 @@
      * hierarchically, where each name identifies a particular component within
      * the hierarchy. Supports retrieval from {@link Map} objects, as well as
      * via getXxx() methods, or by direct field retrieval.
-     * 
+     *
      * <p>Note: this will <i>not</i> work if POJOs are contained within a Map.
      */
     private class ComponetizedExtractor implements Extractor {
@@ -280,7 +281,7 @@
 
         /**
          * Constructor.
-         * 
+         *
          * @param clazz the class associated with the object at the root of the
          *        hierarchy
          * @param names name associated with each component
@@ -296,14 +297,14 @@
 
                 Pair<Extractor, Class<?>> pair = buildExtractor(clz, comp);
 
-                extractors[x] = pair.first();
-                clz = pair.second();
+                extractors[x] = pair.getLeft();
+                clz = pair.getRight();
             }
         }
 
         /**
          * Builds an extractor for the given component of an object.
-         * 
+         *
          * @param clazz type of object from which the component will be
          *        extracted
          * @param comp name of the component to extract
@@ -312,9 +313,9 @@
          * @throws ExtractorException extrator exception
          */
         private Pair<Extractor, Class<?>> buildExtractor(Class<?> clazz, String comp) throws ExtractorException {
-            
+
             Pair<Extractor, Class<?>> pair = getMethodExtractor(clazz, comp);
- 
+
             if (pair == null) {
                 pair = getFieldExtractor(clazz, comp);
             }
@@ -350,7 +351,7 @@
         /**
          * Gets an extractor that invokes a getXxx() method to retrieve the
          * object.
-         * 
+         *
          * @param clazz container's class
          * @param name name of the property to be retrieved
          * @return a new extractor, or {@code null} if the class does not
@@ -371,7 +372,7 @@
                     return null;
                 }
 
-                return new Pair<>(new MethodExtractor(meth), retType);
+                return Pair.of(new MethodExtractor(meth), retType);
 
             } catch (NoSuchMethodException expected) {
                 // no getXxx() method, maybe there's a field by this name
@@ -385,7 +386,7 @@
 
         /**
          * Gets an extractor for a field within the object.
-         * 
+         *
          * @param clazz container's class
          * @param name name of the field whose value is to be extracted
          * @return a new extractor, or {@code null} if the class does not
@@ -399,12 +400,12 @@
                 return null;
             }
 
-            return new Pair<>(new FieldExtractor(field), field.getType());
+            return Pair.of(new FieldExtractor(field), field.getType());
         }
 
         /**
          * Gets an extractor for an item within a Map object.
-         * 
+         *
          * @param clazz container's class
          * @param key item key within the map
          * @return a new extractor, or {@code null} if the class is not a Map
@@ -423,13 +424,13 @@
              * If the object turns out not to be a map, then the MapExtractor
              * for the next component will just return null.
              */
-            return new Pair<>(new MapExtractor(key), Map.class);
+            return Pair.of(new MapExtractor(key), Map.class);
         }
 
         /**
          * Gets field within a class, examining all super classes and
          * interfaces.
-         * 
+         *
          * @param clazz class whose field is desired
          * @param name name of the desired field
          * @return the field within the class, or {@code null} if the field does
diff --git a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/FeatureTest.java b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/FeatureTest.java
index c35e525..96b358d 100644
--- a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/FeatureTest.java
+++ b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/FeatureTest.java
@@ -3,6 +3,7 @@
  * ONAP
  * ================================================================================
  * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -46,6 +47,7 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
+import org.apache.commons.lang3.tuple.Pair;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -61,7 +63,6 @@
 import org.onap.policy.drools.pooling.message.Message;
 import org.onap.policy.drools.system.PolicyController;
 import org.onap.policy.drools.system.PolicyEngine;
-import org.onap.policy.drools.utils.Pair;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -79,25 +80,21 @@
  *
  * <p>Invoke {@link #runSlow()}, before the test, to slow things down.
  */
+
 public class FeatureTest {
-
     private static final Logger logger = LoggerFactory.getLogger(FeatureTest.class);
-
     /**
      * Name of the topic used for inter-host communication.
      */
     private static final String INTERNAL_TOPIC = "my.internal.topic";
-
     /**
      * Name of the topic from which "external" events "arrive".
      */
     private static final String EXTERNAL_TOPIC = "my.external.topic";
-
     /**
      * Name of the controller.
      */
     private static final String CONTROLLER1 = "controller.one";
-
     private static long stdReactivateWaitMs = 200;
     private static long stdIdentificationMs = 60;
     private static long stdStartHeartbeatMs = 60;
@@ -111,28 +108,26 @@
      * Used to decode events from the external topic.
      */
     private static final Gson mapper = new Gson();
-
     /**
      * Used to identify the current context.
      */
     private static final ThreadLocal<Context> currentContext = new ThreadLocal<Context>();
-
     /**
      * Context for the current test case.
      */
     private Context ctx;
-
     /**
      * Setup.
      */
+
     @Before
     public void setUp() {
         ctx = null;
     }
-
     /**
      * Tear down.
      */
+
     @After
     public void tearDown() {
         if (ctx != null) {
@@ -157,19 +152,14 @@
 
     private void run(int nmessages, int nhosts) throws Exception {
         ctx = new Context(nmessages);
-
         for (int x = 0; x < nhosts; ++x) {
             ctx.addHost();
         }
-
         ctx.startHosts();
-
         for (int x = 0; x < nmessages; ++x) {
             ctx.offerExternal(makeMessage(x));
         }
-
         ctx.awaitEvents(stdEventWaitSec, TimeUnit.SECONDS);
-
         assertEquals(0, ctx.getDecodeErrors());
         assertEquals(0, ctx.getRemainingEvents());
         ctx.checkAllSawAMsg();
@@ -178,10 +168,10 @@
     private String makeMessage(int reqnum) {
         return "{\"reqid\":\"req" + reqnum + "\", \"data\":\"hello " + reqnum + "\"}";
     }
-
     /**
      * Invoke this to slow the timers down.
      */
+
     protected static void runSlow() {
         stdReactivateWaitMs = 10000;
         stdIdentificationMs = 10000;
@@ -193,58 +183,50 @@
         stdInterPollMs = 2000;
         stdEventWaitSec = 1000;
     }
-
     /**
      * Decodes an event.
      *
      * @param event event
      * @return the decoded event, or {@code null} if it cannot be decoded
      */
+
     private static Object decodeEvent(String event) {
         try {
             return mapper.fromJson(event, TreeMap.class);
-
         } catch (JsonParseException e) {
             logger.warn("cannot decode external event", e);
             return null;
         }
     }
-
     /**
      * Context used for a single test case.
      */
-    private static class Context {
 
+    private static class Context {
         /**
          * Hosts that have been added to this context.
          */
         private final Deque<Host> hosts = new LinkedList<>();
-
         /**
          * Maps a drools controller to its policy controller.
          */
         private final IdentityHashMap<DroolsController, PolicyController> drools2policy = new IdentityHashMap<>();
-
         /**
          * Maps a channel to its queue. Does <i>not</i> include the "admin" channel.
          */
         private final ConcurrentMap<String, BlockingQueue<String>> channel2queue = new ConcurrentHashMap<>(7);
-
         /**
          * Queue for the external "DMaaP" topic.
          */
         private final BlockingQueue<String> externalTopic = new LinkedBlockingQueue<String>();
-
         /**
          * Counts the number of decode errors.
          */
         private final AtomicInteger numDecodeErrors = new AtomicInteger(0);
-
         /**
          * Number of events we're still waiting to receive.
          */
         private final CountDownLatch eventCounter;
-
         /**
          * The current host. Set by {@link #withHost(Host, VoidFunction)} and used by
          * {@link #getCurrentHost()}.
@@ -256,13 +238,14 @@
          *
          * @param nEvents number of events to be processed
          */
+
         public Context(int events) {
             eventCounter = new CountDownLatch(events);
         }
-
         /**
          * Destroys the context, stopping any hosts that remain.
          */
+
         public void destroy() {
             stopHosts();
             hosts.clear();
@@ -273,16 +256,17 @@
          *
          * @return the new Host
          */
+
         public Host addHost() {
             Host host = new Host(this);
             hosts.add(host);
-
             return host;
         }
 
         /**
          * Starts the hosts.
          */
+
         public void startHosts() {
             hosts.forEach(host -> host.start());
         }
@@ -290,6 +274,7 @@
         /**
          * Stops the hosts.
          */
+
         public void stopHosts() {
             hosts.forEach(host -> host.stop());
         }
@@ -297,6 +282,7 @@
         /**
          * Verifies that all hosts processed at least one message.
          */
+
         public void checkAllSawAMsg() {
             int msgs = 0;
             for (Host host : hosts) {
@@ -312,6 +298,7 @@
          * @param host host
          * @param func function to invoke
          */
+
         public void withHost(Host host, VoidFunction func) {
             currentHost = host;
             func.apply();
@@ -323,6 +310,7 @@
          *
          * @param event event
          */
+
         public void offerExternal(String event) {
             externalTopic.offer(event);
         }
@@ -333,6 +321,7 @@
          * @param channel channel
          * @param queue the channel's queue
          */
+
         public void addInternal(String channel, BlockingQueue<String> queue) {
             channel2queue.put(channel, queue);
         }
@@ -342,6 +331,7 @@
          *
          * @param message message
          */
+
         public void offerInternal(String message) {
             channel2queue.values().forEach(queue -> queue.offer(message));
         }
@@ -352,6 +342,7 @@
          * @param channel channel
          * @param message message
          */
+
         public void offerInternal(String channel, String message) {
             BlockingQueue<String> queue = channel2queue.get(channel);
             if (queue != null) {
@@ -365,6 +356,7 @@
          * @param controller controller
          * @param droolsController drools controller
          */
+
         public void addController(PolicyController controller, DroolsController droolsController) {
             drools2policy.put(droolsController, controller);
         }
@@ -376,6 +368,7 @@
          * @return the controller associated with a drools controller, or {@code null} if
          *         it has no associated controller
          */
+
         public PolicyController getController(DroolsController droolsController) {
             return drools2policy.get(droolsController);
         }
@@ -385,6 +378,7 @@
          *
          * @return queue for the external topic
          */
+
         public BlockingQueue<String> getExternalTopic() {
             return externalTopic;
         }
@@ -394,6 +388,7 @@
          *
          * @return the number of decode errors so far
          */
+
         public int getDecodeErrors() {
             return numDecodeErrors.get();
         }
@@ -401,6 +396,7 @@
         /**
          * Increments the count of decode errors.
          */
+
         public void bumpDecodeErrors() {
             numDecodeErrors.incrementAndGet();
         }
@@ -410,6 +406,7 @@
          *
          * @return the number of events that haven't been processed
          */
+
         public long getRemainingEvents() {
             return eventCounter.getCount();
         }
@@ -417,6 +414,7 @@
         /**
          * Adds an event to the counter.
          */
+
         public void addEvent() {
             eventCounter.countDown();
         }
@@ -429,6 +427,7 @@
          * @return {@code true} if all events have been processed, {@code false} otherwise
          * @throws InterruptedException throws interrupted
          */
+
         public boolean awaitEvents(long time, TimeUnit units) throws InterruptedException {
             return eventCounter.await(time, units);
         }
@@ -439,6 +438,7 @@
          *
          * @return the current host, or {@code null} if there is no current host
          */
+
         public Host getCurrentHost() {
             return currentHost;
         }
@@ -447,25 +447,27 @@
     /**
      * Simulates a single "host".
      */
+
     private static class Host {
-
         private final Context context;
-
         private final PoolingFeature feature;
 
         /**
          * {@code True} if this host has processed a message, {@code false} otherwise.
          */
+
         private final AtomicBoolean sawMsg = new AtomicBoolean(false);
 
         /**
          * This host's internal "DMaaP" topic.
          */
+
         private final BlockingQueue<String> msgQueue = new LinkedBlockingQueue<>();
 
         /**
          * Source that reads from the external topic and posts to the listener.
          */
+
         private TopicSource externalSource;
 
         // mock objects
@@ -478,25 +480,20 @@
          *
          * @param context context
          */
+
         public Host(Context context) {
             this.context = context;
-
             when(controller.getName()).thenReturn(CONTROLLER1);
             when(controller.getDrools()).thenReturn(drools);
-
             // stop consuming events if the controller stops
             when(controller.stop()).thenAnswer(args -> {
                 externalSource.unregister(controller);
                 return true;
             });
-
             doAnswer(new MyExternalTopicListener(context, this)).when(controller).onTopicEvent(any(), any(), any());
-
             context.addController(controller, drools);
-
             // arrange to read from the external topic
             externalSource = new TopicSourceImpl(context, false);
-
             feature = new PoolingFeatureImpl(context);
         }
 
@@ -505,6 +502,7 @@
          *
          * @return the host name
          */
+
         public String getName() {
             return feature.getHost();
         }
@@ -513,21 +511,16 @@
          * Starts threads for the host so that it begins consuming from both the external
          * "DMaaP" topic and its own internal "DMaaP" topic.
          */
+
         public void start() {
-
             context.withHost(this, () -> {
-
                 feature.beforeStart(engine);
                 feature.afterCreate(controller);
-
                 // assign the queue for this host's internal topic
                 context.addInternal(getName(), msgQueue);
-
                 feature.beforeStart(controller);
-
                 // start consuming events from the external topic
                 externalSource.register(controller);
-
                 feature.afterStart(controller);
             });
         }
@@ -535,6 +528,7 @@
         /**
          * Stops the host's threads.
          */
+
         public void stop() {
             feature.beforeStop(controller);
             externalSource.unregister(controller);
@@ -549,6 +543,7 @@
          * @param event event
          * @return {@code true} if the event was handled, {@code false} otherwise
          */
+
         public boolean beforeOffer(CommInfrastructure protocol, String topic2, String event) {
             return feature.beforeOffer(controller, protocol, topic2, event);
         }
@@ -562,8 +557,8 @@
          * @param success success
          * @return {@code true} if the event was handled, {@code false} otherwise
          */
-        public boolean afterOffer(CommInfrastructure protocol, String topic, String event, boolean success) {
 
+        public boolean afterOffer(CommInfrastructure protocol, String topic, String event, boolean success) {
             return feature.afterOffer(controller, protocol, topic, event, success);
         }
 
@@ -573,6 +568,7 @@
          * @param fact fact
          * @return {@code true} if the event was handled, {@code false} otherwise
          */
+
         public boolean beforeInsert(Object fact) {
             return feature.beforeInsert(drools, fact);
         }
@@ -585,6 +581,7 @@
          *        controller, {@code false} otherwise
          * @return {@code true} if the event was handled, {@code false} otherwise
          */
+
         public boolean afterInsert(Object fact, boolean successInsert) {
             return feature.afterInsert(drools, fact, successInsert);
         }
@@ -592,6 +589,7 @@
         /**
          * Indicates that a message was seen for this host.
          */
+
         public void sawMessage() {
             sawMsg.set(true);
         }
@@ -602,6 +600,7 @@
          * @return {@code true} if a message was seen for this host, {@code false}
          *         otherwise
          */
+
         public boolean messageSeen() {
             return sawMsg.get();
         }
@@ -611,6 +610,7 @@
          *
          * @return the queue associated with this host's internal topic
          */
+
         public BlockingQueue<String> getInternalQueue() {
             return msgQueue;
         }
@@ -620,8 +620,8 @@
      * Listener for the external topic. Simulates the actions taken by
      * <i>AggregatedPolicyController.onTopicEvent</i>.
      */
-    private static class MyExternalTopicListener implements Answer<Void> {
 
+    private static class MyExternalTopicListener implements Answer<Void> {
         private final Context context;
         private final Host host;
 
@@ -636,30 +636,23 @@
             CommInfrastructure commType = args.getArgument(index++);
             String topic = args.getArgument(index++);
             String event = args.getArgument(index++);
-
             if (host.beforeOffer(commType, topic, event)) {
                 return null;
             }
-
             boolean result;
             Object fact = decodeEvent(event);
-
             if (fact == null) {
                 result = false;
                 context.bumpDecodeErrors();
-
             } else {
                 result = true;
-
                 if (!host.beforeInsert(fact)) {
                     // feature did not handle it so we handle it here
                     host.afterInsert(fact, result);
-
                     host.sawMessage();
                     context.addEvent();
                 }
             }
-
             host.afterOffer(commType, topic, event, result);
             return null;
         }
@@ -670,10 +663,9 @@
      * <i>channel</i> embedded within the message. If it's the "admin" channel, then the
      * message is placed on all queues.
      */
+
     private static class TopicSinkImpl extends TopicImpl implements TopicSink {
-
         private final Context context;
-
         /**
          * Used to decode the messages so that the channel can be extracted.
          */
@@ -684,6 +676,7 @@
          *
          * @param context context
          */
+
         public TopicSinkImpl(Context context) {
             this.context = context;
         }
@@ -693,22 +686,17 @@
             if (!isAlive()) {
                 return false;
             }
-
             try {
                 Message msg = serializer.decodeMsg(message);
                 String channel = msg.getChannel();
-
                 if (Message.ADMIN.equals(channel)) {
                     // add to every queue
                     context.offerInternal(message);
-
                 } else {
                     // add to a specific queue
                     context.offerInternal(channel, message);
                 }
-
                 return true;
-
             } catch (JsonParseException e) {
                 logger.warn("could not decode message: {}", message);
                 context.bumpDecodeErrors();
@@ -720,15 +708,14 @@
     /**
      * Source implementation that reads from a queue associated with a topic.
      */
+
     private static class TopicSourceImpl extends TopicImpl implements FilterableTopicSource {
 
         private final String topic;
-
         /**
          * Queue from which to retrieve messages.
          */
         private final BlockingQueue<String> queue;
-
         /**
          * Manages the current consumer thread. The "first" item is used as a trigger to
          * tell the thread to stop processing, while the "second" item is triggered <i>by
@@ -743,11 +730,11 @@
          * @param internal {@code true} if to read from the internal topic, {@code false}
          *        to read from the external topic
          */
+
         public TopicSourceImpl(Context context, boolean internal) {
             if (internal) {
                 this.topic = INTERNAL_TOPIC;
                 this.queue = context.getCurrentHost().getInternalQueue();
-
             } else {
                 this.topic = EXTERNAL_TOPIC;
                 this.queue = context.getExternalTopic();
@@ -773,33 +760,25 @@
          * Starts a thread that takes messages from the queue and gives them to the
          * listener. Stops the thread of any previously registered listener.
          */
+
         @Override
         public void register(TopicListener listener) {
-            Pair<CountDownLatch, CountDownLatch> newPair = new Pair<>(new CountDownLatch(1), new CountDownLatch(1));
-
+            Pair<CountDownLatch, CountDownLatch> newPair = Pair.of(new CountDownLatch(1), new CountDownLatch(1));
             reregister(newPair);
-
             Thread thread = new Thread(() -> {
-
                 try {
                     do {
-                        processMessages(newPair.first(), listener);
-                    } while (!newPair.first().await(stdInterPollMs, TimeUnit.MILLISECONDS));
-
+                        processMessages(newPair.getLeft(), listener);
+                    } while (!newPair.getLeft().await(stdInterPollMs, TimeUnit.MILLISECONDS));
                     logger.info("topic source thread completed");
-
                 } catch (InterruptedException e) {
                     logger.warn("topic source thread aborted", e);
                     Thread.currentThread().interrupt();
-
                 } catch (RuntimeException e) {
                     logger.warn("topic source thread aborted", e);
                 }
-
-                newPair.second().countDown();
-
+                newPair.getRight().countDown();
             });
-
             thread.setDaemon(true);
             thread.start();
         }
@@ -807,6 +786,7 @@
         /**
          * Stops the thread of <i>any</i> currently registered listener.
          */
+
         @Override
         public void unregister(TopicListener listener) {
             reregister(null);
@@ -818,6 +798,7 @@
          *
          * @param newPair the new "pair", or {@code null} to unregister
          */
+
         private void reregister(Pair<CountDownLatch, CountDownLatch> newPair) {
             try {
                 Pair<CountDownLatch, CountDownLatch> oldPair = pair.getAndSet(newPair);
@@ -826,26 +807,20 @@
                         // unregister was invoked twice in a row
                         logger.warn("re-unregister for topic source");
                     }
-
                     // no previous thread to stop
                     return;
                 }
-
                 // need to stop the previous thread
-
                 // tell it to stop
-                oldPair.first().countDown();
-
+                oldPair.getLeft().countDown();
                 // wait for it to stop
-                if (!oldPair.second().await(2, TimeUnit.SECONDS)) {
+                if (!oldPair.getRight().await(2, TimeUnit.SECONDS)) {
                     logger.warn("old topic registration is still running");
                 }
-
             } catch (InterruptedException e) {
                 logger.warn("old topic registration may still be running", e);
                 Thread.currentThread().interrupt();
             }
-
             if (newPair != null) {
                 // register was invoked twice in a row
                 logger.warn("re-register for topic source");
@@ -859,15 +834,13 @@
          * @param listener listener
          * @throws InterruptedException throws interrupted exception
          */
+
         private void processMessages(CountDownLatch stopped, TopicListener listener) throws InterruptedException {
-
             for (int x = 0; x < 5 && stopped.getCount() > 0; ++x) {
-
                 String msg = queue.poll(stdPollMs, TimeUnit.MILLISECONDS);
                 if (msg == null) {
                     return;
                 }
-
                 listener.onTopicEvent(CommInfrastructure.UEB, topic, msg);
             }
         }
@@ -877,11 +850,13 @@
      * Topic implementation. Most methods just throw
      * {@link UnsupportedOperationException}.
      */
+
     private static class TopicImpl implements Topic {
 
         /**
          * Constructor.
          */
+
         public TopicImpl() {
             super();
         }
@@ -960,8 +935,8 @@
     /**
      * Feature with overrides.
      */
-    private static class PoolingFeatureImpl extends PoolingFeature {
 
+    private static class PoolingFeatureImpl extends PoolingFeature {
         private final Context context;
 
         /**
@@ -969,9 +944,9 @@
          *
          * @param context context
          */
+
         public PoolingFeatureImpl(Context context) {
             this.context = context;
-
             /*
              * Note: do NOT extract anything from "context" at this point, because it
              * hasn't been fully initialized yet
@@ -981,9 +956,7 @@
         @Override
         public Properties getProperties(String featName) {
             Properties props = new Properties();
-
             props.setProperty(PoolingProperties.PROP_EXTRACTOR_PREFIX + ".java.util.Map", "${reqid}");
-
             props.setProperty(specialize(PoolingProperties.FEATURE_ENABLED, CONTROLLER1), "true");
             props.setProperty(specialize(PoolingProperties.POOLING_TOPIC, CONTROLLER1), INTERNAL_TOPIC);
             props.setProperty(specialize(PoolingProperties.OFFLINE_LIMIT, CONTROLLER1), "10000");
@@ -998,7 +971,6 @@
                             "" + stdActiveHeartbeatMs);
             props.setProperty(specialize(PoolingProperties.INTER_HEARTBEAT_MS, CONTROLLER1),
                             "" + stdInterHeartbeatMs);
-
             return props;
         }
 
@@ -1014,6 +986,7 @@
          * @param spec specializer to be embedded
          * @return the property name, with the specializer embedded within it
          */
+
         private String specialize(String propnm, String spec) {
             String suffix = propnm.substring(PREFIX.length());
             return PREFIX + spec + "." + suffix;
@@ -1022,9 +995,7 @@
         @Override
         protected PoolingManagerImpl makeManager(String host, PolicyController controller, PoolingProperties props,
                         CountDownLatch activeLatch) {
-
             currentContext.set(context);
-
             return new PoolingManagerTest(host, controller, props, activeLatch);
         }
     }
@@ -1032,6 +1003,7 @@
     /**
      * Pooling Manager with overrides.
      */
+
     private static class PoolingManagerTest extends PoolingManagerImpl {
 
         /**
@@ -1042,9 +1014,9 @@
          * @param props the properties
          * @param activeLatch the latch
          */
+
         public PoolingManagerTest(String host, PolicyController controller, PoolingProperties props,
                         CountDownLatch activeLatch) {
-
             super(host, controller, props, activeLatch);
         }
 
@@ -1067,6 +1039,7 @@
     /**
      * DMaaP Manager with overrides.
      */
+
     private static class DmaapManagerImpl extends DmaapManager {
 
         /**
@@ -1076,6 +1049,7 @@
          * @param topic the topic
          * @throws PoolingFeatureException if an error occurs
          */
+
         public DmaapManagerImpl(String topic) throws PoolingFeatureException {
             super(topic);
         }
@@ -1094,16 +1068,16 @@
     /**
      * Controller that also implements the {@link TopicListener} interface.
      */
-    private static interface ListenerController extends PolicyController, TopicListener {
 
+    private static interface ListenerController extends PolicyController, TopicListener {
     }
 
     /**
      * Simple function that takes no arguments and returns nothing.
      */
+
     @FunctionalInterface
     private static interface VoidFunction {
-
         void apply();
     }
 }
diff --git a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/PoolingFeatureTest.java b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/PoolingFeatureTest.java
index f9878a9..63bfc11 100644
--- a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/PoolingFeatureTest.java
+++ b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/PoolingFeatureTest.java
@@ -3,13 +3,14 @@
  * ONAP
  * ================================================================================
  * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -38,6 +39,7 @@
 import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.CountDownLatch;
+import org.apache.commons.lang3.tuple.Pair;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
@@ -46,7 +48,6 @@
 import org.onap.policy.drools.controller.DroolsController;
 import org.onap.policy.drools.system.PolicyController;
 import org.onap.policy.drools.system.PolicyEngine;
-import org.onap.policy.drools.utils.Pair;
 
 public class PoolingFeatureTest {
 
@@ -83,7 +84,7 @@
 
     /**
      * Setup.
-     * 
+     *
      * @throws Exception exception
      */
     @Before
@@ -113,8 +114,8 @@
         pool.afterCreate(controller1);
         pool.afterCreate(controller2);
 
-        mgr1 = managers.get(0).first();
-        mgr2 = managers.get(1).first();
+        mgr1 = managers.get(0).getLeft();
+        mgr2 = managers.get(1).getLeft();
     }
 
     @Test
@@ -245,7 +246,7 @@
         verify(mgr1).afterStop();
 
         assertFalse(pool.afterStop(controllerDisabled));
-        
+
         // count should be unchanged
         verify(mgr1).afterStop();
     }
@@ -254,7 +255,7 @@
     public void testAfterHalt() {
         assertFalse(pool.afterHalt(controller1));
         assertFalse(pool.afterHalt(controller1));
-        
+
         verify(mgr1, never()).afterStop();
 
         assertFalse(pool.afterStop(controllerDisabled));
@@ -264,7 +265,7 @@
     public void testAfterShutdown() {
         assertFalse(pool.afterShutdown(controller1));
         assertFalse(pool.afterShutdown(controller1));
-        
+
         verify(mgr1, never()).afterStop();
 
         assertFalse(pool.afterStop(controllerDisabled));
@@ -515,7 +516,7 @@
 
             PoolingManagerImpl mgr = mock(PoolingManagerImpl.class);
 
-            managers.add(new Pair<>(mgr, props));
+            managers.add(Pair.of(mgr, props));
 
             return mgr;
         }
diff --git a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/ActiveStateTest.java b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/ActiveStateTest.java
index c8cbdbb..e24c3c1 100644
--- a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/ActiveStateTest.java
+++ b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/ActiveStateTest.java
@@ -3,13 +3,14 @@
  * ONAP
  * ================================================================================
  * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -36,6 +37,7 @@
 
 import java.util.Arrays;
 import java.util.Map;
+import org.apache.commons.lang3.tuple.Pair;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.drools.pooling.message.BucketAssignments;
@@ -44,7 +46,6 @@
 import org.onap.policy.drools.pooling.message.Message;
 import org.onap.policy.drools.pooling.message.Offline;
 import org.onap.policy.drools.pooling.message.Query;
-import org.onap.policy.drools.utils.Pair;
 import org.onap.policy.drools.utils.Triple;
 
 public class ActiveStateTest extends SupportBasicStateTester {
@@ -54,6 +55,7 @@
     /**
      * Setup.
      */
+    @Override
     @Before
     public void setUp() throws Exception {
         super.setUp();
@@ -70,7 +72,7 @@
 
         // ensure a heart beat was generated
         Pair<String, Heartbeat> msg = capturePublishedMessage(Heartbeat.class);
-        assertEquals(MY_HOST, msg.second().getSource());
+        assertEquals(MY_HOST, msg.getRight().getSource());
     }
 
     @Test
@@ -187,7 +189,7 @@
         state = new ActiveState(mgr);
 
         /*
-         * 
+         *
          * PREV_HOST2 has buckets and is my predecessor, but it isn't the leader thus
          * should be ignored.
          */
@@ -360,8 +362,8 @@
         verify(mgr, times(2)).publish(anyString(), any(Heartbeat.class));
 
         Pair<String, Heartbeat> msg = capturePublishedMessage(Heartbeat.class);
-        assertEquals(MY_HOST, msg.first());
-        assertEquals(MY_HOST, msg.second().getSource());
+        assertEquals(MY_HOST, msg.getLeft());
+        assertEquals(MY_HOST, msg.getRight().getSource());
     }
 
     @Test
@@ -454,8 +456,8 @@
         verify(mgr, times(1)).publish(any(), any());
 
         Pair<String, Heartbeat> msg = capturePublishedMessage(Heartbeat.class);
-        assertEquals(MY_HOST, msg.first());
-        assertEquals(MY_HOST, msg.second().getSource());
+        assertEquals(MY_HOST, msg.getLeft());
+        assertEquals(MY_HOST, msg.getRight().getSource());
     }
 
     @Test
@@ -469,13 +471,13 @@
 
         // this message should go to itself
         msg = capturePublishedMessage(Heartbeat.class, index++);
-        assertEquals(MY_HOST, msg.first());
-        assertEquals(MY_HOST, msg.second().getSource());
+        assertEquals(MY_HOST, msg.getLeft());
+        assertEquals(MY_HOST, msg.getRight().getSource());
 
         // this message should go to its successor
         msg = capturePublishedMessage(Heartbeat.class, index++);
-        assertEquals(HOST1, msg.first());
-        assertEquals(MY_HOST, msg.second().getSource());
+        assertEquals(HOST1, msg.getLeft());
+        assertEquals(MY_HOST, msg.getRight().getSource());
     }
 
 }
diff --git a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/InactiveStateTest.java b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/InactiveStateTest.java
index 7749161..ab468a1 100644
--- a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/InactiveStateTest.java
+++ b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/InactiveStateTest.java
@@ -3,13 +3,14 @@
  * ONAP
  * ================================================================================
  * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -29,6 +30,7 @@
 import static org.mockito.Mockito.when;
 
 import java.util.Map;
+import org.apache.commons.lang3.tuple.Pair;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.drools.pooling.message.BucketAssignments;
@@ -36,7 +38,6 @@
 import org.onap.policy.drools.pooling.message.Leader;
 import org.onap.policy.drools.pooling.message.Message;
 import org.onap.policy.drools.pooling.message.Query;
-import org.onap.policy.drools.utils.Pair;
 
 public class InactiveStateTest extends SupportBasicStateTester {
 
@@ -44,8 +45,9 @@
 
     /**
      * Setup.
-     * 
+     *
      */
+    @Override
     @Before
     public void setUp() throws Exception {
         super.setUp();
@@ -111,13 +113,13 @@
 
         Pair<Long, StateTimerTask> timer = onceTasks.remove();
 
-        assertEquals(STD_REACTIVATE_WAIT_MS, timer.first().longValue());
+        assertEquals(STD_REACTIVATE_WAIT_MS, timer.getLeft().longValue());
 
         // invoke the task - it should go to the state returned by the mgr
         State next = mock(State.class);
         when(mgr.goStart()).thenReturn(next);
 
-        assertEquals(next, timer.second().fire());
+        assertEquals(next, timer.getRight().fire());
     }
 
     @Test
diff --git a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/QueryStateTest.java b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/QueryStateTest.java
index 97c9c95..aa999b5 100644
--- a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/QueryStateTest.java
+++ b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/QueryStateTest.java
@@ -3,13 +3,14 @@
  * ONAP
  * ================================================================================
  * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -32,6 +33,7 @@
 import static org.mockito.Mockito.when;
 
 import java.util.Map;
+import org.apache.commons.lang3.tuple.Pair;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.drools.pooling.message.BucketAssignments;
@@ -39,7 +41,6 @@
 import org.onap.policy.drools.pooling.message.Leader;
 import org.onap.policy.drools.pooling.message.Message;
 import org.onap.policy.drools.pooling.message.Offline;
-import org.onap.policy.drools.utils.Pair;
 
 public class QueryStateTest extends SupportBasicStateTester {
 
@@ -48,6 +49,7 @@
     /**
      * Setup.
      */
+    @Override
     @Before
     public void setUp() throws Exception {
         super.setUp();
@@ -77,8 +79,8 @@
 
         Pair<Long, StateTimerTask> timer = onceTasks.remove();
 
-        assertEquals(STD_IDENTIFICATION_MS, timer.first().longValue());
-        assertNotNull(timer.second());
+        assertEquals(STD_IDENTIFICATION_MS, timer.getLeft().longValue());
+        assertNotNull(timer.getRight());
     }
 
     @Test
@@ -251,15 +253,15 @@
 
         Pair<Long, StateTimerTask> timer = onceTasks.remove();
 
-        assertEquals(STD_IDENTIFICATION_MS, timer.first().longValue());
-        assertNotNull(timer.second());
+        assertEquals(STD_IDENTIFICATION_MS, timer.getLeft().longValue());
+        assertNotNull(timer.getRight());
 
         // should published an Offline message and go inactive
 
         State next = mock(State.class);
         when(mgr.goStart()).thenReturn(next);
 
-        assertEquals(next, timer.second().fire());
+        assertEquals(next, timer.getRight().fire());
 
         // should continue distributing
         verify(mgr, never()).startDistributing(null);
@@ -275,13 +277,13 @@
 
         Pair<Long, StateTimerTask> timer = onceTasks.remove();
 
-        assertEquals(STD_IDENTIFICATION_MS, timer.first().longValue());
-        assertNotNull(timer.second());
+        assertEquals(STD_IDENTIFICATION_MS, timer.getLeft().longValue());
+        assertNotNull(timer.getRight());
 
         State next = mock(State.class);
         when(mgr.goActive()).thenReturn(next);
 
-        assertEquals(next, timer.second().fire());
+        assertEquals(next, timer.getRight().fire());
 
         // should have published a Leader message
         Leader msg = captureAdminMessage(Leader.class);
@@ -304,14 +306,14 @@
 
         Pair<Long, StateTimerTask> timer = onceTasks.remove();
 
-        assertEquals(STD_IDENTIFICATION_MS, timer.first().longValue());
-        assertNotNull(timer.second());
+        assertEquals(STD_IDENTIFICATION_MS, timer.getLeft().longValue());
+        assertNotNull(timer.getRight());
 
         // set up active state, as that's what it should return
         State next = mock(State.class);
         when(mgr.goActive()).thenReturn(next);
 
-        assertEquals(next, timer.second().fire());
+        assertEquals(next, timer.getRight().fire());
 
         // should NOT have published a Leader message
         assertTrue(admin.isEmpty());
@@ -335,14 +337,14 @@
 
         Pair<Long, StateTimerTask> timer = onceTasks.remove();
 
-        assertEquals(STD_IDENTIFICATION_MS, timer.first().longValue());
-        assertNotNull(timer.second());
+        assertEquals(STD_IDENTIFICATION_MS, timer.getLeft().longValue());
+        assertNotNull(timer.getRight());
 
         // set up inactive state, as that's what it should return
         State next = mock(State.class);
         when(mgr.goInactive()).thenReturn(next);
 
-        assertEquals(next, timer.second().fire());
+        assertEquals(next, timer.getRight().fire());
 
         // should NOT have published a Leader message
         assertTrue(admin.isEmpty());
diff --git a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/StartStateTest.java b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/StartStateTest.java
index 092657e..1fd49c5 100644
--- a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/StartStateTest.java
+++ b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/StartStateTest.java
@@ -3,13 +3,14 @@
  * ONAP
  * ================================================================================
  * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,6 +32,7 @@
 import static org.mockito.Mockito.when;
 
 import java.util.Map;
+import org.apache.commons.lang3.tuple.Pair;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.drools.pooling.message.Forward;
@@ -40,7 +42,6 @@
 import org.onap.policy.drools.pooling.message.Message;
 import org.onap.policy.drools.pooling.message.Offline;
 import org.onap.policy.drools.pooling.message.Query;
-import org.onap.policy.drools.utils.Pair;
 import org.onap.policy.drools.utils.Triple;
 
 public class StartStateTest extends SupportBasicStateTester {
@@ -50,6 +51,7 @@
     /**
      * Setup.
      */
+    @Override
     @Before
     public void setUp() throws Exception {
         super.setUp();
@@ -81,8 +83,8 @@
 
         Pair<String, Heartbeat> msg = capturePublishedMessage(Heartbeat.class);
 
-        assertEquals(MY_HOST, msg.first());
-        assertEquals(state.getHbTimestampMs(), msg.second().getTimestampMs());
+        assertEquals(MY_HOST, msg.getLeft());
+        assertEquals(state.getHbTimestampMs(), msg.getRight().getTimestampMs());
 
 
         /*
@@ -95,11 +97,11 @@
 
         // invoke the task - it should generate another heartbeat
         assertEquals(null, generator.third().fire());
-        verify(mgr, times(2)).publish(MY_HOST, msg.second());
+        verify(mgr, times(2)).publish(MY_HOST, msg.getRight());
 
         // and again
         assertEquals(null, generator.third().fire());
-        verify(mgr, times(3)).publish(MY_HOST, msg.second());
+        verify(mgr, times(3)).publish(MY_HOST, msg.getRight());
 
 
         /*
@@ -107,13 +109,13 @@
          */
         Pair<Long, StateTimerTask> checker = onceTasks.removeFirst();
 
-        assertEquals(STD_HEARTBEAT_WAIT_MS, checker.first().longValue());
+        assertEquals(STD_HEARTBEAT_WAIT_MS, checker.getLeft().longValue());
 
         // invoke the task - it should go to the state returned by the mgr
         State next = mock(State.class);
         when(mgr.goInactive()).thenReturn(next);
 
-        assertEquals(next, checker.second().fire());
+        assertEquals(next, checker.getRight().fire());
 
         verify(mgr).startDistributing(null);
     }
diff --git a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/SupportBasicStateTester.java b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/SupportBasicStateTester.java
index 4727652..a124693 100644
--- a/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/SupportBasicStateTester.java
+++ b/feature-pooling-dmaap/src/test/java/org/onap/policy/drools/pooling/state/SupportBasicStateTester.java
@@ -3,13 +3,14 @@
  * ONAP
  * ================================================================================
  * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -35,13 +36,13 @@
 import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.concurrent.atomic.AtomicReference;
+import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.drools.pooling.CancellableScheduledTask;
 import org.onap.policy.drools.pooling.PoolingManager;
 import org.onap.policy.drools.pooling.PoolingProperties;
 import org.onap.policy.drools.pooling.message.BucketAssignments;
 import org.onap.policy.drools.pooling.message.Leader;
 import org.onap.policy.drools.pooling.message.Message;
-import org.onap.policy.drools.utils.Pair;
 import org.onap.policy.drools.utils.Triple;
 
 /**
@@ -116,7 +117,7 @@
 
     /**
      * Setup.
-     * 
+     *
      * @throws Exception throws exception
      */
     public void setUp() throws Exception {
@@ -152,7 +153,7 @@
         // capture publish() arguments
         doAnswer(invocation -> {
             Object[] args = invocation.getArguments();
-            published.add(new Pair<>((String) args[0], (Message) args[1]));
+            published.add(Pair.of((String) args[0], (Message) args[1]));
 
             return null;
         }).when(mgr).publish(anyString(), any(Message.class));
@@ -168,7 +169,7 @@
         // capture schedule() arguments, and return a new future
         when(mgr.schedule(anyLong(), any(StateTimerTask.class))).thenAnswer(invocation -> {
             Object[] args = invocation.getArguments();
-            onceTasks.add(new Pair<>((Long) args[0], (StateTimerTask) args[1]));
+            onceTasks.add(Pair.of((Long) args[0], (StateTimerTask) args[1]));
 
             CancellableScheduledTask sched = mock(CancellableScheduledTask.class);
             onceSchedules.add(sched);
@@ -198,7 +199,7 @@
 
     /**
      * Makes a sorted set of hosts.
-     * 
+     *
      * @param hosts the hosts to be sorted
      * @return the set of hosts, sorted
      */
@@ -208,7 +209,7 @@
 
     /**
      * Captures the host array from the Leader message published to the admin channel.
-     * 
+     *
      * @return the host array, as a list
      */
     protected List<String> captureHostList() {
@@ -217,7 +218,7 @@
 
     /**
      * Captures the host array from the Leader message published to the admin channel.
-     * 
+     *
      * @return the host array
      */
     protected String[] captureHostArray() {
@@ -231,7 +232,7 @@
 
     /**
      * Captures the assignments from the Leader message published to the admin channel.
-     * 
+     *
      * @return the bucket assignments
      */
     protected BucketAssignments captureAssignments() {
@@ -244,7 +245,7 @@
 
     /**
      * Captures the message published to the admin channel.
-     * 
+     *
      * @param clazz type of {@link Message} to capture
      * @return the message that was published
      */
@@ -254,7 +255,7 @@
 
     /**
      * Captures the message published to the admin channel.
-     * 
+     *
      * @param clazz type of {@link Message} to capture
      * @param index index of the item to be captured
      * @return the message that was published
@@ -265,7 +266,7 @@
 
     /**
      * Captures the message published to the non-admin channels.
-     * 
+     *
      * @param clazz type of {@link Message} to capture
      * @return the (channel,message) pair that was published
      */
@@ -275,13 +276,13 @@
 
     /**
      * Captures the message published to the non-admin channels.
-     * 
+     *
      * @param clazz type of {@link Message} to capture
      * @param index index of the item to be captured
      * @return the (channel,message) pair that was published
      */
     protected <T extends Message> Pair<String, T> capturePublishedMessage(Class<T> clazz, int index) {
         Pair<String, Message> msg = published.get(index);
-        return new Pair<>(msg.first(), clazz.cast(msg.second()));
+        return Pair.of(msg.getLeft(), clazz.cast(msg.getRight()));
     }
 }
diff --git a/feature-server-pool/src/main/java/org/onap/policy/drools/serverpool/FeatureServerPool.java b/feature-server-pool/src/main/java/org/onap/policy/drools/serverpool/FeatureServerPool.java
index cce7a09..dd1c7c3 100644
--- a/feature-server-pool/src/main/java/org/onap/policy/drools/serverpool/FeatureServerPool.java
+++ b/feature-server-pool/src/main/java/org/onap/policy/drools/serverpool/FeatureServerPool.java
@@ -3,6 +3,7 @@
  * feature-server-pool
  * ================================================================================
  * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -46,6 +47,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.tuple.Pair;
 import org.kie.api.runtime.KieSession;
 import org.kie.api.runtime.rule.FactHandle;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
@@ -65,7 +67,6 @@
 import org.onap.policy.drools.system.PolicyControllerConstants;
 import org.onap.policy.drools.system.PolicyEngine;
 import org.onap.policy.drools.system.PolicyEngineConstants;
-import org.onap.policy.drools.utils.Pair;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -791,7 +792,7 @@
                     kieSession.insert(backupAndRemove);
 
                     // add pending operation to the list
-                    pendingData.add(new Pair<>(droolsObjectsWrapper, session));
+                    pendingData.add(Pair.of(droolsObjectsWrapper, session));
                 }
             }
 
@@ -813,7 +814,7 @@
 
             for (Pair<CompletableFuture<List<Object>>, PolicySession> pair :
                     pendingData) {
-                PolicySession session = pair.second();
+                PolicySession session = pair.getRight();
                 long delay = endTime - System.currentTimeMillis();
                 if (delay < 0) {
                     /*
@@ -824,7 +825,7 @@
                 }
                 try {
                     List<Object> droolsObjects =
-                        pair.first().get(delay, TimeUnit.MILLISECONDS);
+                        pair.getLeft().get(delay, TimeUnit.MILLISECONDS);
 
                     // if we reach this point, session data read has completed
                     logger.info("{}: session={}, got {} object(s)",
diff --git a/policy-utils/src/main/java/org/onap/policy/drools/utils/Pair.java b/policy-utils/src/main/java/org/onap/policy/drools/utils/Pair.java
deleted file mode 100644
index c37084f..0000000
--- a/policy-utils/src/main/java/org/onap/policy/drools/utils/Pair.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-utils
- * ================================================================================
- * Copyright (C) 2017-2018 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.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.drools.utils;
-
-public class Pair<F, S> {
-
-    protected F first;
-    protected S second;
-
-    public Pair(F first, S second) {
-        this.first = first;
-        this.second = second;
-    }
-
-    public F first() {
-        return this.first;
-    }
-
-    public void first(F first) {
-        this.first = first;
-    }
-
-    public S second() {
-        return this.second;
-    }
-
-    public void second(S second) {
-        this.second = second;
-    }
-
-    public F getFirst() {
-        return this.first;
-    }
-
-    public S getSecond() {
-        return this.second;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("Pair [first=").append(first).append(", second=").append(second).append("]");
-        return builder.toString();
-    }
-}
diff --git a/policy-utils/src/test/java/org/onap/policy/drools/utils/PairTripleTest.java b/policy-utils/src/test/java/org/onap/policy/drools/utils/PairTripleTest.java
deleted file mode 100644
index ca792a1..0000000
--- a/policy-utils/src/test/java/org/onap/policy/drools/utils/PairTripleTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * policy-utils
- * ================================================================================
- * Copyright (C) 2017-2018, 2020 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.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.drools.utils;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import org.junit.Test;
-
-public class PairTripleTest {
-
-    @Test
-    public void testPair() {
-        Pair<String, String> pair = new Pair<String, String>("foo", "bar");
-
-        assertEquals("foo", pair.first());
-        assertEquals("bar", pair.second());
-        assertEquals("foo", pair.getFirst());
-        assertEquals("bar", pair.getSecond());
-
-        pair.first("one");
-        pair.second("two");
-
-        assertEquals("one", pair.first());
-        assertEquals("two", pair.second());
-        assertEquals("one", pair.getFirst());
-        assertEquals("two", pair.getSecond());
-
-        assertNotNull(pair.toString());
-
-    }
-
-    @Test
-    public void testTriple() {
-        Triple<String, String, String> triple = new Triple<String, String, String>("foo", "bar", "fiz");
-
-        assertEquals("foo", triple.first());
-        assertEquals("bar", triple.second());
-        assertEquals("fiz", triple.third());
-
-        triple.first("one");
-        triple.second("two");
-        triple.third("three");
-
-        assertEquals("one", triple.first());
-        assertEquals("two", triple.second());
-        assertEquals("three", triple.third());
-    }
-
-}
diff --git a/policy-utils/src/test/java/org/onap/policy/drools/utils/TripleTest.java b/policy-utils/src/test/java/org/onap/policy/drools/utils/TripleTest.java
index ff61393..7f04b16 100644
--- a/policy-utils/src/test/java/org/onap/policy/drools/utils/TripleTest.java
+++ b/policy-utils/src/test/java/org/onap/policy/drools/utils/TripleTest.java
@@ -3,6 +3,7 @@
  * ONAP
  * ================================================================================
  * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2020 Nordix Foundation
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -56,5 +57,6 @@
 
         triple.setThird("III");
         Assert.assertTrue("III".equals(triple.third()));
+
     }
 }
\ No newline at end of file