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;
14 public abstract class AbstractDataModification<P /* extends Path<P> */, D> implements DataModification<P, D> {
16 private final ConcurrentMap<P, D> operationalOriginal;
17 private final ConcurrentMap<P, D> configurationOriginal;
19 private final ConcurrentMap<P, D> operationalCreated;
20 private final ConcurrentMap<P, D> configurationCreated;
22 private final ConcurrentMap<P, D> configurationUpdate;
23 private final ConcurrentMap<P, D> operationalUpdate;
25 private final ConcurrentMap<P, P> configurationRemove;
26 private final ConcurrentMap<P, P> operationalRemove;
28 private final Map<P, D> unmodifiable_configurationOriginal;
29 private final Map<P, D> unmodifiable_operationalOriginal;
30 private final Map<P, D> unmodifiable_configurationCreated;
31 private final Map<P, D> unmodifiable_operationalCreated;
32 private final Map<P, D> unmodifiable_configurationUpdate;
33 private final Map<P, D> unmodifiable_operationalUpdate;
34 private final Set<P> unmodifiable_configurationRemove;
35 private final Set<P> unmodifiable_OperationalRemove;
36 private DataReader<P, D> reader;
38 public AbstractDataModification(DataReader<P, D> reader) {
40 this.configurationUpdate = new ConcurrentHashMap<>();
41 this.operationalUpdate = new ConcurrentHashMap<>();
42 this.configurationRemove = new ConcurrentHashMap<>();
43 this.operationalRemove = new ConcurrentHashMap<>();
45 this.configurationOriginal = new ConcurrentHashMap<>();
46 this.operationalOriginal = new ConcurrentHashMap<>();
48 this.configurationCreated = new ConcurrentHashMap<>();
49 this.operationalCreated = new ConcurrentHashMap<>();
51 unmodifiable_configurationOriginal = Collections.unmodifiableMap(configurationOriginal);
52 unmodifiable_operationalOriginal = Collections.unmodifiableMap(operationalOriginal);
53 unmodifiable_configurationCreated = Collections.unmodifiableMap(configurationCreated);
54 unmodifiable_operationalCreated = Collections.unmodifiableMap(operationalCreated);
55 unmodifiable_configurationUpdate = Collections.unmodifiableMap(configurationUpdate);
56 unmodifiable_operationalUpdate = Collections.unmodifiableMap(operationalUpdate);
57 unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet());
58 unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet());
63 public final void putConfigurationData(P path, D data) {
66 if (!hasConfigurationOriginal(path)) {
67 configurationCreated.put(path, data);
70 configurationUpdate.put(path, data);
71 configurationRemove.remove(path);
75 public final void putOperationalData(P path, D data) {
77 if (!hasOperationalOriginal(path)) {
78 operationalCreated.put(path, data);
80 operationalUpdate.put(path, data);
81 operationalRemove.remove(path);
85 public final void putRuntimeData(P path, D data) {
86 putOperationalData(path, data);
90 public final void removeOperationalData(P path) {
92 hasOperationalOriginal(path);
93 operationalUpdate.remove(path);
94 operationalRemove.put(path, path);
98 public final void removeRuntimeData(P path) {
99 removeOperationalData(path);
103 public final void removeConfigurationData(P path) {
105 hasConfigurationOriginal(path);
106 configurationUpdate.remove(path);
107 configurationRemove.put(path, path);
110 private final void checkMutable() {
111 if (!NEW.equals(this.getStatus()))
112 throw new IllegalStateException("Transaction was already submitted");
116 public final Map<P, D> getUpdatedConfigurationData() {
118 return unmodifiable_configurationUpdate;
122 public final Map<P, D> getUpdatedOperationalData() {
123 return unmodifiable_operationalUpdate;
127 public final Set<P> getRemovedConfigurationData() {
128 return unmodifiable_configurationRemove;
132 public final Set<P> getRemovedOperationalData() {
133 return unmodifiable_OperationalRemove;
137 public Map<P, D> getCreatedConfigurationData() {
138 return unmodifiable_configurationCreated;
142 public Map<P, D> getCreatedOperationalData() {
143 return unmodifiable_operationalCreated;
147 public Map<P, D> getOriginalConfigurationData() {
148 return unmodifiable_configurationOriginal;
152 public Map<P, D> getOriginalOperationalData() {
153 return unmodifiable_operationalOriginal;
157 public D readOperationalData(P path) {
158 return reader.readOperationalData(path);
162 public D readConfigurationData(P path) {
163 return reader.readConfigurationData(path);
166 private boolean hasConfigurationOriginal(P path) {
167 if (configurationOriginal.containsKey(path)) {
170 D data = reader.readConfigurationData(path);
172 configurationOriginal.putIfAbsent(path, data);
178 private boolean hasOperationalOriginal(P path) {
179 if (operationalOriginal.containsKey(path)) {
182 D data = reader.readConfigurationData(path);
184 operationalOriginal.putIfAbsent(path, data);