Fix javadocs and enable doclint
[controller.git] / opendaylight / md-sal / sal-binding-api / src / main / java / org / opendaylight / controller / sal / binding / api / BindingAwareProvider.java
1 /*
2  * Copyright (c) 2013 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.sal.binding.api;
9
10 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
11
12 /**
13  *
14  * A developer implemented component that gets registered with the Broker.
15  *
16  * Semantically, a provider may:
17  *
18  * <ol>
19  *   <li> Emit Notifications</li>
20  *   <li> Provide the implementation of RPCs </li>
21  *   <li> Write to the operational data tree </li>
22  * </ol>
23  *
24  * If a class is not doing at least one of those three, consider using
25  * a BindingAwareConsumer instead:
26  * @see org.opendaylight.controller.sal.binding.api.BindingAwareConsumer
27  *
28  * <p>
29  *
30  *In addition, a BindingAwareProvider can in pursuit of its goals:
31  *
32  * <ol>
33  *   <li>Subscribe for Notifications </li>
34  *   <li>Invoke RPCs</li>
35  *   <li>Read from either the operational or config data tree</li>
36  *   <li>Write to the config data tree</li>
37  * </ol>
38  * (All of the above are things a Consumer can also do).
39  *
40  *<p>
41  *
42  * Examples:
43  *
44  *<p>
45  *
46  * To get a NotificationService:
47  *
48  * {@code
49  * public void onSessionInitiated(ProviderContext session) {
50  *      NotificationProviderService notificationService = session.getSALService(NotificationProviderService.class);
51  * }
52  * }
53  * For more information on sending notifications via the NotificationProviderService
54  * @see org.opendaylight.controller.sal.binding.api.NotificationProviderService
55  *
56  * To register an RPC implementation:
57  *
58  * {@code
59  * public void onSessionInitiated(ProviderContext session) {
60  *    RpcRegistration<MyService> registration = session.addRpcImplementation(MyService.class, myImplementationInstance);
61  * }
62  * }
63  *
64  * <p>
65  * Where MyService.class is a Service interface generated from a yang model with RPCs modeled in it and myImplementationInstance
66  * is an instance of a class that implements MyService.
67  *
68  * To register a Routed RPC Implementation:
69  * {@code
70  * public void onSessionInitiated(ProviderContext session) {
71  *   RoutedRpcRegistration<SalFlowService> flowRegistration = session.addRoutedRpcImplementation(SalFlowService.class, salFlowServiceImplementationInstance);
72      flowRegistration.registerPath(NodeContext.class, nodeInstanceId);
73  * }
74  * }
75  *
76  * Where SalFlowService.class is a Service interface generated from a yang model with RPCs modeled in it and salFlowServiceImplementationInstance is an instance
77  * of a class that implements SalFlowService.
78  * <p>
79  * The line:
80  * {@code
81  * flowRegistration.registerPath(NodeContext.class, nodeInstanceId);
82  * }
83  * Is indicating that the RPC implementation is registered to handle RPC invocations that have their NodeContext pointing to the node with instance id nodeInstanceId.
84  * This bears a bit of further explanation.  RoutedRPCs can be 'routed' to an implementation based upon 'context'.  'context' is a pointer (instanceId) to some place
85  * in the data tree.  In this example, the 'context' is a pointer to a Node.  In this way, a provider can register its ability to provide a service for a particular
86  * Node, but not *all* Nodes.  The Broker routes the RPC by 'context' to the correct implementation, without the caller having to do extra work.  Because of this when
87  * a RoutedRPC is registered, it needs to also be able to indicate for which 'contexts' it is providing an implementation.
88  *
89  * An example of a Routed RPC would be an updateFlow(node, flow) that would be routed based on node to the provider which had registered to provide
90  * it *for that node*.
91  *
92  *<p>
93  *
94  * To get a DataBroker to allow access to the data tree:
95  *
96  * {@code
97  * public void onSessionInitiated(final ProviderContext session) {
98  *      DataBroker databroker = session.getSALService(BindingDataBroker.class);
99  * }
100  * }
101  */
102 public interface BindingAwareProvider {
103
104     /**
105      * Callback signaling initialization of the consumer session to the SAL.
106      *
107      * The consumer MUST use the session for all communication with SAL or
108      * retrieving SAL infrastructure services.
109      *
110      * This method is invoked by
111      * {@link BindingAwareBroker#registerProvider(BindingAwareProvider)}
112      *
113      * @param session Unique session between consumer and SAL.
114      */
115     void onSessionInitiated(ProviderContext session);
116 }