Merge "Fix issue where NodeConnector ADDED events were propagated as NodeConnector...
[controller.git] / opendaylight / md-sal / sal-common-impl / src / main / java / org / opendaylight / controller / md / sal / common / impl / service / ImmutableDataChangeEvent.java
1 package org.opendaylight.controller.md.sal.common.impl.service;
2
3 import java.util.Map;
4 import java.util.Set;
5
6 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
7 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
8 import org.opendaylight.yangtools.concepts.Path;
9
10 import com.google.common.base.Predicate;
11 import com.google.common.collect.ImmutableMap;
12 import com.google.common.collect.ImmutableSet;
13 import com.google.common.collect.Maps;
14
15 final class ImmutableDataChangeEvent<P extends Path<P>, D> implements DataChangeEvent<P,D> {
16
17     private final D updatedOperationalSubtree;
18     private final Map<P, D> updatedOperational;
19     private final D updatedConfigurationSubtree;
20     private final Map<P, D> updatedConfiguration;
21     private final Set<P> removedOperational;
22     private final Set<P> removedConfiguration;
23     private final D originalOperationalSubtree;
24     private final Map<P, D> originalOperational;
25     private final D originalConfigurationSubtree;
26     private final Map<P, D> originalConfiguration;
27     private final Map<P, D> createdOperational;
28     private final Map<P, D> createdConfiguration;
29
30
31     public ImmutableDataChangeEvent(Builder<P, D> builder) {
32
33         createdConfiguration = builder.getCreatedConfiguration().build();
34         createdOperational = builder.getCreatedOperational().build();
35         originalConfiguration = builder.getOriginalConfiguration().build();
36         originalConfigurationSubtree = builder.getOriginalConfigurationSubtree();
37         originalOperational = builder.getOriginalOperational().build();
38         originalOperationalSubtree = builder.getOriginalOperationalSubtree();
39         removedConfiguration = builder.getRemovedConfiguration().build();
40         removedOperational = builder.getRemovedOperational().build();
41         updatedConfiguration = builder.getUpdatedConfiguration().build();
42         updatedConfigurationSubtree = builder.getUpdatedConfigurationSubtree();
43         updatedOperational = builder.getUpdatedOperational().build();
44         updatedOperationalSubtree = builder.getUpdatedOperationalSubtree();
45     }
46
47     @Override
48     public Map<P, D> getCreatedConfigurationData() {
49         return createdConfiguration;
50     }
51
52     @Override
53     public Map<P, D> getCreatedOperationalData() {
54         return createdOperational;
55     }
56
57     @Override
58     public Map<P, D> getOriginalConfigurationData() {
59         return originalConfiguration;
60     }
61     @Override
62     public D getOriginalConfigurationSubtree() {
63         return originalConfigurationSubtree;
64     }
65     @Override
66     public Map<P, D> getOriginalOperationalData() {
67         return originalOperational;
68     }
69     @Override
70     public D getOriginalOperationalSubtree() {
71         return originalOperationalSubtree;
72     }
73     @Override
74     public Set<P> getRemovedConfigurationData() {
75         return removedConfiguration;
76     }
77     @Override
78     public Set<P> getRemovedOperationalData() {
79         return removedOperational;
80     }
81     @Override
82     public Map<P, D> getUpdatedConfigurationData() {
83         return updatedConfiguration;
84     }
85     @Override
86     public D getUpdatedConfigurationSubtree() {
87         return updatedConfigurationSubtree;
88     }
89     @Override
90     public Map<P, D> getUpdatedOperationalData() {
91         return updatedOperational;
92     }
93     @Override
94     public D getUpdatedOperationalSubtree() {
95         return updatedOperationalSubtree;
96     }
97
98     static final <P extends Path<P>,D> Builder<P, D> builder() {
99         return new Builder<>();
100     }
101
102     static final class Builder<P extends Path<P>,D> {
103
104         private  D updatedOperationalSubtree;
105         private  D originalOperationalSubtree;
106         private  D originalConfigurationSubtree;
107         private  D updatedConfigurationSubtree;
108
109         private final ImmutableMap.Builder<P, D> updatedOperational = ImmutableMap.builder();
110         private final ImmutableMap.Builder<P, D> updatedConfiguration = ImmutableMap.builder();
111         private final ImmutableSet.Builder<P> removedOperational = ImmutableSet.builder();
112         private final ImmutableSet.Builder<P> removedConfiguration = ImmutableSet.builder();
113         private final ImmutableMap.Builder<P, D> originalOperational = ImmutableMap.builder();
114
115         private final ImmutableMap.Builder<P, D> originalConfiguration = ImmutableMap.builder();
116         private final ImmutableMap.Builder<P, D> createdOperational = ImmutableMap.builder();
117         private final ImmutableMap.Builder<P, D> createdConfiguration = ImmutableMap.builder();
118
119
120         protected Builder<P,D> addTransaction(DataModification<P, D> data, Predicate<P> keyFilter) {
121             updatedOperational.putAll(Maps.filterKeys(data.getUpdatedOperationalData(), keyFilter));
122             updatedConfiguration.putAll(Maps.filterKeys(data.getUpdatedConfigurationData(), keyFilter));
123             originalConfiguration.putAll(Maps.filterKeys(data.getOriginalConfigurationData(), keyFilter));
124             originalOperational.putAll(Maps.filterKeys(data.getOriginalOperationalData(), keyFilter));
125             createdOperational.putAll(Maps.filterKeys(data.getCreatedOperationalData(), keyFilter));
126             createdConfiguration.putAll(Maps.filterKeys(data.getCreatedConfigurationData(), keyFilter));
127             return this;
128         }
129
130         protected Builder<P, D> addConfigurationChangeSet(RootedChangeSet<P, D> changeSet) {
131             if(changeSet == null) {
132                 return this;
133             }
134
135             originalConfiguration.putAll(changeSet.getOriginal());
136             createdConfiguration.putAll(changeSet.getCreated());
137             updatedConfiguration.putAll(changeSet.getUpdated());
138             removedConfiguration.addAll(changeSet.getRemoved());
139             return this;
140         }
141
142         protected Builder<P, D> addOperationalChangeSet(RootedChangeSet<P, D> changeSet) {
143             if(changeSet == null) {
144                 return this;
145             }
146             originalOperational.putAll(changeSet.getOriginal());
147             createdOperational.putAll(changeSet.getCreated());
148             updatedOperational.putAll(changeSet.getUpdated());
149             removedOperational.addAll(changeSet.getRemoved());
150             return this;
151         }
152
153         protected ImmutableDataChangeEvent<P, D> build() {
154             return new ImmutableDataChangeEvent<P,D>(this);
155         }
156
157         protected D getUpdatedOperationalSubtree() {
158             return updatedOperationalSubtree;
159         }
160
161         protected Builder<P, D> setUpdatedOperationalSubtree(D updatedOperationalSubtree) {
162             this.updatedOperationalSubtree = updatedOperationalSubtree;
163             return this;
164         }
165
166         protected D getOriginalOperationalSubtree() {
167             return originalOperationalSubtree;
168         }
169
170         protected Builder<P,D> setOriginalOperationalSubtree(D originalOperationalSubtree) {
171             this.originalOperationalSubtree = originalOperationalSubtree;
172             return this;
173         }
174
175         protected D getOriginalConfigurationSubtree() {
176             return originalConfigurationSubtree;
177         }
178
179         protected Builder<P, D> setOriginalConfigurationSubtree(D originalConfigurationSubtree) {
180             this.originalConfigurationSubtree = originalConfigurationSubtree;
181             return this;
182         }
183
184         protected D getUpdatedConfigurationSubtree() {
185             return updatedConfigurationSubtree;
186         }
187
188         protected Builder<P,D> setUpdatedConfigurationSubtree(D updatedConfigurationSubtree) {
189             this.updatedConfigurationSubtree = updatedConfigurationSubtree;
190             return this;
191         }
192
193         protected ImmutableMap.Builder<P, D> getUpdatedOperational() {
194             return updatedOperational;
195         }
196
197         protected ImmutableMap.Builder<P, D> getUpdatedConfiguration() {
198             return updatedConfiguration;
199         }
200
201         protected ImmutableSet.Builder<P> getRemovedOperational() {
202             return removedOperational;
203         }
204
205         protected ImmutableSet.Builder<P> getRemovedConfiguration() {
206             return removedConfiguration;
207         }
208
209         protected ImmutableMap.Builder<P, D> getOriginalOperational() {
210             return originalOperational;
211         }
212
213         protected ImmutableMap.Builder<P, D> getOriginalConfiguration() {
214             return originalConfiguration;
215         }
216
217         protected ImmutableMap.Builder<P, D> getCreatedOperational() {
218             return createdOperational;
219         }
220
221         protected ImmutableMap.Builder<P, D> getCreatedConfiguration() {
222             return createdConfiguration;
223         }
224     }
225
226 }