From: Ed Warnicke Date: Thu, 7 Nov 2013 14:53:12 +0000 (+0000) Subject: Merge "Updated AbstractDataModification to also implement DataChange" X-Git-Tag: jenkins-controller-bulk-release-prepare-only-2-1~466 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=7d2f3fcb2fb4192434900449baf527d7590887fc;hp=3a9f0addbcd1d3504ffaae935b64d3173b74f426 Merge "Updated AbstractDataModification to also implement DataChange" --- diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataTransactionImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataTransactionImpl.java index 9cb9caf7c1..c970fc5e92 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataTransactionImpl.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataTransactionImpl.java @@ -22,6 +22,7 @@ public class DataTransactionImpl extends AbstractDataModification */, D> { */ Map getUpdatedConfigurationData(); + + /** * Returns a set of paths of removed objects. * @@ -82,33 +84,4 @@ public interface DataChange

*/, D> { * @return map of paths and original state of updated and removed objectd. */ Map getOriginalOperationalData(); - - /** - * Returns a original subtree of data, which starts at the path - * where listener was registered. - * - */ - D getOriginalConfigurationSubtree(); - - /** - * Returns a original subtree of data, which starts at the path - * where listener was registered. - * - */ - D getOriginalOperationalSubtree(); - - /** - * Returns a new subtree of data, which starts at the path - * where listener was registered. - * - */ - D getUpdatedConfigurationSubtree(); - - /** - * Returns a new subtree of data, which starts at the path - * where listener was registered. - * - */ - D getUpdatedOperationalSubtree(); - } diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataChangeEvent.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataChangeEvent.java index 5905413745..144a81b256 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataChangeEvent.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataChangeEvent.java @@ -11,4 +11,17 @@ import org.opendaylight.yangtools.concepts.Immutable; public interface DataChangeEvent extends DataChange, Immutable { + /** + * Returns a new subtree of data, which starts at the path + * where listener was registered. + * + */ + D getUpdatedConfigurationSubtree(); + + /** + * Returns a new subtree of data, which starts at the path + * where listener was registered. + * + */ + D getUpdatedOperationalSubtree(); } diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataModification.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataModification.java index 1ab7c34589..d059766dea 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataModification.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataModification.java @@ -16,7 +16,7 @@ import org.opendaylight.controller.md.sal.common.api.TransactionStatus; // import org.opendaylight.yangtools.concepts.Path; import org.opendaylight.yangtools.yang.common.RpcResult; -public interface DataModification

*/, D> extends DataReader { +public interface DataModification

*/, D> extends DataChange, DataReader { /** * Returns transaction identifier @@ -27,21 +27,29 @@ public interface DataModification

*/, D> extends DataReader< TransactionStatus getStatus(); + /** + * + * Use {@link #putOperationalData(Object, Object)} instead. + * + * @param path + * @param data + */ void putRuntimeData(P path, D data); + void putOperationalData(P path, D data); + void putConfigurationData(P path, D data); + /** + * Use {@link #removeOperationalData(Object)} + * + * @param path + */ void removeRuntimeData(P path); - void removeConfigurationData(P path); - - public Map getUpdatedConfigurationData(); + void removeOperationalData(P path); - public Map getUpdatedOperationalData(); - - public Set

getRemovedConfigurationData(); - - public Set

getRemovedOperationalData(); + void removeConfigurationData(P path); /** * Initiates a two-phase commit of modification. 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 5d76717ab6..c335b75e15 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 @@ -5,68 +5,109 @@ 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 { +public abstract class AbstractDataModification

*/, D> implements DataModification { - private final Map configurationUpdate; - private final Map operationalUpdate; + private final ConcurrentMap operationalOriginal; + private final ConcurrentMap configurationOriginal; - private final Set

configurationRemove; - private final Set

operationalRemove; + private final ConcurrentMap operationalCreated; + private final ConcurrentMap configurationCreated; + private final ConcurrentMap configurationUpdate; + private final ConcurrentMap operationalUpdate; + + 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<>(); - public AbstractDataModification(Map configurationUpdate, Map operationalUpdate, - Set

configurationRemove, Set

operationalRemove) { - this.configurationUpdate = configurationUpdate; - this.operationalUpdate = operationalUpdate; - this.configurationRemove = configurationRemove; - this.operationalRemove = operationalRemove; + this.configurationOriginal = new ConcurrentHashMap<>(); + this.operationalOriginal = new ConcurrentHashMap<>(); + 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); - } + unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet()); + unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet()); - public AbstractDataModification() { - this(new HashMap(), new HashMap(), new HashSet

(), new HashSet

()); } @Override public final void putConfigurationData(P path, D data) { checkMutable(); + + if (!hasConfigurationOriginal(path)) { + configurationCreated.put(path, data); + } + configurationUpdate.put(path, data); configurationRemove.remove(path); } @Override - public final void putRuntimeData(P path, D data) { + public final void putOperationalData(P path, D data) { checkMutable(); + if (!hasOperationalOriginal(path)) { + operationalCreated.put(path, data); + } operationalUpdate.put(path, data); operationalRemove.remove(path); } @Override - public final void removeRuntimeData(P path) { + public final void putRuntimeData(P path, D data) { + putRuntimeData(path, data); + } + + @Override + public final void removeOperationalData(P path) { checkMutable(); + hasOperationalOriginal(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(); + hasConfigurationOriginal(path); configurationUpdate.remove(path); - configurationRemove.add(path); + configurationRemove.put(path, path); } private final void checkMutable() { @@ -75,24 +116,77 @@ public abstract class AbstractDataModification

*/, D> impleme } @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 boolean hasConfigurationOriginal(P path) { + if (configurationOriginal.containsKey(path)) { + return true; + } + D data = reader.readConfigurationData(path); + if (data != null) { + configurationOriginal.putIfAbsent(path, data); + return true; + } + return false; + } + + private boolean hasOperationalOriginal(P path) { + if (operationalOriginal.containsKey(path)) { + return true; + } + D data = reader.readConfigurationData(path); + if (data != null) { + operationalOriginal.putIfAbsent(path, data); + return true; + } + return false; + } }