+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
package org.opendaylight.controller.md.sal.common.impl;
import static org.opendaylight.controller.md.sal.common.api.TransactionStatus.NEW;
import org.opendaylight.controller.md.sal.common.api.data.DataModification;
import org.opendaylight.controller.md.sal.common.api.data.DataReader;
+import org.opendaylight.yangtools.concepts.Path;
-public abstract class AbstractDataModification<P /* extends Path<P> */, D> implements DataModification<P, D> {
+public abstract class AbstractDataModification<P extends Path<P>, D> implements DataModification<P, D> {
private final ConcurrentMap<P, D> operationalOriginal;
private final ConcurrentMap<P, D> configurationOriginal;
unmodifiable_operationalUpdate = Collections.unmodifiableMap(operationalUpdate);
unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet());
unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet());
-
}
@Override
public final void putConfigurationData(P path, D data) {
checkMutable();
-
- if (!hasConfigurationOriginal(path)) {
+ D original = null;
+ if ((original = getConfigurationOriginal(path)) == null) {
configurationCreated.put(path, data);
}
- configurationUpdate.put(path, data);
+ configurationUpdate.put(path, mergeConfigurationData(path,original, data));
configurationRemove.remove(path);
}
@Override
public final void putOperationalData(P path, D data) {
checkMutable();
- if (!hasOperationalOriginal(path)) {
+ D original = null;
+ if ((original = getOperationalOriginal(path)) == null) {
operationalCreated.put(path, data);
}
- operationalUpdate.put(path, data);
+ operationalUpdate.put(path, mergeOperationalData(path,original,data));
operationalRemove.remove(path);
}
@Override
public final void removeOperationalData(P path) {
checkMutable();
- hasOperationalOriginal(path);
+ getOperationalOriginal(path);
operationalUpdate.remove(path);
operationalRemove.put(path, path);
}
@Override
public final void removeConfigurationData(P path) {
checkMutable();
- hasConfigurationOriginal(path);
+ getConfigurationOriginal(path);
configurationUpdate.remove(path);
configurationRemove.put(path, path);
}
return reader.readConfigurationData(path);
}
- private boolean hasConfigurationOriginal(P path) {
- if (configurationOriginal.containsKey(path)) {
- return true;
+ private D getConfigurationOriginal(P path) {
+ D data = configurationOriginal.get(path);
+ if (data != null) {
+ return data;
}
- D data = reader.readConfigurationData(path);
+ data = reader.readConfigurationData(path);
if (data != null) {
configurationOriginal.putIfAbsent(path, data);
- return true;
+ return data;
}
- return false;
+ return null;
}
- private boolean hasOperationalOriginal(P path) {
- if (operationalOriginal.containsKey(path)) {
- return true;
+ private D getOperationalOriginal(P path) {
+ D data = operationalOriginal.get(path);
+ if (data != null) {
+ return data;
}
- D data = reader.readConfigurationData(path);
+ data = reader.readOperationalData(path);
if (data != null) {
operationalOriginal.putIfAbsent(path, data);
- return true;
+ return data;
}
- return false;
+ return null;
+ }
+
+ protected D mergeOperationalData(P path,D stored, D modified) {
+ return modified;
+ }
+
+ protected D mergeConfigurationData(P path,D stored, D modified) {
+ return modified;
}
}