import org.opendaylight.mdsal.binding.api.WriteTransaction;
import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMAdapterBuilder.Factory;
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.Registration;
import org.opendaylight.yangtools.yang.binding.DataObject;
public BindingDOMDataBrokerAdapter(final AdapterContext adapterContext, final DOMDataBroker domDataBroker) {
super(adapterContext, domDataBroker);
- final var domTreeChange = domDataBroker.extension(DOMDataTreeChangeService.class);
+ final var domTreeChange = domDataBroker.extension(DataTreeChangeExtension.class);
treeChangeService = domTreeChange == null ? null
: new BindingDOMDataTreeChangeServiceAdapter(adapterContext, domTreeChange);
}
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.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.Augmentation;
import org.opendaylight.yangtools.yang.binding.DataObject;
/**
- * Adapter exposing Binding {@link DataTreeChangeService} and wrapping a {@link DOMDataTreeChangeService} and is
+ * Adapter exposing Binding {@link DataTreeChangeService} and wrapping a {@link DataTreeChangeExtension} and is
* responsible for translation and instantiation of {@link BindingDOMDataTreeChangeListenerAdapter} adapters.
*
* <p>
* Each registered {@link DataTreeChangeListener} is wrapped using adapter and registered directly to DOM service.
*/
-final class BindingDOMDataTreeChangeServiceAdapter extends AbstractBindingAdapter<DOMDataTreeChangeService>
+final class BindingDOMDataTreeChangeServiceAdapter extends AbstractBindingAdapter<DataTreeChangeExtension>
implements DataTreeChangeService {
BindingDOMDataTreeChangeServiceAdapter(final AdapterContext adapterContext,
- final DOMDataTreeChangeService dataTreeChangeService) {
- super(adapterContext, dataTreeChangeService);
+ final DataTreeChangeExtension dataTreeChangeExtension) {
+ super(adapterContext, dataTreeChangeExtension);
}
@Override
import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
private static final YangInstanceIdentifier TOP_YIID = YangInstanceIdentifier.of(Top.QNAME);
@Mock
- private DOMDataTreeChangeService mockDOMService;
+ private DataTreeChangeExtension mockDOMService;
@Mock
private BindingDOMCodecServices services;
*/
Registration registerCommitCohort(DOMDataTreeIdentifier path, DOMDataTreeCommitCohort cohort);
}
+
+ /**
+ * An {@link Extension} which allows users to register for changes to a subtree.
+ */
+ interface DataTreeChangeExtension extends Extension {
+ /**
+ * Registers a {@link DOMDataTreeChangeListener} to receive notifications when data changes under a given path
+ * in the conceptual data tree.
+ *
+ * <p>
+ * You are able to register for notifications for any node or subtree which can be represented using
+ * {@link DOMDataTreeIdentifier}.
+ *
+ * <p>
+ * You are able to register for data change notifications for a subtree or leaf even if it does not exist. You
+ * will receive notification once that node is created.
+ *
+ * <p>
+ * If there is any pre-existing data in the data tree for the path for which you are registering, you will
+ * receive an initial data change event, which will contain all pre-existing data, marked as created.
+ *
+ * <p>
+ * This method returns a {@link Registration} object. To "unregister" your listener for changes call
+ * the {@link Registration#close()} method on the returned object.
+ *
+ * <p>
+ * You MUST explicitly unregister your listener when you no longer want to receive notifications. This is
+ * especially true in OSGi environments, where failure to do so during bundle shutdown can lead to stale
+ * listeners being still registered.
+ *
+ * @param treeId Data tree identifier of the subtree which should be watched for changes.
+ * @param listener Listener instance which is being registered
+ * @return A {@link Registration} object, which may be used to unregister your listener using
+ * {@link Registration#close()} to stop delivery of change events.
+ * @throws NullPointerException if any of the arguments is {@code null}
+ */
+ Registration registerDataTreeChangeListener(DOMDataTreeIdentifier treeId, DOMDataTreeChangeListener listener);
+ }
}
+++ /dev/null
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.mdsal.dom.api;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.opendaylight.yangtools.concepts.Registration;
-
-/**
- * A {@link DOMDataBroker.Extension} which allows users to register for changes to a subtree.
- */
-@NonNullByDefault
-public interface DOMDataTreeChangeService extends DOMDataBroker.Extension {
- /**
- * Registers a {@link DOMDataTreeChangeListener} to receive notifications when data changes under a given path in
- * the conceptual data tree.
- *
- * <p>
- * You are able to register for notifications for any node or subtree which can be represented using
- * {@link DOMDataTreeIdentifier}.
- *
- * <p>
- * You are able to register for data change notifications for a subtree or leaf even if it does not exist. You will
- * receive notification once that node is created.
- *
- * <p>
- * If there is any pre-existing data in the data tree for the path for which you are registering, you will receive
- * an initial data change event, which will contain all pre-existing data, marked as created.
- *
- * <p>
- * This method returns a {@link Registration} object. To "unregister" your listener for changes call
- * the {@link Registration#close()} method on the returned object.
- *
- * <p>
- * You MUST explicitly unregister your listener when you no longer want to receive notifications. This is especially
- * true in OSGi environments, where failure to do so during bundle shutdown can lead to stale listeners being still
- * registered.
- *
- * @param treeId Data tree identifier of the subtree which should be watched for changes.
- * @param listener Listener instance which is being registered
- * @return A {@link Registration} object, which may be used to unregister your listener using
- * {@link Registration#close()} to stop delivery of change events.
- * @throws NullPointerException if any of the arguments is {@code null}
- */
- Registration registerDataTreeChangeListener(DOMDataTreeIdentifier treeId, DOMDataTreeChangeListener listener);
-}
import org.junit.Test;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.mdsal.common.api.TransactionCommitDeadlockException;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
import org.opendaylight.mdsal.dom.spi.AbstractDOMDataBroker;
import org.opendaylight.mdsal.dom.spi.store.DOMStore;
public void writeContainerEmptyTreeTest() throws InterruptedException {
final var latch = new CountDownLatch(1);
- final var dataTreeChangeService = getDOMDataTreeChangeService();
+ final var dataTreeChangeService = getDataTreeChangeExtension();
assertNotNull("DOMDataTreeChangeService not found, cannot continue with test!",
dataTreeChangeService);
public void replaceContainerContainerInTreeTest() throws ExecutionException, InterruptedException {
final var latch = new CountDownLatch(2);
- final var dataTreeChangeService = getDOMDataTreeChangeService();
+ final var dataTreeChangeService = getDataTreeChangeExtension();
assertNotNull("DOMDataTreeChangeService not found, cannot continue with test!",
dataTreeChangeService);
public void deleteContainerContainerInTreeTest() throws ExecutionException, InterruptedException {
final var latch = new CountDownLatch(2);
- final var dataTreeChangeService = getDOMDataTreeChangeService();
+ final var dataTreeChangeService = getDataTreeChangeExtension();
assertNotNull("DOMDataTreeChangeService not found, cannot continue with test!", dataTreeChangeService);
var writeTx = domBroker.newWriteOnlyTransaction();
public void replaceChildListContainerInTreeTest() throws ExecutionException, InterruptedException {
final var latch = new CountDownLatch(2);
- final var dataTreeChangeService = getDOMDataTreeChangeService();
+ final var dataTreeChangeService = getDataTreeChangeExtension();
assertNotNull("DOMDataTreeChangeService not found, cannot continue with test!", dataTreeChangeService);
var writeTx = domBroker.newWriteOnlyTransaction();
public void rootModificationChildListenerTest() throws ExecutionException, InterruptedException {
final var latch = new CountDownLatch(2);
- final var dataTreeChangeService = getDOMDataTreeChangeService();
+ final var dataTreeChangeService = getDataTreeChangeExtension();
assertNotNull("DOMDataTreeChangeService not found, cannot continue with test!",
dataTreeChangeService);
public void listEntryChangeNonRootRegistrationTest() throws ExecutionException, InterruptedException {
final var latch = new CountDownLatch(2);
- final var dataTreeChangeService = getDOMDataTreeChangeService();
+ final var dataTreeChangeService = getDataTreeChangeExtension();
assertNotNull("DOMDataTreeChangeService not found, cannot continue with test!", dataTreeChangeService);
var writeTx = domBroker.newWriteOnlyTransaction();
assertEquals(expectedMod, candidateNode.modificationType());
}
- private DOMDataTreeChangeService getDOMDataTreeChangeService() {
- return domBroker.extension(DOMDataTreeChangeService.class);
+ private DataTreeChangeExtension getDataTreeChangeExtension() {
+ return domBroker.extension(DataTreeChangeExtension.class);
}
static class CommitExecutorService extends ForwardingExecutorService {
import java.util.concurrent.atomic.AtomicLong;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
import org.opendaylight.mdsal.dom.spi.store.DOMStore;
import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionChain;
final var builder = ImmutableList.<Extension>builder();
if (isSupported(datastores, DOMStoreTreeChangePublisher.class)) {
- builder.add((DOMDataTreeChangeService) (treeId, listener) -> {
+ builder.add((DataTreeChangeExtension) (treeId, listener) -> {
final var dsType = treeId.datastore();
if (getTxFactories().get(dsType) instanceof DOMStoreTreeChangePublisher publisher) {
return publisher.registerTreeChangeListener(treeId.path(), listener);
import com.google.common.annotations.VisibleForTesting;
import java.time.Duration;
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.singleton.common.api.ClusterSingletonServiceProvider;
import org.opendaylight.yangtools.concepts.Registration;
import org.osgi.service.component.annotations.Activate;
final ClusterSingletonServiceProvider singleton, final boolean enabled, final int listenPort,
final Duration keepaliveInterval, final int maxMissedKeepalives) {
LOG.debug("Source {}", enabled ? "enabled" : "disabled");
- final var dtcs = verifyNotNull(broker.extension(DOMDataTreeChangeService.class),
+ final var dtcs = verifyNotNull(broker.extension(DataTreeChangeExtension.class),
"Missing DOMDataTreeChangeService in broker %s", broker);
checkArgument(maxMissedKeepalives > 0, "max-missed-keepalives %s must be greater than 0", maxMissedKeepalives);
return enabled ? singleton.registerClusterSingletonService(new SourceSingletonService(bootstrap,
import java.util.List;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
final class SourceRequestHandler extends SimpleChannelInboundHandler<ByteBuf> {
private static final Logger LOG = LoggerFactory.getLogger(SourceRequestHandler.class);
- private final DOMDataTreeChangeService dtcs;
+ private final DataTreeChangeExtension dtcs;
private Registration reg;
- SourceRequestHandler(final DOMDataTreeChangeService dtcs) {
+ SourceRequestHandler(final DataTreeChangeExtension dtcs) {
this.dtcs = requireNonNull(dtcs);
}
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.checkerframework.checker.lock.qual.GuardedBy;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker.DataTreeChangeExtension;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion;
new ServiceGroupIdentifier(SourceSingletonService.class.getName());
private final BootstrapSupport bootstrapSupport;
- private final DOMDataTreeChangeService dtcs;
+ private final DataTreeChangeExtension dtcs;
private final int listenPort;
@GuardedBy("this")
@GuardedBy("this")
private Channel serverChannel;
- SourceSingletonService(final BootstrapSupport bootstrapSupport, final DOMDataTreeChangeService dtcs,
+ SourceSingletonService(final BootstrapSupport bootstrapSupport, final DataTreeChangeExtension dtcs,
final int listenPort, final Duration keepaliveInterval, final int maxMissedKeepalives) {
this.bootstrapSupport = requireNonNull(bootstrapSupport);
this.dtcs = requireNonNull(dtcs);
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener;
import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
@Override
public <T extends Extension> T extension(final Class<T> type) {
final var ext = delegate.extension(type);
- if (DOMDataTreeChangeService.class.equals(type) && ext instanceof DOMDataTreeChangeService treeChange) {
- return type.cast((DOMDataTreeChangeService) (domDataTreeIdentifier, listener) -> {
+ if (DataTreeChangeExtension.class.equals(type) && ext instanceof DataTreeChangeExtension treeChange) {
+ return type.cast((DataTreeChangeExtension) (domDataTreeIdentifier, listener) -> {
final var rootId = domDataTreeIdentifier.path();
if (isRegistrationWatched(rootId, domDataTreeIdentifier.datastore())) {
LOG.warn("{} registration (registerDataTreeChangeListener) for {} from {}.",