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=f231bb5c39e32c3cfb6b998873d0fe3d748ecdc3;hb=f2439a364be2129ab6d50eb15ad2df1a0ecac21f;hp=c2faf86bce73427c11217fd2ef7c2bfdb905a864;hpb=af4995552e842e052a085ed0845bfda97f5fe668;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 c2faf86bce..f231bb5c39 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,29 +4,34 @@ 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.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.NodeModification; import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreMetadataNode; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerRegistrationNode.DataChangeListenerRegistration; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.base.Optional; 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 DOMImmutableDataChangeEvent NO_CHANGE = builder().build(); + private final ImmutableList.Builder tasks = ImmutableList.builder(); private InstanceIdentifier rootPath; private ListenerRegistrationNode listenerRoot; private NodeModification modificationRoot; private Optional beforeRoot; private Optional afterRoot; - private final ImmutableList.Builder tasks = ImmutableList.builder(); protected InstanceIdentifier getRootPath() { return rootPath; @@ -74,6 +79,7 @@ public class DataChangeEventResolver { } public Iterable resolve() { + LOG.trace("Resolving events for {}" ,modificationRoot); resolveAnyChangeEvent(rootPath, Optional.of(listenerRoot), modificationRoot, beforeRoot, afterRoot); return tasks.build(); } @@ -124,11 +130,8 @@ public class DataChangeEventResolver { 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, @@ -142,12 +145,7 @@ public class DataChangeEventResolver { 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, @@ -169,12 +167,15 @@ public class DataChangeEventResolver { switch (childMod.getModificationType()) { case WRITE: case DELETE: - one.merge(resolveAnyChangeEvent(childPath, childListen, childMod, childBefore, childBefore)); + one.merge(resolveAnyChangeEvent(childPath, childListen, childMod, childBefore, childAfter)); break; case SUBTREE_MODIFIED: subtree.merge(resolveSubtreeChangeEvent(childPath, childListen, childMod, childBefore.get(), childAfter.get())); break; + case UNMODIFIED: + // no-op + break; } } DOMImmutableDataChangeEvent oneChangeEvent = one.build(); @@ -194,22 +195,35 @@ public class DataChangeEventResolver { return builder().build(); } - private void addNotifyTask(final ListenerRegistrationNode listenerRegistrationNode, final DataChangeScope one, - final DOMImmutableDataChangeEvent event) { - - + 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)); + } + } + return event; } - private void addNotifyTask(final Iterable> listeners, + private void addNotifyTask(final ListenerRegistrationNode listenerRegistrationNode, final DataChangeScope scope, final DOMImmutableDataChangeEvent event) { - 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(); } - - - }