Merge "Bug 2673: Binding cursor-based data change API"
[controller.git] / opendaylight / md-sal / sal-dom-api / src / main / java / org / opendaylight / controller / md / sal / dom / api / DOMDataTreeProducer.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.md.sal.dom.api;
9
10 import java.util.Collection;
11 import javax.annotation.Nonnull;
12
13 /**
14  * A data producer context. It allows transactions to be submitted to the subtrees
15  * specified at instantiation time. At any given time there may be a single transaction
16  * open. It needs to be either submitted or cancelled before another one can be open.
17  * Once a transaction is submitted, it will proceed to be committed asynchronously.
18  *
19  * Each instance has  an upper bound on the number of transactions which can be in-flight,
20  * once that capacity is exceeded, an attempt to create a new transaction will block
21  * until some transactions complete.
22  *
23  * Each {@link DOMDataTreeProducer} can be in two logical states, bound and unbound,
24  * which define the lifecycle rules for when is it legal to create and submit transactions
25  * in relationship with {@link DOMDataTreeListener} callbacks.
26  *
27  * When a producer is first created, it is unbound. In this state the producer can be
28  * accessed by any application thread to allocate or submit transactions, as long as
29  * the 'single open transaction' rule is maintained. The producer and any transaction
30  * object MUST NOT be accessed, directly or indirectly, from a {@link DOMDataTreeListener}
31  * callback.
32  *
33  * When a producer is referenced in a call to {@link DOMDataTreeService#registerListener(DOMDataTreeListener, java.util.Collection, boolean, java.util.Collection)},
34  * an attempt will be made to bind the producer to the specified {@link DOMDataTreeListener}.
35  * Such an attempt will fail the producer is already bound, or it has an open transaction.
36  * Once bound, the producer can only be accessed from within the {@link DOMDataTreeListener}
37  * callback on that particular instance. Any transaction which is not submitted by the
38  * time the callback returns will be implicitly cancelled. A producer becomes unbound
39  * when the listener it is bound to becomes unregistered.
40  */
41 public interface DOMDataTreeProducer extends DOMDataTreeProducerFactory, AutoCloseable {
42     /**
43      * Allocate a new open transaction on this producer. Any and all transactions
44      * previously allocated must have been either submitted or cancelled by the
45      * time this method is invoked.
46      *
47      * @param barrier Indicates whether this transaction should be a barrier. A barrier
48      *                transaction is processed separately from any preceding transactions.
49      *                Non-barrier transactions may be merged and processed in a batch,
50      *                such that any observers see the modifications contained in them as
51      *                if the modifications were made in a single transaction.
52      * @return A new {@link DOMDataWriteTransaction}
53      * @throws {@link IllegalStateException} if a previous transaction was not closed.
54      * @throws {@link IllegalThreadStateException} if the calling thread context does not
55      *         match the lifecycle rules enforced by the producer state (e.g. bound or unbound).
56      *         This exception is thrown on a best effort basis and programs should not rely
57      *         on it for correct operation.
58      */
59     @Nonnull DOMDataWriteTransaction createTransaction(boolean isolated);
60
61     /**
62      * {@inheritDoc}
63      *
64      * When invoked on a {@link DOMDataTreeProducer}, this method has additional restrictions.
65      * There may not be an open transaction from this producer. The method needs to be
66      * invoked in appropriate context, e.g. bound or unbound.
67      *
68      * Specified subtrees must be accessible by this producer. Accessible means they are a subset
69      * of the subtrees specified when the producer is instantiated. The set is further reduced as
70      * child producers are instantiated -- if you create a producer for /a and then a child for
71      * /a/b, /a/b is not accessible from the first producer.
72      *
73      * Once this method returns successfully, this (parent) producer loses the ability to
74      * access the specified paths until the resulting (child) producer is shut down.
75      *
76      * @throws {@link IllegalStateException} if there is an open transaction
77      * @throws {@link IllegalArgumentException} if subtrees contains a subtree which is not
78      *         accessible by this producer
79      * @throws {@link IllegalThreadStateException} if the calling thread context does not
80      *         match the lifecycle rules enforced by the producer state (e.g. bound or unbound).
81      *         This exception is thrown on a best effort basis and programs should not rely
82      *         on it for correct operation.
83      */
84     @Override
85     @Nonnull DOMDataTreeProducer createProducer(@Nonnull Collection<DOMDataTreeIdentifier> subtrees);
86
87     /**
88      * {@inheritDoc}
89      *
90      * @throws DOMDataTreeProducerBusyException when there is an open transaction.
91      */
92     @Override
93     void close() throws DOMDataTreeProducerException;
94 }