X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fdom%2Fstore%2Fimpl%2FResolveDataChangeEventsTask.java;h=b36ef3dd7c16250bfcc101ab4567be3feaaadbc4;hp=db9bb0fef29fda971f08982d5d0f0e67353ec630;hb=617941ac35b64881556f7311a8a296f4b60b2935;hpb=a31a4448ea6665317f4af41ae26d804829418c04 diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ResolveDataChangeEventsTask.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ResolveDataChangeEventsTask.java index db9bb0fef2..b36ef3dd7c 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ResolveDataChangeEventsTask.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/ResolveDataChangeEventsTask.java @@ -23,11 +23,11 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataCh import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent.Builder; import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent.SimpleEventFactory; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidate; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidateNode; import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerTree; import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerTree.Node; import org.opendaylight.controller.md.sal.dom.store.impl.tree.ListenerTree.Walker; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.NodeModification; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.StoreMetadataNode; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates; @@ -73,9 +73,9 @@ final class ResolveDataChangeEventsTask implements Callable call() { try (final Walker w = listenerRoot.getWalker()) { - resolveAnyChangeEvent(candidate.getRootPath(), Collections.singleton(w.getRootNode()), - candidate.getModificationRoot(), Optional.fromNullable(candidate.getBeforeRoot()), - Optional.fromNullable(candidate.getAfterRoot())); + resolveAnyChangeEvent(candidate.getRootPath(), Collections.singleton(w.getRootNode()), candidate.getRootNode()); return createNotificationTasks(); } } @@ -256,29 +254,38 @@ final class ResolveDataChangeEventsTask implements Callable 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 - if (!before.isPresent() && !after.isPresent()) { + final Collection listeners, final DataTreeCandidateNode node) { + + if (node.getModificationType() != ModificationType.UNMODIFIED && + !node.getDataAfter().isPresent() && !node.getDataBefore().isPresent()) { + LOG.debug("Modification at {} has type {}, but no before- and after-data. Assuming unchanged.", + path, node.getModificationType()); return NO_CHANGE; } - switch (modification.getModificationType()) { + + // no before and after state is present + + switch (node.getModificationType()) { case SUBTREE_MODIFIED: - return resolveSubtreeChangeEvent(path, listeners, modification, before.get(), after.get()); + return resolveSubtreeChangeEvent(path, listeners, node); case MERGE: case WRITE: - if (before.isPresent()) { - return resolveReplacedEvent(path, listeners, before.get().getData(), after.get().getData()); + Preconditions.checkArgument(node.getDataAfter().isPresent(), + "Modification at {} has type {} but no after-data", path, node.getModificationType()); + if (node.getDataBefore().isPresent()) { + return resolveReplacedEvent(path, listeners, node.getDataBefore().get(), node.getDataAfter().get()); } else { - return resolveCreateEvent(path, listeners, after.get()); + return resolveCreateEvent(path, listeners, node.getDataAfter().get()); } case DELETE: - return resolveDeleteEvent(path, listeners, before.get()); - default: + Preconditions.checkArgument(node.getDataBefore().isPresent(), + "Modification at {} has type {} but no before-data", path, node.getModificationType()); + return resolveDeleteEvent(path, listeners, node.getDataBefore().get()); + case UNMODIFIED: return NO_CHANGE; } + throw new IllegalStateException(String.format("Unhandled node state %s at %s", node.getModificationType(), path)); } private DOMImmutableDataChangeEvent resolveReplacedEvent(final InstanceIdentifier path, @@ -313,7 +320,7 @@ final class ResolveDataChangeEventsTask implements Callable listeners, final NormalizedNodeContainer> beforeCont, - final NormalizedNodeContainer> afterCont) { + final NormalizedNodeContainer> afterCont) { final Set alreadyProcessed = new HashSet<>(); final List childChanges = new LinkedList<>(); @@ -388,17 +395,17 @@ final class ResolveDataChangeEventsTask implements Callable listeners, final StoreMetadataNode afterState) { + final Collection listeners, final NormalizedNode afterState) { @SuppressWarnings({ "unchecked", "rawtypes" }) - final NormalizedNode node = (NormalizedNode) afterState.getData(); + final NormalizedNode node = (NormalizedNode) afterState; return resolveSameEventRecursivelly(path, listeners, node, DOMImmutableDataChangeEvent.getCreateEventFactory()); } private DOMImmutableDataChangeEvent resolveDeleteEvent(final InstanceIdentifier path, - final Collection listeners, final StoreMetadataNode beforeState) { + final Collection listeners, final NormalizedNode beforeState) { @SuppressWarnings({ "unchecked", "rawtypes" }) - final NormalizedNode node = (NormalizedNode) beforeState.getData(); + final NormalizedNode node = (NormalizedNode) beforeState; return resolveSameEventRecursivelly(path, listeners, node, DOMImmutableDataChangeEvent.getRemoveEventFactory()); } @@ -408,7 +415,7 @@ final class ResolveDataChangeEventsTask implements Callable) { LOG.trace("Resolving subtree recursive event for {}, type {}", path, eventFactory); @@ -439,30 +446,31 @@ final class ResolveDataChangeEventsTask implements Callable listeners, final NodeModification modification, - final StoreMetadataNode before, final StoreMetadataNode after) { + final Collection listeners, final DataTreeCandidateNode modification) { - Builder one = builder(DataChangeScope.ONE).setBefore(before.getData()).setAfter(after.getData()); + Preconditions.checkArgument(modification.getDataBefore().isPresent(), "Subtree change with before-data not present at path %s", path); + Preconditions.checkArgument(modification.getDataAfter().isPresent(), "Subtree change with after-data not present at path %s", path); - Builder subtree = builder(DataChangeScope.SUBTREE).setBefore(before.getData()).setAfter(after.getData()); + Builder one = builder(DataChangeScope.ONE). + setBefore(modification.getDataBefore().get()). + setAfter(modification.getDataAfter().get()); + Builder subtree = builder(DataChangeScope.SUBTREE). + setBefore(modification.getDataBefore().get()). + setAfter(modification.getDataAfter().get()); - for (NodeModification childMod : modification.getModifications()) { + for (DataTreeCandidateNode childMod : modification.getChildNodes()) { PathArgument childId = childMod.getIdentifier(); InstanceIdentifier childPath = append(path, childId); Collection childListeners = getListenerChildrenWildcarded(listeners, childId); - Optional childBefore = before.getChild(childId); - Optional childAfter = after.getChild(childId); - switch (childMod.getModificationType()) { case WRITE: case MERGE: case DELETE: - one.merge(resolveAnyChangeEvent(childPath, childListeners, childMod, childBefore, childAfter)); + one.merge(resolveAnyChangeEvent(childPath, childListeners, childMod)); break; case SUBTREE_MODIFIED: - subtree.merge(resolveSubtreeChangeEvent(childPath, childListeners, childMod, childBefore.get(), - childAfter.get())); + subtree.merge(resolveSubtreeChangeEvent(childPath, childListeners, childMod)); break; case UNMODIFIED: // no-op @@ -514,7 +522,7 @@ final class ResolveDataChangeEventsTask implements Callable