X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-adapter%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fadapter%2FBindingDOMTransactionChainAdapter.java;h=dad9227be2e710549a0ff7d3eca797d2e1af1189;hb=11408d627adca7eb71ac956c3ad01f75b6b91596;hp=a2226dfcf9af9604232c539ba745071eec2c73ac;hpb=c6680361d2856cf956e26c8b0a46ae54492eea3c;p=mdsal.git 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 a2226dfcf9..dad9227be2 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 @@ -7,41 +7,49 @@ */ package org.opendaylight.mdsal.binding.dom.adapter; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.CheckedFuture; +import static com.google.common.base.Preconditions.checkState; +import static java.util.Objects.requireNonNull; + +import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; -import org.opendaylight.mdsal.binding.api.BindingTransactionChain; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; +import java.util.function.Function; +import java.util.function.Supplier; import org.opendaylight.mdsal.binding.api.ReadTransaction; +import org.opendaylight.mdsal.binding.api.ReadWriteTransaction; +import org.opendaylight.mdsal.binding.api.TransactionChain; +import org.opendaylight.mdsal.binding.api.TransactionChainClosedException; +import org.opendaylight.mdsal.binding.api.TransactionChainListener; import org.opendaylight.mdsal.binding.api.WriteTransaction; -import org.opendaylight.mdsal.common.api.AsyncTransaction; -import org.opendaylight.mdsal.common.api.TransactionChain; -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.common.api.CommitInfo; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; +import org.opendaylight.mdsal.dom.api.DOMDataTreeTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; +import org.opendaylight.mdsal.dom.api.DOMTransactionChainClosedException; +import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.yangtools.concepts.Delegator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class BindingDOMTransactionChainAdapter implements BindingTransactionChain, Delegator { +final class BindingDOMTransactionChainAdapter implements TransactionChain, Delegator { private static final Logger LOG = LoggerFactory.getLogger(BindingDOMTransactionChainAdapter.class); private final DOMTransactionChain delegate; - private final BindingToNormalizedNodeCodec codec; + private final AdapterContext adapterContext; private final DelegateChainListener domListener; private final TransactionChainListener bindingListener; - BindingDOMTransactionChainAdapter(final DOMDataBroker chainFactory, - final BindingToNormalizedNodeCodec codec, final TransactionChainListener listener) { - Preconditions.checkNotNull(chainFactory, "DOM Transaction chain factory must not be null"); + BindingDOMTransactionChainAdapter(final Function chainFactory, + final AdapterContext codec, final TransactionChainListener listener) { + requireNonNull(chainFactory, "DOM Transaction chain factory must not be null"); this.domListener = new DelegateChainListener(); this.bindingListener = listener; - this.delegate = chainFactory.createTransactionChain(domListener); - this.codec = codec; + this.delegate = chainFactory.apply(domListener); + this.adapterContext = requireNonNull(codec); } @Override @@ -51,36 +59,44 @@ final class BindingDOMTransactionChainAdapter implements BindingTransactionChain @Override public ReadTransaction newReadOnlyTransaction() { - final DOMDataTreeReadTransaction delegateTx = delegate.newReadOnlyTransaction(); - return new BindingDOMReadTransactionAdapter(delegateTx, codec); + return new BindingDOMReadTransactionAdapter(adapterContext, + createTransaction(delegate::newReadOnlyTransaction)); } @Override public WriteTransaction newWriteOnlyTransaction() { - final DOMDataTreeWriteTransaction delegateTx = delegate.newWriteOnlyTransaction(); - return new BindingDOMWriteTransactionAdapter(delegateTx, codec) { - + final DOMDataTreeWriteTransaction delegateTx = createTransaction(delegate::newWriteOnlyTransaction); + return new BindingDOMWriteTransactionAdapter<>(adapterContext, delegateTx) { @Override - public CheckedFuture submit() { - return listenForFailure(this,super.submit()); + public FluentFuture commit() { + return listenForFailure(this, super.commit()); } + }; + } + @Override + public ReadWriteTransaction newReadWriteTransaction() { + final DOMDataTreeReadWriteTransaction delegateTx = createTransaction(delegate::newReadWriteTransaction); + return new BindingDOMReadWriteTransactionAdapter(adapterContext, delegateTx) { + @Override + public FluentFuture commit() { + return listenForFailure(this, super.commit()); + } }; } - private CheckedFuture listenForFailure( - final WriteTransaction tx, final CheckedFuture future) { - Futures.addCallback(future, new FutureCallback() { + private > F listenForFailure(final WriteTransaction tx, final F future) { + Futures.addCallback(future, new FutureCallback() { @Override public void onFailure(final Throwable throwable) { failTransactionChain(tx, throwable); } @Override - public void onSuccess(final Void result) { + public void onSuccess(final T result) { // Intentionally NOOP } - }); + }, MoreExecutors.directExecutor()); return future; } @@ -100,13 +116,19 @@ final class BindingDOMTransactionChainAdapter implements BindingTransactionChain delegate.close(); } - private final class DelegateChainListener implements TransactionChainListener { + private static T createTransaction(final Supplier supplier) { + try { + return supplier.get(); + } catch (DOMTransactionChainClosedException e) { + throw new TransactionChainClosedException("Transaction chain already closed", e); + } + } + private final class DelegateChainListener implements DOMTransactionChainListener { @Override - public void onTransactionChainFailed(final TransactionChain chain, - final AsyncTransaction transaction, final Throwable cause) { - Preconditions.checkState(delegate.equals(chain), - "Illegal state - listener for %s was invoked for incorrect chain %s.", delegate, chain); + public void onTransactionChainFailed(final DOMTransactionChain chain, final DOMDataTreeTransaction transaction, + final Throwable cause) { + checkState(delegate.equals(chain), "Listener for %s was invoked for incorrect chain %s.", delegate, chain); /* * Intentionally NOOP, callback for failure, since we * are also listening on each transaction future for failure, @@ -114,17 +136,14 @@ final class BindingDOMTransactionChainAdapter implements BindingTransactionChain * of this transaction chain), instead of DOM transaction * which is known only to this chain, binding transaction implementation * and underlying transaction chain. - * */ LOG.debug("Transaction chain {} failed. Failed DOM Transaction {}",this,transaction,cause); } @Override - public void onTransactionChainSuccessful(final TransactionChain chain) { - Preconditions.checkState(delegate.equals(chain), - "Illegal state - listener for %s was invoked for incorrect chain %s.", delegate, chain); + public void onTransactionChainSuccessful(final DOMTransactionChain chain) { + checkState(delegate.equals(chain), "Listener for %s was invoked for incorrect chain %s.", delegate, chain); bindingListener.onTransactionChainSuccessful(BindingDOMTransactionChainAdapter.this); } } - }