Merge "Resolve Bug:522"
[controller.git] / opendaylight / md-sal / sal-dom-broker / src / main / java / org / opendaylight / controller / md / sal / dom / store / impl / DOMImmutableDataChangeEvent.java
1 package org.opendaylight.controller.md.sal.dom.store.impl;
2
3 import java.util.Map;
4 import java.util.Set;
5
6 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
7 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
8 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
9
10 import com.google.common.collect.ImmutableMap;
11 import com.google.common.collect.ImmutableSet;
12
13 public final class DOMImmutableDataChangeEvent implements
14         AsyncDataChangeEvent<InstanceIdentifier, NormalizedNode<?, ?>> {
15
16     private final NormalizedNode<?, ?> original;
17     private final NormalizedNode<?, ?> updated;
18     private final Map<InstanceIdentifier, ? extends NormalizedNode<?, ?>> originalData;
19     private final Map<InstanceIdentifier, NormalizedNode<?, ?>> createdData;
20     private final Map<InstanceIdentifier, NormalizedNode<?, ?>> updatedData;
21     private final Set<InstanceIdentifier> removedPaths;
22
23     private DOMImmutableDataChangeEvent(final Builder change) {
24         original = change.before;
25         updated = change.after;
26         originalData = change.original.build();
27         createdData = change.created.build();
28         updatedData = change.updated.build();
29         removedPaths = change.removed.build();
30     }
31
32     public static final Builder builder() {
33         return new Builder();
34     }
35
36     @Override
37     public NormalizedNode<?, ?> getOriginalSubtree() {
38         return original;
39     }
40
41     @Override
42     public NormalizedNode<?, ?> getUpdatedSubtree() {
43         return updated;
44     }
45
46     @Override
47     public Map<InstanceIdentifier, ? extends NormalizedNode<?, ?>> getOriginalData() {
48         return originalData;
49     }
50
51     @Override
52     public Map<InstanceIdentifier, NormalizedNode<?, ?>> getCreatedData() {
53         return createdData;
54     }
55
56     @Override
57     public Map<InstanceIdentifier, NormalizedNode<?, ?>> getUpdatedData() {
58         return updatedData;
59     }
60
61     @Override
62     public Set<InstanceIdentifier> getRemovedPaths() {
63         return removedPaths;
64     }
65
66     @Override
67     public String toString() {
68         return "DOMImmutableDataChangeEvent [created=" + createdData.keySet() + ", updated=" + updatedData.keySet()
69                 + ", removed=" + removedPaths + "]";
70     }
71
72     public static class Builder {
73
74         private NormalizedNode<?, ?> after;
75         private NormalizedNode<?, ?> before;
76
77         private final ImmutableMap.Builder<InstanceIdentifier, NormalizedNode<?, ?>> original = ImmutableMap.builder();
78         private final ImmutableMap.Builder<InstanceIdentifier, NormalizedNode<?, ?>> created = ImmutableMap.builder();
79         private final ImmutableMap.Builder<InstanceIdentifier, NormalizedNode<?, ?>> updated = ImmutableMap.builder();
80         private final ImmutableSet.Builder<InstanceIdentifier> removed = ImmutableSet.builder();
81
82         private Builder() {
83
84         }
85
86         public Builder setAfter(final NormalizedNode<?, ?> node) {
87             after = node;
88             return this;
89         }
90
91         public DOMImmutableDataChangeEvent build() {
92
93             return new DOMImmutableDataChangeEvent(this);
94         }
95
96         public void merge(final DOMImmutableDataChangeEvent nestedChanges) {
97
98             original.putAll(nestedChanges.getOriginalData());
99             created.putAll(nestedChanges.getCreatedData());
100             updated.putAll(nestedChanges.getUpdatedData());
101             removed.addAll(nestedChanges.getRemovedPaths());
102
103         }
104
105         public Builder setBefore(final NormalizedNode<?, ?> node) {
106             this.before = node;
107             return this;
108         }
109
110         public Builder addCreated(final InstanceIdentifier path, final NormalizedNode<?, ?> node) {
111             created.put(path, node);
112             return this;
113         }
114
115         public Builder addRemoved(final InstanceIdentifier path, final NormalizedNode<?, ?> node) {
116             original.put(path, node);
117             removed.add(path);
118             return this;
119         }
120
121         public Builder addUpdated(final InstanceIdentifier path, final NormalizedNode<?, ?> before,
122                 final NormalizedNode<?, ?> after) {
123             original.put(path, before);
124             updated.put(path, after);
125             return this;
126         }
127     }
128
129 }