Fix modules Restconf call for mounted devices
[controller.git] / opendaylight / md-sal / sal-dom-broker / src / main / java / org / opendaylight / controller / md / sal / dom / broker / impl / compat / TranslatingDataChangeEvent.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.md.sal.dom.broker.impl.compat;
9
10 import com.google.common.collect.Maps;
11 import java.util.Collections;
12 import java.util.HashMap;
13 import java.util.Map;
14 import java.util.Set;
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;
22
23 @Deprecated
24 public abstract class TranslatingDataChangeEvent implements DataChangeEvent<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> {
25
26     private TranslatingDataChangeEvent() {
27     }
28
29     public static DataChangeEvent<YangInstanceIdentifier, CompositeNode> createOperational(
30             final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change, final DataNormalizer normalizer) {
31         return new OperationalChangeEvent(change, normalizer);
32     }
33
34     public static DataChangeEvent<YangInstanceIdentifier, CompositeNode> createConfiguration(
35             final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change, final DataNormalizer normalizer) {
36         return new ConfigurationChangeEvent(change, normalizer);
37     }
38
39     @Override
40     public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getCreatedOperationalData() {
41         return Collections.emptyMap();
42     }
43
44     @Override
45     public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getCreatedConfigurationData() {
46         return Collections.emptyMap();
47     }
48
49     @Override
50     public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getUpdatedOperationalData() {
51         return Collections.emptyMap();
52     }
53
54     @Override
55     public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getUpdatedConfigurationData() {
56         return Collections.emptyMap();
57     }
58
59     @Override
60     public Set<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier> getRemovedConfigurationData() {
61         return Collections.emptySet();
62     }
63
64     @Override
65     public Set<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier> getRemovedOperationalData() {
66         return Collections.emptySet();
67     }
68
69     @Override
70     public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getOriginalConfigurationData() {
71         return Collections.emptyMap();
72     }
73
74     @Override
75     public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getOriginalOperationalData() {
76         return Collections.emptyMap();
77     }
78
79     @Override
80     public CompositeNode getOriginalConfigurationSubtree() {
81         return null;
82     }
83
84     @Override
85     public CompositeNode getOriginalOperationalSubtree() {
86         return null;
87     }
88
89     @Override
90     public CompositeNode getUpdatedConfigurationSubtree() {
91         return null;
92     }
93
94     @Override
95     public CompositeNode getUpdatedOperationalSubtree() {
96         return null;
97     }
98
99     private final static class OperationalChangeEvent extends TranslatingDataChangeEvent {
100
101         private final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> delegate;
102         private final DataNormalizer normalizer;
103         private Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> updatedCache;
104
105         public OperationalChangeEvent(final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change,
106                 final DataNormalizer normalizer) {
107             this.delegate = change;
108             this.normalizer = normalizer;
109         }
110
111         @Override
112         public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getCreatedOperationalData() {
113             return transformToLegacy(normalizer, delegate.getCreatedData());
114         }
115
116
117         @Override
118         public Set<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier> getRemovedOperationalData() {
119             return delegate.getRemovedPaths();
120         }
121
122         @Override
123         public CompositeNode getOriginalOperationalSubtree() {
124             // first argument is unused
125             return normalizer.toLegacy(null, delegate.getOriginalSubtree());
126         }
127
128         @Override
129         public CompositeNode getUpdatedOperationalSubtree() {
130             // first argument is unused
131             return normalizer.toLegacy(null, delegate.getUpdatedSubtree());
132         }
133
134         @Override
135         public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getOriginalOperationalData() {
136             return transformToLegacy(normalizer, delegate.getOriginalData());
137         }
138
139         @Override
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);
148             }
149             return updatedCache;
150         }
151
152         @Override
153         public String toString() {
154             return "OperationalChangeEvent [delegate=" + delegate + "]";
155         }
156
157     }
158
159     private static Map<YangInstanceIdentifier, CompositeNode> transformToLegacy(final DataNormalizer normalizer, final Map<YangInstanceIdentifier, ? extends NormalizedNode<?, ?>> nodes) {
160         final Map<YangInstanceIdentifier, CompositeNode> legacy = Maps.newHashMap();
161
162         for (final Map.Entry<YangInstanceIdentifier, ? extends NormalizedNode<?, ?>> entry : nodes.entrySet()) {
163             try {
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);
167             }
168         }
169         return legacy;
170     }
171
172     private final static class ConfigurationChangeEvent extends TranslatingDataChangeEvent {
173
174         private final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> delegate;
175         private final DataNormalizer normalizer;
176         private Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> updatedCache;
177
178         public ConfigurationChangeEvent(final AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change,
179                 final DataNormalizer normalizer) {
180             this.delegate = change;
181             this.normalizer = normalizer;
182         }
183
184         @Override
185         public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getCreatedConfigurationData() {
186             return transformToLegacy(normalizer, delegate.getCreatedData());
187         }
188
189
190         @Override
191         public Set<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier> getRemovedConfigurationData() {
192             return delegate.getRemovedPaths();
193         }
194
195         @Override
196         public CompositeNode getOriginalConfigurationSubtree() {
197             // first argument is unused
198             return normalizer.toLegacy(null, delegate.getOriginalSubtree());
199         }
200
201         @Override
202         public CompositeNode getUpdatedConfigurationSubtree() {
203             // first argument is unused
204             return normalizer.toLegacy(null, delegate.getUpdatedSubtree());
205         }
206
207         @Override
208         public Map<org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier, CompositeNode> getOriginalConfigurationData() {
209             return transformToLegacy(normalizer, delegate.getOriginalData());
210         }
211
212         @Override
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);
221             }
222             return updatedCache;
223         }
224
225         @Override
226         public String toString() {
227             return "ConfigurationChangeEvent [delegate=" + delegate + "]";
228         }
229     }
230 }