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.broker.impl.compat;
10 import com.google.common.collect.Maps;
11 import java.util.Collections;
12 import java.util.HashMap;
15 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
16 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
17 import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationException;
18 import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizer;
19 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
21 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
24 public abstract class TranslatingDataChangeEvent implements DataChangeEvent<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> {
26 private TranslatingDataChangeEvent() {
29 public static DataChangeEvent<YangInstanceIdentifier, CompositeNode> createOperational(
30 final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change, final DataNormalizer normalizer) {
31 return new OperationalChangeEvent(change, normalizer);
34 public static DataChangeEvent<YangInstanceIdentifier, CompositeNode> createConfiguration(
35 final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change, final DataNormalizer normalizer) {
36 return new ConfigurationChangeEvent(change, normalizer);
40 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getCreatedOperationalData() {
41 return Collections.emptyMap();
45 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getCreatedConfigurationData() {
46 return Collections.emptyMap();
50 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getUpdatedOperationalData() {
51 return Collections.emptyMap();
55 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getUpdatedConfigurationData() {
56 return Collections.emptyMap();
60 public Set<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier> getRemovedConfigurationData() {
61 return Collections.emptySet();
65 public Set<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier> getRemovedOperationalData() {
66 return Collections.emptySet();
70 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getOriginalConfigurationData() {
71 return Collections.emptyMap();
75 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getOriginalOperationalData() {
76 return Collections.emptyMap();
80 public CompositeNode getOriginalConfigurationSubtree() {
85 public CompositeNode getOriginalOperationalSubtree() {
90 public CompositeNode getUpdatedConfigurationSubtree() {
95 public CompositeNode getUpdatedOperationalSubtree() {
99 private final static class OperationalChangeEvent extends TranslatingDataChangeEvent {
101 private final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> delegate;
102 private final DataNormalizer normalizer;
103 private Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> updatedCache;
105 public OperationalChangeEvent(final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change,
106 final DataNormalizer normalizer) {
107 this.delegate = change;
108 this.normalizer = normalizer;
112 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getCreatedOperationalData() {
113 return transformToLegacy(normalizer, delegate.getCreatedData());
118 public Set<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier> getRemovedOperationalData() {
119 return delegate.getRemovedPaths();
123 public CompositeNode getOriginalOperationalSubtree() {
124 // first argument is unused
125 return normalizer.toLegacy(null, delegate.getOriginalSubtree());
129 public CompositeNode getUpdatedOperationalSubtree() {
130 // first argument is unused
131 return normalizer.toLegacy(null, delegate.getUpdatedSubtree());
135 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getOriginalOperationalData() {
136 return transformToLegacy(normalizer, delegate.getOriginalData());
140 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getUpdatedOperationalData() {
141 if(updatedCache == null) {
142 final Map<YangInstanceIdentifier, CompositeNode> updated = transformToLegacy(normalizer, delegate.getUpdatedData());
143 final Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> created = getCreatedConfigurationData();
144 final HashMap<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> updatedComposite = new HashMap<>(created.size() + updated.size());
145 updatedComposite.putAll(created);
146 updatedComposite.putAll(updated);
147 updatedCache = Collections.unmodifiableMap(updatedComposite);
153 public String toString() {
154 return "OperationalChangeEvent [delegate=" + delegate + "]";
159 private static Map<YangInstanceIdentifier, CompositeNode> transformToLegacy(final DataNormalizer normalizer, final Map<YangInstanceIdentifier, ? extends NormalizedNode<?, ?>> nodes) {
160 final Map<YangInstanceIdentifier, CompositeNode> legacy = Maps.newHashMap();
162 for (final Map.Entry<YangInstanceIdentifier, ? extends NormalizedNode<?, ?>> entry : nodes.entrySet()) {
164 legacy.put(normalizer.toLegacy(entry.getKey()), normalizer.toLegacy(entry.getKey(), entry.getValue()));
165 } catch (final DataNormalizationException e) {
166 throw new IllegalStateException("Unable to transform data change event to legacy format", e);
172 private final static class ConfigurationChangeEvent extends TranslatingDataChangeEvent {
174 private final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> delegate;
175 private final DataNormalizer normalizer;
176 private Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> updatedCache;
178 public ConfigurationChangeEvent(final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change,
179 final DataNormalizer normalizer) {
180 this.delegate = change;
181 this.normalizer = normalizer;
185 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getCreatedConfigurationData() {
186 return transformToLegacy(normalizer, delegate.getCreatedData());
191 public Set<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier> getRemovedConfigurationData() {
192 return delegate.getRemovedPaths();
196 public CompositeNode getOriginalConfigurationSubtree() {
197 // first argument is unused
198 return normalizer.toLegacy(null, delegate.getOriginalSubtree());
202 public CompositeNode getUpdatedConfigurationSubtree() {
203 // first argument is unused
204 return normalizer.toLegacy(null, delegate.getUpdatedSubtree());
208 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getOriginalConfigurationData() {
209 return transformToLegacy(normalizer, delegate.getOriginalData());
213 public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getUpdatedConfigurationData() {
214 if(updatedCache == null) {
215 final Map<YangInstanceIdentifier, CompositeNode> updated = transformToLegacy(normalizer, delegate.getUpdatedData());
216 final Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> created = getCreatedConfigurationData();
217 final HashMap<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> updatedComposite = new HashMap<>(created.size() + updated.size());
218 updatedComposite.putAll(created);
219 updatedComposite.putAll(updated);
220 updatedCache = Collections.unmodifiableMap(updatedComposite);
226 public String toString() {
227 return "ConfigurationChangeEvent [delegate=" + delegate + "]";