Publish a list of changes when leadership changes occur

Change-Id: I99a4e239ac5aa9999b3a735cdf004941a5957a93
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorCommands.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorCommands.java
index 8efa234..900fef2 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorCommands.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorCommands.java
@@ -291,17 +291,14 @@
     }
 
     /**
-     * Command for administratively anointing a node as leader.
+     * Command for administratively changing the leadership state for a node.
      */
     @SuppressWarnings("serial")
-    public static class Anoint extends ElectionCommand<Boolean> {
+    public abstract static class ElectionChangeCommand<V> extends ElectionCommand<V>  {
         private String topic;
         private NodeId nodeId;
 
-        public Anoint() {
-        }
-
-        public Anoint(String topic, NodeId nodeId) {
+        public ElectionChangeCommand(String topic, NodeId nodeId) {
             this.topic = topic;
             this.nodeId = nodeId;
         }
@@ -346,57 +343,22 @@
     }
 
     /**
+     * Command for administratively anoint a node as leader.
+     */
+    @SuppressWarnings("serial")
+    public static class Anoint extends ElectionChangeCommand<Boolean> {
+        public Anoint(String topic, NodeId nodeId) {
+            super(topic, nodeId);
+        }
+    }
+
+    /**
      * Command for administratively promote a node as top candidate.
      */
     @SuppressWarnings("serial")
-    public static class Promote extends ElectionCommand<Boolean> {
-        private String topic;
-        private NodeId nodeId;
-
-        public Promote() {
-        }
-
+    public static class Promote extends ElectionChangeCommand<Boolean> {
         public Promote(String topic, NodeId nodeId) {
-            this.topic = topic;
-            this.nodeId = nodeId;
-        }
-
-        /**
-         * Returns the topic.
-         *
-         * @return The topic
-         */
-        public String topic() {
-            return topic;
-        }
-
-        /**
-         * Returns the nodeId to make top candidate.
-         *
-         * @return The nodeId
-         */
-        public NodeId nodeId() {
-            return nodeId;
-        }
-
-        @Override
-        public String toString() {
-            return MoreObjects.toStringHelper(getClass())
-                    .add("topic", topic)
-                    .add("nodeId", nodeId)
-                    .toString();
-        }
-
-        @Override
-        public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
-            buffer.writeString(topic);
-            buffer.writeString(nodeId.toString());
-        }
-
-        @Override
-        public void readObject(BufferInput<?> buffer, Serializer serializer) {
-            topic = buffer.readString();
-            nodeId = new NodeId(buffer.readString());
+            super(topic, nodeId);
         }
     }
 
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorState.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorState.java
index ef8c444..0621042 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorState.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorState.java
@@ -97,7 +97,7 @@
     }
 
     private void notifyLeadershipChange(Leadership previousLeadership, Leadership newLeadership) {
-        notifyLeadershipChanges(Arrays.asList(new Change<>(previousLeadership, newLeadership)));
+        notifyLeadershipChanges(Lists.newArrayList(new Change<>(previousLeadership, newLeadership)));
     }
 
     private void notifyLeadershipChanges(List<Change<Leadership>> changes) {
@@ -247,7 +247,7 @@
      */
     public void evict(Commit<? extends Evict> commit) {
         try {
-            List<Change<Leadership>> changes = Lists.newLinkedList();
+            List<Change<Leadership>> changes = Lists.newArrayList();
             NodeId nodeId = commit.operation().nodeId();
             Set<String> topics = Maps.filterValues(elections, e -> e.candidates().contains(nodeId)).keySet();
             topics.forEach(topic -> {
@@ -330,14 +330,16 @@
             listener.close();
         }
         Set<String> topics = elections.keySet();
+        List<Change<Leadership>> changes = Lists.newArrayList();
         topics.forEach(topic -> {
             Leadership oldLeadership = leadership(topic);
             elections.compute(topic, (k, v) -> v.cleanup(session, termCounter(topic)::incrementAndGet));
             Leadership newLeadership = leadership(topic);
             if (!Objects.equal(oldLeadership, newLeadership)) {
-                notifyLeadershipChange(oldLeadership, newLeadership);
+                changes.add(new Change<>(oldLeadership, newLeadership));
             }
         });
+        notifyLeadershipChanges(changes);
     }
 
     private static class Registration {