Merge "Add sequence number to Actors"
authorRam Krishna Verma <ram_krishna.verma@bell.ca>
Sun, 1 Mar 2020 15:44:26 +0000 (15:44 +0000)
committerGerrit Code Review <gerrit@onap.org>
Sun, 1 Mar 2020 15:44:26 +0000 (15:44 +0000)
models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcActorServiceProvider.java
models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcServiceProviderTest.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/ActorService.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImpl.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/spi/Actor.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/ActorServiceTest.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImplTest.java

index 76aa828..117bd5c 100644 (file)
@@ -81,6 +81,14 @@ public class AppcActorServiceProvider extends BidirectionalTopicActor<Bidirectio
                         ModifyConfigOperation::new));
     }
 
+    /**
+     * This actor should take precedence over APPC-LCM.
+     */
+    @Override
+    public int getSequenceNumber() {
+        return -1;
+    }
+
 
     // TODO old code: remove lines down to **HERE**
 
index 99e9d82..a2bf018 100644 (file)
@@ -133,6 +133,7 @@ public class AppcServiceProviderTest extends BasicActor {
     @Test
     public void testConstructor() {
         AppcActorServiceProvider prov = new AppcActorServiceProvider();
+        assertEquals(-1, prov.getSequenceNumber());
 
         // verify that it has the operators we expect
         var expected = Arrays.asList(ModifyConfigOperation.NAME).stream().sorted().collect(Collectors.toList());
index b0d70fd..49379b2 100644 (file)
@@ -25,6 +25,8 @@ import com.google.common.collect.ImmutableMap;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.ServiceConfigurationError;
 import java.util.ServiceLoader;
@@ -55,17 +57,7 @@ public class ActorService extends StartConfigPartial<Map<String, Object>> {
 
         Map<String, Actor> map = new HashMap<>();
 
-        Iterator<Actor> iter = loadActors().iterator();
-        while (iter.hasNext()) {
-
-            Actor newActor;
-            try {
-                newActor = iter.next();
-            } catch (ServiceConfigurationError e) {
-                logger.warn("unable to load actor", e);
-                continue;
-            }
-
+        for (Actor newActor : buildList()) {
             map.compute(newActor.getName(), (name, existingActor) -> {
                 if (existingActor == null) {
                     return newActor;
@@ -80,6 +72,35 @@ public class ActorService extends StartConfigPartial<Map<String, Object>> {
         name2actor = ImmutableMap.copyOf(map);
     }
 
+    /**
+     * Builds the list of actors, discarding those that cannot be constructed.
+     *
+     * @return the list of actors, sorted by ascending sequence number
+     */
+    private List<Actor> buildList() {
+        List<Actor> actors = new LinkedList<>();
+
+        Iterator<Actor> iter = loadActors().iterator();
+        while (iter.hasNext()) {
+            try {
+                actors.add(iter.next());
+            } catch (ServiceConfigurationError e) {
+                logger.warn("unable to load actor", e);
+            }
+        }
+
+        actors.sort((actor1, actor2) -> {
+            int cmp = Integer.compare(actor1.getSequenceNumber(), actor2.getSequenceNumber());
+            if (cmp != 0) {
+                return cmp;
+            }
+
+            return actor1.getClass().getName().compareTo(actor2.getClass().getName());
+        });
+
+        return actors;
+    }
+
     /**
      * Gets a particular actor.
      *
index 0c88ebe..12af030 100644 (file)
@@ -55,6 +55,14 @@ public class ActorImpl extends StartConfigPartial<Map<String, Object>> implement
         super(name);
     }
 
+    /**
+     * This method simply returns {@code 0}.
+     */
+    @Override
+    public int getSequenceNumber() {
+        return 0;
+    }
+
     /**
      * Adds an operator supported by this actor.
      *
index 53bee5f..52d1a5a 100644 (file)
@@ -36,7 +36,7 @@ import org.onap.policy.controlloop.actorserviceprovider.Operator;
  * @author pameladragosh
  *
  */
-public interface Actor extends Startable, Configurable<Map<String,Object>> {
+public interface Actor extends Startable, Configurable<Map<String, Object>> {
 
     /**
      * Gets the name of the actor.
@@ -68,6 +68,14 @@ public interface Actor extends Startable, Configurable<Map<String,Object>> {
      */
     public Set<String> getOperationNames();
 
+    /**
+     * Gets the actor sequence number. Lower numbered actors take precedence over higher
+     * numbered actors.
+     *
+     * @return the actor sequence number
+     */
+    public int getSequenceNumber();
+
 
     // TODO old code: remove lines down to **HERE**
 
index 401e0ca..0f282f6 100644 (file)
@@ -91,15 +91,27 @@ public class ActorServiceTest {
     }
 
     @Test
-    public void testActorService() {
+    public void testActorService_testBuildList() {
         /*
          * make a service where actors two and four have names that are duplicates of the
          * others
          */
+
+        /*
+         * actor0 has a higher sequence number than actor1, so it should be discarded,
+         * even though it will be examined first
+         */
+        Actor actor0 = spy(new ActorImpl(ACTOR1) {
+            @Override
+            public int getSequenceNumber() {
+                return 10000;
+            }
+        });
+
         actor2 = spy(new ActorImpl(ACTOR1));
         actor4 = spy(new ActorImpl(ACTOR3));
 
-        service = makeService(actor1, actor2, actor3, actor4);
+        service = makeService(actor0, actor1, actor2, actor3, actor4);
 
         assertEquals(2, service.getActorNames().size());