X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-common-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fcommon%2Fimpl%2FAbstractDataModification.java;h=4b6a0185ab81ecc1bdaf2799de15b1a6af33ff7b;hb=80ee47d942c0581d9af5bb221e427f7b1c570ff6;hp=e786b7443b3fd5c1cfa6dac19198cf732be6ea9c;hpb=a251833f27fd00040904e2df316cd707c8129d1e;p=controller.git diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java index e786b7443b..4b6a0185ab 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java @@ -1,99 +1,205 @@ +/* + * 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.HashMap; -import java.util.HashSet; 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; -import static org.opendaylight.controller.md.sal.common.api.TransactionStatus.NEW; +public abstract class AbstractDataModification

, D> implements DataModification { + + private final ConcurrentMap operationalOriginal; + private final ConcurrentMap configurationOriginal; -public abstract class AbstractDataModification

, D> implements DataModification { + private final ConcurrentMap operationalCreated; + private final ConcurrentMap configurationCreated; - private final Map configurationUpdate; - private final Map operationalUpdate; + private final ConcurrentMap configurationUpdate; + private final ConcurrentMap operationalUpdate; - private final Set

configurationRemove; - private final Set

operationalRemove; - + private final ConcurrentMap configurationRemove; + private final ConcurrentMap operationalRemove; + + private final Map unmodifiable_configurationOriginal; + private final Map unmodifiable_operationalOriginal; + private final Map unmodifiable_configurationCreated; + private final Map unmodifiable_operationalCreated; private final Map unmodifiable_configurationUpdate; private final Map unmodifiable_operationalUpdate; private final Set

unmodifiable_configurationRemove; private final Set

unmodifiable_OperationalRemove; + private DataReader reader; - + public AbstractDataModification(DataReader reader) { + this.reader = reader; + this.configurationUpdate = new ConcurrentHashMap<>(); + this.operationalUpdate = new ConcurrentHashMap<>(); + this.configurationRemove = new ConcurrentHashMap<>(); + this.operationalRemove = new ConcurrentHashMap<>(); + + this.configurationOriginal = new ConcurrentHashMap<>(); + this.operationalOriginal = new ConcurrentHashMap<>(); - public AbstractDataModification(Map configurationUpdate, Map operationalUpdate, - Set

configurationRemove, Set

operationalRemove) { - this.configurationUpdate = configurationUpdate; - this.operationalUpdate = operationalUpdate; - this.configurationRemove = configurationRemove; - this.operationalRemove = operationalRemove; - + this.configurationCreated = new ConcurrentHashMap<>(); + this.operationalCreated = new ConcurrentHashMap<>(); + + unmodifiable_configurationOriginal = Collections.unmodifiableMap(configurationOriginal); + unmodifiable_operationalOriginal = Collections.unmodifiableMap(operationalOriginal); + unmodifiable_configurationCreated = Collections.unmodifiableMap(configurationCreated); + unmodifiable_operationalCreated = Collections.unmodifiableMap(operationalCreated); unmodifiable_configurationUpdate = Collections.unmodifiableMap(configurationUpdate); unmodifiable_operationalUpdate = Collections.unmodifiableMap(operationalUpdate); - unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove); - unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove); - } - - public AbstractDataModification() { - this(new HashMap(), new HashMap(), new HashSet

(), new HashSet

()); + unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet()); + unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet()); } @Override public final void putConfigurationData(P path, D data) { checkMutable(); - configurationUpdate.put(path, data); - configurationRemove.remove(path); + D original = null; + if ((original = getConfigurationOriginal(path)) == null) { + configurationCreated.put(path, data); + } + + configurationUpdate.put(path, mergeConfigurationData(path,original, data)); } - + @Override - public final void putRuntimeData(P path, D data) { + public final void putOperationalData(P path, D data) { checkMutable(); - operationalUpdate.put(path, data); - operationalRemove.remove(path); + D original = null; + if ((original = getOperationalOriginal(path)) == null) { + operationalCreated.put(path, data); + } + operationalUpdate.put(path, mergeOperationalData(path,original,data)); } - + @Override - public final void removeRuntimeData(P path) { + public final void putRuntimeData(P path, D data) { + putOperationalData(path, data); + } + + @Override + public final void removeOperationalData(P path) { checkMutable(); + getOperationalOriginal(path); operationalUpdate.remove(path); - operationalRemove.add(path); + operationalRemove.put(path, path); } - + + @Override + public final void removeRuntimeData(P path) { + removeOperationalData(path); + } + @Override public final void removeConfigurationData(P path) { checkMutable(); + getConfigurationOriginal(path); configurationUpdate.remove(path); - configurationRemove.add(path); + configurationRemove.put(path, path); } private final void checkMutable() { - if(!NEW.equals(this.getStatus())) throw new IllegalStateException("Transaction was already submitted"); + if (!NEW.equals(this.getStatus())) + throw new IllegalStateException("Transaction was already submitted"); } @Override - public Map getUpdatedConfigurationData() { - + public final Map getUpdatedConfigurationData() { + return unmodifiable_configurationUpdate; } @Override - public Map getUpdatedOperationalData() { + public final Map getUpdatedOperationalData() { return unmodifiable_operationalUpdate; } @Override - public Set

getRemovedConfigurationData() { + public final Set

getRemovedConfigurationData() { return unmodifiable_configurationRemove; } - + @Override - public Set

getRemovedOperationalData() { + public final Set

getRemovedOperationalData() { return unmodifiable_OperationalRemove; } + @Override + public Map getCreatedConfigurationData() { + return unmodifiable_configurationCreated; + } + + @Override + public Map getCreatedOperationalData() { + return unmodifiable_operationalCreated; + } + + @Override + public Map getOriginalConfigurationData() { + return unmodifiable_configurationOriginal; + } + + @Override + public Map getOriginalOperationalData() { + return unmodifiable_operationalOriginal; + } + + @Override + public D readOperationalData(P path) { + return reader.readOperationalData(path); + } + + @Override + public D readConfigurationData(P path) { + return reader.readConfigurationData(path); + } + + private D getConfigurationOriginal(P path) { + D data = configurationOriginal.get(path); + if (data != null) { + return data; + } + data = reader.readConfigurationData(path); + if (data != null) { + configurationOriginal.putIfAbsent(path, data); + return data; + } + return null; + } + + private D getOperationalOriginal(P path) { + D data = operationalOriginal.get(path); + if (data != null) { + return data; + } + data = reader.readOperationalData(path); + if (data != null) { + operationalOriginal.putIfAbsent(path, data); + return data; + } + return null; + } + + protected D mergeOperationalData(P path,D stored, D modified) { + return modified; + } + + protected D mergeConfigurationData(P path,D stored, D modified) { + return modified; + } }