*/
package org.opendaylight.mdsal.binding.dom.adapter;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.ImmutableSet;
import java.util.Set;
-import org.opendaylight.mdsal.binding.api.BindingTransactionChain;
+import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.binding.api.DataBroker;
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.TransactionChain;
import org.opendaylight.mdsal.binding.api.WriteTransaction;
import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMAdapterBuilder.Factory;
-import org.opendaylight.mdsal.common.api.TransactionChainListener;
import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
import org.opendaylight.mdsal.dom.api.DOMService;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.DataObject;
-
/**
- * The DataBrokerImpl simply defers to the DOMDataBroker for all its operations.
- * All transactions and listener registrations are wrapped by the DataBrokerImpl
- * to allow binding aware components to use the DataBroker transparently.
+ * The DataBrokerImpl simply defers to the DOMDataBroker for all its operations. All transactions and listener
+ * registrations are wrapped by the DataBrokerImpl to allow binding aware components to use the DataBroker
+ * transparently.
*
* <p>
- * Besides this the DataBrokerImpl and it's collaborators also cache data that
- * is already transformed from the binding independent to binding aware format
- *
+ * Besides this the DataBrokerImpl and it's collaborators also cache data that is already transformed from the binding
+ * independent to binding aware format.
*/
-public class BindingDOMDataBrokerAdapter extends AbstractForwardedDataBroker implements
- DataBroker, DataTreeChangeService {
+@VisibleForTesting
+public class BindingDOMDataBrokerAdapter extends AbstractBindingAdapter<@NonNull DOMDataBroker> implements DataBroker {
+ static final Factory<DataBroker> BUILDER_FACTORY = Builder::new;
+ private final DataTreeChangeService treeChangeService;
+ public BindingDOMDataBrokerAdapter(final AdapterContext adapterContext, final DOMDataBroker domDataBroker) {
+ super(adapterContext, domDataBroker);
+ final var domTreeChange = domDataBroker.extension(DataTreeChangeExtension.class);
+ treeChangeService = domTreeChange == null ? null
+ : new BindingDOMDataTreeChangeServiceAdapter(adapterContext, domTreeChange);
+ }
- static final Factory<DataBroker> BUILDER_FACTORY = new BindingDOMAdapterBuilder.Factory<DataBroker>() {
+ @Override
+ public ReadTransaction newReadOnlyTransaction() {
+ return new BindingDOMReadTransactionAdapter(adapterContext(), getDelegate().newReadOnlyTransaction());
+ }
- @Override
- public BindingDOMAdapterBuilder<DataBroker> newBuilder() {
- return new Builder();
- }
+ @Override
+ public WriteTransaction newWriteOnlyTransaction() {
+ return new BindingDOMWriteTransactionAdapter<>(adapterContext(), getDelegate().newWriteOnlyTransaction());
+ }
- };
- private final DataTreeChangeService treeChangeService;
+ @Override
+ public ReadWriteTransaction newReadWriteTransaction() {
+ return new BindingDOMReadWriteTransactionAdapter(adapterContext(), getDelegate().newReadWriteTransaction());
+ }
- public BindingDOMDataBrokerAdapter(final DOMDataBroker domDataBroker, final BindingToNormalizedNodeCodec codec) {
- super(domDataBroker, codec);
- final DOMDataTreeChangeService domTreeChange
- = (DOMDataTreeChangeService) domDataBroker.getSupportedExtensions().get(DOMDataTreeChangeService.class);
- if (domTreeChange != null) {
- treeChangeService = BindingDOMDataTreeChangeServiceAdapter.create(codec, domTreeChange);
- } else {
- treeChangeService = null;
- }
+ @Override
+ public TransactionChain createTransactionChain() {
+ return new BindingDOMTransactionChainAdapter(getDelegate().createTransactionChain(), adapterContext());
}
@Override
- public ReadTransaction newReadOnlyTransaction() {
- return new BindingDOMReadTransactionAdapter(getDelegate().newReadOnlyTransaction(),getCodec());
+ public TransactionChain createMergingTransactionChain() {
+ return new BindingDOMTransactionChainAdapter(getDelegate().createMergingTransactionChain(), adapterContext());
}
@Override
- public WriteTransaction newWriteOnlyTransaction() {
- return new BindingDOMWriteTransactionAdapter<>(getDelegate().newWriteOnlyTransaction(),getCodec());
+ public <T extends DataObject> Registration registerTreeChangeListener(final DataTreeIdentifier<T> treeId,
+ final DataTreeChangeListener<T> listener) {
+ return getTreeChangeService().registerTreeChangeListener(treeId, listener);
}
@Override
- public BindingTransactionChain createTransactionChain(final TransactionChainListener listener) {
- return new BindingDOMTransactionChainAdapter(getDelegate(), getCodec(), listener);
+ @Deprecated(since = "13.0.0", forRemoval = true)
+ public <T extends DataObject> Registration registerLegacyTreeChangeListener(final DataTreeIdentifier<T> treeId,
+ final DataTreeChangeListener<T> listener) {
+ return getTreeChangeService().registerLegacyTreeChangeListener(treeId, listener);
+ }
+
+ private @NonNull DataTreeChangeService getTreeChangeService() {
+ final var local = treeChangeService;
+ if (local == null) {
+ throw new UnsupportedOperationException("Underlying data broker does not expose DOMDataTreeChangeService.");
+ }
+ return local;
}
private static class Builder extends BindingDOMAdapterBuilder<DataBroker> {
+ Builder(final AdapterContext adapterContext) {
+ super(adapterContext);
+ }
@Override
- public Set<? extends Class<? extends DOMService>> getRequiredDelegates() {
+ public Set<? extends Class<? extends DOMService<?, ?>>> getRequiredDelegates() {
return ImmutableSet.of(DOMDataBroker.class);
}
@Override
- protected DataBroker createInstance(final BindingToNormalizedNodeCodec codec,
- final ClassToInstanceMap<DOMService> delegates) {
- final DOMDataBroker domDataBroker = delegates.getInstance(DOMDataBroker.class);
- return new BindingDOMDataBrokerAdapter(domDataBroker, codec);
+ protected DataBroker createInstance(final ClassToInstanceMap<DOMService<?, ?>> delegates) {
+ return new BindingDOMDataBrokerAdapter(adapterContext(), delegates.getInstance(DOMDataBroker.class));
}
-
}
-
- @Override
- public <T extends DataObject, L extends DataTreeChangeListener<T>> ListenerRegistration<L>
- registerDataTreeChangeListener(
- final DataTreeIdentifier<T> treeId, final L listener) {
- if (treeChangeService == null) {
- throw new UnsupportedOperationException("Underlying data broker does not expose DOMDataTreeChangeService.");
- }
- return treeChangeService.registerDataTreeChangeListener(treeId, listener);
- }
-
}