+/*
+ * 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 java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
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;
+ private final Map<P, D> operationalOriginal;
+ private final Map<P, D> configurationOriginal;
- private final ConcurrentMap<P, D> operationalCreated;
- private final ConcurrentMap<P, D> configurationCreated;
+ private final Map<P, D> operationalCreated;
+ private final Map<P, D> configurationCreated;
- private final ConcurrentMap<P, D> configurationUpdate;
- private final ConcurrentMap<P, D> operationalUpdate;
+ private final Map<P, D> configurationUpdate;
+ private final Map<P, D> operationalUpdate;
- private final ConcurrentMap<P, P> configurationRemove;
- private final ConcurrentMap<P, P> operationalRemove;
+ private final Map<P, P> configurationRemove;
+ private final Map<P, P> operationalRemove;
private final Map<P, D> unmodifiable_configurationOriginal;
private final Map<P, D> unmodifiable_operationalOriginal;
private final Map<P, D> unmodifiable_operationalUpdate;
private final Set<P> unmodifiable_configurationRemove;
private final Set<P> unmodifiable_OperationalRemove;
- private DataReader<P, D> reader;
+ private final DataReader<P, D> reader;
- public AbstractDataModification(DataReader<P, D> reader) {
+ public AbstractDataModification(final DataReader<P, D> reader) {
this.reader = reader;
- this.configurationUpdate = new ConcurrentHashMap<>();
- this.operationalUpdate = new ConcurrentHashMap<>();
- this.configurationRemove = new ConcurrentHashMap<>();
- this.operationalRemove = new ConcurrentHashMap<>();
+ this.configurationUpdate = new LinkedHashMap<>();
+ this.operationalUpdate = new LinkedHashMap<>();
+ this.configurationRemove = new LinkedHashMap<>();
+ this.operationalRemove = new LinkedHashMap<>();
- this.configurationOriginal = new ConcurrentHashMap<>();
- this.operationalOriginal = new ConcurrentHashMap<>();
+ this.configurationOriginal = new LinkedHashMap<>();
+ this.operationalOriginal = new LinkedHashMap<>();
- this.configurationCreated = new ConcurrentHashMap<>();
- this.operationalCreated = new ConcurrentHashMap<>();
+ this.configurationCreated = new LinkedHashMap<>();
+ this.operationalCreated = new LinkedHashMap<>();
unmodifiable_configurationOriginal = Collections.unmodifiableMap(configurationOriginal);
unmodifiable_operationalOriginal = Collections.unmodifiableMap(operationalOriginal);
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) {
+ public final void putConfigurationData(final P path, final D data) {
checkMutable();
-
- if (!hasConfigurationOriginal(path)) {
+ D original = null;
+ if ((original = getConfigurationOriginal(path)) == null) {
configurationCreated.put(path, data);
}
- configurationUpdate.put(path, data);
- configurationRemove.remove(path);
+ configurationUpdate.put(path, mergeConfigurationData(path,original, data));
}
@Override
- public final void putOperationalData(P path, D data) {
+ public final void putOperationalData(final P path, final D data) {
checkMutable();
- if (!hasOperationalOriginal(path)) {
+ D original = null;
+ if ((original = getOperationalOriginal(path)) == null) {
operationalCreated.put(path, data);
}
- operationalUpdate.put(path, data);
- operationalRemove.remove(path);
+ operationalUpdate.put(path, mergeOperationalData(path,original,data));
}
@Override
- public final void putRuntimeData(P path, D data) {
- putOperationalData(path, data);
- }
-
- @Override
- public final void removeOperationalData(P path) {
+ public final void removeOperationalData(final P path) {
checkMutable();
- hasOperationalOriginal(path);
+ getOperationalOriginal(path);
operationalUpdate.remove(path);
operationalRemove.put(path, path);
}
@Override
- public final void removeRuntimeData(P path) {
- removeOperationalData(path);
- }
-
- @Override
- public final void removeConfigurationData(P path) {
+ public final void removeConfigurationData(final P path) {
checkMutable();
- hasConfigurationOriginal(path);
+ getConfigurationOriginal(path);
configurationUpdate.remove(path);
configurationRemove.put(path, path);
}
}
@Override
- public D readOperationalData(P path) {
+ public D readOperationalData(final P path) {
return reader.readOperationalData(path);
}
@Override
- public D readConfigurationData(P path) {
+ public D readConfigurationData(final P path) {
return reader.readConfigurationData(path);
}
- private boolean hasConfigurationOriginal(P path) {
- if (configurationOriginal.containsKey(path)) {
- return true;
+ private D getConfigurationOriginal(final 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;
+ configurationOriginal.put(path, data);
+ return data;
}
- return false;
+ return null;
}
- private boolean hasOperationalOriginal(P path) {
- if (operationalOriginal.containsKey(path)) {
- return true;
+ private D getOperationalOriginal(final P path) {
+ D data = operationalOriginal.get(path);
+ if (data != null) {
+ return data;
}
- D data = reader.readOperationalData(path);
+ data = reader.readOperationalData(path);
if (data != null) {
- operationalOriginal.putIfAbsent(path, data);
- return true;
+ operationalOriginal.put(path, data);
+ return data;
}
- return false;
+ return null;
+ }
+
+ protected D mergeOperationalData(final P path,final D stored, final D modified) {
+ return modified;
+ }
+
+ protected D mergeConfigurationData(final P path,final D stored, final D modified) {
+ return modified;
}
}