From: Robert Varga Date: Thu, 20 Jan 2022 11:16:27 +0000 (+0100) Subject: Expose a List of changes in DOMDataTreeChangeListener X-Git-Tag: v9.0.0~64 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=f0d936f01e3b8914c4f3858a384dc5e81e949188;p=mdsal.git Expose a List of changes in DOMDataTreeChangeListener The order of changes have a semantic meaning in that they occur in-order. There are a number of use cases where we would want to access only the last delta (i.e. for the last state), which is easier when we expose a proper List instead of Collection. Change-Id: I159983207dfc935cbc81eccc24296e3db885f73e Signed-off-by: Robert Varga --- diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeListenerAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeListenerAdapter.java index 1372e1cf13..31296762d6 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeListenerAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeListenerAdapter.java @@ -9,7 +9,7 @@ package org.opendaylight.mdsal.binding.dom.adapter; import static java.util.Objects.requireNonNull; -import java.util.Collection; +import java.util.List; import org.opendaylight.mdsal.binding.api.DataTreeChangeListener; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; @@ -33,7 +33,7 @@ class BindingDOMDataTreeChangeListenerAdapter implements D } @Override - public void onDataTreeChanged(final Collection domChanges) { + public void onDataTreeChanged(final List domChanges) { listener.onDataTreeChanged(LazyDataTreeModification.from(adapterContext.currentSerializer(), domChanges, store)); } diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModification.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModification.java index 95aec5e110..5773430629 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModification.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModification.java @@ -11,7 +11,6 @@ import static java.util.Objects.requireNonNull; import com.google.common.base.MoreObjects; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.api.DataObjectModification; @@ -60,9 +59,8 @@ final class LazyDataTreeModification implements DataTreeMo LazyDataObjectModification.create(codec, candidate.getRootNode())); } - static @NonNull Collection> from( - final CurrentAdapterSerializer codec, final Collection domChanges, - final LogicalDatastoreType datastoreType) { + static @NonNull List> from(final CurrentAdapterSerializer codec, + final List domChanges, final LogicalDatastoreType datastoreType) { final List> result = new ArrayList<>(domChanges.size()); for (final DataTreeCandidate domChange : domChanges) { result.add(LazyDataTreeModification.create(codec, domChange, datastoreType)); diff --git a/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataTreeChangeListener.java b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataTreeChangeListener.java index da1f929265..4ac6106280 100644 --- a/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataTreeChangeListener.java +++ b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataTreeChangeListener.java @@ -7,8 +7,8 @@ */ package org.opendaylight.mdsal.dom.api; -import java.util.Collection; import java.util.EventListener; +import java.util.List; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; @@ -35,15 +35,15 @@ public interface DOMDataTreeChangeListener extends EventListener { * a {@link org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType} other than UNMODIFIED, while * the before- and after- data items compare as equal. * - * @param changes Collection of change events, may not be null or empty. + * @param changes List of change events, may not be null or empty. * @throws NullPointerException if {@code changes} is null */ - void onDataTreeChanged(@NonNull Collection changes); + void onDataTreeChanged(@NonNull List changes); /** * Invoked only once during registration of the listener if there was no data in the conceptual data tree * for the supplied path, which was used to register this listener, and after this - * {@link #onDataTreeChanged(Collection)} would always be invoked for data changes. + * {@link #onDataTreeChanged(List)} would always be invoked for data changes. */ void onInitialData(); } diff --git a/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMDataTreeChangeListenerTest.java b/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMDataTreeChangeListenerTest.java index d85ed73dc3..a1b19c1ea3 100644 --- a/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMDataTreeChangeListenerTest.java +++ b/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMDataTreeChangeListenerTest.java @@ -18,7 +18,7 @@ import static org.mockito.Mockito.verify; import com.google.common.collect.Iterables; import com.google.common.util.concurrent.MoreExecutors; -import java.util.Collection; +import java.util.List; import java.util.concurrent.ExecutionException; import org.junit.Before; import org.junit.Test; @@ -56,7 +56,7 @@ public class DOMDataTreeChangeListenerTest extends AbstractDatastoreTest { @Test public void receiveOnDataInitialEventForNonExistingData() throws InterruptedException, ExecutionException { final DOMDataTreeChangeListener listener = mock(DOMDataTreeChangeListener.class); - final ArgumentCaptor candidateCapture = ArgumentCaptor.forClass(Collection.class); + final ArgumentCaptor candidateCapture = ArgumentCaptor.forClass(List.class); doNothing().when(listener).onInitialData(); doNothing().when(listener).onDataTreeChanged(any()); @@ -79,7 +79,7 @@ public class DOMDataTreeChangeListenerTest extends AbstractDatastoreTest { @Test public void receiveOnDataTreeChangedEventForPreExistingEmptyData() throws InterruptedException, ExecutionException { final DOMDataTreeChangeListener listener = mock(DOMDataTreeChangeListener.class); - final ArgumentCaptor candidateCapture = ArgumentCaptor.forClass(Collection.class); + final ArgumentCaptor candidateCapture = ArgumentCaptor.forClass(List.class); doNothing().when(listener).onDataTreeChanged(any()); final NormalizedNode testNode = ImmutableNodes.containerNode(TestModel.TEST_QNAME); @@ -101,7 +101,7 @@ public class DOMDataTreeChangeListenerTest extends AbstractDatastoreTest { @Test public void receiveOnDataTreeChangeEventForPreExistingData() throws InterruptedException, ExecutionException { final DOMDataTreeChangeListener listener = mock(DOMDataTreeChangeListener.class); - final ArgumentCaptor candidateCapture = ArgumentCaptor.forClass(Collection.class); + final ArgumentCaptor candidateCapture = ArgumentCaptor.forClass(List.class); doNothing().when(listener).onDataTreeChanged(any()); final ContainerNode testNode = ImmutableContainerNodeBuilder.create() diff --git a/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMDataTreeListenerTest.java b/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMDataTreeListenerTest.java index a77775f382..b2dd818d15 100644 --- a/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMDataTreeListenerTest.java +++ b/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMDataTreeListenerTest.java @@ -19,7 +19,6 @@ import com.google.common.util.concurrent.ForwardingExecutorService; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; @@ -136,10 +135,10 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { latch.await(5, TimeUnit.SECONDS); assertEquals(1, listener.getReceivedChanges().size()); - final Collection changes = listener.getReceivedChanges().get(0); + final List changes = listener.getReceivedChanges().get(0); assertEquals(1, changes.size()); - final DataTreeCandidate candidate = changes.iterator().next(); + final DataTreeCandidate candidate = changes.get(0); assertNotNull(candidate); final DataTreeCandidateNode candidateRoot = candidate.getRootNode(); checkChange(null, TEST_CONTAINER, ModificationType.WRITE, candidateRoot); @@ -168,10 +167,10 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { latch.await(5, TimeUnit.SECONDS); assertEquals(2, listener.getReceivedChanges().size()); - Collection changes = listener.getReceivedChanges().get(0); + List changes = listener.getReceivedChanges().get(0); assertEquals(1, changes.size()); - DataTreeCandidate candidate = changes.iterator().next(); + DataTreeCandidate candidate = changes.get(0); assertNotNull(candidate); DataTreeCandidateNode candidateRoot = candidate.getRootNode(); checkChange(null, TEST_CONTAINER, ModificationType.WRITE, candidateRoot); @@ -179,7 +178,7 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { changes = listener.getReceivedChanges().get(1); assertEquals(1, changes.size()); - candidate = changes.iterator().next(); + candidate = changes.get(0); assertNotNull(candidate); candidateRoot = candidate.getRootNode(); checkChange(TEST_CONTAINER, TEST_CONTAINER_2, ModificationType.WRITE, candidateRoot); @@ -209,10 +208,10 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { latch.await(5, TimeUnit.SECONDS); assertEquals(2, listener.getReceivedChanges().size()); - Collection changes = listener.getReceivedChanges().get(0); + List changes = listener.getReceivedChanges().get(0); assertEquals(1, changes.size()); - DataTreeCandidate candidate = changes.iterator().next(); + DataTreeCandidate candidate = changes.get(0); assertNotNull(candidate); DataTreeCandidateNode candidateRoot = candidate.getRootNode(); checkChange(null, TEST_CONTAINER, ModificationType.WRITE, candidateRoot); @@ -220,7 +219,7 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { changes = listener.getReceivedChanges().get(1); assertEquals(1, changes.size()); - candidate = changes.iterator().next(); + candidate = changes.get(0); assertNotNull(candidate); candidateRoot = candidate.getRootNode(); checkChange(TEST_CONTAINER, null, ModificationType.DELETE, candidateRoot); @@ -250,10 +249,10 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { latch.await(5, TimeUnit.SECONDS); assertEquals(2, listener.getReceivedChanges().size()); - Collection changes = listener.getReceivedChanges().get(0); + List changes = listener.getReceivedChanges().get(0); assertEquals(1, changes.size()); - DataTreeCandidate candidate = changes.iterator().next(); + DataTreeCandidate candidate = changes.get(0); assertNotNull(candidate); DataTreeCandidateNode candidateRoot = candidate.getRootNode(); checkChange(null, TEST_CONTAINER, ModificationType.WRITE, candidateRoot); @@ -261,7 +260,7 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { changes = listener.getReceivedChanges().get(1); assertEquals(1, changes.size()); - candidate = changes.iterator().next(); + candidate = changes.get(0); assertNotNull(candidate); candidateRoot = candidate.getRootNode(); checkChange(TEST_CONTAINER, TEST_CONTAINER_2, ModificationType.SUBTREE_MODIFIED, candidateRoot); @@ -294,10 +293,10 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { latch.await(1, TimeUnit.SECONDS); assertEquals(2, listener.getReceivedChanges().size()); - Collection changes = listener.getReceivedChanges().get(0); + List changes = listener.getReceivedChanges().get(0); assertEquals(1, changes.size()); - DataTreeCandidate candidate = changes.iterator().next(); + DataTreeCandidate candidate = changes.get(0); assertNotNull(candidate); DataTreeCandidateNode candidateRoot = candidate.getRootNode(); checkChange(null, OUTER_LIST, ModificationType.WRITE, candidateRoot); @@ -305,7 +304,7 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { changes = listener.getReceivedChanges().get(1); assertEquals(1, changes.size()); - candidate = changes.iterator().next(); + candidate = changes.get(0); assertNotNull(candidate); candidateRoot = candidate.getRootNode(); checkChange(OUTER_LIST, OUTER_LIST_2, ModificationType.WRITE, candidateRoot); @@ -355,10 +354,10 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { latch.await(5, TimeUnit.SECONDS); assertEquals(2, listener.getReceivedChanges().size()); - Collection changes = listener.getReceivedChanges().get(0); + List changes = listener.getReceivedChanges().get(0); assertEquals(1, changes.size()); - DataTreeCandidate candidate = changes.iterator().next(); + DataTreeCandidate candidate = changes.get(0); assertNotNull(candidate); DataTreeCandidateNode candidateRoot = candidate.getRootNode(); checkChange(null, OUTER_LIST, ModificationType.WRITE, candidateRoot); @@ -366,7 +365,7 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { changes = listener.getReceivedChanges().get(1); assertEquals(1, changes.size()); - candidate = changes.iterator().next(); + candidate = changes.get(0); assertNotNull(candidate); candidateRoot = candidate.getRootNode(); checkChange(OUTER_LIST, listAfter, ModificationType.SUBTREE_MODIFIED, candidateRoot); @@ -417,7 +416,7 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { } static class TestDataTreeListener implements DOMDataTreeChangeListener { - private final List> receivedChanges = new ArrayList<>(); + private final List> receivedChanges = new ArrayList<>(); private final CountDownLatch latch; TestDataTreeListener(final CountDownLatch latch) { @@ -425,7 +424,7 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { } @Override - public void onDataTreeChanged(final Collection changes) { + public void onDataTreeChanged(final List changes) { receivedChanges.add(changes); latch.countDown(); } @@ -435,7 +434,7 @@ public class DOMDataTreeListenerTest extends AbstractDatastoreTest { // noop } - List> getReceivedChanges() { + List> getReceivedChanges() { return receivedChanges; } } diff --git a/replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/AbstractSourceMessage.java b/replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/AbstractSourceMessage.java index 0df9b42ff0..5c5eeeb549 100644 --- a/replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/AbstractSourceMessage.java +++ b/replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/AbstractSourceMessage.java @@ -11,7 +11,6 @@ import static java.util.Objects.requireNonNull; import java.io.DataOutputStream; import java.io.IOException; -import java.util.Collection; import java.util.List; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; import org.opendaylight.yangtools.yang.data.codec.binfmt.DataTreeCandidateInputOutput; @@ -27,9 +26,9 @@ abstract class AbstractSourceMessage { } private static final class Deltas extends AbstractSourceMessage { - private final Collection deltas; + private final List deltas; - Deltas(final Collection deltas) { + Deltas(final List deltas) { this.deltas = requireNonNull(deltas); } @@ -52,7 +51,7 @@ abstract class AbstractSourceMessage { return EMPTY; } - static AbstractSourceMessage of(final Collection deltas) { + static AbstractSourceMessage of(final List deltas) { return new Deltas(deltas); } diff --git a/replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/SourceRequestHandler.java b/replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/SourceRequestHandler.java index 2d2065d50d..dc5201a419 100644 --- a/replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/SourceRequestHandler.java +++ b/replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/SourceRequestHandler.java @@ -16,7 +16,7 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import java.io.IOException; -import java.util.Collection; +import java.util.List; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener; import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; @@ -95,7 +95,7 @@ final class SourceRequestHandler extends SimpleChannelInboundHandler { } @Override - public void onDataTreeChanged(final Collection changes) { + public void onDataTreeChanged(final List changes) { LOG.debug("Channel {} tree {} has {} changes", channel, dataTree, changes.size()); channel.writeAndFlush(AbstractSourceMessage.of(changes)); }