X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fdom%2Fstore%2Fimpl%2FDataChangeEventResolver.java;h=df2725d0206f1bb91716e8505b61214de6a16d65;hb=fc2ff81f096e61194c0538452bb6ed1b2894159a;hp=a032c798c62d8fbe0151ab5406a23dab54b0af02;hpb=08217531fbe76dbcc429c71d593894fc211e50aa;p=controller.git diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DataChangeEventResolver.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DataChangeEventResolver.java index a032c798c6..df2725d020 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DataChangeEventResolver.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DataChangeEventResolver.java @@ -4,12 +4,14 @@ import static org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableData import static org.opendaylight.controller.md.sal.dom.store.impl.StoreUtils.append; import static org.opendaylight.controller.md.sal.dom.store.impl.tree.TreeNodeUtils.getChild; -import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent.Builder; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerRegistrationNode; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerTree; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerTree.Walker; import org.opendaylight.controller.md.sal.dom.store.impl.tree.NodeModification; import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreMetadataNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; @@ -23,17 +25,14 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; public class DataChangeEventResolver { - - - private static final Logger LOG = LoggerFactory.getLogger(DataChangeEventResolver.class); - + private static final Logger LOG = LoggerFactory.getLogger(DataChangeEventResolver.class); private static final DOMImmutableDataChangeEvent NO_CHANGE = builder().build(); + private final ImmutableList.Builder tasks = ImmutableList.builder(); private InstanceIdentifier rootPath; - private ListenerRegistrationNode listenerRoot; + private ListenerTree listenerRoot; private NodeModification modificationRoot; private Optional beforeRoot; private Optional afterRoot; - private final ImmutableList.Builder tasks = ImmutableList.builder(); protected InstanceIdentifier getRootPath() { return rootPath; @@ -44,11 +43,11 @@ public class DataChangeEventResolver { return this; } - protected ListenerRegistrationNode getListenerRoot() { + protected ListenerTree getListenerRoot() { return listenerRoot; } - protected DataChangeEventResolver setListenerRoot(final ListenerRegistrationNode listenerRoot) { + protected DataChangeEventResolver setListenerRoot(final ListenerTree listenerRoot) { this.listenerRoot = listenerRoot; return this; } @@ -81,13 +80,16 @@ public class DataChangeEventResolver { } public Iterable resolve() { - LOG.trace("Resolving events for {}" ,modificationRoot); - resolveAnyChangeEvent(rootPath, Optional.of(listenerRoot), modificationRoot, beforeRoot, afterRoot); - return tasks.build(); + LOG.trace("Resolving events for {}", modificationRoot); + + try (final Walker w = listenerRoot.getWalker()) { + resolveAnyChangeEvent(rootPath, Optional.of(w.getRootNode()), modificationRoot, beforeRoot, afterRoot); + return tasks.build(); + } } private DOMImmutableDataChangeEvent resolveAnyChangeEvent(final InstanceIdentifier path, - final Optional listeners, final NodeModification modification, + final Optional listeners, final NodeModification modification, final Optional before, final Optional after) { // No listeners are present in listener registration subtree // no before and after state is present @@ -121,46 +123,37 @@ public class DataChangeEventResolver { * @return */ private DOMImmutableDataChangeEvent resolveCreateEvent(final InstanceIdentifier path, - final Optional listeners, final StoreMetadataNode afterState) { + final Optional listeners, final StoreMetadataNode afterState) { final NormalizedNode node = afterState.getData(); Builder builder = builder().setAfter(node).addCreated(path, node); for (StoreMetadataNode child : afterState.getChildren()) { PathArgument childId = child.getIdentifier(); - Optional childListeners = getChild(listeners, childId); + Optional childListeners = getChild(listeners, childId); InstanceIdentifier childPath = StoreUtils.append(path, childId); builder.merge(resolveCreateEvent(childPath, childListeners, child)); } - DOMImmutableDataChangeEvent event = builder.build(); - if (listeners.isPresent()) { - addNotifyTask(listeners.get().getListeners(), event); - } - return event; + return addNotifyTask(listeners, builder.build()); } private DOMImmutableDataChangeEvent resolveDeleteEvent(final InstanceIdentifier path, - final Optional listeners, final StoreMetadataNode beforeState) { + final Optional listeners, final StoreMetadataNode beforeState) { final NormalizedNode node = beforeState.getData(); Builder builder = builder().setBefore(node).addRemoved(path, node); for (StoreMetadataNode child : beforeState.getChildren()) { PathArgument childId = child.getIdentifier(); - Optional childListeners = getChild(listeners, childId); + Optional childListeners = getChild(listeners, childId); InstanceIdentifier childPath = StoreUtils.append(path, childId); builder.merge(resolveDeleteEvent(childPath, childListeners, child)); } - DOMImmutableDataChangeEvent event = builder.build(); - if (listeners.isPresent()) { - addNotifyTask(listeners.get().getListeners(), event); - } - return event; - + return addNotifyTask(listeners, builder.build()); } private DOMImmutableDataChangeEvent resolveSubtreeChangeEvent(final InstanceIdentifier path, - final Optional listeners, final NodeModification modification, + final Optional listeners, final NodeModification modification, final StoreMetadataNode before, final StoreMetadataNode after) { Builder one = builder().setBefore(before.getData()).setAfter(after.getData()); @@ -170,7 +163,7 @@ public class DataChangeEventResolver { for (NodeModification childMod : modification.getModifications()) { PathArgument childId = childMod.getIdentifier(); InstanceIdentifier childPath = append(path, childId); - Optional childListen = getChild(listeners, childId); + Optional childListen = getChild(listeners, childId); Optional childBefore = before.getChild(childId); Optional childAfter = after.getChild(childId); @@ -184,6 +177,9 @@ public class DataChangeEventResolver { subtree.merge(resolveSubtreeChangeEvent(childPath, childListen, childMod, childBefore.get(), childAfter.get())); break; + case UNMODIFIED: + // no-op + break; } } DOMImmutableDataChangeEvent oneChangeEvent = one.build(); @@ -197,39 +193,41 @@ public class DataChangeEventResolver { } private DOMImmutableDataChangeEvent resolveReplacedEvent(final InstanceIdentifier path, - final Optional listeners, final NodeModification modification, + final Optional listeners, final NodeModification modification, final StoreMetadataNode before, final StoreMetadataNode after) { // FIXME Add task return builder().build(); } - private void addNotifyTask(final ListenerRegistrationNode listenerRegistrationNode, final DataChangeScope scope, - final DOMImmutableDataChangeEvent event) { - Collection> potential = listenerRegistrationNode.getListeners(); - if(potential.isEmpty()) { - return; - } - ArrayList> toNotify = new ArrayList<>(potential.size()); - for(DataChangeListenerRegistration listener : potential) { - if(scope.equals(listener.getScope())) { - toNotify.add(listener); + private DOMImmutableDataChangeEvent addNotifyTask(final Optional listeners, final DOMImmutableDataChangeEvent event) { + if (listeners.isPresent()) { + final Collection> l = listeners.get().getListeners(); + if (!l.isEmpty()) { + tasks.add(new ChangeListenerNotifyTask(ImmutableSet.copyOf(l), event)); } } - addNotifyTask(toNotify, event); + return event; } - private void addNotifyTask(final Collection> listeners, + private void addNotifyTask(final ListenerTree.Node listenerRegistrationNode, final DataChangeScope scope, final DOMImmutableDataChangeEvent event) { - if(!listeners.isEmpty()) { - tasks.add(new ChangeListenerNotifyTask(ImmutableSet.copyOf(listeners),event)); + Collection> potential = listenerRegistrationNode.getListeners(); + if(!potential.isEmpty()) { + final Set> toNotify = new HashSet<>(potential.size()); + for(DataChangeListenerRegistration listener : potential) { + if(scope.equals(listener.getScope())) { + toNotify.add(listener); + } + } + + if (!toNotify.isEmpty()) { + tasks.add(new ChangeListenerNotifyTask(toNotify, event)); + } } } public static DataChangeEventResolver create() { return new DataChangeEventResolver(); } - - - }