2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.dom.api;
10 import java.util.Collection;
11 import javax.annotation.Nonnull;
12 import org.opendaylight.yangtools.concepts.ListenerRegistration;
15 * A {@link DOMService} providing access to the conceptual data tree. Interactions
16 * with the data tree are split into data producers and consumers (listeners). Each
17 * of them operate on a set of subtrees, which need to be declared at instantiation time.
20 * Returned instances are not thread-safe and expected to be used by a single thread
21 * at a time. Furthermore, producers may not be accessed from consumer callbacks
22 * unless they were specified when the listener is registered.
25 * The service maintains a loop-free topology of producers and consumers. What this means
26 * is that a consumer is not allowed to access a producer, which affects any of the
27 * subtrees it is subscribed to. This restriction is in place to ensure the system does
28 * not go into a feedback loop, where it is impossible to block either a producer or
29 * a consumer without accumulating excess work in the backlog stemming from its previous
32 public interface DOMDataTreeService extends DOMDataTreeProducerFactory, DOMService {
34 * Register a {@link DOMDataTreeListener} instance. Once registered, the listener
35 * will start receiving changes on the selected subtrees. If the listener cannot
36 * keep up with the rate of changes, and allowRxMerges is set to true, this service
37 * is free to merge the changes, so that a smaller number of them will be reported,
38 * possibly hiding some data transitions (like flaps).
41 * If the listener wants to write into any producer, that producer has to be mentioned
42 * in the call to this method. Those producers will be bound exclusively to the
43 * registration, so that accessing them outside of this listener's callback will trigger
44 * an error. Any producers mentioned must be idle, e.g. they may not have an open
45 * transaction at the time this method is invoked.
48 * Each listener instance can be registered at most once. Implementations of this
49 * interface have to guarantee that the listener's methods will not be invoked
50 * concurrently from multiple threads.
52 * @param listener {@link DOMDataTreeListener} that is being registered
53 * @param subtrees Conceptual subtree identifier of subtrees which should be monitored
54 * for changes. May not be null or empty.
55 * @param allowRxMerges True if the backend may perform ingress state compression.
56 * @param producers {@link DOMDataTreeProducer} instances to bind to the listener.
57 * @return A listener registration. Once closed, the listener will no longer be
58 * invoked and the producers will be unbound.
59 * @throws IllegalArgumentException if subtrees is empty or the listener is already bound
60 * @throws DOMDataTreeLoopException if the registration of the listener to the specified
61 * subtrees with specified producers would form a
64 @Nonnull <T extends DOMDataTreeListener> ListenerRegistration<T> registerListener(@Nonnull T listener,
65 @Nonnull Collection<DOMDataTreeIdentifier> subtrees, boolean allowRxMerges,
66 @Nonnull Collection<DOMDataTreeProducer> producers) throws DOMDataTreeLoopException;