2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.md.sal.dom.store.impl;
10 import org.opendaylight.mdsal.common.api.AsyncDataChangeEvent;
11 import org.opendaylight.mdsal.common.api.AsyncDataBroker.DataChangeScope;
13 import com.google.common.base.Preconditions;
14 import java.util.Collections;
15 import java.util.HashMap;
16 import java.util.HashSet;
19 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
21 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
23 public final class DOMImmutableDataChangeEvent implements
24 AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> {
27 private static final RemoveEventFactory REMOVE_EVENT_FACTORY = new RemoveEventFactory();
28 private static final CreateEventFactory CREATE_EVENT_FACTORY = new CreateEventFactory();
30 private final NormalizedNode<?, ?> original;
31 private final NormalizedNode<?, ?> updated;
32 private final Map<YangInstanceIdentifier, NormalizedNode<?, ?>> originalData;
33 private final Map<YangInstanceIdentifier, NormalizedNode<?, ?>> createdData;
34 private final Map<YangInstanceIdentifier, NormalizedNode<?, ?>> updatedData;
35 private final Set<YangInstanceIdentifier> removedPaths;
36 private final DataChangeScope scope;
40 private DOMImmutableDataChangeEvent(final Builder change) {
41 original = change.before;
42 updated = change.after;
43 originalData = Collections.unmodifiableMap(change.original);
44 createdData = Collections.unmodifiableMap(change.created);
45 updatedData = Collections.unmodifiableMap(change.updated);
46 removedPaths = Collections.unmodifiableSet(change.removed);
50 public static final Builder builder(final DataChangeScope scope) {
51 return new Builder(scope);
54 protected DataChangeScope getScope() {
59 public NormalizedNode<?, ?> getOriginalSubtree() {
64 public NormalizedNode<?, ?> getUpdatedSubtree() {
69 public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getOriginalData() {
74 public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getCreatedData() {
79 public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getUpdatedData() {
84 public Set<YangInstanceIdentifier> getRemovedPaths() {
89 public String toString() {
90 return "DOMImmutableDataChangeEvent [created=" + createdData.keySet() + ", updated=" + updatedData.keySet()
91 + ", removed=" + removedPaths + "]";
95 * Simple event factory which creates event based on path and data
99 public interface SimpleEventFactory {
100 DOMImmutableDataChangeEvent create(YangInstanceIdentifier path, NormalizedNode<PathArgument,?> data);
104 * Event factory which takes after state and creates event for it.
106 * Factory for events based on path and after state.
107 * After state is set as {@link #getUpdatedSubtree()} and is path,
108 * state mapping is also present in {@link #getUpdatedData()}.
112 public static final SimpleEventFactory getCreateEventFactory() {
113 return CREATE_EVENT_FACTORY;
117 * Event factory which takes before state and creates event for it.
119 * Factory for events based on path and after state.
120 * After state is set as {@link #getOriginalSubtree()} and is path,
121 * state mapping is also present in {@link #getOriginalSubtree()}.
123 * Path is present in {@link #getRemovedPaths()}.
126 public static final SimpleEventFactory getRemoveEventFactory() {
127 return REMOVE_EVENT_FACTORY;
129 public static class Builder {
131 public DataChangeScope scope;
132 private NormalizedNode<?, ?> after;
133 private NormalizedNode<?, ?> before;
135 private final Map<YangInstanceIdentifier, NormalizedNode<?, ?>> original = new HashMap<>();
136 private final Map<YangInstanceIdentifier, NormalizedNode<?, ?>> created = new HashMap<>();
137 private final Map<YangInstanceIdentifier, NormalizedNode<?, ?>> updated = new HashMap<>();
138 private final Set<YangInstanceIdentifier> removed = new HashSet<>();
140 private Builder(final DataChangeScope scope) {
141 Preconditions.checkNotNull(scope, "Data change scope should not be null.");
145 public Builder setAfter(final NormalizedNode<?, ?> node) {
150 public DOMImmutableDataChangeEvent build() {
152 return new DOMImmutableDataChangeEvent(this);
155 public void merge(final DOMImmutableDataChangeEvent nestedChanges) {
157 original.putAll(nestedChanges.getOriginalData());
158 created.putAll(nestedChanges.getCreatedData());
159 updated.putAll(nestedChanges.getUpdatedData());
160 removed.addAll(nestedChanges.getRemovedPaths());
164 public Builder setBefore(final NormalizedNode<?, ?> node) {
169 public Builder addCreated(final YangInstanceIdentifier path, final NormalizedNode<?, ?> node) {
170 created.put(path, node);
174 public Builder addRemoved(final YangInstanceIdentifier path, final NormalizedNode<?, ?> node) {
175 original.put(path, node);
180 public Builder addUpdated(final YangInstanceIdentifier path, final NormalizedNode<?, ?> before,
181 final NormalizedNode<?, ?> after) {
182 original.put(path, before);
183 updated.put(path, after);
187 public boolean isEmpty() {
188 return created.isEmpty() && removed.isEmpty() && updated.isEmpty();
192 private static final class RemoveEventFactory implements SimpleEventFactory {
195 public DOMImmutableDataChangeEvent create(final YangInstanceIdentifier path, final NormalizedNode<PathArgument, ?> data) {
196 return builder(DataChangeScope.BASE) //
198 .addRemoved(path, data) //
204 private static final class CreateEventFactory implements SimpleEventFactory {
207 public DOMImmutableDataChangeEvent create(final YangInstanceIdentifier path, final NormalizedNode<PathArgument, ?> data) {
208 return builder(DataChangeScope.BASE) //
210 .addCreated(path, data) //