From 0b283e62a5872be1960635d5d6c4d301b1f87df2 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 22 Mar 2019 19:33:21 +0100 Subject: [PATCH] Bump mdsal to 4.0.0 This bumps mdsal to 4.0.0, adjusting for changes it brings, notably: - FluentFuture removed from DOM RPC invocation services - ping-pong functionality directly part of DOMDataBroker API and not via a dedicated DOMDataBroker instance - DataContainer.getImplementedInterface() renamed to implementedInterface() - DOMBrokerReadWriteTransaction.close() method being removed - BindingCodecTreeNode being refactored Change-Id: I5af13aa82036373826291a54661f7fd20ff387c3 Signed-off-by: Robert Varga --- benchmark/api/pom.xml | 2 +- benchmark/dsbenchmark/pom.xml | 2 +- .../dsbenchmark/DsbenchmarkProvider.java | 31 +- .../dsbenchmark/txchain/TxchainBaDelete.java | 2 +- .../dsbenchmark/txchain/TxchainBaWrite.java | 2 +- .../OSGI-INF/blueprint/dsbenchmark.xml | 8 +- benchmark/ntfbenchmark/pom.xml | 2 +- benchmark/rpcbenchmark/pom.xml | 2 +- features/benchmark/odl-benchmark-api/pom.xml | 2 +- .../mdsal/odl-clustering-test-app/pom.xml | 2 +- .../mdsal/odl-controller-mdsal-common/pom.xml | 2 +- .../odl-controller-model-topology/pom.xml | 2 +- features/mdsal/odl-mdsal-broker-local/pom.xml | 2 +- .../mdsal/odl-mdsal-model-inventory/pom.xml | 2 +- .../mdsal/odl-message-bus-collector/pom.xml | 2 +- features/mdsal/odl-toaster/pom.xml | 2 +- karaf/pom.xml | 2 +- opendaylight/blueprint/pom.xml | 2 +- opendaylight/config/pom.xml | 2 +- opendaylight/md-sal/parent/pom.xml | 2 +- .../binding/compat/NotificationInvoker.java | 2 +- .../impl/BindingToNormalizedNodeCodec.java | 4 +- .../impl/LazyDataObjectModification.java | 29 +- .../impl/LazyDataTreeModification.java | 6 +- .../impl/LazySerializedDOMNotification.java | 2 +- .../binding/impl/ContextExtractorTest.java | 3 +- .../md-sal/sal-binding-dom-it/pom.xml | 2 +- .../cluster/databroker/AbstractDOMBroker.java | 6 +- .../DOMBrokerReadWriteTransaction.java | 6 - .../cluster/sharding/ShardProxyProducer.java | 5 + .../md/sal/dom/broker/impl/DOMRpcRouter.java | 6 +- .../AbstractLegacyDOMDataBrokerAdapter.java | 375 ++++++++++++++++++ .../sal/core/compat/DOMDataBrokerAdapter.java | 3 +- ...OMDataTreeReadWriteTransactionAdapter.java | 5 - .../sal/core/compat/DOMRpcServiceAdapter.java | 4 +- .../compat/DOMTransactionChainAdapter.java | 6 - .../compat/LegacyDOMActionServiceAdapter.java | 6 +- .../compat/LegacyDOMDataBrokerAdapter.java | 352 +--------------- .../LegacyDOMRpcResultFutureAdapter.java | 6 +- .../compat/LegacyDOMRpcServiceAdapter.java | 4 +- .../LegacyPingPongDOMDataBrokerAdapter.java | 26 ++ .../remote/rpc/RemoteRpcImplementation.java | 10 +- .../rpc/RemoteRpcImplementationTest.java | 18 +- opendaylight/model/model-inventory/pom.xml | 2 +- opendaylight/model/model-topology/pom.xml | 2 +- 45 files changed, 506 insertions(+), 459 deletions(-) create mode 100644 opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/AbstractLegacyDOMDataBrokerAdapter.java create mode 100644 opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyPingPongDOMDataBrokerAdapter.java diff --git a/benchmark/api/pom.xml b/benchmark/api/pom.xml index 929eebc638..6784395c0c 100644 --- a/benchmark/api/pom.xml +++ b/benchmark/api/pom.xml @@ -10,7 +10,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.opendaylight.mdsal binding-parent - 3.0.6 + 4.0.0 diff --git a/benchmark/dsbenchmark/pom.xml b/benchmark/dsbenchmark/pom.xml index c8e5ce6136..949fe5d9a3 100644 --- a/benchmark/dsbenchmark/pom.xml +++ b/benchmark/dsbenchmark/pom.xml @@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.opendaylight.mdsal binding-parent - 3.0.6 + 4.0.0 diff --git a/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/DsbenchmarkProvider.java b/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/DsbenchmarkProvider.java index 0cf0195ca4..c5232a2b79 100644 --- a/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/DsbenchmarkProvider.java +++ b/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/DsbenchmarkProvider.java @@ -59,23 +59,18 @@ public class DsbenchmarkProvider implements DsbenchmarkService, AutoCloseable { private final AtomicReference execStatus = new AtomicReference<>(ExecStatus.Idle); private final DsbenchmarkListenerProvider listenerProvider = new DsbenchmarkListenerProvider(); private final DOMDataBroker domDataBroker; // Async DOM Broker for use with all DOM operations - private final DataBroker txChainDataBroker; // Async Binding-Aware Broker for use in tx chains; initialized to - // ping-pong broker in default config (see default-config.xml and - // dsbenchmark-impl.yang) - private final DataBroker simpleTxDataBroker; // "Legacy" OSGI Data Broker for use in simple transactions + private final DataBroker dataBroker; // Async Binding-Aware Broker for use in tx chains private long testsCompleted = 0; - public DsbenchmarkProvider(final DOMDataBroker domDataBroker, final DataBroker txChainDataBroker, - final DataBroker simpleTxDataBroker) { + public DsbenchmarkProvider(final DOMDataBroker domDataBroker, final DataBroker dataBroker) { this.domDataBroker = domDataBroker; - this.txChainDataBroker = txChainDataBroker; - this.simpleTxDataBroker = simpleTxDataBroker; + this.dataBroker = dataBroker; } @SuppressWarnings("checkstyle:illegalCatch") public void init() { - listenerProvider.setDataBroker(simpleTxDataBroker); + listenerProvider.setDataBroker(dataBroker); try { // We want to set the initial operation status so users can detect we are ready to start test. @@ -173,7 +168,7 @@ public class DsbenchmarkProvider implements DsbenchmarkService, AutoCloseable { .setTestsCompleted(tstCompl) .build(); - WriteTransaction tx = simpleTxDataBroker.newWriteOnlyTransaction(); + WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); tx.put(LogicalDatastoreType.OPERATIONAL, TEST_STATUS_IID, status); try { @@ -190,7 +185,7 @@ public class DsbenchmarkProvider implements DsbenchmarkService, AutoCloseable { .setOuterList(Collections.emptyList()) .build(); - WriteTransaction tx = simpleTxDataBroker.newWriteOnlyTransaction(); + WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); tx.put(LogicalDatastoreType.CONFIGURATION, TEST_EXEC_IID, data); try { tx.commit().get(); @@ -200,7 +195,7 @@ public class DsbenchmarkProvider implements DsbenchmarkService, AutoCloseable { throw new IllegalStateException(e); } - tx = simpleTxDataBroker.newWriteOnlyTransaction(); + tx = dataBroker.newWriteOnlyTransaction(); tx.put(LogicalDatastoreType.OPERATIONAL, TEST_EXEC_IID, data); try { tx.commit().get(); @@ -228,13 +223,13 @@ public class DsbenchmarkProvider implements DsbenchmarkService, AutoCloseable { if (txType == StartTestInput.TransactionType.SIMPLETX) { if (dataFormat == StartTestInput.DataFormat.BINDINGAWARE) { if (StartTestInput.Operation.DELETE == oper) { - retVal = new SimpletxBaDelete(this.simpleTxDataBroker, outerListElem, + retVal = new SimpletxBaDelete(this.dataBroker, outerListElem, innerListElem,writesPerTx, dataStore); } else if (StartTestInput.Operation.READ == oper) { - retVal = new SimpletxBaRead(this.simpleTxDataBroker, outerListElem, + retVal = new SimpletxBaRead(this.dataBroker, outerListElem, innerListElem, writesPerTx, dataStore); } else { - retVal = new SimpletxBaWrite(this.simpleTxDataBroker, oper, outerListElem, + retVal = new SimpletxBaWrite(this.dataBroker, oper, outerListElem, innerListElem, writesPerTx, dataStore); } } else { @@ -252,13 +247,13 @@ public class DsbenchmarkProvider implements DsbenchmarkService, AutoCloseable { } else { if (dataFormat == StartTestInput.DataFormat.BINDINGAWARE) { if (StartTestInput.Operation.DELETE == oper) { - retVal = new TxchainBaDelete(this.txChainDataBroker, outerListElem, + retVal = new TxchainBaDelete(this.dataBroker, outerListElem, innerListElem, writesPerTx, dataStore); } else if (StartTestInput.Operation.READ == oper) { - retVal = new TxchainBaRead(this.txChainDataBroker,outerListElem, + retVal = new TxchainBaRead(this.dataBroker, outerListElem, innerListElem,writesPerTx, dataStore); } else { - retVal = new TxchainBaWrite(this.txChainDataBroker, oper, outerListElem, + retVal = new TxchainBaWrite(this.dataBroker, oper, outerListElem, innerListElem, writesPerTx, dataStore); } } else { diff --git a/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/txchain/TxchainBaDelete.java b/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/txchain/TxchainBaDelete.java index 14561a58d4..75fb892418 100644 --- a/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/txchain/TxchainBaDelete.java +++ b/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/txchain/TxchainBaDelete.java @@ -53,7 +53,7 @@ public class TxchainBaDelete extends DatastoreAbstractWriter implements Transact @Override public void executeList() { final LogicalDatastoreType dsType = getDataStoreType(); - final TransactionChain chain = bindingDataBroker.createTransactionChain(this); + final TransactionChain chain = bindingDataBroker.createMergingTransactionChain(this); WriteTransaction tx = chain.newWriteOnlyTransaction(); int txSubmitted = 0; diff --git a/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/txchain/TxchainBaWrite.java b/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/txchain/TxchainBaWrite.java index e10f947a05..b0ee4b4d22 100644 --- a/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/txchain/TxchainBaWrite.java +++ b/benchmark/dsbenchmark/src/main/java/org/opendaylight/dsbenchmark/txchain/TxchainBaWrite.java @@ -48,7 +48,7 @@ public class TxchainBaWrite extends DatastoreAbstractWriter implements Transacti @Override public void executeList() { - final TransactionChain chain = bindingDataBroker.createTransactionChain(this); + final TransactionChain chain = bindingDataBroker.createMergingTransactionChain(this); final LogicalDatastoreType dsType = getDataStoreType(); WriteTransaction tx = chain.newWriteOnlyTransaction(); diff --git a/benchmark/dsbenchmark/src/main/resources/OSGI-INF/blueprint/dsbenchmark.xml b/benchmark/dsbenchmark/src/main/resources/OSGI-INF/blueprint/dsbenchmark.xml index 7829d2a002..5b47231ae1 100644 --- a/benchmark/dsbenchmark/src/main/resources/OSGI-INF/blueprint/dsbenchmark.xml +++ b/benchmark/dsbenchmark/src/main/resources/OSGI-INF/blueprint/dsbenchmark.xml @@ -10,15 +10,13 @@ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0" odl:use-default-for-reference-types="true"> - - - + + - - + diff --git a/benchmark/ntfbenchmark/pom.xml b/benchmark/ntfbenchmark/pom.xml index 683dd2e58c..ae7f68fdd4 100644 --- a/benchmark/ntfbenchmark/pom.xml +++ b/benchmark/ntfbenchmark/pom.xml @@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.opendaylight.mdsal binding-parent - 3.0.6 + 4.0.0 diff --git a/benchmark/rpcbenchmark/pom.xml b/benchmark/rpcbenchmark/pom.xml index 99e8ccbfa0..73b022b9ca 100644 --- a/benchmark/rpcbenchmark/pom.xml +++ b/benchmark/rpcbenchmark/pom.xml @@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.opendaylight.mdsal binding-parent - 3.0.6 + 4.0.0 diff --git a/features/benchmark/odl-benchmark-api/pom.xml b/features/benchmark/odl-benchmark-api/pom.xml index e7ae979a01..f45a43509a 100644 --- a/features/benchmark/odl-benchmark-api/pom.xml +++ b/features/benchmark/odl-benchmark-api/pom.xml @@ -27,7 +27,7 @@ org.opendaylight.mdsal odl-mdsal-binding-base - 3.0.6 + 4.0.0 xml features diff --git a/features/mdsal/odl-clustering-test-app/pom.xml b/features/mdsal/odl-clustering-test-app/pom.xml index 6e0ea45840..9ab9176b8f 100644 --- a/features/mdsal/odl-clustering-test-app/pom.xml +++ b/features/mdsal/odl-clustering-test-app/pom.xml @@ -26,7 +26,7 @@ org.opendaylight.mdsal mdsal-artifacts - 3.0.6 + 4.0.0 import pom diff --git a/features/mdsal/odl-controller-mdsal-common/pom.xml b/features/mdsal/odl-controller-mdsal-common/pom.xml index fdb96f14d6..45fa286f03 100644 --- a/features/mdsal/odl-controller-mdsal-common/pom.xml +++ b/features/mdsal/odl-controller-mdsal-common/pom.xml @@ -28,7 +28,7 @@ org.opendaylight.mdsal mdsal-artifacts - 3.0.6 + 4.0.0 pom import diff --git a/features/mdsal/odl-controller-model-topology/pom.xml b/features/mdsal/odl-controller-model-topology/pom.xml index ae94f98ab3..a01e5dd0ef 100644 --- a/features/mdsal/odl-controller-model-topology/pom.xml +++ b/features/mdsal/odl-controller-model-topology/pom.xml @@ -27,7 +27,7 @@ org.opendaylight.mdsal mdsal-artifacts - 3.0.6 + 4.0.0 pom import diff --git a/features/mdsal/odl-mdsal-broker-local/pom.xml b/features/mdsal/odl-mdsal-broker-local/pom.xml index 6adf223a56..14e06c7e22 100644 --- a/features/mdsal/odl-mdsal-broker-local/pom.xml +++ b/features/mdsal/odl-mdsal-broker-local/pom.xml @@ -41,7 +41,7 @@ org.opendaylight.mdsal mdsal-artifacts - 3.0.6 + 4.0.0 pom import diff --git a/features/mdsal/odl-mdsal-model-inventory/pom.xml b/features/mdsal/odl-mdsal-model-inventory/pom.xml index afa75c99a2..bf2b0a2600 100644 --- a/features/mdsal/odl-mdsal-model-inventory/pom.xml +++ b/features/mdsal/odl-mdsal-model-inventory/pom.xml @@ -28,7 +28,7 @@ org.opendaylight.mdsal mdsal-artifacts - 3.0.6 + 4.0.0 pom import diff --git a/features/mdsal/odl-message-bus-collector/pom.xml b/features/mdsal/odl-message-bus-collector/pom.xml index 7a983e41e6..aaeb7f164f 100644 --- a/features/mdsal/odl-message-bus-collector/pom.xml +++ b/features/mdsal/odl-message-bus-collector/pom.xml @@ -37,7 +37,7 @@ org.opendaylight.mdsal mdsal-artifacts - 3.0.6 + 4.0.0 pom import diff --git a/features/mdsal/odl-toaster/pom.xml b/features/mdsal/odl-toaster/pom.xml index 32924edffe..140401886c 100644 --- a/features/mdsal/odl-toaster/pom.xml +++ b/features/mdsal/odl-toaster/pom.xml @@ -27,7 +27,7 @@ org.opendaylight.mdsal odl-mdsal-binding-runtime - 3.0.6 + 4.0.0 xml features diff --git a/karaf/pom.xml b/karaf/pom.xml index dcb73b643d..b84a0473d6 100644 --- a/karaf/pom.xml +++ b/karaf/pom.xml @@ -55,7 +55,7 @@ org.opendaylight.mdsal features-mdsal - 3.0.6 + 4.0.0 features xml runtime diff --git a/opendaylight/blueprint/pom.xml b/opendaylight/blueprint/pom.xml index 5944d698b6..b8393372a0 100644 --- a/opendaylight/blueprint/pom.xml +++ b/opendaylight/blueprint/pom.xml @@ -27,7 +27,7 @@ org.opendaylight.mdsal mdsal-artifacts - 3.0.6 + 4.0.0 pom import diff --git a/opendaylight/config/pom.xml b/opendaylight/config/pom.xml index 629c8c0dd5..e7794a2257 100644 --- a/opendaylight/config/pom.xml +++ b/opendaylight/config/pom.xml @@ -5,7 +5,7 @@ org.opendaylight.mdsal binding-parent - 3.0.6 + 4.0.0 diff --git a/opendaylight/md-sal/parent/pom.xml b/opendaylight/md-sal/parent/pom.xml index a074df2d43..71d28dd92e 100644 --- a/opendaylight/md-sal/parent/pom.xml +++ b/opendaylight/md-sal/parent/pom.xml @@ -11,7 +11,7 @@ org.opendaylight.mdsal binding-parent - 3.0.6 + 4.0.0 diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/compat/NotificationInvoker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/compat/NotificationInvoker.java index c2fef92e65..a6d26d40b8 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/compat/NotificationInvoker.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/compat/NotificationInvoker.java @@ -55,7 +55,7 @@ final class NotificationInvoker @Override public void onNotification(final Notification notification) { - getContext(notification.getImplementedInterface()).invoke(notification); + getContext(notification.implementedInterface()).invoke(notification); } private InvokerContext getContext(final Class type) { diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java index d8ba10c8b6..f5a1435b7f 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java @@ -15,7 +15,7 @@ import java.util.Map; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationException; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationOperation; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizer; -import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -91,7 +91,7 @@ public class BindingToNormalizedNodeCodec } @Override - public Map.Entry, BindingCodecTreeNode> getSubtreeCodec( + public Map.Entry, BindingDataObjectCodecTreeNode> getSubtreeCodec( final YangInstanceIdentifier domIdentifier) { return super.getSubtreeCodec(domIdentifier); } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataObjectModification.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataObjectModification.java index b1632852bd..9bc8421e96 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataObjectModification.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataObjectModification.java @@ -7,6 +7,7 @@ */ package org.opendaylight.controller.md.sal.binding.impl; +import static com.google.common.base.Verify.verify; import static java.util.Objects.requireNonNull; import static org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType.UNMODIFIED; @@ -20,6 +21,7 @@ import java.util.stream.Stream; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.mdsal.binding.dom.adapter.BindingStructuralType; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.ChoiceIn; @@ -48,33 +50,36 @@ final class LazyDataObjectModification implements DataObje private static final Logger LOG = LoggerFactory.getLogger(LazyDataObjectModification.class); - private final BindingCodecTreeNode codec; + private final BindingDataObjectCodecTreeNode codec; private final DataTreeCandidateNode domData; private final PathArgument identifier; private volatile Collection> childNodesCache; private volatile ModificationType modificationType; - private LazyDataObjectModification(final BindingCodecTreeNode codec, final DataTreeCandidateNode domData) { + private LazyDataObjectModification(final BindingDataObjectCodecTreeNode codec, + final DataTreeCandidateNode domData) { this.codec = requireNonNull(codec); this.domData = requireNonNull(domData); this.identifier = codec.deserializePathArgument(domData.getIdentifier()); } - static LazyDataObjectModification create(final BindingCodecTreeNode codec, + static LazyDataObjectModification create(final BindingDataObjectCodecTreeNode codec, final DataTreeCandidateNode domData) { return new LazyDataObjectModification<>(codec, domData); } private static Collection> from( - final BindingCodecTreeNode parentCodec, final Collection domChildNodes) { + final BindingDataObjectCodecTreeNode parentCodec, + final Collection domChildNodes) { final List> result = new ArrayList<>(domChildNodes.size()); populateList(result, parentCodec, domChildNodes); return result; } private static void populateList(final List> result, - final BindingCodecTreeNode parentCodec, final Collection domChildNodes) { + final BindingDataObjectCodecTreeNode parentCodec, + final Collection domChildNodes) { for (final DataTreeCandidateNode domChildNode : domChildNodes) { if (domChildNode.getModificationType() != UNMODIFIED) { final BindingStructuralType type = BindingStructuralType.from(domChildNode); @@ -85,9 +90,11 @@ final class LazyDataObjectModification implements DataObje * debug log. */ try { - final BindingCodecTreeNode childCodec = - parentCodec.yangPathArgumentChild(domChildNode.getIdentifier()); - populateList(result, type, childCodec, domChildNode); + final BindingCodecTreeNode childCodec = parentCodec.yangPathArgumentChild( + domChildNode.getIdentifier()); + verify(childCodec instanceof BindingDataObjectCodecTreeNode, "Unhandled codec %s for type %s", + childCodec, type); + populateList(result, type, (BindingDataObjectCodecTreeNode) childCodec, domChildNode); } catch (final IllegalArgumentException e) { if (type == BindingStructuralType.UNKNOWN) { LOG.debug("Unable to deserialize unknown DOM node {}", domChildNode, e); @@ -101,7 +108,7 @@ final class LazyDataObjectModification implements DataObje } private static void populateList(final List> result, - final BindingStructuralType type, final BindingCodecTreeNode childCodec, + final BindingStructuralType type, final BindingDataObjectCodecTreeNode childCodec, final DataTreeCandidateNode domChildNode) { switch (type) { case INVISIBLE_LIST: @@ -121,7 +128,7 @@ final class LazyDataObjectModification implements DataObje } private static void populateListWithSingleCodec(final List> result, - final BindingCodecTreeNode codec, final Collection childNodes) { + final BindingDataObjectCodecTreeNode codec, final Collection childNodes) { for (final DataTreeCandidateNode child : childNodes) { if (child.getModificationType() != UNMODIFIED) { result.add(create(codec, child)); @@ -234,7 +241,7 @@ final class LazyDataObjectModification implements DataObje @Override public DataObjectModification getModifiedChild(final PathArgument arg) { final List domArgumentList = new ArrayList<>(); - final BindingCodecTreeNode childCodec = codec.bindingPathArgumentChild(arg, domArgumentList); + final BindingDataObjectCodecTreeNode childCodec = codec.bindingPathArgumentChild(arg, domArgumentList); final Iterator toEnter = domArgumentList.iterator(); DataTreeCandidateNode current = domData; while (toEnter.hasNext() && current != null) { diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataTreeModification.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataTreeModification.java index 3b140120e4..0ec5aa7154 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataTreeModification.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataTreeModification.java @@ -15,7 +15,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; @@ -34,7 +34,7 @@ class LazyDataTreeModification implements DataTreeModifica private final DataObjectModification rootNode; LazyDataTreeModification(final LogicalDatastoreType datastoreType, final InstanceIdentifier path, - final BindingCodecTreeNode codec, final DataTreeCandidate domChange) { + final BindingDataObjectCodecTreeNode codec, final DataTreeCandidate domChange) { this.path = new DataTreeIdentifier<>(datastoreType, path); this.rootNode = LazyDataObjectModification.create(codec, domChange.getRootNode()); } @@ -52,7 +52,7 @@ class LazyDataTreeModification implements DataTreeModifica @SuppressWarnings({"unchecked", "rawtypes"}) static DataTreeModification create(final BindingToNormalizedNodeCodec codec, final DataTreeCandidate domChange, final LogicalDatastoreType datastoreType) { - final Entry, BindingCodecTreeNode> codecCtx = + final Entry, BindingDataObjectCodecTreeNode> codecCtx = codec.getSubtreeCodec(domChange.getRootPath()); return new LazyDataTreeModification(datastoreType, codecCtx.getKey(), codecCtx.getValue(), domChange); } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazySerializedDOMNotification.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazySerializedDOMNotification.java index 3e3e8bee39..0373dd2286 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazySerializedDOMNotification.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazySerializedDOMNotification.java @@ -38,7 +38,7 @@ public final class LazySerializedDOMNotification implements DOMNotification { } static DOMNotification create(final BindingNormalizedNodeSerializer codec, final Notification data) { - final SchemaPath type = SchemaPath.create(true, BindingReflections.findQName(data.getImplementedInterface())); + final SchemaPath type = SchemaPath.create(true, BindingReflections.findQName(data.implementedInterface())); return new LazySerializedDOMNotification(codec, data, type); } diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/ContextExtractorTest.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/ContextExtractorTest.java index 3e1a688f44..b426c80d18 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/ContextExtractorTest.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/md/sal/binding/impl/ContextExtractorTest.java @@ -18,7 +18,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controll import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.rpc.routing.rev140701.EncapsulatedRouteInGrouping; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.rpc.routing.rev140701.RoutedSimpleRouteInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.rpc.routing.rev140701.RoutedSimpleRouteInputBuilder; -import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public final class ContextExtractorTest { @@ -31,7 +30,7 @@ public final class ContextExtractorTest { private static final Transitive TEST_GROUPING = new Transitive() { @Override - public Class getImplementedInterface() { + public Class implementedInterface() { return Transitive.class; } diff --git a/opendaylight/md-sal/sal-binding-dom-it/pom.xml b/opendaylight/md-sal/sal-binding-dom-it/pom.xml index bc2c70cc52..9ef18c4c09 100644 --- a/opendaylight/md-sal/sal-binding-dom-it/pom.xml +++ b/opendaylight/md-sal/sal-binding-dom-it/pom.xml @@ -25,7 +25,7 @@ org.opendaylight.mdsal mdsal-artifacts - 3.0.6 + 4.0.0 pom import diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/AbstractDOMBroker.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/AbstractDOMBroker.java index f05967630e..4ab1c15782 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/AbstractDOMBroker.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/AbstractDOMBroker.java @@ -5,7 +5,6 @@ * 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.controller.cluster.databroker; import static com.google.common.base.Preconditions.checkState; @@ -17,7 +16,6 @@ import java.util.EnumMap; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataBrokerExtension; import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; @@ -27,6 +25,7 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; +import org.opendaylight.mdsal.dom.spi.PingPongMergingDOMDataBroker; import org.opendaylight.mdsal.dom.spi.store.DOMStore; import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionChain; import org.opendaylight.mdsal.dom.spi.store.DOMStoreTreeChangePublisher; @@ -34,7 +33,8 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class AbstractDOMBroker extends AbstractDOMTransactionFactory implements DOMDataBroker { +public abstract class AbstractDOMBroker extends AbstractDOMTransactionFactory + implements PingPongMergingDOMDataBroker { private static final Logger LOG = LoggerFactory.getLogger(AbstractDOMBroker.class); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/DOMBrokerReadWriteTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/DOMBrokerReadWriteTransaction.java index b160d5b076..86b915bc9d 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/DOMBrokerReadWriteTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/DOMBrokerReadWriteTransaction.java @@ -5,7 +5,6 @@ * 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.controller.cluster.databroker; import com.google.common.util.concurrent.FluentFuture; @@ -48,9 +47,4 @@ public class DOMBrokerReadWriteTransaction extends AbstractDOMBrokerWriteTransac protected DOMStoreReadWriteTransaction createTransaction(LogicalDatastoreType key) { return getTxFactory(key).newReadWriteTransaction(); } - - @Override - public void close() { - cancel(); - } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/sharding/ShardProxyProducer.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/sharding/ShardProxyProducer.java index ae1907479d..602566bda6 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/sharding/ShardProxyProducer.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/sharding/ShardProxyProducer.java @@ -54,4 +54,9 @@ class ShardProxyProducer implements DOMDataTreeShardProducer { void setModificationFactory(final DistributedShardModificationFactory modificationFactory) { this.modificationFactory = requireNonNull(modificationFactory); } + + @Override + public void close() { + // FIXME: implement this + } } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRouter.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRouter.java index b660423223..f5f887a2d4 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRouter.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMRpcRouter.java @@ -10,7 +10,7 @@ package org.opendaylight.controller.md.sal.dom.broker.impl; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableSet; import com.google.common.util.concurrent.CheckedFuture; -import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.ListenableFuture; import java.util.Collections; import java.util.Map; import java.util.Set; @@ -76,7 +76,7 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP org.opendaylight.mdsal.dom.api.DOMRpcImplementation delegateImpl = new org.opendaylight.mdsal.dom.api.DOMRpcImplementation() { @Override - public FluentFuture invokeRpc( + public ListenableFuture invokeRpc( final org.opendaylight.mdsal.dom.api.DOMRpcIdentifier rpc, final NormalizedNode input) { return new MdsalDOMRpcResultFutureAdapter(implementation.invokeRpc(DOMRpcIdentifier.fromMdsal(rpc), input)); @@ -107,7 +107,7 @@ public final class DOMRpcRouter implements AutoCloseable, DOMRpcService, DOMRpcP @Override public CheckedFuture invokeRpc(final SchemaPath type, final NormalizedNode input) { - final FluentFuture future = + final ListenableFuture future = delegateRpcService.invokeRpc(type, input); return future instanceof MdsalDOMRpcResultFutureAdapter ? ((MdsalDOMRpcResultFutureAdapter)future).delegate() : new LegacyDOMRpcResultFutureAdapter(future); diff --git a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/AbstractLegacyDOMDataBrokerAdapter.java b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/AbstractLegacyDOMDataBrokerAdapter.java new file mode 100644 index 0000000000..bd68ea838c --- /dev/null +++ b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/AbstractLegacyDOMDataBrokerAdapter.java @@ -0,0 +1,375 @@ +/* + * Copyright (c) 2017 Inocybe Technologies 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.controller.sal.core.compat; + +import static java.util.Objects.requireNonNull; + +import com.google.common.base.Optional; +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.ForwardingObject; +import com.google.common.collect.ImmutableClassToInstanceMap; +import com.google.common.collect.ImmutableClassToInstanceMap.Builder; +import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.MoreExecutors; +import com.google.common.util.concurrent.SettableFuture; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.controller.md.sal.common.api.MappingCheckedFuture; +import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; +import org.opendaylight.controller.md.sal.common.api.data.DataStoreUnavailableException; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; +import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; +import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException; +import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; +import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; +import org.opendaylight.controller.md.sal.dom.api.ClusteredDOMDataTreeChangeListener; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension; +import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; +import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; +import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener; +import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService; +import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeCommitCohortRegistry; +import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; +import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; +import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; +import org.opendaylight.mdsal.common.api.CommitInfo; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadOperations; +import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; +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.DOMTransactionChainClosedException; +import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.util.concurrent.ExceptionMapper; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; + +/** + * Adapter between the legacy controller API-based DOMDataBroker and the mdsal API-based DOMDataBroker. + * + * @author Thomas Pantelis + */ +public abstract class AbstractLegacyDOMDataBrokerAdapter extends ForwardingObject implements DOMDataBroker { + private static final ExceptionMapper COMMIT_EX_MAPPER = + new ExceptionMapper("commit", TransactionCommitFailedException.class) { + @Override + protected TransactionCommitFailedException newWithCause(final String message, final Throwable cause) { + if (cause instanceof org.opendaylight.mdsal.common.api.OptimisticLockFailedException) { + return new OptimisticLockFailedException(cause.getMessage(), cause.getCause()); + } else if (cause instanceof org.opendaylight.mdsal.common.api.TransactionCommitFailedException) { + Throwable rootCause = cause.getCause(); + if (rootCause instanceof org.opendaylight.mdsal.common.api.DataStoreUnavailableException) { + rootCause = new DataStoreUnavailableException(rootCause.getMessage(), rootCause.getCause()); + } + + return new TransactionCommitFailedException(cause.getMessage(), rootCause); + } + + return new TransactionCommitFailedException(message, cause); + } + }; + + private final org.opendaylight.mdsal.dom.api.DOMDataBroker delegate; + private final ClassToInstanceMap extensions; + + public AbstractLegacyDOMDataBrokerAdapter(final org.opendaylight.mdsal.dom.api.DOMDataBroker delegate) { + this.delegate = delegate; + + ClassToInstanceMap delegateExtensions = + delegate.getExtensions(); + + Builder extBuilder = ImmutableClassToInstanceMap.builder(); + final org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService delegateTreeChangeService = + (org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService) delegateExtensions.get( + org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService.class); + if (delegateTreeChangeService != null) { + extBuilder.put(DOMDataTreeChangeService.class, new DOMDataTreeChangeService() { + @Override + public ListenerRegistration registerDataTreeChangeListener( + final DOMDataTreeIdentifier treeId, final L listener) { + final org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener delegateListener; + if (listener instanceof ClusteredDOMDataTreeChangeListener) { + delegateListener = new ClusteredProxyListener(listener); + } else { + delegateListener = new ProxyListener(listener); + } + + final ListenerRegistration reg = + delegateTreeChangeService.registerDataTreeChangeListener(treeId.toMdsal(), delegateListener); + + return new ListenerRegistration() { + @Override + public L getInstance() { + return listener; + } + + @Override + public void close() { + reg.close(); + } + }; + } + }); + } + + final org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry delegateCohortRegistry = + (org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry) delegateExtensions.get( + org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry.class); + if (delegateCohortRegistry != null) { + extBuilder.put(DOMDataTreeCommitCohortRegistry.class, delegateCohortRegistry::registerCommitCohort); + } + + extensions = extBuilder.build(); + } + + @Override + protected org.opendaylight.mdsal.dom.api.DOMDataBroker delegate() { + return delegate; + } + + @Override + public Map, DOMDataBrokerExtension> getSupportedExtensions() { + return extensions; + } + + @Override + public DOMDataReadOnlyTransaction newReadOnlyTransaction() { + return new DOMDataReadOnlyTransactionAdapter(delegate().newReadOnlyTransaction()); + } + + @Override + public DOMDataReadWriteTransaction newReadWriteTransaction() { + return new DOMDataTransactionAdapter(delegate().newReadWriteTransaction()); + } + + @Override + public DOMDataWriteTransaction newWriteOnlyTransaction() { + return new DOMDataTransactionAdapter(delegate().newWriteOnlyTransaction()); + } + + @Override + public DOMTransactionChain createTransactionChain(final TransactionChainListener listener) { + AtomicReference legacyChain = new AtomicReference<>(); + DOMTransactionChainListener delegateListener = + new DOMTransactionChainListener() { + @Override + @SuppressWarnings("rawtypes") + public void onTransactionChainFailed(final org.opendaylight.mdsal.dom.api.DOMTransactionChain chain, + final DOMDataTreeTransaction transaction, final Throwable cause) { + listener.onTransactionChainFailed(legacyChain.get(), + (AsyncTransaction) () -> transaction.getIdentifier(), + cause instanceof Exception ? COMMIT_EX_MAPPER.apply((Exception)cause) : cause); + } + + @Override + public void onTransactionChainSuccessful(final org.opendaylight.mdsal.dom.api.DOMTransactionChain chain) { + listener.onTransactionChainSuccessful(legacyChain.get()); + } + }; + + final org.opendaylight.mdsal.dom.api.DOMTransactionChain delegateChain = + delegate().createTransactionChain(delegateListener); + legacyChain.set(new DOMTransactionChain() { + @Override + public DOMDataReadOnlyTransaction newReadOnlyTransaction() { + return new DOMDataReadOnlyTransactionAdapter(wrapException(delegateChain::newReadOnlyTransaction)); + } + + @Override + public DOMDataReadWriteTransaction newReadWriteTransaction() { + return new DOMDataTransactionAdapter(wrapException(delegateChain::newReadWriteTransaction)); + } + + @Override + public DOMDataWriteTransaction newWriteOnlyTransaction() { + return new DOMDataTransactionAdapter(wrapException(delegateChain::newWriteOnlyTransaction)); + } + + @Override + public void close() { + delegateChain.close(); + } + }); + + return legacyChain.get(); + } + + abstract org.opendaylight.mdsal.dom.api.DOMTransactionChain createDelegateChain( + DOMTransactionChainListener listener); + + static T wrapException(final Supplier supplier) { + try { + return supplier.get(); + } catch (DOMTransactionChainClosedException e) { + throw new TransactionChainClosedException("Transaction chain already closed", e); + } + } + + private static class DOMDataTransactionAdapter implements DOMDataReadWriteTransaction { + private final DOMDataTreeReadOperations readDelegate; + private final DOMDataTreeWriteTransaction writeDelegate; + private final Object identifier; + + DOMDataTransactionAdapter(final @NonNull DOMDataTreeReadOperations readDelegate, final Object identifier) { + this.readDelegate = requireNonNull(readDelegate); + this.identifier = requireNonNull(identifier); + this.writeDelegate = null; + } + + DOMDataTransactionAdapter(final @NonNull DOMDataTreeWriteTransaction writeDelegate) { + this.writeDelegate = requireNonNull(writeDelegate); + this.identifier = writeDelegate.getIdentifier(); + this.readDelegate = null; + } + + DOMDataTransactionAdapter(final @NonNull DOMDataTreeReadWriteTransaction rwDelegate) { + this.readDelegate = requireNonNull(rwDelegate); + this.writeDelegate = rwDelegate; + this.identifier = rwDelegate.getIdentifier(); + } + + DOMDataTreeReadOperations readDelegate() { + return readDelegate; + } + + DOMDataTreeWriteTransaction writeDelegate() { + return writeDelegate; + } + + @Override + public Object getIdentifier() { + return identifier; + } + + @Override + public CheckedFuture>, ReadFailedException> read(final LogicalDatastoreType store, + final YangInstanceIdentifier path) { + return MappingCheckedFuture.create(readDelegate().read(store.toMdsal(), path).transform( + Optional::fromJavaUtil, MoreExecutors.directExecutor()), ReadFailedExceptionAdapter.INSTANCE); + } + + @Override + public CheckedFuture exists(final LogicalDatastoreType store, + final YangInstanceIdentifier path) { + return MappingCheckedFuture.create(readDelegate().exists(store.toMdsal(), path), + ReadFailedExceptionAdapter.INSTANCE); + } + + @Override + public void delete(final LogicalDatastoreType store, final YangInstanceIdentifier path) { + writeDelegate().delete(store.toMdsal(), path); + } + + @Override + public void put(final LogicalDatastoreType store, final YangInstanceIdentifier path, + final NormalizedNode data) { + writeDelegate().put(store.toMdsal(), path, data); + } + + @Override + public void merge(final LogicalDatastoreType store, final YangInstanceIdentifier path, + final NormalizedNode data) { + writeDelegate().merge(store.toMdsal(), path, data); + } + + @Override + public boolean cancel() { + return writeDelegate().cancel(); + } + + @Override + public FluentFuture commit() { + final SettableFuture resultFuture = SettableFuture.create(); + writeDelegate().commit().addCallback(new FutureCallback() { + @Override + public void onSuccess(final CommitInfo result) { + resultFuture.set(result); + } + + @Override + public void onFailure(final Throwable ex) { + if (ex instanceof Exception) { + resultFuture.setException(COMMIT_EX_MAPPER.apply((Exception)ex)); + } else { + resultFuture.setException(ex); + } + } + }, MoreExecutors.directExecutor()); + + return FluentFuture.from(resultFuture); + } + } + + private static class DOMDataReadOnlyTransactionAdapter implements DOMDataReadOnlyTransaction { + private final DOMDataTreeReadTransaction transaction; + private final DOMDataTransactionAdapter adapter; + + DOMDataReadOnlyTransactionAdapter(final DOMDataTreeReadTransaction delegateTx) { + this.transaction = requireNonNull(delegateTx); + adapter = new DOMDataTransactionAdapter(delegateTx, transaction.getIdentifier()); + } + + @Override + public CheckedFuture>, ReadFailedException> read(final LogicalDatastoreType store, + final YangInstanceIdentifier path) { + return adapter.read(store, path); + } + + @Override + public CheckedFuture exists(final LogicalDatastoreType store, + final YangInstanceIdentifier path) { + return adapter.exists(store, path); + } + + @Override + public Object getIdentifier() { + return adapter.getIdentifier(); + } + + @Override + public void close() { + transaction.close(); + } + } + + private static class ProxyListener extends ForwardingObject + implements org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener { + private final DOMDataTreeChangeListener delegate; + + ProxyListener(final DOMDataTreeChangeListener delegate) { + this.delegate = requireNonNull(delegate); + } + + @Override + public void onDataTreeChanged(Collection changes) { + delegate.onDataTreeChanged(changes); + } + + @Override + protected DOMDataTreeChangeListener delegate() { + return delegate; + } + } + + private static final class ClusteredProxyListener extends ProxyListener + implements org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener { + + ClusteredProxyListener(DOMDataTreeChangeListener delegate) { + super(delegate); + } + } +} diff --git a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMDataBrokerAdapter.java b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMDataBrokerAdapter.java index a5a47bb9d8..b426311991 100644 --- a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMDataBrokerAdapter.java +++ b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMDataBrokerAdapter.java @@ -23,9 +23,10 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.mdsal.dom.api.DOMTransactionChain; import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; +import org.opendaylight.mdsal.dom.spi.PingPongMergingDOMDataBroker; @Deprecated -public class DOMDataBrokerAdapter extends ForwardingObject implements org.opendaylight.mdsal.dom.api.DOMDataBroker { +public class DOMDataBrokerAdapter extends ForwardingObject implements PingPongMergingDOMDataBroker { private final ClassToInstanceMap extensions; private final DOMDataBroker delegate; diff --git a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMDataTreeReadWriteTransactionAdapter.java b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMDataTreeReadWriteTransactionAdapter.java index d35ce442d2..22bafb84bf 100644 --- a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMDataTreeReadWriteTransactionAdapter.java +++ b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMDataTreeReadWriteTransactionAdapter.java @@ -43,11 +43,6 @@ public class DOMDataTreeReadWriteTransactionAdapter extends ForwardingObject return TransactionUtils.exists(delegate(), store, path); } - @Override - public void close() { - cancel(); - } - @Override public void put(final LogicalDatastoreType store, final YangInstanceIdentifier path, final NormalizedNode data) { diff --git a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMRpcServiceAdapter.java b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMRpcServiceAdapter.java index 06cf6bc120..7158665530 100644 --- a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMRpcServiceAdapter.java +++ b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMRpcServiceAdapter.java @@ -10,7 +10,7 @@ package org.opendaylight.controller.sal.core.compat; import static java.util.Objects.requireNonNull; import com.google.common.collect.ForwardingObject; -import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.ListenableFuture; import java.util.Collection; import java.util.Set; import java.util.stream.Collectors; @@ -32,7 +32,7 @@ public class DOMRpcServiceAdapter extends ForwardingObject implements org.openda } @Override - public FluentFuture invokeRpc(final SchemaPath type, final NormalizedNode input) { + public ListenableFuture invokeRpc(final SchemaPath type, final NormalizedNode input) { return new MdsalDOMRpcResultFutureAdapter(delegate().invokeRpc(type, input)); } diff --git a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMTransactionChainAdapter.java b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMTransactionChainAdapter.java index 685986cb13..09f5ba5f0d 100644 --- a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMTransactionChainAdapter.java +++ b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/DOMTransactionChainAdapter.java @@ -80,12 +80,6 @@ public class DOMTransactionChainAdapter extends ForwardingObject untrack(delegate()); return super.cancel(); } - - @Override - public void close() { - untrack(delegate()); - super.close(); - } }); } diff --git a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMActionServiceAdapter.java b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMActionServiceAdapter.java index 8331bad7b6..7e498e381d 100644 --- a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMActionServiceAdapter.java +++ b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMActionServiceAdapter.java @@ -11,7 +11,7 @@ import static java.util.Objects.requireNonNull; import com.google.common.collect.ClassToInstanceMap; import com.google.common.collect.ForwardingObject; -import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.ListenableFuture; import org.opendaylight.controller.md.sal.dom.api.DOMActionService; import org.opendaylight.mdsal.dom.api.DOMActionResult; import org.opendaylight.mdsal.dom.api.DOMActionServiceExtension; @@ -33,8 +33,8 @@ public class LegacyDOMActionServiceAdapter extends ForwardingObject implements D } @Override - public FluentFuture invokeAction(final SchemaPath type, final DOMDataTreeIdentifier path, - final ContainerNode input) { + public ListenableFuture invokeAction(final SchemaPath type, + final DOMDataTreeIdentifier path, final ContainerNode input) { return delegate.invokeAction(type, path, input); } diff --git a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMDataBrokerAdapter.java b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMDataBrokerAdapter.java index ab92b00150..7ae5ec5633 100644 --- a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMDataBrokerAdapter.java +++ b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMDataBrokerAdapter.java @@ -7,363 +7,21 @@ */ package org.opendaylight.controller.sal.core.compat; -import static java.util.Objects.requireNonNull; - -import com.google.common.base.Optional; -import com.google.common.collect.ClassToInstanceMap; -import com.google.common.collect.ForwardingObject; -import com.google.common.collect.ImmutableClassToInstanceMap; -import com.google.common.collect.ImmutableClassToInstanceMap.Builder; -import com.google.common.util.concurrent.CheckedFuture; -import com.google.common.util.concurrent.FluentFuture; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.MoreExecutors; -import com.google.common.util.concurrent.SettableFuture; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Supplier; -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.controller.md.sal.common.api.MappingCheckedFuture; -import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; -import org.opendaylight.controller.md.sal.common.api.data.DataStoreUnavailableException; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; -import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException; -import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.ClusteredDOMDataTreeChangeListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeCommitCohortRegistry; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.mdsal.common.api.CommitInfo; -import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; -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.DOMTransactionChainClosedException; +import org.opendaylight.mdsal.dom.api.DOMTransactionChain; import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.util.concurrent.ExceptionMapper; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; /** * Adapter between the legacy controller API-based DOMDataBroker and the mdsal API-based DOMDataBroker. * * @author Thomas Pantelis */ -public class LegacyDOMDataBrokerAdapter extends ForwardingObject implements DOMDataBroker { - private static final ExceptionMapper COMMIT_EX_MAPPER = - new ExceptionMapper("commit", TransactionCommitFailedException.class) { - @Override - protected TransactionCommitFailedException newWithCause(final String message, final Throwable cause) { - if (cause instanceof org.opendaylight.mdsal.common.api.OptimisticLockFailedException) { - return new OptimisticLockFailedException(cause.getMessage(), cause.getCause()); - } else if (cause instanceof org.opendaylight.mdsal.common.api.TransactionCommitFailedException) { - Throwable rootCause = cause.getCause(); - if (rootCause instanceof org.opendaylight.mdsal.common.api.DataStoreUnavailableException) { - rootCause = new DataStoreUnavailableException(rootCause.getMessage(), rootCause.getCause()); - } - - return new TransactionCommitFailedException(cause.getMessage(), rootCause); - } - - return new TransactionCommitFailedException(message, cause); - } - }; - - private final org.opendaylight.mdsal.dom.api.DOMDataBroker delegate; - private final ClassToInstanceMap extensions; - +public class LegacyDOMDataBrokerAdapter extends AbstractLegacyDOMDataBrokerAdapter { public LegacyDOMDataBrokerAdapter(final org.opendaylight.mdsal.dom.api.DOMDataBroker delegate) { - this.delegate = delegate; - - ClassToInstanceMap delegateExtensions = - delegate.getExtensions(); - - Builder extBuilder = ImmutableClassToInstanceMap.builder(); - final org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService delegateTreeChangeService = - (org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService) delegateExtensions.get( - org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService.class); - if (delegateTreeChangeService != null) { - extBuilder.put(DOMDataTreeChangeService.class, new DOMDataTreeChangeService() { - @Override - public ListenerRegistration registerDataTreeChangeListener( - final DOMDataTreeIdentifier treeId, final L listener) { - final org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener delegateListener; - if (listener instanceof ClusteredDOMDataTreeChangeListener) { - delegateListener = new ClusteredProxyListener(listener); - } else { - delegateListener = new ProxyListener(listener); - } - - final ListenerRegistration reg = - delegateTreeChangeService.registerDataTreeChangeListener(treeId.toMdsal(), delegateListener); - - return new ListenerRegistration() { - @Override - public L getInstance() { - return listener; - } - - @Override - public void close() { - reg.close(); - } - }; - } - }); - } - - final org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry delegateCohortRegistry = - (org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry) delegateExtensions.get( - org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohortRegistry.class); - if (delegateCohortRegistry != null) { - extBuilder.put(DOMDataTreeCommitCohortRegistry.class, delegateCohortRegistry::registerCommitCohort); - } - - extensions = extBuilder.build(); - } - - @Override - protected org.opendaylight.mdsal.dom.api.DOMDataBroker delegate() { - return delegate; - } - - @Override - public Map, DOMDataBrokerExtension> getSupportedExtensions() { - return extensions; + super(delegate); } @Override - public DOMDataReadOnlyTransaction newReadOnlyTransaction() { - return new DOMDataReadOnlyTransactionAdapter(delegate().newReadOnlyTransaction()); - } - - @Override - public DOMDataReadWriteTransaction newReadWriteTransaction() { - return new DOMDataTransactionAdapter(delegate().newReadWriteTransaction()); - } - - @Override - public DOMDataWriteTransaction newWriteOnlyTransaction() { - return new DOMDataTransactionAdapter(delegate().newWriteOnlyTransaction()); - } - - @Override - public DOMTransactionChain createTransactionChain(final TransactionChainListener listener) { - AtomicReference legacyChain = new AtomicReference<>(); - DOMTransactionChainListener delegateListener = - new DOMTransactionChainListener() { - @Override - @SuppressWarnings("rawtypes") - public void onTransactionChainFailed(final org.opendaylight.mdsal.dom.api.DOMTransactionChain chain, - final DOMDataTreeTransaction transaction, final Throwable cause) { - listener.onTransactionChainFailed(legacyChain.get(), - (AsyncTransaction) () -> transaction.getIdentifier(), - cause instanceof Exception ? COMMIT_EX_MAPPER.apply((Exception)cause) : cause); - } - - @Override - public void onTransactionChainSuccessful(final org.opendaylight.mdsal.dom.api.DOMTransactionChain chain) { - listener.onTransactionChainSuccessful(legacyChain.get()); - } - }; - - final org.opendaylight.mdsal.dom.api.DOMTransactionChain delegateChain = - delegate().createTransactionChain(delegateListener); - legacyChain.set(new DOMTransactionChain() { - @Override - public DOMDataReadOnlyTransaction newReadOnlyTransaction() { - return new DOMDataReadOnlyTransactionAdapter(wrapException(delegateChain::newReadOnlyTransaction)); - } - - @Override - public DOMDataReadWriteTransaction newReadWriteTransaction() { - return new DOMDataTransactionAdapter(wrapException(delegateChain::newReadWriteTransaction)); - } - - @Override - public DOMDataWriteTransaction newWriteOnlyTransaction() { - return new DOMDataTransactionAdapter(wrapException(delegateChain::newWriteOnlyTransaction)); - } - - @Override - public void close() { - delegateChain.close(); - } - }); - - return legacyChain.get(); - } - - static T wrapException(final Supplier supplier) { - try { - return supplier.get(); - } catch (DOMTransactionChainClosedException e) { - throw new TransactionChainClosedException("Transaction chain already closed", e); - } - } - - private static class DOMDataTransactionAdapter implements DOMDataReadWriteTransaction { - private final DOMDataTreeReadTransaction readDelegate; - private final DOMDataTreeWriteTransaction writeDelegate; - private final Object identifier; - - DOMDataTransactionAdapter(final @NonNull DOMDataTreeReadTransaction readDelegate) { - this.readDelegate = requireNonNull(readDelegate); - this.identifier = readDelegate.getIdentifier(); - this.writeDelegate = null; - } - - DOMDataTransactionAdapter(final @NonNull DOMDataTreeWriteTransaction writeDelegate) { - this.writeDelegate = requireNonNull(writeDelegate); - this.identifier = writeDelegate.getIdentifier(); - this.readDelegate = null; - } - - DOMDataTransactionAdapter(final @NonNull DOMDataTreeReadWriteTransaction rwDelegate) { - this.readDelegate = requireNonNull(rwDelegate); - this.writeDelegate = rwDelegate; - this.identifier = readDelegate.getIdentifier(); - } - - DOMDataTreeReadTransaction readDelegate() { - return readDelegate; - } - - DOMDataTreeWriteTransaction writeDelegate() { - return writeDelegate; - } - - @Override - public Object getIdentifier() { - return identifier; - } - - @Override - public CheckedFuture>, ReadFailedException> read(final LogicalDatastoreType store, - final YangInstanceIdentifier path) { - return MappingCheckedFuture.create(readDelegate().read(store.toMdsal(), path).transform( - Optional::fromJavaUtil, MoreExecutors.directExecutor()), ReadFailedExceptionAdapter.INSTANCE); - } - - @Override - public CheckedFuture exists(final LogicalDatastoreType store, - final YangInstanceIdentifier path) { - return MappingCheckedFuture.create(readDelegate().exists(store.toMdsal(), path), - ReadFailedExceptionAdapter.INSTANCE); - } - - @Override - public void delete(final LogicalDatastoreType store, final YangInstanceIdentifier path) { - writeDelegate().delete(store.toMdsal(), path); - } - - @Override - public void put(final LogicalDatastoreType store, final YangInstanceIdentifier path, - final NormalizedNode data) { - writeDelegate().put(store.toMdsal(), path, data); - } - - @Override - public void merge(final LogicalDatastoreType store, final YangInstanceIdentifier path, - final NormalizedNode data) { - writeDelegate().merge(store.toMdsal(), path, data); - } - - @Override - public boolean cancel() { - return writeDelegate().cancel(); - } - - @Override - public FluentFuture commit() { - final SettableFuture resultFuture = SettableFuture.create(); - writeDelegate().commit().addCallback(new FutureCallback() { - @Override - public void onSuccess(final CommitInfo result) { - resultFuture.set(result); - } - - @Override - public void onFailure(final Throwable ex) { - if (ex instanceof Exception) { - resultFuture.setException(COMMIT_EX_MAPPER.apply((Exception)ex)); - } else { - resultFuture.setException(ex); - } - } - }, MoreExecutors.directExecutor()); - - return resultFuture; - } - } - - private static class DOMDataReadOnlyTransactionAdapter implements DOMDataReadOnlyTransaction { - private final DOMDataTransactionAdapter adapter; - - DOMDataReadOnlyTransactionAdapter(final DOMDataTreeReadTransaction delegateTx) { - adapter = new DOMDataTransactionAdapter(delegateTx); - } - - @Override - public CheckedFuture>, ReadFailedException> read(final LogicalDatastoreType store, - final YangInstanceIdentifier path) { - return adapter.read(store, path); - } - - @Override - public CheckedFuture exists(final LogicalDatastoreType store, - final YangInstanceIdentifier path) { - return adapter.exists(store, path); - } - - @Override - public Object getIdentifier() { - return adapter.getIdentifier(); - } - - @Override - public void close() { - adapter.readDelegate().close(); - } - } - - private static class ProxyListener extends ForwardingObject - implements org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener { - private final DOMDataTreeChangeListener delegate; - - ProxyListener(final DOMDataTreeChangeListener delegate) { - this.delegate = requireNonNull(delegate); - } - - @Override - public void onDataTreeChanged(Collection changes) { - delegate.onDataTreeChanged(changes); - } - - @Override - protected DOMDataTreeChangeListener delegate() { - return delegate; - } - } - - private static final class ClusteredProxyListener extends ProxyListener - implements org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener { - - ClusteredProxyListener(DOMDataTreeChangeListener delegate) { - super(delegate); - } + DOMTransactionChain createDelegateChain(DOMTransactionChainListener listener) { + return delegate().createTransactionChain(listener); } } diff --git a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMRpcResultFutureAdapter.java b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMRpcResultFutureAdapter.java index 10a85feba2..de397dbeab 100644 --- a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMRpcResultFutureAdapter.java +++ b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMRpcResultFutureAdapter.java @@ -8,7 +8,7 @@ package org.opendaylight.controller.sal.core.compat; import com.google.common.util.concurrent.CheckedFuture; -import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.ListenableFuture; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -26,7 +26,7 @@ import org.opendaylight.yangtools.util.concurrent.ExceptionMapper; * @author Thomas Pantelis */ public class LegacyDOMRpcResultFutureAdapter extends AbstractDOMRpcResultFutureAdapter, + org.opendaylight.mdsal.dom.api.DOMRpcResult, ListenableFuture, DOMRpcException> implements CheckedFuture { private static final ExceptionMapper LEGACY_DOM_RPC_EX_MAPPER = @@ -40,7 +40,7 @@ public class LegacyDOMRpcResultFutureAdapter extends AbstractDOMRpcResultFutureA } }; - public LegacyDOMRpcResultFutureAdapter(FluentFuture delegate) { + public LegacyDOMRpcResultFutureAdapter(ListenableFuture delegate) { super(delegate, LEGACY_DOM_RPC_EX_MAPPER); } diff --git a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMRpcServiceAdapter.java b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMRpcServiceAdapter.java index 170d9c9175..851ee09c99 100644 --- a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMRpcServiceAdapter.java +++ b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyDOMRpcServiceAdapter.java @@ -11,7 +11,7 @@ import static java.util.Objects.requireNonNull; import com.google.common.collect.ForwardingObject; import com.google.common.util.concurrent.CheckedFuture; -import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.ListenableFuture; import org.opendaylight.controller.md.sal.dom.api.DOMRpcAvailabilityListener; import org.opendaylight.controller.md.sal.dom.api.DOMRpcException; import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; @@ -32,7 +32,7 @@ public class LegacyDOMRpcServiceAdapter extends ForwardingObject implements DOMR @Override public CheckedFuture invokeRpc(final SchemaPath type, final NormalizedNode input) { - final FluentFuture future = delegate().invokeRpc(type, input); + final ListenableFuture future = delegate().invokeRpc(type, input); return future instanceof MdsalDOMRpcResultFutureAdapter ? ((MdsalDOMRpcResultFutureAdapter)future).delegate() : new LegacyDOMRpcResultFutureAdapter(future); } diff --git a/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyPingPongDOMDataBrokerAdapter.java b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyPingPongDOMDataBrokerAdapter.java new file mode 100644 index 0000000000..a28561f89e --- /dev/null +++ b/opendaylight/md-sal/sal-dom-compat/src/main/java/org/opendaylight/controller/sal/core/compat/LegacyPingPongDOMDataBrokerAdapter.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2019 PANTHEON.tech 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.controller.sal.core.compat; + +import org.opendaylight.mdsal.dom.api.DOMTransactionChain; +import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; + +/** + * Adapter between the legacy controller API-based DOMDataBroker and the mdsal API-based DOMDataBroker, equivalent + * to PingPongDOMDataBroker. + */ +public class LegacyPingPongDOMDataBrokerAdapter extends AbstractLegacyDOMDataBrokerAdapter { + public LegacyPingPongDOMDataBrokerAdapter(final org.opendaylight.mdsal.dom.api.DOMDataBroker delegate) { + super(delegate); + } + + @Override + DOMTransactionChain createDelegateChain(DOMTransactionChainListener listener) { + return delegate().createMergingTransactionChain(listener); + } +} diff --git a/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementation.java b/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementation.java index 45a847f975..71b2759991 100644 --- a/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementation.java +++ b/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementation.java @@ -5,14 +5,14 @@ * 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.controller.remote.rpc; +import static java.util.Objects.requireNonNull; + import akka.actor.ActorRef; import akka.pattern.Patterns; import akka.util.Timeout; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.ListenableFuture; import org.opendaylight.controller.remote.rpc.messages.ExecuteRpc; import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier; import org.opendaylight.mdsal.dom.api.DOMRpcImplementation; @@ -32,12 +32,12 @@ final class RemoteRpcImplementation implements DOMRpcImplementation { private final Timeout askDuration; RemoteRpcImplementation(final ActorRef remoteInvoker, final RemoteRpcProviderConfig config) { - this.remoteInvoker = Preconditions.checkNotNull(remoteInvoker); + this.remoteInvoker = requireNonNull(remoteInvoker); this.askDuration = config.getAskDuration(); } @Override - public FluentFuture invokeRpc(final DOMRpcIdentifier rpc, + public ListenableFuture invokeRpc(final DOMRpcIdentifier rpc, final NormalizedNode input) { final RemoteDOMRpcFuture ret = RemoteDOMRpcFuture.create(rpc.getType().getLastComponent()); ret.completeWith(Patterns.ask(remoteInvoker, ExecuteRpc.from(rpc, input), askDuration)); diff --git a/opendaylight/md-sal/sal-remoterpc-connector/src/test/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementationTest.java b/opendaylight/md-sal/sal-remoterpc-connector/src/test/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementationTest.java index 6e755f1ec5..5b3394eebd 100644 --- a/opendaylight/md-sal/sal-remoterpc-connector/src/test/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementationTest.java +++ b/opendaylight/md-sal/sal-remoterpc-connector/src/test/java/org/opendaylight/controller/remote/rpc/RemoteRpcImplementationTest.java @@ -11,12 +11,12 @@ package org.opendaylight.controller.remote.rpc; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; -import com.google.common.util.concurrent.FluentFuture; +import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import org.junit.Ignore; @@ -53,7 +53,7 @@ public class RemoteRpcImplementationTest extends AbstractRpcTest { when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn( FluentFutures.immediateFluentFuture(rpcResult)); - final FluentFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); + final ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS); @@ -75,7 +75,7 @@ public class RemoteRpcImplementationTest extends AbstractRpcTest { when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn( FluentFutures.immediateFluentFuture(rpcResult)); - FluentFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, null); + ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, null); assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS); @@ -98,7 +98,7 @@ public class RemoteRpcImplementationTest extends AbstractRpcTest { when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn( FluentFutures.immediateFluentFuture(rpcResult)); - final FluentFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); + final ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); final DOMRpcResult result = frontEndFuture.get(5, TimeUnit.SECONDS); @@ -119,7 +119,7 @@ public class RemoteRpcImplementationTest extends AbstractRpcTest { when(domRpcService2.invokeRpc(eq(TEST_RPC_TYPE), inputCaptor.capture())).thenReturn( FluentFutures.immediateFailedFluentFuture(new RemoteDOMRpcException("Test Exception", null))); - final FluentFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); + final ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); try { @@ -137,7 +137,7 @@ public class RemoteRpcImplementationTest extends AbstractRpcTest { @Test(expected = RemoteDOMRpcException.class) public void testInvokeRpcWithAkkaTimeoutException() throws Exception { final NormalizedNode invokeRpcInput = makeRPCInput("foo"); - final FluentFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); + final ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); frontEndFuture.get(20, TimeUnit.SECONDS); @@ -155,7 +155,7 @@ public class RemoteRpcImplementationTest extends AbstractRpcTest { doThrow(new RuntimeException("test")).when(domRpcService2).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class)); - final FluentFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); + final ListenableFuture frontEndFuture = remoteRpcImpl1.invokeRpc(TEST_RPC_ID, invokeRpcInput); assertTrue(frontEndFuture instanceof RemoteDOMRpcFuture); try { diff --git a/opendaylight/model/model-inventory/pom.xml b/opendaylight/model/model-inventory/pom.xml index e75d24de49..680a9bfa47 100644 --- a/opendaylight/model/model-inventory/pom.xml +++ b/opendaylight/model/model-inventory/pom.xml @@ -13,7 +13,7 @@ org.opendaylight.mdsal binding-parent - 3.0.6 + 4.0.0 diff --git a/opendaylight/model/model-topology/pom.xml b/opendaylight/model/model-topology/pom.xml index d197981add..e7548a6a16 100644 --- a/opendaylight/model/model-topology/pom.xml +++ b/opendaylight/model/model-topology/pom.xml @@ -13,7 +13,7 @@ org.opendaylight.mdsal binding-parent - 3.0.6 + 4.0.0 -- 2.36.6