From c875e567d2c681879f272259ed47f5bfcc25509a Mon Sep 17 00:00:00 2001 From: Tom Pantelis Date: Mon, 9 Jan 2017 23:27:42 -0500 Subject: [PATCH] Add read-write transaction to the AsyncDataBroker APIs Read-write transactions were ommitted from the AsyncDataBroker and related APIs. It is unclear as to why but the DOMStore API defines read-write transaction as do the equivalent controller APIs so clients will expect it when converting to the mdsal APIs. Plus we want to convert the CDS to the mdsal APIs and deprecate the controller APIs but we cannot provide an adapter between the two without read-write transactions. Change-Id: I46cd1783931044a34039f4a2100c50b645446bf2 Signed-off-by: Tom Pantelis Signed-off-by: Robert Varga --- .../binding/api/BindingTransactionChain.java | 4 +- .../mdsal/binding/api/DataBroker.java | 3 + .../binding/api/ReadWriteTransaction.java | 24 +++ .../dom/adapter/BindingDOMAdapterBuilder.java | 1 + .../dom/adapter/BindingDOMAdapterLoader.java | 14 +- .../adapter/BindingDOMDataBrokerAdapter.java | 20 ++- ...gDOMNotificationPublishServiceAdapter.java | 10 +- .../BindingDOMNotificationServiceAdapter.java | 8 +- ...BindingDOMReadWriteTransactionAdapter.java | 36 +++++ .../BindingDOMTransactionChainAdapter.java | 16 +- .../data/BindingDOMDataBrokerAdapter.java | 9 ++ .../BindingDOMTransactionChainAdapter.java | 9 ++ .../mdsal/common/api/AsyncDataBroker.java | 3 + .../api/AsyncDataTransactionFactory.java | 12 ++ .../common/api/AsyncReadWriteTransaction.java | 141 ++++++++++++++++++ .../mdsal/common/api/TransactionChain.java | 29 ++++ .../mdsal/dom/api/DOMDataBroker.java | 3 + .../api/DOMDataTreeReadWriteTransaction.java | 22 +++ .../mdsal/dom/api/DOMTransactionChain.java | 2 + ...bstractDOMForwardedTransactionFactory.java | 17 +++ .../DOMForwardedReadWriteTransaction.java | 64 ++++++++ .../broker/ShardedDOMDataBrokerAdapter.java | 7 +- ...ShardedDOMReadWriteTransactionAdapter.java | 48 ++++++ .../ShardedDOMTransactionChainAdapter.java | 15 ++ .../TransactionChainReadWriteTransaction.java | 46 ++++++ .../dom/spi/ForwardingDOMDataBroker.java | 6 + .../spi/ForwardingDOMTransactionChain.java | 6 + .../ForwardingDOMTransactionChainTest.java | 2 +- 28 files changed, 538 insertions(+), 39 deletions(-) create mode 100644 binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/ReadWriteTransaction.java create mode 100644 binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadWriteTransactionAdapter.java create mode 100644 common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncReadWriteTransaction.java create mode 100644 dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataTreeReadWriteTransaction.java create mode 100644 dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMForwardedReadWriteTransaction.java create mode 100644 dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMReadWriteTransactionAdapter.java create mode 100644 dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/TransactionChainReadWriteTransaction.java diff --git a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/BindingTransactionChain.java b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/BindingTransactionChain.java index bf1219cdd4..afd2e75678 100644 --- a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/BindingTransactionChain.java +++ b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/BindingTransactionChain.java @@ -8,7 +8,6 @@ package org.opendaylight.mdsal.binding.api; import org.opendaylight.mdsal.common.api.TransactionChain; - import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -30,4 +29,7 @@ public interface BindingTransactionChain extends TransactionFactory, @Override WriteTransaction newWriteOnlyTransaction(); + + @Override + ReadWriteTransaction newReadWriteTransaction(); } diff --git a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/DataBroker.java b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/DataBroker.java index c43889c0c8..9ad29be2b6 100644 --- a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/DataBroker.java +++ b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/DataBroker.java @@ -33,6 +33,9 @@ public interface DataBroker extends AsyncDataBroker, Data @Override WriteTransaction newWriteOnlyTransaction(); + @Override + ReadWriteTransaction newReadWriteTransaction(); + @Override BindingTransactionChain createTransactionChain(TransactionChainListener listener); } diff --git a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/ReadWriteTransaction.java b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/ReadWriteTransaction.java new file mode 100644 index 0000000000..70299ec8a1 --- /dev/null +++ b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/ReadWriteTransaction.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2017 Brocade Communications Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.binding.api; + +import com.google.common.annotations.Beta; +import org.opendaylight.mdsal.common.api.AsyncReadWriteTransaction; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * A transaction that enables combined read/write capabilities. + * + *

