From f4e390f72ae047278cc2bf32cd9bd7f4535de16d Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 4 Sep 2014 14:19:01 +0200 Subject: [PATCH 1/1] BUG-1690: catch wildcard InstanceIdentifiers Read/write/merge/delete of wildcarded instance identifiers is not defined, so catch them early on in the binding broker implementation. Change-Id: I97161f88b8496a78575d6a7bc1b7bab8fee1da5b Signed-off-by: Robert Varga --- .../impl/AbstractForwardedTransaction.java | 1 + .../impl/AbstractWriteTransaction.java | 58 +++++++++---------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedTransaction.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedTransaction.java index 088e2283d7..eadde73e42 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedTransaction.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedTransaction.java @@ -58,6 +58,7 @@ abstract class AbstractForwardedTransaction CheckedFuture,ReadFailedException> doRead( final DOMDataReadTransaction readTx, final LogicalDatastoreType store, final InstanceIdentifier path) { + Preconditions.checkArgument(!path.isWildcarded(), "Invalid read of wildcarded path %s", path); return MappingCheckedFuture.create( Futures.transform(readTx.read(store, codec.toNormalized(path)), diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractWriteTransaction.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractWriteTransaction.java index 65a9c1abeb..4597f0646c 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractWriteTransaction.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractWriteTransaction.java @@ -7,23 +7,21 @@ */ package org.opendaylight.controller.md.sal.binding.impl; +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; +import com.google.common.util.concurrent.CheckedFuture; import java.util.Collections; import java.util.Map.Entry; - import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.Identifiable; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +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; - -import com.google.common.base.Optional; -import com.google.common.collect.Iterables; -import com.google.common.util.concurrent.CheckedFuture; /** * @@ -33,34 +31,30 @@ import com.google.common.util.concurrent.CheckedFuture; public abstract class AbstractWriteTransaction extends AbstractForwardedTransaction { - private static final Logger LOG = LoggerFactory.getLogger(AbstractWriteTransaction.class); - - protected AbstractWriteTransaction(final T delegate, - final BindingToNormalizedNodeCodec codec) { + protected AbstractWriteTransaction(final T delegate, final BindingToNormalizedNodeCodec codec) { super(delegate, codec); } - public final void put(final LogicalDatastoreType store, final InstanceIdentifier path, final U data, final boolean createParents) { - final Entry> normalized = getCodec() - .toNormalizedNode(path, data); - if(createParents) { + Preconditions.checkArgument(!path.isWildcarded(), "Cannot put data into wildcarded path %s", path); + + final Entry> normalized = getCodec().toNormalizedNode(path, data); + if (createParents) { ensureParentsByMerge(store, normalized.getKey(), path); } else { ensureListParentIfNeeded(store,path,normalized); } + getDelegate().put(store, normalized.getKey(), normalized.getValue()); } - public final void merge(final LogicalDatastoreType store, final InstanceIdentifier path, final U data,final boolean createParents) { + Preconditions.checkArgument(!path.isWildcarded(), "Cannot merge data into wildcarded path %s", path); - final Entry> normalized = getCodec() - .toNormalizedNode(path, data); - - if(createParents) { + final Entry> normalized = getCodec().toNormalizedNode(path, data); + if (createParents) { ensureParentsByMerge(store, normalized.getKey(), path); } else { ensureListParentIfNeeded(store,path,normalized); @@ -69,7 +63,6 @@ public abstract class AbstractWriteTransaction path, - final Entry> normalized) { - if(Identifiable.class.isAssignableFrom(path.getTargetType())) { - org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier parentMapPath = getParent(normalized.getKey()).get(); + final Entry> normalized) { + if (Identifiable.class.isAssignableFrom(path.getTargetType())) { + YangInstanceIdentifier parentMapPath = getParent(normalized.getKey()).get(); NormalizedNode emptyParent = getCodec().getDefaultNodeFor(parentMapPath); getDelegate().merge(store, parentMapPath, emptyParent); } - } // FIXME (should be probaly part of InstanceIdentifier) - protected static Optional getParent( - final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier child) { + protected static Optional getParent( + final YangInstanceIdentifier child) { Iterable mapEntryItemPath = child.getPathArguments(); int parentPathSize = Iterables.size(mapEntryItemPath) - 1; - if(parentPathSize > 1) { - return Optional.of(org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.create(Iterables.limit(mapEntryItemPath, parentPathSize))); + if (parentPathSize > 1) { + return Optional.of(YangInstanceIdentifier.create(Iterables.limit(mapEntryItemPath, parentPathSize))); } else if(parentPathSize == 0) { - return Optional.of(org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.create(Collections.emptyList())); + return Optional.of(YangInstanceIdentifier.create(Collections.emptyList())); } else { return Optional.absent(); } @@ -136,11 +128,13 @@ public abstract class AbstractWriteTransaction path); + YangInstanceIdentifier key, InstanceIdentifier path); protected final void doDelete(final LogicalDatastoreType store, final InstanceIdentifier path) { - final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier normalized = getCodec().toNormalized(path); + Preconditions.checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path); + + final YangInstanceIdentifier normalized = getCodec().toNormalized(path); getDelegate().delete(store, normalized); } -- 2.36.6