From: Robert Varga Date: Wed, 14 Nov 2018 09:11:44 +0000 (+0100) Subject: Introduce ReadTransaction.exists() X-Git-Tag: release/neon~66 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=a6bdbfafe60b9aeac056187f27229e476fbf88bf Introduce ReadTransaction.exists() This method exists in the DOM API, but for some reason it was left out if the Binding API. Introduce it as default methods riding on the read() method and override them in all known implementations, so the request is efficiently routed. JIRA: MDSAL-389 Change-Id: Id56332d6f720396305ac68e40554e62fd17c34fb Signed-off-by: Robert Varga --- diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ForwardingReadOnlyTransaction.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ForwardingReadOnlyTransaction.java index a8fad51560..a71c08a1c0 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ForwardingReadOnlyTransaction.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ForwardingReadOnlyTransaction.java @@ -24,7 +24,7 @@ public class ForwardingReadOnlyTransaction extends ForwardingObject implements R private final ReadOnlyTransaction delegate; - protected ForwardingReadOnlyTransaction(ReadOnlyTransaction delegate) { + protected ForwardingReadOnlyTransaction(final ReadOnlyTransaction delegate) { this.delegate = delegate; } @@ -34,11 +34,17 @@ public class ForwardingReadOnlyTransaction extends ForwardingObject implements R } @Override - public CheckedFuture, ReadFailedException> read(LogicalDatastoreType store, - InstanceIdentifier path) { + public CheckedFuture, ReadFailedException> read(final LogicalDatastoreType store, + final InstanceIdentifier path) { return delegate.read(store, path); } + @Override + public CheckedFuture exists(final LogicalDatastoreType store, + final InstanceIdentifier path) { + return delegate.exists(store, path); + } + @Override public Object getIdentifier() { return delegate.getIdentifier(); diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ForwardingReadWriteTransaction.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ForwardingReadWriteTransaction.java index 641e77bb72..3e8dfe7e57 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ForwardingReadWriteTransaction.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ForwardingReadWriteTransaction.java @@ -26,7 +26,7 @@ public class ForwardingReadWriteTransaction extends ForwardingObject implements private final ReadWriteTransaction delegate; - protected ForwardingReadWriteTransaction(ReadWriteTransaction delegate) { + protected ForwardingReadWriteTransaction(final ReadWriteTransaction delegate) { this.delegate = delegate; } @@ -36,22 +36,29 @@ public class ForwardingReadWriteTransaction extends ForwardingObject implements } @Override - public void put(LogicalDatastoreType store, InstanceIdentifier path, T data) { + public void put(final LogicalDatastoreType store, final InstanceIdentifier path, + final T data) { delegate.put(store, path, data); } @Override - public void put(LogicalDatastoreType store, InstanceIdentifier path, T data, - boolean createMissingParents) { + public void put(final LogicalDatastoreType store, final InstanceIdentifier path, + final T data, final boolean createMissingParents) { delegate.put(store, path, data, createMissingParents); } @Override - public CheckedFuture, ReadFailedException> read(LogicalDatastoreType store, - InstanceIdentifier path) { + public CheckedFuture, ReadFailedException> read(final LogicalDatastoreType store, + final InstanceIdentifier path) { return delegate.read(store, path); } + @Override + public CheckedFuture exists(final LogicalDatastoreType store, + final InstanceIdentifier path) { + return delegate.exists(store, path); + } + @Override public Object getIdentifier() { return delegate.getIdentifier(); @@ -63,13 +70,14 @@ public class ForwardingReadWriteTransaction extends ForwardingObject implements } @Override - public void merge(LogicalDatastoreType store, InstanceIdentifier path, T data) { + public void merge(final LogicalDatastoreType store, final InstanceIdentifier path, + final T data) { delegate.merge(store, path, data); } @Override - public void merge(LogicalDatastoreType store, InstanceIdentifier path, T data, - boolean createMissingParents) { + public void merge(final LogicalDatastoreType store, final InstanceIdentifier path, + final T data, final boolean createMissingParents) { delegate.merge(store, path, data, createMissingParents); } @@ -79,7 +87,7 @@ public class ForwardingReadWriteTransaction extends ForwardingObject implements } @Override - public void delete(LogicalDatastoreType store, InstanceIdentifier path) { + public void delete(final LogicalDatastoreType store, final InstanceIdentifier path) { delegate.delete(store, path); } } diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ReadTransaction.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ReadTransaction.java index 21bcf23cd4..01f525487a 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ReadTransaction.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/ReadTransaction.java @@ -9,6 +9,9 @@ package org.opendaylight.controller.md.sal.binding.api; import com.google.common.base.Optional; import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.MoreExecutors; +import org.opendaylight.controller.md.sal.common.api.MappingCheckedFuture; import org.opendaylight.controller.md.sal.common.api.data.AsyncReadTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; @@ -45,6 +48,38 @@ public interface ReadTransaction extends AsyncReadTransaction * */ - CheckedFuture,ReadFailedException> read( + CheckedFuture, ReadFailedException> read( LogicalDatastoreType store, InstanceIdentifier path); + + /** + * Checks if data is available in the logical data store located at provided path. + * + *

+ * Note: a successful result from this method makes no guarantee that a subsequent call to {@link #read} + * will succeed. It is possible that the data resides in a data store on a remote node and, if that + * node goes down or a network failure occurs, a subsequent read would fail. Another scenario is if + * the data is deleted in between the calls to exists and read + * + *

+ * Default implementation delegates to {@link #read(LogicalDatastoreType, InstanceIdentifier)}, implementations + * are advised to provide a more efficient override. + * + * @param store + * Logical data store from which read should occur. + * @param path + * Path which uniquely identifies subtree which client want to + * check existence of + * @return a CheckFuture containing the result of the check. + *

    + *
  • If the data at the supplied path exists, the Future returns a Boolean + * whose value is true, false otherwise
  • + *
  • If checking for the data fails, the Future will fail with a + * {@link ReadFailedException} or an exception derived from ReadFailedException.
  • + *
+ */ + default CheckedFuture exists(final LogicalDatastoreType store, + final InstanceIdentifier path) { + return MappingCheckedFuture.create(Futures.transform(read(store, path), Optional::isPresent, + MoreExecutors.directExecutor()), ReadFailedException.MAPPER); + } } 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 fe8c75864e..24b7ff03ce 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 @@ -57,7 +57,7 @@ abstract class AbstractForwardedTransaction CheckedFuture,ReadFailedException> doRead( + protected final CheckedFuture, ReadFailedException> doRead( final DOMDataReadTransaction readTx, final LogicalDatastoreType store, final InstanceIdentifier path) { Preconditions.checkArgument(!path.isWildcarded(), "Invalid read of wildcarded path %s", path); @@ -68,4 +68,13 @@ abstract class AbstractForwardedTransaction doExists( + final DOMDataReadTransaction readTx, final LogicalDatastoreType store, + final InstanceIdentifier path) { + Preconditions.checkArgument(!path.isWildcarded(), "Invalid read of wildcarded path %s", path); + + return MappingCheckedFuture.create(readTx.exists(store, codec.toYangInstanceIdentifierBlocking(path)), + ReadFailedException.MAPPER); + } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMReadTransactionAdapter.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMReadTransactionAdapter.java index 1d6932237b..7a8414ce79 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMReadTransactionAdapter.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMReadTransactionAdapter.java @@ -25,11 +25,17 @@ class BindingDOMReadTransactionAdapter extends AbstractForwardedTransaction CheckedFuture,ReadFailedException> read( + public CheckedFuture, ReadFailedException> read( final LogicalDatastoreType store, final InstanceIdentifier path) { return doRead(getDelegate(),store, path); } + @Override + public CheckedFuture exists(final LogicalDatastoreType store, + final InstanceIdentifier path) { + return doExists(getDelegate(), store, path); + } + @Override public void close() { getDelegate().close(); diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMReadWriteTransactionAdapter.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMReadWriteTransactionAdapter.java index bebed4df85..d3764fbce6 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMReadWriteTransactionAdapter.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMReadWriteTransactionAdapter.java @@ -29,4 +29,10 @@ class BindingDOMReadWriteTransactionAdapter extends final LogicalDatastoreType store, final InstanceIdentifier path) { return doRead(getDelegate(), store, path); } + + @Override + public CheckedFuture exists(final LogicalDatastoreType store, + final InstanceIdentifier path) { + return doExists(getDelegate(), store, path); + } }