+ * For more information on usage and examples, please see the documentation in {@link AsyncReadWriteTransaction}. + */ +@Beta +public interface ReadWriteTransaction extends ReadTransaction, WriteTransaction, + AsyncReadWriteTransaction, DataObject> { +} diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterBuilder.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterBuilder.java index 94758151e7..bfcdbc8fde 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterBuilder.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterBuilder.java @@ -14,6 +14,7 @@ import org.opendaylight.mdsal.dom.api.DOMService; abstract class BindingDOMAdapterBuilder extends AdapterBuilder { + @FunctionalInterface interface Factory { BindingDOMAdapterBuilder newBuilder(); diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoader.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoader.java index b58e9a246c..ec5bc81e31 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoader.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoader.java @@ -19,14 +19,12 @@ import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMAdapterBuilder.Facto import org.opendaylight.mdsal.dom.api.DOMService; public abstract class BindingDOMAdapterLoader extends AdapterLoader { - - - private static final Map,BindingDOMAdapterBuilder.Factory> FACTORIES = ImmutableMap., - BindingDOMAdapterBuilder.Factory>builder() - .put(NotificationService.class,BindingDOMNotificationServiceAdapter.BUILDER_FACTORY) - .put(NotificationPublishService.class,BindingDOMNotificationPublishServiceAdapter.BUILDER_FACTORY) - .put(DataBroker.class,BindingDOMDataBrokerAdapter.BUILDER_FACTORY) - .put(RpcConsumerRegistry.class,BindingDOMRpcServiceAdapter.BUILDER_FACTORY) + private static final Map,BindingDOMAdapterBuilder.Factory> FACTORIES = + ImmutableMap., BindingDOMAdapterBuilder.Factory>builder() + .put(NotificationService.class, BindingDOMNotificationServiceAdapter.BUILDER_FACTORY) + .put(NotificationPublishService.class, BindingDOMNotificationPublishServiceAdapter.BUILDER_FACTORY) + .put(DataBroker.class, BindingDOMDataBrokerAdapter.BUILDER_FACTORY) + .put(RpcConsumerRegistry.class, BindingDOMRpcServiceAdapter.BUILDER_FACTORY) .build(); private final BindingToNormalizedNodeCodec codec; diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataBrokerAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataBrokerAdapter.java index a40b14ed8c..c636c81e4b 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataBrokerAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataBrokerAdapter.java @@ -16,6 +16,7 @@ import org.opendaylight.mdsal.binding.api.DataTreeChangeListener; import org.opendaylight.mdsal.binding.api.DataTreeChangeService; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.ReadTransaction; +import org.opendaylight.mdsal.binding.api.ReadWriteTransaction; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMAdapterBuilder.Factory; import org.opendaylight.mdsal.common.api.TransactionChainListener; @@ -40,14 +41,7 @@ public class BindingDOMDataBrokerAdapter extends AbstractForwardedDataBroker imp DataBroker, DataTreeChangeService { - static final Factory BUILDER_FACTORY = new BindingDOMAdapterBuilder.Factory() { - - @Override - public BindingDOMAdapterBuilder newBuilder() { - return new Builder(); - } - - }; + static final Factory BUILDER_FACTORY = Builder::new; private final DataTreeChangeService treeChangeService; public BindingDOMDataBrokerAdapter(final DOMDataBroker domDataBroker, final BindingToNormalizedNodeCodec codec) { @@ -63,12 +57,17 @@ public class BindingDOMDataBrokerAdapter extends AbstractForwardedDataBroker imp @Override public ReadTransaction newReadOnlyTransaction() { - return new BindingDOMReadTransactionAdapter(getDelegate().newReadOnlyTransaction(),getCodec()); + return new BindingDOMReadTransactionAdapter(getDelegate().newReadOnlyTransaction(), getCodec()); } @Override public WriteTransaction newWriteOnlyTransaction() { - return new BindingDOMWriteTransactionAdapter<>(getDelegate().newWriteOnlyTransaction(),getCodec()); + return new BindingDOMWriteTransactionAdapter<>(getDelegate().newWriteOnlyTransaction(), getCodec()); + } + + @Override + public ReadWriteTransaction newReadWriteTransaction() { + return new BindingDOMReadWriteTransactionAdapter(getDelegate().newReadWriteTransaction(), getCodec()); } @Override @@ -101,5 +100,4 @@ public class BindingDOMDataBrokerAdapter extends AbstractForwardedDataBroker imp } return treeChangeService.registerDataTreeChangeListener(treeId, listener); } - } diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationPublishServiceAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationPublishServiceAdapter.java index 0f5d2582fb..e60aa9b6ca 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationPublishServiceAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationPublishServiceAdapter.java @@ -21,15 +21,7 @@ import org.opendaylight.yangtools.yang.binding.Notification; public class BindingDOMNotificationPublishServiceAdapter implements NotificationPublishService, AutoCloseable { - static final Factory BUILDER_FACTORY - = new BindingDOMAdapterBuilder.Factory() { - - @Override - public BindingDOMAdapterBuilder newBuilder() { - return new Builder(); - } - - }; + static final Factory BUILDER_FACTORY = Builder::new; private final BindingToNormalizedNodeCodec codecRegistry; private final DOMNotificationPublishService domPublishService; diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationServiceAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationServiceAdapter.java index da5998786e..1fe5980533 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationServiceAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationServiceAdapter.java @@ -21,14 +21,8 @@ import org.opendaylight.yangtools.yang.binding.NotificationListener; public class BindingDOMNotificationServiceAdapter implements NotificationService, AutoCloseable { - public static final Factory BUILDER_FACTORY = new Factory() { + public static final Factory BUILDER_FACTORY = Builder::new; - @Override - public BindingDOMAdapterBuilder newBuilder() { - return new Builder(); - } - - }; private final BindingNormalizedNodeSerializer codec; private final DOMNotificationService domNotifService; 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 new file mode 100644 index 0000000000..b60b56c89e --- /dev/null +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadWriteTransactionAdapter.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017 Brocade Communications Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.binding.dom.adapter; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.CheckedFuture; +import org.opendaylight.mdsal.binding.api.ReadWriteTransaction; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.common.api.ReadFailedException; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +class BindingDOMReadWriteTransactionAdapter extends BindingDOMWriteTransactionAdapter + implements ReadWriteTransaction { + + BindingDOMReadWriteTransactionAdapter(DOMDataTreeReadWriteTransaction delegateTx, + BindingToNormalizedNodeCodec codec) { + super(delegateTx, codec); + } + + @Override + public CheckedFuture, ReadFailedException> read(LogicalDatastoreType store, + InstanceIdentifier path) { + return doRead(getDelegate(),store, path); + } + + @Override + public void close() { + } +} diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapter.java index e80579e9b4..71d9716065 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapter.java @@ -15,6 +15,7 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import org.opendaylight.mdsal.binding.api.BindingTransactionChain; import org.opendaylight.mdsal.binding.api.ReadTransaction; +import org.opendaylight.mdsal.binding.api.ReadWriteTransaction; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.common.api.AsyncTransaction; import org.opendaylight.mdsal.common.api.TransactionChain; @@ -22,6 +23,7 @@ import org.opendaylight.mdsal.common.api.TransactionChainListener; import org.opendaylight.mdsal.common.api.TransactionCommitFailedException; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; import org.opendaylight.yangtools.concepts.Delegator; @@ -70,6 +72,19 @@ final class BindingDOMTransactionChainAdapter implements BindingTransactionChain }; } + @Override + public ReadWriteTransaction newReadWriteTransaction() { + final DOMDataTreeReadWriteTransaction delegateTx = delegate.newReadWriteTransaction(); + return new BindingDOMReadWriteTransactionAdapter(delegateTx, codec) { + + @Override + public CheckedFuture submit() { + return listenForFailure(this,super.submit()); + } + + }; + } + private > F listenForFailure(final WriteTransaction tx, final F future) { Futures.addCallback(future, new FutureCallback() { @Override @@ -127,5 +142,4 @@ final class BindingDOMTransactionChainAdapter implements BindingTransactionChain bindingListener.onTransactionChainSuccessful(BindingDOMTransactionChainAdapter.this); } } - } diff --git a/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/data/BindingDOMDataBrokerAdapter.java b/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/data/BindingDOMDataBrokerAdapter.java index b3006f36bb..b3459d400e 100644 --- a/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/data/BindingDOMDataBrokerAdapter.java +++ b/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/data/BindingDOMDataBrokerAdapter.java @@ -30,6 +30,9 @@ import org.opendaylight.mdsal.binding.javav2.dom.adapter.spi.AbstractForwardedDa import org.opendaylight.mdsal.binding.javav2.dom.adapter.spi.builder.BindingDOMAdapterBuilder; import org.opendaylight.mdsal.binding.javav2.dom.adapter.spi.builder.BindingDOMAdapterBuilder.Factory; import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec; +import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier; +import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode; +import org.opendaylight.mdsal.common.api.AsyncReadWriteTransaction; import org.opendaylight.mdsal.common.api.TransactionChainListener; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeService; @@ -74,6 +77,12 @@ public class BindingDOMDataBrokerAdapter extends AbstractForwardedDataBroker imp return new BindingDOMWriteTransactionAdapter<>(getDelegate().newWriteOnlyTransaction(), getCodec()); } + @Override + public AsyncReadWriteTransaction, TreeNode> newReadWriteTransaction() { + // TODO - placeholder for now + throw new UnsupportedOperationException(); + } + @Override public BindingTransactionChain createTransactionChain(final TransactionChainListener listener) { return new BindingDOMTransactionChainAdapter(getDelegate(), getCodec(), listener); diff --git a/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/transaction/BindingDOMTransactionChainAdapter.java b/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/transaction/BindingDOMTransactionChainAdapter.java index 3de3ddf68d..10de48694b 100644 --- a/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/transaction/BindingDOMTransactionChainAdapter.java +++ b/binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/transaction/BindingDOMTransactionChainAdapter.java @@ -18,6 +18,9 @@ import org.opendaylight.mdsal.binding.javav2.api.BindingTransactionChain; import org.opendaylight.mdsal.binding.javav2.api.ReadTransaction; import org.opendaylight.mdsal.binding.javav2.api.WriteTransaction; import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec; +import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier; +import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode; +import org.opendaylight.mdsal.common.api.AsyncReadWriteTransaction; import org.opendaylight.mdsal.common.api.AsyncTransaction; import org.opendaylight.mdsal.common.api.TransactionChain; import org.opendaylight.mdsal.common.api.TransactionChainListener; @@ -75,6 +78,12 @@ public final class BindingDOMTransactionChainAdapter }; } + @Override + public AsyncReadWriteTransaction, TreeNode> newReadWriteTransaction() { + // TODO - placeholder for now + throw new UnsupportedOperationException(); + } + private > F listenForFailure(final WriteTransaction tx, final F future) { Futures.addCallback(future, new FutureCallback() { @Override diff --git a/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncDataBroker.java b/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncDataBroker.java index a441f52881..86f201008a 100644 --- a/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncDataBroker.java +++ b/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncDataBroker.java @@ -55,4 +55,7 @@ public interface AsyncDataBroker

, D> extends @Override AsyncWriteTransaction newWriteOnlyTransaction(); + + @Override + AsyncReadWriteTransaction newReadWriteTransaction(); } diff --git a/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncDataTransactionFactory.java b/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncDataTransactionFactory.java index 8d629b77f4..be0df369fd 100644 --- a/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncDataTransactionFactory.java +++ b/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncDataTransactionFactory.java @@ -90,4 +90,16 @@ public interface AsyncDataTransactionFactory

, D> { */ AsyncWriteTransaction newWriteOnlyTransaction(); + /** + * Allocates new read-write transaction which provides a mutable view of the data tree. + * + *

+ * Preconditions for mutation of data tree are captured from the snapshot of data tree state, when the transaction + * is allocated. If data was changed during transaction in an incompatible way then the commit of this transaction + * will fail. See {@link AsyncWriteTransaction#submit()} for more details about conflicting and not-conflicting + * changes and failure scenarios. + * + * @return new read-write transaction + */ + AsyncReadWriteTransaction newReadWriteTransaction(); } diff --git a/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncReadWriteTransaction.java b/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncReadWriteTransaction.java new file mode 100644 index 0000000000..068b570636 --- /dev/null +++ b/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/AsyncReadWriteTransaction.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2017 Brocade Communications Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.common.api; + +import org.opendaylight.yangtools.concepts.Path; + +/** + * Transaction enabling a client to have combined read/write capabilities. + * + *

+ * The initial state of the write transaction is stable snapshot of current data tree + * state captured when transaction was created and it's state and underlying + * data tree are not affected by other concurrently running transactions. + * + *

+ * Write transactions are isolated from other concurrent write transactions. All + * writes are local to the transaction and represents only a proposal of state + * change for data tree and it is not visible to any other concurrently running + * transactions. + * + *

+ * Applications publish the changes proposed in the transaction by calling {@link #submit} + * on the transaction. This seals the transaction + * (preventing any further writes using this transaction) and submits it to be + * processed and applied to global conceptual data tree. + * + *

+ * The transaction commit may fail due to a concurrent transaction modifying and committing data in + * an incompatible way. See {@link #submit()} for more concrete commit failure examples. + * + * Implementation Note: This interface is not intended to be implemented + * by users of MD-SAL, but only to be consumed by them. + * + *

Examples

+ * + *

Transaction local state

+ * + *

+ * Let's assume initial state of data tree for PATH is A + * . + *

+ * txWrite = broker.newReadWriteTransaction(); // concurrent write transaction
+ *
+ * txWrite.read(OPERATIONAL,PATH).get()        // will return Optional containing A
+ * txWrite.put(OPERATIONAL,PATH,B);            // writes B to PATH
+ * txWrite.read(OPERATIONAL,PATH).get()        // will return Optional Containing B
+ *
+ * txWrite.commit().get();                     // data tree is updated, PATH contains B
+ *
+ * tx1afterCommit = broker.newReadOnlyTransaction(); // read Transaction is snapshot of new state
+ * tx1afterCommit.read(OPERATIONAL,PATH).get(); // returns Optional containing B
+ * 
+ * + *

+ * As you could see read-write transaction provides capabilities as + * {@link AsyncWriteTransaction} but also allows for reading proposed changes as + * if they already happened. + * + *

Transaction isolation (read transaction, read-write transaction)

Let + * assume initial state of data tree for PATH is A. + * + *
+ * txRead = broker.newReadOnlyTransaction();   // read Transaction is snapshot of data
+ * txWrite = broker.newReadWriteTransaction(); // concurrent write transaction
+ *
+ * txRead.read(OPERATIONAL,PATH).get();        // will return Optional containing A
+ * txWrite.read(OPERATIONAL,PATH).get()        // will return Optional containing A
+ *
+ * txWrite.put(OPERATIONAL,PATH,B);            // writes B to PATH
+ * txWrite.read(OPERATIONAL,PATH).get()        // will return Optional Containing B
+ *
+ * txRead.read(OPERATIONAL,PATH).get();        // concurrent read transaction still returns
+ *                                             // Optional containing A
+ *
+ * txWrite.commit().get();                     // data tree is updated, PATH contains B
+ * txRead.read(OPERATIONAL,PATH).get();        // still returns Optional containing A
+ *
+ * tx1afterCommit = broker.newReadOnlyTransaction(); // read Transaction is snapshot of new state
+ * tx1afterCommit.read(OPERATIONAL,PATH).get(); // returns Optional containing B
+ * 
+ * + *

Transaction isolation (2 concurrent read-write transactions)

Let + * assume initial state of data tree for PATH is A. + * + *
+ * tx1 = broker.newReadWriteTransaction(); // read Transaction is snapshot of data
+ * tx2 = broker.newReadWriteTransaction(); // concurrent write transaction
+ *
+ * tx1.read(OPERATIONAL,PATH).get();       // will return Optional containing A
+ * tx2.read(OPERATIONAL,PATH).get()        // will return Optional containing A
+ *
+ * tx2.put(OPERATIONAL,PATH,B);            // writes B to PATH
+ * tx2.read(OPERATIONAL,PATH).get()        // will return Optional Containing B
+ *
+ * tx1.read(OPERATIONAL,PATH).get();       // tx1 read-write transaction still sees Optional
+ *                                         // containing A since is isolated from tx2
+ * tx1.put(OPERATIONAL,PATH,C);            // writes C to PATH
+ * tx1.read(OPERATIONAL,PATH).get()        // will return Optional Containing C
+ *
+ * tx2.read(OPERATIONAL,PATH).get()        // tx2 read-write transaction still sees Optional
+ *                                         // containing B since is isolated from tx1
+ *
+ * tx2.commit().get();                     // data tree is updated, PATH contains B
+ * tx1.read(OPERATIONAL,PATH).get();       // still returns Optional containing C since is isolated from tx2
+ *
+ * tx1afterCommit = broker.newReadOnlyTransaction(); // read Transaction is snapshot of new state
+ * tx1afterCommit.read(OPERATIONAL,PATH).get(); // returns Optional containing B
+ *
+ * tx1.commit()                            // Will fail with OptimisticLockFailedException
+ *                                         // which means concurrent transaction changed the same PATH
+ *
+ * 
+ * + *

+ * Note: examples contains blocking calls on future only to illustrate + * that action happened after other asynchronous action. Use of blocking call + * {@link com.google.common.util.concurrent.ListenableFuture#get()} is discouraged for most uses and you should + * use + * {@link com.google.common.util.concurrent.Futures#addCallback(com.google.common.util.concurrent.ListenableFuture, + * com.google.common.util.concurrent.FutureCallback)} + * or other functions from {@link com.google.common.util.concurrent.Futures} to + * register more specific listeners. + * + * @see AsyncReadTransaction + * @see AsyncWriteTransaction + * + * @param

+ * Type of path (subtree identifier), which represents location in + * tree + * @param + * Type of data (payload), which represents data payload + */ +public interface AsyncReadWriteTransaction

, D> extends AsyncReadTransaction, + AsyncWriteTransaction { + +} diff --git a/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/TransactionChain.java b/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/TransactionChain.java index d6ef81c7a7..addddca11f 100644 --- a/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/TransactionChain.java +++ b/common/mdsal-common-api/src/main/java/org/opendaylight/mdsal/common/api/TransactionChain.java @@ -93,6 +93,35 @@ public interface TransactionChain

, D> extends AutoCloseable, @Override AsyncWriteTransaction newWriteOnlyTransaction(); + /** + * Create a new read-write transaction which will continue the chain. + * + *

+ * The previous write transaction has to be either SUBMITTED + * ({@link AsyncWriteTransaction#submit submit} was invoked) or CANCELLED + * ({@link #close close} was invoked). + * + *

+ * The returned read-write transaction presents an isolated view of the data if the previous + * write transaction was successful - in other words, this read-write transaction will see the + * state changes made by the previous write transaction in the chain. However, state which + * was introduced by other transactions outside this transaction chain after creation of + * the previous transaction is not visible. + * + *

+ * Committing this read-write transaction using {@link AsyncWriteTransaction#submit submit} + * will submit the state changes in this transaction to be visible to any subsequent + * transaction in this chain and also to any transaction outside this chain. + * + * @return New transaction in the chain. + * @throws IllegalStateException + * if the previous transaction was not SUBMITTED or CANCELLED. + * @throws TransactionChainClosedException + * if the chain has been closed. + */ + @Override + AsyncReadWriteTransaction newReadWriteTransaction(); + @Override void close(); } diff --git a/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataBroker.java b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataBroker.java index 23c6efcf8c..1519b95847 100644 --- a/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataBroker.java +++ b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataBroker.java @@ -29,6 +29,9 @@ public interface DOMDataBroker extends @Override DOMDataTreeWriteTransaction newWriteOnlyTransaction(); + @Override + DOMDataTreeReadWriteTransaction newReadWriteTransaction(); + @Override DOMTransactionChain createTransactionChain(TransactionChainListener listener); } diff --git a/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataTreeReadWriteTransaction.java b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataTreeReadWriteTransaction.java new file mode 100644 index 0000000000..7b481c794e --- /dev/null +++ b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMDataTreeReadWriteTransaction.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2017 Brocade Communications Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.dom.api; + +import org.opendaylight.mdsal.common.api.AsyncReadWriteTransaction; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +/** + * A transaction that provides read/write access to a logical data store. + * + *

+ * For more information on usage and examples, please see the documentation in {@link AsyncReadWriteTransaction}. + */ +public interface DOMDataTreeReadWriteTransaction extends DOMDataTreeReadTransaction, DOMDataTreeWriteTransaction, + AsyncReadWriteTransaction> { +} diff --git a/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMTransactionChain.java b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMTransactionChain.java index 14d7929b95..c8d2264755 100644 --- a/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMTransactionChain.java +++ b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMTransactionChain.java @@ -28,4 +28,6 @@ public interface DOMTransactionChain extends TransactionChain(newTransactionIdentifier(), txns, this); } + /** + * Creates a new composite read-write transaction. + * + * @return New composite read-write transaction associated with this factory. + */ + public final DOMDataTreeReadWriteTransaction newReadWriteTransaction() { + checkNotClosed(); + + final Map txns = new EnumMap<>(LogicalDatastoreType.class); + for (Entry store : storeTxFactories.entrySet()) { + txns.put(store.getKey(), store.getValue().newReadWriteTransaction()); + } + return new DOMForwardedReadWriteTransaction(newTransactionIdentifier(), txns, this); + } + /** * Convenience accessor of backing factories intended to be used only by * finalization of this class. diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMForwardedReadWriteTransaction.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMForwardedReadWriteTransaction.java new file mode 100644 index 0000000000..efeab63ea2 --- /dev/null +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMForwardedReadWriteTransaction.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2017 Brocade Communications Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.dom.broker; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.CheckedFuture; +import java.util.Map; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.common.api.ReadFailedException; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; +import org.opendaylight.mdsal.dom.spi.store.DOMStoreReadWriteTransaction; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +/** + * Read-Write Transaction, which is composed of several + * {@link DOMStoreReadWriteTransaction} transactions. Subtransaction is selected by + * {@link LogicalDatastoreType} type parameter in: + * + *

    + *
  • {@link #read(LogicalDatastoreType, YangInstanceIdentifier)} + *
  • {@link #put(LogicalDatastoreType, YangInstanceIdentifier, NormalizedNode)} + *
  • {@link #delete(LogicalDatastoreType, YangInstanceIdentifier)} + *
  • {@link #merge(LogicalDatastoreType, YangInstanceIdentifier, NormalizedNode)} + *
+ * + *

+ * {@link #submit()} will result in invocation of + * {@link DOMDataCommitImplementation#submit(org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction, Iterable)} + * invocation with all + * {@link org.opendaylight.mdsal.dom.spi.store.DOMStoreThreePhaseCommitCohort} for + * underlying transactions. + */ +final class DOMForwardedReadWriteTransaction extends DOMForwardedWriteTransaction + implements DOMDataTreeReadWriteTransaction { + + protected DOMForwardedReadWriteTransaction(final Object identifier, + final Map backingTxs, + final AbstractDOMForwardedTransactionFactory commitImpl) { + super(identifier, backingTxs, commitImpl); + } + + @Override + public CheckedFuture>, ReadFailedException> read(final LogicalDatastoreType store, + final YangInstanceIdentifier path) { + return getSubtransaction(store).read(path); + } + + @Override + public CheckedFuture exists(final LogicalDatastoreType store, + final YangInstanceIdentifier path) { + return getSubtransaction(store).exists(path); + } + + @Override + public void close() { + closeSubtransactions(); + } +} diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataBrokerAdapter.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataBrokerAdapter.java index 7faad87787..826bb0d4b9 100644 --- a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataBrokerAdapter.java +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataBrokerAdapter.java @@ -15,6 +15,7 @@ import org.opendaylight.mdsal.common.api.TransactionChainListener; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeService; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; @@ -44,6 +45,11 @@ public class ShardedDOMDataBrokerAdapter implements DOMDataBroker { return new ShardedDOMWriteTransactionAdapter(newTransactionIdentifier(), service); } + @Override + public DOMDataTreeReadWriteTransaction newReadWriteTransaction() { + return new ShardedDOMReadWriteTransactionAdapter(newTransactionIdentifier(), service); + } + @Override public DOMTransactionChain createTransactionChain(final TransactionChainListener listener) { return new ShardedDOMTransactionChainAdapter(newChainIdentifier(), service, listener); @@ -56,5 +62,4 @@ public class ShardedDOMDataBrokerAdapter implements DOMDataBroker { private Object newChainIdentifier() { return "DOM-CHAIN-" + chainNum; } - } diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMReadWriteTransactionAdapter.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMReadWriteTransactionAdapter.java new file mode 100644 index 0000000000..0c9581406c --- /dev/null +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMReadWriteTransactionAdapter.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017 Brocade Communications Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.dom.broker; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.CheckedFuture; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.common.api.ReadFailedException; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; +import org.opendaylight.mdsal.dom.api.DOMDataTreeService; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +public class ShardedDOMReadWriteTransactionAdapter extends ShardedDOMWriteTransactionAdapter + implements DOMDataTreeReadWriteTransaction { + + private final ShardedDOMReadTransactionAdapter readAdapter; + + ShardedDOMReadWriteTransactionAdapter(Object identifier, DOMDataTreeService transactionDelegator) { + super(identifier, transactionDelegator); + readAdapter = new ShardedDOMReadTransactionAdapter(identifier, transactionDelegator); + } + + @Override + public CheckedFuture>, ReadFailedException> read(LogicalDatastoreType store, + YangInstanceIdentifier path) { + return readAdapter.read(store, path); + } + + @Override + public CheckedFuture exists(LogicalDatastoreType store, YangInstanceIdentifier path) { + return readAdapter.exists(store, path); + } + + @Override + public void close() { + readAdapter.close(); + } + + ShardedDOMReadTransactionAdapter getReadAdapter() { + return readAdapter; + } +} diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMTransactionChainAdapter.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMTransactionChainAdapter.java index 8d38f863c2..f08aa2a78b 100644 --- a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMTransactionChainAdapter.java +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMTransactionChainAdapter.java @@ -30,6 +30,7 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeLoopException; import org.opendaylight.mdsal.dom.api.DOMDataTreeProducer; import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerException; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeService; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; @@ -82,6 +83,20 @@ public class ShardedDOMTransactionChainAdapter implements DOMTransactionChain { return writeTx; } + @Override + public DOMDataTreeReadWriteTransaction newReadWriteTransaction() { + checkRunning(); + checkWriteTxClosed(); + checkReadTxClosed(); + ShardedDOMReadWriteTransactionAdapter adapter = new ShardedDOMReadWriteTransactionAdapter( + newTransactionIdentifier(), cachedDataTreeService); + TransactionChainReadWriteTransaction readWriteTx = new TransactionChainReadWriteTransaction( + newTransactionIdentifier(), adapter, adapter.getReadAdapter(), writeTxSubmitFuture, this); + + writeTx = readWriteTx; + return readWriteTx; + } + @Override public void close() { if (finished) { diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/TransactionChainReadWriteTransaction.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/TransactionChainReadWriteTransaction.java new file mode 100644 index 0000000000..430b5dd425 --- /dev/null +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/TransactionChainReadWriteTransaction.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017 Brocade Communications Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.dom.broker; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.ListenableFuture; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.common.api.ReadFailedException; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +class TransactionChainReadWriteTransaction extends TransactionChainWriteTransaction + implements DOMDataTreeReadWriteTransaction { + + private final TransactionChainReadTransaction readTx; + + TransactionChainReadWriteTransaction(final Object identifier, + final DOMDataTreeReadWriteTransaction delegateWriteTx, final DOMDataTreeReadTransaction delegateReadTx, + final ListenableFuture previousWriteTxFuture, final ShardedDOMTransactionChainAdapter txChain) { + super(identifier, delegateWriteTx, txChain); + readTx = new TransactionChainReadTransaction(identifier, delegateReadTx, previousWriteTxFuture, txChain); + } + + @Override + public CheckedFuture>, ReadFailedException> read(LogicalDatastoreType store, + YangInstanceIdentifier path) { + return readTx.read(store, path); + } + + @Override + public CheckedFuture exists(LogicalDatastoreType store, YangInstanceIdentifier path) { + return readTx.exists(store, path); + } + + @Override + public void close() { + } +} diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMDataBroker.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMDataBroker.java index 5048f98901..915f4547bd 100644 --- a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMDataBroker.java +++ b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMDataBroker.java @@ -14,6 +14,7 @@ import org.opendaylight.mdsal.common.api.TransactionChainListener; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; @@ -37,6 +38,11 @@ public abstract class ForwardingDOMDataBroker extends ForwardingObject implement return delegate().newWriteOnlyTransaction(); } + @Override + public DOMDataTreeReadWriteTransaction newReadWriteTransaction() { + return delegate().newReadWriteTransaction(); + } + @Override public DOMTransactionChain createTransactionChain(final TransactionChainListener listener) { return delegate().createTransactionChain(listener); diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMTransactionChain.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMTransactionChain.java index a66bc0a83e..8e1d9b8e57 100644 --- a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMTransactionChain.java +++ b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMTransactionChain.java @@ -10,6 +10,7 @@ package org.opendaylight.mdsal.dom.spi; import com.google.common.collect.ForwardingObject; import javax.annotation.Nonnull; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; @@ -36,4 +37,9 @@ public abstract class ForwardingDOMTransactionChain extends ForwardingObject imp public DOMDataTreeWriteTransaction newWriteOnlyTransaction() { return delegate().newWriteOnlyTransaction(); } + + @Override + public DOMDataTreeReadWriteTransaction newReadWriteTransaction() { + return delegate().newReadWriteTransaction(); + } } diff --git a/dom/mdsal-dom-spi/src/test/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMTransactionChainTest.java b/dom/mdsal-dom-spi/src/test/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMTransactionChainTest.java index 82ab02ee22..14d7c7a96c 100644 --- a/dom/mdsal-dom-spi/src/test/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMTransactionChainTest.java +++ b/dom/mdsal-dom-spi/src/test/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMTransactionChainTest.java @@ -44,4 +44,4 @@ public class ForwardingDOMTransactionChainTest extends ForwardingDOMTransactionC protected DOMTransactionChain delegate() { return domTransactionChain; } -} \ No newline at end of file +} -- 2.36.6