From: Tony Tkacik Date: Wed, 13 May 2015 09:24:36 +0000 (+0200) Subject: Bug 3189: Check consistency of Instance Identifier and Data X-Git-Tag: release/beryllium~496 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=524c3e5552f31bde285439bfebf7a65e617a17d5 Bug 3189: Check consistency of Instance Identifier and Data Change-Id: If6f5cf8b28eb27cba89faf8a7c9489ed7fdc3dca Signed-off-by: Tony Tkacik (cherry picked from commit c567ebbe7ffdb38e88524e710145cab7d3c790bc) --- diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/DOMBrokerWriteOnlyTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/DOMBrokerWriteOnlyTransaction.java index 6d00210629..df32a2d542 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/DOMBrokerWriteOnlyTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/DOMBrokerWriteOnlyTransaction.java @@ -26,6 +26,7 @@ import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCoh import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,13 +62,13 @@ public class DOMBrokerWriteOnlyTransaction private volatile Future commitFuture; protected DOMBrokerWriteOnlyTransaction(final Object identifier, - Map storeTxFactories, final AbstractDOMTransactionFactory commitImpl) { + final Map storeTxFactories, final AbstractDOMTransactionFactory commitImpl) { super(identifier, storeTxFactories); this.commitImpl = Preconditions.checkNotNull(commitImpl, "commitImpl must not be null."); } @Override - protected T createTransaction(LogicalDatastoreType key) { + protected T createTransaction(final LogicalDatastoreType key) { // FIXME : Casting shouldn't be necessary here return (T) getTxFactory(key).newWriteOnlyTransaction(); } @@ -75,9 +76,18 @@ public class DOMBrokerWriteOnlyTransaction @Override public void put(final LogicalDatastoreType store, final YangInstanceIdentifier path, final NormalizedNode data) { checkRunning(commitImpl); + checkInstanceIdentifierReferencesData(path,data); getSubtransaction(store).write(path, data); } + private static void checkInstanceIdentifierReferencesData(final YangInstanceIdentifier path, + final NormalizedNode data) { + final PathArgument lastArg = path.getLastPathArgument(); + Preconditions.checkArgument( + (lastArg == data.getIdentifier()) || (lastArg != null && lastArg.equals(data.getIdentifier())), + "Instance identifier references %s but data identifier is %s", lastArg, data); + } + @Override public void delete(final LogicalDatastoreType store, final YangInstanceIdentifier path) { checkRunning(commitImpl); @@ -87,6 +97,7 @@ public class DOMBrokerWriteOnlyTransaction @Override public void merge(final LogicalDatastoreType store, final YangInstanceIdentifier path, final NormalizedNode data) { checkRunning(commitImpl); + checkInstanceIdentifierReferencesData(path, data); getSubtransaction(store).merge(path, data); } @@ -125,7 +136,7 @@ public class DOMBrokerWriteOnlyTransaction final Collection cohorts = new ArrayList<>(txns.size()); // FIXME: deal with errors thrown by backed (ready and submit can fail in theory) - for (DOMStoreWriteTransaction txn : txns) { + for (final DOMStoreWriteTransaction txn : txns) { cohorts.add(txn.ready()); }