2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.md.sal.common.impl;
10 import static org.opendaylight.controller.md.sal.common.api.TransactionStatus.NEW;
12 import java.util.Collections;
13 import java.util.LinkedHashMap;
17 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
18 import org.opendaylight.controller.md.sal.common.api.data.DataReader;
19 import org.opendaylight.yangtools.concepts.Path;
22 public abstract class AbstractDataModification<P extends Path<P>, D> implements DataModification<P, D> {
24 private final Map<P, D> operationalOriginal;
25 private final Map<P, D> configurationOriginal;
27 private final Map<P, D> operationalCreated;
28 private final Map<P, D> configurationCreated;
30 private final Map<P, D> configurationUpdate;
31 private final Map<P, D> operationalUpdate;
33 private final Map<P, P> configurationRemove;
34 private final Map<P, P> operationalRemove;
36 private final Map<P, D> unmodifiable_configurationOriginal;
37 private final Map<P, D> unmodifiable_operationalOriginal;
38 private final Map<P, D> unmodifiable_configurationCreated;
39 private final Map<P, D> unmodifiable_operationalCreated;
40 private final Map<P, D> unmodifiable_configurationUpdate;
41 private final Map<P, D> unmodifiable_operationalUpdate;
42 private final Set<P> unmodifiable_configurationRemove;
43 private final Set<P> unmodifiable_OperationalRemove;
44 private final DataReader<P, D> reader;
46 public AbstractDataModification(final DataReader<P, D> reader) {
48 this.configurationUpdate = new LinkedHashMap<>();
49 this.operationalUpdate = new LinkedHashMap<>();
50 this.configurationRemove = new LinkedHashMap<>();
51 this.operationalRemove = new LinkedHashMap<>();
53 this.configurationOriginal = new LinkedHashMap<>();
54 this.operationalOriginal = new LinkedHashMap<>();
56 this.configurationCreated = new LinkedHashMap<>();
57 this.operationalCreated = new LinkedHashMap<>();
59 unmodifiable_configurationOriginal = Collections.unmodifiableMap(configurationOriginal);
60 unmodifiable_operationalOriginal = Collections.unmodifiableMap(operationalOriginal);
61 unmodifiable_configurationCreated = Collections.unmodifiableMap(configurationCreated);
62 unmodifiable_operationalCreated = Collections.unmodifiableMap(operationalCreated);
63 unmodifiable_configurationUpdate = Collections.unmodifiableMap(configurationUpdate);
64 unmodifiable_operationalUpdate = Collections.unmodifiableMap(operationalUpdate);
65 unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet());
66 unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet());
70 public final void putConfigurationData(final P path, final D data) {
73 if ((original = getConfigurationOriginal(path)) == null) {
74 configurationCreated.put(path, data);
77 configurationUpdate.put(path, mergeConfigurationData(path,original, data));
81 public final void putOperationalData(final P path, final D data) {
84 if ((original = getOperationalOriginal(path)) == null) {
85 operationalCreated.put(path, data);
87 operationalUpdate.put(path, mergeOperationalData(path,original,data));
91 public final void removeOperationalData(final P path) {
93 getOperationalOriginal(path);
94 operationalUpdate.remove(path);
95 operationalRemove.put(path, path);
99 public final void removeConfigurationData(final P path) {
101 getConfigurationOriginal(path);
102 configurationUpdate.remove(path);
103 configurationRemove.put(path, path);
106 private final void checkMutable() {
107 if (!NEW.equals(this.getStatus())) {
108 throw new IllegalStateException("Transaction was already submitted");
113 public final Map<P, D> getUpdatedConfigurationData() {
115 return unmodifiable_configurationUpdate;
119 public final Map<P, D> getUpdatedOperationalData() {
120 return unmodifiable_operationalUpdate;
124 public final Set<P> getRemovedConfigurationData() {
125 return unmodifiable_configurationRemove;
129 public final Set<P> getRemovedOperationalData() {
130 return unmodifiable_OperationalRemove;
134 public Map<P, D> getCreatedConfigurationData() {
135 return unmodifiable_configurationCreated;
139 public Map<P, D> getCreatedOperationalData() {
140 return unmodifiable_operationalCreated;
144 public Map<P, D> getOriginalConfigurationData() {
145 return unmodifiable_configurationOriginal;
149 public Map<P, D> getOriginalOperationalData() {
150 return unmodifiable_operationalOriginal;
154 public D readOperationalData(final P path) {
155 return reader.readOperationalData(path);
159 public D readConfigurationData(final P path) {
160 return reader.readConfigurationData(path);
163 private D getConfigurationOriginal(final P path) {
164 D data = configurationOriginal.get(path);
168 data = reader.readConfigurationData(path);
170 configurationOriginal.put(path, data);
176 private D getOperationalOriginal(final P path) {
177 D data = operationalOriginal.get(path);
181 data = reader.readOperationalData(path);
183 operationalOriginal.put(path, data);
189 protected D mergeOperationalData(final P path,final D stored, final D modified) {
193 protected D mergeConfigurationData(final P path,final D stored, final D modified) {