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%2FDOMImmutableDataChangeEvent.java;h=3dfca40b4045d435cb79e909a7be0c9b77cec248;hp=d0ebcf5d4c77543b91352246d1d3331731294228;hb=481d8d9e4d9a12754eea1f3271d424cb6bb45fa2;hpb=af4995552e842e052a085ed0845bfda97f5fe668 diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DOMImmutableDataChangeEvent.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DOMImmutableDataChangeEvent.java index d0ebcf5d4c..3dfca40b40 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DOMImmutableDataChangeEvent.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/DOMImmutableDataChangeEvent.java @@ -1,36 +1,52 @@ package org.opendaylight.controller.md.sal.dom.store.impl; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; 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 com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; +import com.google.common.base.Preconditions; public final class DOMImmutableDataChangeEvent implements AsyncDataChangeEvent> { + + private static final RemoveEventFactory REMOVE_EVENT_FACTORY = new RemoveEventFactory(); + private static final CreateEventFactory CREATE_EVENT_FACTORY = new CreateEventFactory(); + private final NormalizedNode original; private final NormalizedNode updated; private final Map> originalData; private final Map> createdData; private final Map> updatedData; private final Set removedPaths; + private final DataChangeScope scope; + + private DOMImmutableDataChangeEvent(final Builder change) { original = change.before; updated = change.after; - originalData = change.original.build(); - createdData = change.created.build(); - updatedData = change.updated.build(); - removedPaths = change.removed.build(); + originalData = Collections.unmodifiableMap(change.original); + createdData = Collections.unmodifiableMap(change.created); + updatedData = Collections.unmodifiableMap(change.updated); + removedPaths = Collections.unmodifiableSet(change.removed); + scope = change.scope; } - public static final Builder builder() { - return new Builder(); + public static final Builder builder(final DataChangeScope scope) { + return new Builder(scope); + } + + protected DataChangeScope getScope() { + return scope; } @Override @@ -63,19 +79,61 @@ public final class DOMImmutableDataChangeEvent implements return removedPaths; } + @Override + public String toString() { + return "DOMImmutableDataChangeEvent [created=" + createdData.keySet() + ", updated=" + updatedData.keySet() + + ", removed=" + removedPaths + "]"; + } + + /** + * Simple event factory which creates event based on path and data + * + * + */ + public interface SimpleEventFactory { + DOMImmutableDataChangeEvent create(InstanceIdentifier path, NormalizedNode data); + } + + /** + * Event factory which takes after state and creates event for it. + * + * Factory for events based on path and after state. + * After state is set as {@link #getUpdatedSubtree()} and is path, + * state mapping is also present in {@link #getUpdatedData()}. + * + * @return + */ + public static final SimpleEventFactory getCreateEventFactory() { + return CREATE_EVENT_FACTORY; + } + + /** + * Event factory which takes before state and creates event for it. + * + * Factory for events based on path and after state. + * After state is set as {@link #getOriginalSubtree()} and is path, + * state mapping is also present in {@link #getOriginalSubtree()}. + * + * Path is present in {@link #getRemovedPaths()}. + * @return + */ + public static final SimpleEventFactory getRemoveEventFactory() { + return REMOVE_EVENT_FACTORY; + } public static class Builder { + public DataChangeScope scope; private NormalizedNode after; private NormalizedNode before; - private final ImmutableMap.Builder> original = ImmutableMap.builder(); - private final ImmutableMap.Builder> created = ImmutableMap.builder(); - private final ImmutableMap.Builder> updated = ImmutableMap.builder(); - private final ImmutableSet.Builder removed = ImmutableSet.builder(); - - - private Builder() { + private final Map> original = new HashMap<>(); + private final Map> created = new HashMap<>(); + private final Map> updated = new HashMap<>(); + private final Set removed = new HashSet<>(); + private Builder(final DataChangeScope scope) { + Preconditions.checkNotNull(scope, "Data change scope should not be null."); + this.scope = scope; } public Builder setAfter(final NormalizedNode node) { @@ -121,5 +179,27 @@ public final class DOMImmutableDataChangeEvent implements } } -} + private static final class RemoveEventFactory implements SimpleEventFactory { + @Override + public DOMImmutableDataChangeEvent create(final InstanceIdentifier path, final NormalizedNode data) { + return builder(DataChangeScope.BASE) // + .setBefore(data) // + .addRemoved(path, data) // + .build(); + } + + } + + private static final class CreateEventFactory implements SimpleEventFactory { + + @Override + public DOMImmutableDataChangeEvent create(final InstanceIdentifier path, final NormalizedNode data) { + return builder(DataChangeScope.BASE) // + .setAfter(data) // + .addCreated(path, data) // + .build(); + } + } + +}