From: Robert Varga Date: Tue, 13 Nov 2018 18:18:30 +0000 (+0100) Subject: Introduce ReadOperations.exists() X-Git-Tag: v3.0.2~23 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F39%2F77739%2F3;p=mdsal.git Introduce ReadOperations.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. Change-Id: Id56332d6f720396305ac68e40554e62fd17c34fb JIRA: MDSAL-389 Signed-off-by: Robert Varga --- diff --git a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/ReadOperations.java b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/ReadOperations.java index 57afb72988..13c50f0094 100644 --- a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/ReadOperations.java +++ b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/ReadOperations.java @@ -8,6 +8,7 @@ package org.opendaylight.mdsal.binding.api; import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.MoreExecutors; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; @@ -29,8 +30,8 @@ public interface ReadOperations { * * @param store Logical data store from which read should occur. * @param path Path which uniquely identifies subtree which client want to read - * @return a FluentFuture containing the result of the read. The Future blocks until the commit operation is - * complete. Once complete: + * @return a FluentFuture containing the result of the read. The Future blocks until the operation is complete. Once + * complete: * * @throws NullPointerException if any of the arguments is null + * @throws IllegalArgumentException if the path is {@link InstanceIdentifier#isWildcarded()} */ @NonNull FluentFuture> read(@NonNull LogicalDatastoreType store, @NonNull InstanceIdentifier path); + + /** + * Determines if data data exists in the provided logical data store located at the provided path. + * + *

+ * Default implementation just delegates to {@link #read(LogicalDatastoreType, InstanceIdentifier)}. Implementations + * are recommended to override with a more efficient implementation. + * + * @param store Logical data store from which read should occur. + * @param path Path which uniquely identifies subtree which client want to read + * @return a FluentFuture containing the result of the check. The Future blocks until the operation is complete. + * Once complete: + *

    + *
  • If the data at the supplied path exists, the Future returns {@link Boolean#TRUE}. + *
  • + *
  • If the data at the supplied path does not exist, the Future returns {@link Boolean#FALSE}.
  • + *
  • If the check fails, the Future will fail with a {@link ReadFailedException} or an exception derived + * from ReadFailedException.
  • + *
+ * @throws NullPointerException if any of the arguments is null + * @throws IllegalArgumentException if the path is {@link InstanceIdentifier#isWildcarded()} and the implementation + * does not support evaluating wildcards. + */ + default @NonNull FluentFuture exists(final @NonNull LogicalDatastoreType store, + final @NonNull InstanceIdentifier path) { + return read(store, path).transform(Optional::isPresent, MoreExecutors.directExecutor()); + } } diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractForwardedTransaction.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractForwardedTransaction.java index 34d32726b1..28b63ec8b9 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractForwardedTransaction.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractForwardedTransaction.java @@ -53,11 +53,18 @@ abstract class AbstractForwardedTransaction im return codec; } - protected final FluentFuture> doRead(final DOMDataTreeReadOperations readOps, - final LogicalDatastoreType store, final InstanceIdentifier path) { + protected final @NonNull FluentFuture> doRead( + final DOMDataTreeReadOperations readOps, final LogicalDatastoreType store, + final InstanceIdentifier path) { checkArgument(!path.isWildcarded(), "Invalid read of wildcarded path %s", path); return readOps.read(store, codec.toYangInstanceIdentifierBlocking(path)) .transform(codec.getCodecRegistry().deserializeFunction(path)::apply, MoreExecutors.directExecutor()); } + + protected final @NonNull FluentFuture doExists(final DOMDataTreeReadOperations readOps, + final LogicalDatastoreType store, final InstanceIdentifier path) { + checkArgument(!path.isWildcarded(), "Invalid exists of wildcarded path %s", path); + return readOps.exists(store, codec.toYangInstanceIdentifierBlocking(path)); + } } diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadTransactionAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadTransactionAdapter.java index 0cf1a4b47b..a088ac00d0 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadTransactionAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadTransactionAdapter.java @@ -26,7 +26,12 @@ final class BindingDOMReadTransactionAdapter extends AbstractForwardedTransactio @Override public FluentFuture> read(final LogicalDatastoreType store, final InstanceIdentifier path) { - return doRead(getDelegate(),store, path); + return doRead(getDelegate(), store, path); + } + + @Override + public FluentFuture exists(final LogicalDatastoreType store, final InstanceIdentifier path) { + return doExists(getDelegate(), store, path); } @Override diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadWriteTransactionAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadWriteTransactionAdapter.java index 7bb2dfd891..a8868b6547 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadWriteTransactionAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadWriteTransactionAdapter.java @@ -28,4 +28,9 @@ class BindingDOMReadWriteTransactionAdapter extends BindingDOMWriteTransactionAd final InstanceIdentifier path) { return doRead(getDelegate(), store, path); } + + @Override + public FluentFuture exists(final LogicalDatastoreType store, final InstanceIdentifier path) { + return doExists(getDelegate(), store, path); + } } diff --git a/binding/mdsal-binding-spi/src/main/java/org/opendaylight/mdsal/binding/spi/ForwardingReadTransaction.java b/binding/mdsal-binding-spi/src/main/java/org/opendaylight/mdsal/binding/spi/ForwardingReadTransaction.java index 9d6892c432..86e3d0f922 100644 --- a/binding/mdsal-binding-spi/src/main/java/org/opendaylight/mdsal/binding/spi/ForwardingReadTransaction.java +++ b/binding/mdsal-binding-spi/src/main/java/org/opendaylight/mdsal/binding/spi/ForwardingReadTransaction.java @@ -37,6 +37,11 @@ public class ForwardingReadTransaction extends ForwardingTransaction implements return delegate.read(store, path); } + @Override + public FluentFuture exists(final LogicalDatastoreType store, final InstanceIdentifier path) { + return delegate.exists(store, path); + } + @Override public void close() { delegate.close(); diff --git a/binding/mdsal-binding-spi/src/main/java/org/opendaylight/mdsal/binding/spi/ForwardingReadWriteTransaction.java b/binding/mdsal-binding-spi/src/main/java/org/opendaylight/mdsal/binding/spi/ForwardingReadWriteTransaction.java index 3336299d9b..10ddc5ff0e 100644 --- a/binding/mdsal-binding-spi/src/main/java/org/opendaylight/mdsal/binding/spi/ForwardingReadWriteTransaction.java +++ b/binding/mdsal-binding-spi/src/main/java/org/opendaylight/mdsal/binding/spi/ForwardingReadWriteTransaction.java @@ -51,6 +51,11 @@ public class ForwardingReadWriteTransaction extends ForwardingTransaction implem return delegate.read(store, path); } + @Override + public FluentFuture exists(final LogicalDatastoreType store, final InstanceIdentifier path) { + return delegate.exists(store, path); + } + @Override public boolean cancel() { return delegate.cancel(); diff --git a/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TransactionAdapter.java b/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TransactionAdapter.java index 2a856877a2..0178224b2e 100644 --- a/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TransactionAdapter.java +++ b/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TransactionAdapter.java @@ -151,5 +151,11 @@ public final class TransactionAdapter { checkStore(store); return delegate().read(path); } + + @Override + public FluentFuture exists(final LogicalDatastoreType store,final InstanceIdentifier path) { + checkStore(store); + return delegate().exists(path); + } } } diff --git a/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadTransaction.java b/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadTransaction.java index f42e69203d..845923191f 100644 --- a/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadTransaction.java +++ b/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadTransaction.java @@ -8,6 +8,7 @@ package org.opendaylight.mdsal.binding.util; import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.MoreExecutors; import java.util.Optional; import org.opendaylight.mdsal.binding.api.ReadTransaction; import org.opendaylight.mdsal.binding.api.Transaction; @@ -34,4 +35,18 @@ public interface TypedReadTransaction extends Transaction { * @return A future providing access to the result of the read, when it’s available, or any error encountered. */ FluentFuture> read(InstanceIdentifier path); + + /** + * Determines if an object exists at the given path. Default implementation just delegates to + * {@link #read(InstanceIdentifier)}. Implementations are recommended to override with a more efficient + * implementation. + * + * @see ReadTransaction#exists(LogicalDatastoreType, InstanceIdentifier) + * + * @param path The path to read from. + * @return A future providing access to the result of the check, when it’s available, or any error encountered. + */ + default FluentFuture exists(final InstanceIdentifier path) { + return read(path).transform(Optional::isPresent, MoreExecutors.directExecutor()); + } } diff --git a/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadTransactionImpl.java b/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadTransactionImpl.java index 3176b924e1..31ee12788e 100644 --- a/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadTransactionImpl.java +++ b/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadTransactionImpl.java @@ -28,4 +28,9 @@ final class TypedReadTransactionImpl extends TypedTransacti public FluentFuture> read(final InstanceIdentifier path) { return delegate().read(getDatastoreType(), path); } + + @Override + public FluentFuture exists(final InstanceIdentifier path) { + return delegate().exists(getDatastoreType(), path); + } } diff --git a/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadWriteTransactionImpl.java b/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadWriteTransactionImpl.java index ae121603f3..1927853905 100644 --- a/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadWriteTransactionImpl.java +++ b/binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedReadWriteTransactionImpl.java @@ -29,4 +29,9 @@ class TypedReadWriteTransactionImpl public final FluentFuture> read(final InstanceIdentifier path) { return delegate().read(getDatastoreType(), path); } + + @Override + public FluentFuture exists(final InstanceIdentifier path) { + return delegate().exists(getDatastoreType(), path); + } }