Add JournalSegmentFile.map()
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / RootDataTreeChangeListenerActor.java
index 963dea98afab9f61a286497a525a4fc9ace4ece8..857c2844ffcc75a52b416998755efae1e71e87b4 100644 (file)
@@ -14,10 +14,12 @@ import akka.actor.ActorRef;
 import akka.actor.Props;
 import com.google.common.collect.Iterables;
 import java.util.ArrayDeque;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Deque;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import org.opendaylight.controller.cluster.datastore.messages.DataTreeChanged;
 import org.opendaylight.controller.cluster.datastore.messages.OnInitialData;
@@ -26,11 +28,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNodes;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidates;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
+import org.opendaylight.yangtools.yang.data.tree.spi.DataTreeCandidateNodes;
+import org.opendaylight.yangtools.yang.data.tree.spi.DataTreeCandidates;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 final class RootDataTreeChangeListenerActor extends DataTreeChangeListenerActor {
@@ -41,7 +43,7 @@ final class RootDataTreeChangeListenerActor extends DataTreeChangeListenerActor
     private Deque<DataTreeChanged> otherMessages = new ArrayDeque<>();
 
     private RootDataTreeChangeListenerActor(final DOMDataTreeChangeListener listener, final int shardCount) {
-        super(listener, YangInstanceIdentifier.empty());
+        super(listener, YangInstanceIdentifier.of());
         this.shardCount = shardCount;
     }
 
@@ -83,7 +85,7 @@ final class RootDataTreeChangeListenerActor extends DataTreeChangeListenerActor
         /*
          * We need to make-pretend that the data coming into the listener is coming from a single logical entity, where
          * ordering is partially guaranteed (on shard boundaries). The data layout in shards is such that each DataTree
-         * is rooted at YangInstanceIdentifier.empty(), but their contents vary:
+         * is rooted at YangInstanceIdentifier.of(), but their contents vary:
          *
          * 1) non-default shards contain immediate children of root from one module
          * 2) default shard contains everything else
@@ -95,7 +97,10 @@ final class RootDataTreeChangeListenerActor extends DataTreeChangeListenerActor
          * Construct an overall NormalizedNode view of the entire datastore by combining first-level children from all
          * reported initial state reports, report that node as written and then report any additional deltas.
          */
-        final Deque<DataTreeCandidate> initialChanges = new ArrayDeque<>();
+        final List<DataTreeCandidate> initialChanges = new ArrayList<>();
+        // Reserve first item
+        initialChanges.add(null);
+
         final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> rootBuilder = Builders.containerBuilder()
                 .withNodeIdentifier(NodeIdentifier.create(SchemaContext.NAME));
         for (Object message : initialMessages.values()) {
@@ -106,21 +111,21 @@ final class RootDataTreeChangeListenerActor extends DataTreeChangeListenerActor
                     final Iterator<DataTreeCandidate> it = changes.iterator();
                     initial = it.next();
                     // Append to changes to report as initial. This should not be happening (often?).
-                    it.forEachRemaining(initialChanges::addLast);
+                    it.forEachRemaining(initialChanges::add);
                 } else {
                     initial = Iterables.get(changes, 0);
                 }
 
-                final NormalizedNode<?, ?> root = initial.getRootNode().getDataAfter().orElseThrow();
+                final NormalizedNode root = initial.getRootNode().getDataAfter();
                 verify(root instanceof ContainerNode, "Unexpected root node %s", root);
-                ((ContainerNode) root).getValue().forEach(rootBuilder::withChild);
+                ((ContainerNode) root).body().forEach(rootBuilder::withChild);
             }
         }
         // We will not be intercepting any other messages, allow initial state to be reclaimed as soon as possible
         initialMessages = null;
 
-        // Prepend combined initial changed and report initial changes and clear the map
-        initialChanges.addFirst(DataTreeCandidates.newDataTreeCandidate(YangInstanceIdentifier.empty(),
+        // Replace first element with the combined initial change, report initial changes and clear the map
+        initialChanges.set(0, DataTreeCandidates.newDataTreeCandidate(YangInstanceIdentifier.of(),
             DataTreeCandidateNodes.written(rootBuilder.build())));
         super.dataTreeChanged(new DataTreeChanged(initialChanges));
 
@@ -133,6 +138,6 @@ final class RootDataTreeChangeListenerActor extends DataTreeChangeListenerActor
     }
 
     static Props props(final DOMDataTreeChangeListener instance, final int shardCount) {
-        return Props.create(RootDataTreeChangeListenerActor.class, shardCount);
+        return Props.create(RootDataTreeChangeListenerActor.class, instance, shardCount);
     }
 }