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;
21 public abstract class AbstractDataModification<P extends Path<P>, D> implements DataModification<P, D> {
23 private final Map<P, D> operationalOriginal;
24 private final Map<P, D> configurationOriginal;
26 private final Map<P, D> operationalCreated;
27 private final Map<P, D> configurationCreated;
29 private final Map<P, D> configurationUpdate;
30 private final Map<P, D> operationalUpdate;
32 private final Map<P, P> configurationRemove;
33 private final Map<P, P> operationalRemove;
35 private final Map<P, D> unmodifiable_configurationOriginal;
36 private final Map<P, D> unmodifiable_operationalOriginal;
37 private final Map<P, D> unmodifiable_configurationCreated;
38 private final Map<P, D> unmodifiable_operationalCreated;
39 private final Map<P, D> unmodifiable_configurationUpdate;
40 private final Map<P, D> unmodifiable_operationalUpdate;
41 private final Set<P> unmodifiable_configurationRemove;
42 private final Set<P> unmodifiable_OperationalRemove;
43 private final DataReader<P, D> reader;
45 public AbstractDataModification(final DataReader<P, D> reader) {
47 this.configurationUpdate = new LinkedHashMap<>();
48 this.operationalUpdate = new LinkedHashMap<>();
49 this.configurationRemove = new LinkedHashMap<>();
50 this.operationalRemove = new LinkedHashMap<>();
52 this.configurationOriginal = new LinkedHashMap<>();
53 this.operationalOriginal = new LinkedHashMap<>();
55 this.configurationCreated = new LinkedHashMap<>();
56 this.operationalCreated = new LinkedHashMap<>();
58 unmodifiable_configurationOriginal = Collections.unmodifiableMap(configurationOriginal);
59 unmodifiable_operationalOriginal = Collections.unmodifiableMap(operationalOriginal);
60 unmodifiable_configurationCreated = Collections.unmodifiableMap(configurationCreated);
61 unmodifiable_operationalCreated = Collections.unmodifiableMap(operationalCreated);
62 unmodifiable_configurationUpdate = Collections.unmodifiableMap(configurationUpdate);
63 unmodifiable_operationalUpdate = Collections.unmodifiableMap(operationalUpdate);
64 unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet());
65 unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet());
69 public final void putConfigurationData(final P path, final D data) {
72 if ((original = getConfigurationOriginal(path)) == null) {
73 configurationCreated.put(path, data);
76 configurationUpdate.put(path, mergeConfigurationData(path,original, data));
80 public final void putOperationalData(final P path, final D data) {
83 if ((original = getOperationalOriginal(path)) == null) {
84 operationalCreated.put(path, data);
86 operationalUpdate.put(path, mergeOperationalData(path,original,data));
90 public final void removeOperationalData(final P path) {
92 getOperationalOriginal(path);
93 operationalUpdate.remove(path);
94 operationalRemove.put(path, path);
98 public final void removeConfigurationData(final P path) {
100 getConfigurationOriginal(path);
101 configurationUpdate.remove(path);
102 configurationRemove.put(path, path);
105 private final void checkMutable() {
106 if (!NEW.equals(this.getStatus()))
107 throw new IllegalStateException("Transaction was already submitted");
111 public final Map<P, D> getUpdatedConfigurationData() {
113 return unmodifiable_configurationUpdate;
117 public final Map<P, D> getUpdatedOperationalData() {
118 return unmodifiable_operationalUpdate;
122 public final Set<P> getRemovedConfigurationData() {
123 return unmodifiable_configurationRemove;
127 public final Set<P> getRemovedOperationalData() {
128 return unmodifiable_OperationalRemove;
132 public Map<P, D> getCreatedConfigurationData() {
133 return unmodifiable_configurationCreated;
137 public Map<P, D> getCreatedOperationalData() {
138 return unmodifiable_operationalCreated;
142 public Map<P, D> getOriginalConfigurationData() {
143 return unmodifiable_configurationOriginal;
147 public Map<P, D> getOriginalOperationalData() {
148 return unmodifiable_operationalOriginal;
152 public D readOperationalData(final P path) {
153 return reader.readOperationalData(path);
157 public D readConfigurationData(final P path) {
158 return reader.readConfigurationData(path);
161 private D getConfigurationOriginal(final P path) {
162 D data = configurationOriginal.get(path);
166 data = reader.readConfigurationData(path);
168 configurationOriginal.put(path, data);
174 private D getOperationalOriginal(final P path) {
175 D data = operationalOriginal.get(path);
179 data = reader.readOperationalData(path);
181 operationalOriginal.put(path, data);
187 protected D mergeOperationalData(final P path,final D stored, final D modified) {
191 protected D mergeConfigurationData(final P path,final D stored, final D modified) {