summaryrefslogtreecommitdiffstats
path: root/models-interactions
diff options
context:
space:
mode:
authorJim Hahn <jrh3@att.com>2020-02-29 13:20:06 -0500
committerJim Hahn <jrh3@att.com>2020-02-29 13:22:48 -0500
commitf583aa9031e4f73ae0004bf972ac7a6c3afa4b71 (patch)
treefd4a02ba054118ef79c589a263376b13fe441a0c /models-interactions
parentda47a120294d931bde38d821df8979813564e05c (diff)
Add sequence number to Actors
When actors with duplicate names are loaded, a way is needed to determine which should take precedence. Added a sequence number to Actor to facilitate this. Unfortunately, couldn't use OrderedServiceImpl, because it only creates the Actors once, which would break a number of junit tests. Issue-ID: POLICY-1625 Signed-off-by: Jim Hahn <jrh3@att.com> Change-Id: I1ade92f4fe516cfc54bb92d0a3624c67e8981075
Diffstat (limited to 'models-interactions')
-rw-r--r--models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcActorServiceProvider.java8
-rw-r--r--models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcServiceProviderTest.java1
-rw-r--r--models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/ActorService.java43
-rw-r--r--models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImpl.java8
-rw-r--r--models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/spi/Actor.java10
-rw-r--r--models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/ActorServiceTest.java16
-rw-r--r--models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImplTest.java1
7 files changed, 73 insertions, 14 deletions
diff --git a/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcActorServiceProvider.java b/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcActorServiceProvider.java
index 76aa828c1..117bd5c86 100644
--- a/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcActorServiceProvider.java
+++ b/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcActorServiceProvider.java
@@ -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**
diff --git a/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcServiceProviderTest.java b/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcServiceProviderTest.java
index 99e9d824a..a2bf018b3 100644
--- a/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcServiceProviderTest.java
+++ b/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcServiceProviderTest.java
@@ -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());
diff --git a/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/ActorService.java b/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/ActorService.java
index b0d70fda0..49379b28c 100644
--- a/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/ActorService.java
+++ b/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/ActorService.java
@@ -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;
@@ -81,6 +73,35 @@ public class ActorService extends StartConfigPartial<Map<String, Object>> {
}
/**
+ * 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.
*
* @param name name of the actor of interest
diff --git a/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImpl.java b/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImpl.java
index 0c88ebee2..12af030d5 100644
--- a/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImpl.java
+++ b/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImpl.java
@@ -56,6 +56,14 @@ public class ActorImpl extends StartConfigPartial<Map<String, Object>> implement
}
/**
+ * This method simply returns {@code 0}.
+ */
+ @Override
+ public int getSequenceNumber() {
+ return 0;
+ }
+
+ /**
* Adds an operator supported by this actor.
*
* @param operator operation to be added
diff --git a/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/spi/Actor.java b/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/spi/Actor.java
index 53bee5f00..52d1a5a9a 100644
--- a/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/spi/Actor.java
+++ b/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/spi/Actor.java
@@ -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**
diff --git a/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/ActorServiceTest.java b/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/ActorServiceTest.java
index 401e0ca58..0f282f662 100644
--- a/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/ActorServiceTest.java
+++ b/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/ActorServiceTest.java
@@ -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());
diff --git a/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImplTest.java b/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImplTest.java
index 92cbbe774..681378de4 100644
--- a/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImplTest.java
+++ b/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImplTest.java
@@ -93,6 +93,7 @@ public class ActorImplTest {
public void testActorImpl_testGetName() {
assertEquals(ACTOR_NAME, actor.getName());
assertEquals(4, actor.getOperationNames().size());
+ assertEquals(0, actor.getSequenceNumber());
}
@Test