1 package org.opendaylight.controller.md.sal.dom.store.impl;
6 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
7 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
8 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
9 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
10 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
12 import com.google.common.base.Preconditions;
13 import com.google.common.collect.ImmutableMap;
14 import com.google.common.collect.ImmutableSet;
16 public final class DOMImmutableDataChangeEvent implements
17 AsyncDataChangeEvent<InstanceIdentifier, NormalizedNode<?, ?>> {
20 private static final RemoveEventFactory REMOVE_EVENT_FACTORY = new RemoveEventFactory();
21 private static final CreateEventFactory CREATE_EVENT_FACTORY = new CreateEventFactory();
23 private final NormalizedNode<?, ?> original;
24 private final NormalizedNode<?, ?> updated;
25 private final Map<InstanceIdentifier, ? extends NormalizedNode<?, ?>> originalData;
26 private final Map<InstanceIdentifier, NormalizedNode<?, ?>> createdData;
27 private final Map<InstanceIdentifier, NormalizedNode<?, ?>> updatedData;
28 private final Set<InstanceIdentifier> removedPaths;
29 private final DataChangeScope scope;
33 private DOMImmutableDataChangeEvent(final Builder change) {
34 original = change.before;
35 updated = change.after;
36 originalData = change.original.build();
37 createdData = change.created.build();
38 updatedData = change.updated.build();
39 removedPaths = change.removed.build();
43 public static final Builder builder(final DataChangeScope scope) {
44 return new Builder(scope);
47 protected DataChangeScope getScope() {
52 public NormalizedNode<?, ?> getOriginalSubtree() {
57 public NormalizedNode<?, ?> getUpdatedSubtree() {
62 public Map<InstanceIdentifier, ? extends NormalizedNode<?, ?>> getOriginalData() {
67 public Map<InstanceIdentifier, NormalizedNode<?, ?>> getCreatedData() {
72 public Map<InstanceIdentifier, NormalizedNode<?, ?>> getUpdatedData() {
77 public Set<InstanceIdentifier> getRemovedPaths() {
82 public String toString() {
83 return "DOMImmutableDataChangeEvent [created=" + createdData.keySet() + ", updated=" + updatedData.keySet()
84 + ", removed=" + removedPaths + "]";
88 * Simple event factory which creates event based on path and data
92 public interface SimpleEventFactory {
93 DOMImmutableDataChangeEvent create(InstanceIdentifier path, NormalizedNode<PathArgument,?> data);
97 * Event factory which takes after state and creates event for it.
99 * Factory for events based on path and after state.
100 * After state is set as {@link #getUpdatedSubtree()} and is path,
101 * state mapping is also present in {@link #getUpdatedData()}.
105 public static final SimpleEventFactory getCreateEventFactory() {
106 return CREATE_EVENT_FACTORY;
110 * Event factory which takes before state and creates event for it.
112 * Factory for events based on path and after state.
113 * After state is set as {@link #getOriginalSubtree()} and is path,
114 * state mapping is also present in {@link #getOriginalSubtree()}.
116 * Path is present in {@link #getRemovedPaths()}.
119 public static final SimpleEventFactory getRemoveEventFactory() {
120 return REMOVE_EVENT_FACTORY;
122 public static class Builder {
124 public DataChangeScope scope;
125 private NormalizedNode<?, ?> after;
126 private NormalizedNode<?, ?> before;
128 private final ImmutableMap.Builder<InstanceIdentifier, NormalizedNode<?, ?>> original = ImmutableMap.builder();
129 private final ImmutableMap.Builder<InstanceIdentifier, NormalizedNode<?, ?>> created = ImmutableMap.builder();
130 private final ImmutableMap.Builder<InstanceIdentifier, NormalizedNode<?, ?>> updated = ImmutableMap.builder();
131 private final ImmutableSet.Builder<InstanceIdentifier> removed = ImmutableSet.builder();
133 private Builder(final DataChangeScope scope) {
134 Preconditions.checkNotNull(scope, "Data change scope should not be null.");
138 public Builder setAfter(final NormalizedNode<?, ?> node) {
143 public DOMImmutableDataChangeEvent build() {
145 return new DOMImmutableDataChangeEvent(this);
148 public void merge(final DOMImmutableDataChangeEvent nestedChanges) {
150 original.putAll(nestedChanges.getOriginalData());
151 created.putAll(nestedChanges.getCreatedData());
152 updated.putAll(nestedChanges.getUpdatedData());
153 removed.addAll(nestedChanges.getRemovedPaths());
157 public Builder setBefore(final NormalizedNode<?, ?> node) {
162 public Builder addCreated(final InstanceIdentifier path, final NormalizedNode<?, ?> node) {
163 created.put(path, node);
167 public Builder addRemoved(final InstanceIdentifier path, final NormalizedNode<?, ?> node) {
168 original.put(path, node);
173 public Builder addUpdated(final InstanceIdentifier path, final NormalizedNode<?, ?> before,
174 final NormalizedNode<?, ?> after) {
175 original.put(path, before);
176 updated.put(path, after);
181 private static final class RemoveEventFactory implements SimpleEventFactory {
184 public DOMImmutableDataChangeEvent create(final InstanceIdentifier path, final NormalizedNode<PathArgument, ?> data) {
185 return builder(DataChangeScope.BASE) //
187 .addRemoved(path, data) //
193 private static final class CreateEventFactory implements SimpleEventFactory {
196 public DOMImmutableDataChangeEvent create(final InstanceIdentifier path, final NormalizedNode<PathArgument, ?> data) {
197 return builder(DataChangeScope.BASE) //
199 .addCreated(path, data) //