1 package org.opendaylight.controller.md.sal.common.impl;
3 import java.util.Collections;
4 import java.util.HashMap;
5 import java.util.HashSet;
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 import static org.opendaylight.controller.md.sal.common.api.TransactionStatus.NEW;
17 public abstract class AbstractDataModification<P /* extends Path<P> */, D> implements DataModification<P, D> {
19 private final ConcurrentMap<P, D> operationalOriginal;
20 private final ConcurrentMap<P, D> configurationOriginal;
22 private final ConcurrentMap<P, D> operationalCreated;
23 private final ConcurrentMap<P, D> configurationCreated;
25 private final ConcurrentMap<P, D> configurationUpdate;
26 private final ConcurrentMap<P, D> operationalUpdate;
28 private final ConcurrentMap<P, P> configurationRemove;
29 private final ConcurrentMap<P, P> operationalRemove;
31 private final Map<P, D> unmodifiable_configurationOriginal;
32 private final Map<P, D> unmodifiable_operationalOriginal;
33 private final Map<P, D> unmodifiable_configurationCreated;
34 private final Map<P, D> unmodifiable_operationalCreated;
35 private final Map<P, D> unmodifiable_configurationUpdate;
36 private final Map<P, D> unmodifiable_operationalUpdate;
37 private final Set<P> unmodifiable_configurationRemove;
38 private final Set<P> unmodifiable_OperationalRemove;
39 private DataReader<P, D> reader;
41 public AbstractDataModification(DataReader<P, D> reader) {
43 this.configurationUpdate = new ConcurrentHashMap<>();
44 this.operationalUpdate = new ConcurrentHashMap<>();
45 this.configurationRemove = new ConcurrentHashMap<>();
46 this.operationalRemove = new ConcurrentHashMap<>();
48 this.configurationOriginal = new ConcurrentHashMap<>();
49 this.operationalOriginal = new ConcurrentHashMap<>();
51 this.configurationCreated = new ConcurrentHashMap<>();
52 this.operationalCreated = new ConcurrentHashMap<>();
54 unmodifiable_configurationOriginal = Collections.unmodifiableMap(configurationOriginal);
55 unmodifiable_operationalOriginal = Collections.unmodifiableMap(operationalOriginal);
56 unmodifiable_configurationCreated = Collections.unmodifiableMap(configurationCreated);
57 unmodifiable_operationalCreated = Collections.unmodifiableMap(operationalCreated);
58 unmodifiable_configurationUpdate = Collections.unmodifiableMap(configurationUpdate);
59 unmodifiable_operationalUpdate = Collections.unmodifiableMap(operationalUpdate);
60 unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet());
61 unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet());
66 public final void putConfigurationData(P path, D data) {
69 if (!hasConfigurationOriginal(path)) {
70 configurationCreated.put(path, data);
73 configurationUpdate.put(path, data);
74 configurationRemove.remove(path);
78 public final void putOperationalData(P path, D data) {
80 if (!hasOperationalOriginal(path)) {
81 operationalCreated.put(path, data);
83 operationalUpdate.put(path, data);
84 operationalRemove.remove(path);
88 public final void putRuntimeData(P path, D data) {
89 putRuntimeData(path, data);
93 public final void removeOperationalData(P path) {
95 hasOperationalOriginal(path);
96 operationalUpdate.remove(path);
97 operationalRemove.put(path, path);
101 public final void removeRuntimeData(P path) {
102 removeOperationalData(path);
106 public final void removeConfigurationData(P path) {
108 hasConfigurationOriginal(path);
109 configurationUpdate.remove(path);
110 configurationRemove.put(path, path);
113 private final void checkMutable() {
114 if (!NEW.equals(this.getStatus()))
115 throw new IllegalStateException("Transaction was already submitted");
119 public final Map<P, D> getUpdatedConfigurationData() {
121 return unmodifiable_configurationUpdate;
125 public final Map<P, D> getUpdatedOperationalData() {
126 return unmodifiable_operationalUpdate;
130 public final Set<P> getRemovedConfigurationData() {
131 return unmodifiable_configurationRemove;
135 public final Set<P> getRemovedOperationalData() {
136 return unmodifiable_OperationalRemove;
140 public Map<P, D> getCreatedConfigurationData() {
141 return unmodifiable_configurationCreated;
145 public Map<P, D> getCreatedOperationalData() {
146 return unmodifiable_operationalCreated;
150 public Map<P, D> getOriginalConfigurationData() {
151 return unmodifiable_configurationOriginal;
155 public Map<P, D> getOriginalOperationalData() {
156 return unmodifiable_operationalOriginal;
160 public D readOperationalData(P path) {
161 return reader.readOperationalData(path);
165 public D readConfigurationData(P path) {
166 return reader.readConfigurationData(path);
169 private boolean hasConfigurationOriginal(P path) {
170 if (configurationOriginal.containsKey(path)) {
173 D data = reader.readConfigurationData(path);
175 configurationOriginal.putIfAbsent(path, data);
181 private boolean hasOperationalOriginal(P path) {
182 if (operationalOriginal.containsKey(path)) {
185 D data = reader.readConfigurationData(path);
187 operationalOriginal.putIfAbsent(path, data);