1 package org.opendaylight.controller.md.sal.common.impl;
3 import static org.opendaylight.controller.md.sal.common.api.TransactionStatus.NEW;
5 import java.util.Collections;
8 import java.util.concurrent.ConcurrentHashMap;
9 import java.util.concurrent.ConcurrentMap;
11 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
12 import org.opendaylight.controller.md.sal.common.api.data.DataReader;
13 import org.opendaylight.yangtools.concepts.Path;
15 public abstract class AbstractDataModification<P extends Path<P>, D> implements DataModification<P, D> {
17 private final ConcurrentMap<P, D> operationalOriginal;
18 private final ConcurrentMap<P, D> configurationOriginal;
20 private final ConcurrentMap<P, D> operationalCreated;
21 private final ConcurrentMap<P, D> configurationCreated;
23 private final ConcurrentMap<P, D> configurationUpdate;
24 private final ConcurrentMap<P, D> operationalUpdate;
26 private final ConcurrentMap<P, P> configurationRemove;
27 private final ConcurrentMap<P, P> operationalRemove;
29 private final Map<P, D> unmodifiable_configurationOriginal;
30 private final Map<P, D> unmodifiable_operationalOriginal;
31 private final Map<P, D> unmodifiable_configurationCreated;
32 private final Map<P, D> unmodifiable_operationalCreated;
33 private final Map<P, D> unmodifiable_configurationUpdate;
34 private final Map<P, D> unmodifiable_operationalUpdate;
35 private final Set<P> unmodifiable_configurationRemove;
36 private final Set<P> unmodifiable_OperationalRemove;
37 private DataReader<P, D> reader;
39 public AbstractDataModification(DataReader<P, D> reader) {
41 this.configurationUpdate = new ConcurrentHashMap<>();
42 this.operationalUpdate = new ConcurrentHashMap<>();
43 this.configurationRemove = new ConcurrentHashMap<>();
44 this.operationalRemove = new ConcurrentHashMap<>();
46 this.configurationOriginal = new ConcurrentHashMap<>();
47 this.operationalOriginal = new ConcurrentHashMap<>();
49 this.configurationCreated = new ConcurrentHashMap<>();
50 this.operationalCreated = new ConcurrentHashMap<>();
52 unmodifiable_configurationOriginal = Collections.unmodifiableMap(configurationOriginal);
53 unmodifiable_operationalOriginal = Collections.unmodifiableMap(operationalOriginal);
54 unmodifiable_configurationCreated = Collections.unmodifiableMap(configurationCreated);
55 unmodifiable_operationalCreated = Collections.unmodifiableMap(operationalCreated);
56 unmodifiable_configurationUpdate = Collections.unmodifiableMap(configurationUpdate);
57 unmodifiable_operationalUpdate = Collections.unmodifiableMap(operationalUpdate);
58 unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet());
59 unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet());
63 public final void putConfigurationData(P path, D data) {
66 if ((original = getConfigurationOriginal(path)) == null) {
67 configurationCreated.put(path, data);
70 configurationUpdate.put(path, mergeConfigurationData(path,original, data));
71 configurationRemove.remove(path);
75 public final void putOperationalData(P path, D data) {
78 if ((original = getOperationalOriginal(path)) == null) {
79 operationalCreated.put(path, data);
81 operationalUpdate.put(path, mergeOperationalData(path,original,data));
82 operationalRemove.remove(path);
86 public final void putRuntimeData(P path, D data) {
87 putOperationalData(path, data);
91 public final void removeOperationalData(P path) {
93 getOperationalOriginal(path);
94 operationalUpdate.remove(path);
95 operationalRemove.put(path, path);
99 public final void removeRuntimeData(P path) {
100 removeOperationalData(path);
104 public final void removeConfigurationData(P path) {
106 getConfigurationOriginal(path);
107 configurationUpdate.remove(path);
108 configurationRemove.put(path, path);
111 private final void checkMutable() {
112 if (!NEW.equals(this.getStatus()))
113 throw new IllegalStateException("Transaction was already submitted");
117 public final Map<P, D> getUpdatedConfigurationData() {
119 return unmodifiable_configurationUpdate;
123 public final Map<P, D> getUpdatedOperationalData() {
124 return unmodifiable_operationalUpdate;
128 public final Set<P> getRemovedConfigurationData() {
129 return unmodifiable_configurationRemove;
133 public final Set<P> getRemovedOperationalData() {
134 return unmodifiable_OperationalRemove;
138 public Map<P, D> getCreatedConfigurationData() {
139 return unmodifiable_configurationCreated;
143 public Map<P, D> getCreatedOperationalData() {
144 return unmodifiable_operationalCreated;
148 public Map<P, D> getOriginalConfigurationData() {
149 return unmodifiable_configurationOriginal;
153 public Map<P, D> getOriginalOperationalData() {
154 return unmodifiable_operationalOriginal;
158 public D readOperationalData(P path) {
159 return reader.readOperationalData(path);
163 public D readConfigurationData(P path) {
164 return reader.readConfigurationData(path);
167 private D getConfigurationOriginal(P path) {
168 D data = configurationOriginal.get(path);
172 data = reader.readConfigurationData(path);
174 configurationOriginal.putIfAbsent(path, data);
180 private D getOperationalOriginal(P path) {
181 D data = operationalOriginal.get(path);
185 data = reader.readOperationalData(path);
187 operationalOriginal.putIfAbsent(path, data);
193 protected D mergeOperationalData(P path,D stored, D modified) {
197 protected D mergeConfigurationData(P path,D stored, D modified) {