X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fbinding%2Fapi%2FBindingAwareProvider.java;h=399eda53ee555a0971ba62363da74004596f5b1d;hp=0812e5f53c3d9193cbafaae8acabaaa06be3b880;hb=aaea3e9a92ae9d6fac04c4a065db4b35cbca9ed0;hpb=53aff7cd94da139a8329daddbcd773469564d1f4 diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareProvider.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareProvider.java index 0812e5f53c..399eda53ee 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareProvider.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/BindingAwareProvider.java @@ -7,63 +7,117 @@ */ package org.opendaylight.controller.sal.binding.api; -import java.util.Collection; - -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; -import org.opendaylight.yangtools.yang.binding.RpcService; /** + * A developer implemented component that gets registered with the Broker. + * + *

+ * Semantically, a provider may: + * + *

    + *
  1. Emit Notifications
  2. + *
  3. Provide the implementation of RPCs
  4. + *
  5. Write to the operational data tree
  6. + *
+ * + *

+ * If a class is not doing at least one of those three, consider using + * a BindingAwareConsumer instead: + * see {@link org.opendaylight.controller.sal.binding.api.BindingAwareConsumer} * - * Defines the component of controller and supplies additional metadata. A - * component of the controller or application supplies a concrete implementation - * of this interface. + *

+ * In addition, a BindingAwareProvider can in pursuit of its goals: + *

    + *
  1. Subscribe for Notifications
  2. + *
  3. Invoke RPCs
  4. + *
  5. Read from either the operational or config data tree
  6. + *
  7. Write to the config data tree
  8. + *
+ * (All of the above are things a Consumer can also do). * *

- * A user-implemented component (application) which facilitates the SAL and SAL - * services to access infrastructure services and to provide functionality to - * {@link Consumer}s and other providers. + * Examples: + * + *

+ * To get a NotificationService: * + * {@code + * public void onSessionInitiated(ProviderContext session) { + * NotificationProviderService notificationService = session.getSALService(NotificationProviderService.class); + * } + * } + * For more information on sending notifications via the NotificationProviderService + * see {@link org.opendaylight.controller.sal.binding.api.NotificationProviderService} + * + *

+ * To register an RPC implementation: + * + * {@code + * public void onSessionInitiated(ProviderContext session) { + * RpcRegistration registration = session.addRpcImplementation(MyService.class, myImplementationInstance); + * } + * } + * + *

+ * Where MyService.class is a Service interface generated from a yang model with RPCs modeled in it and + * myImplementationInstance is an instance of a class that implements MyService. + * + *

+ * To register a Routed RPC Implementation: + * {@code + * public void onSessionInitiated(ProviderContext session) { + * RoutedRpcRegistration flowRegistration = session.addRoutedRpcImplementation(SalFlowService.class, + * salFlowServiceImplementationInstance); + flowRegistration.registerPath(NodeContext.class, nodeInstanceId); + * } + * } + * + *

+ * Where SalFlowService.class is a Service interface generated from a yang model with RPCs modeled in it and + * salFlowServiceImplementationInstance is an instance of a class that implements SalFlowService. + * + *

+ * The line: + * {@code + * flowRegistration.registerPath(NodeContext.class, nodeInstanceId); + * } + * Is indicating that the RPC implementation is registered to handle RPC invocations that have their NodeContext + * pointing to the node with instance id nodeInstanceId. 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 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 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 a RoutedRPC is registered, it + * needs to also be able to indicate for which 'contexts' it is providing an implementation. * + *

+ * 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 it *for that node*. + * + *

+ * To get a DataBroker to allow access to the data tree: + * + * {@code + * public void onSessionInitiated(final ProviderContext session) { + * DataBroker databroker = session.getSALService(BindingDataBroker.class); + * } + * } */ +@Deprecated(forRemoval = true) public interface BindingAwareProvider { /** - * Returns a set of provided implementations of YANG modules and their rpcs. - * - * - * @return Set of provided implementation of YANG modules and their Rpcs - */ - Collection getImplementations(); - - /** - * Gets a set of implementations of provider functionality to be registered - * into system during the provider registration to the SAL. + * Callback signaling initialization of the consumer session to the SAL. * *

- * This method is invoked by {@link Broker#registerProvider(Provider)} to - * learn the initial provided functionality - * - * @return Set of provider's functionality. - */ - Collection getFunctionality(); - - /** - * Functionality provided by the {@link BindingAwareProvider} + * The consumer MUST use the session for all communication with SAL or + * retrieving SAL infrastructure services. * *

- * Marker interface used to mark the interfaces describing specific - * functionality which could be exposed by providers to other components. - * - * + * This method is invoked by + * {@link BindingAwareBroker#registerProvider(BindingAwareProvider)} * + * @param session Unique session between consumer and SAL. */ - public interface ProviderFunctionality { - - } - void onSessionInitiated(ProviderContext session); - - void onSessionInitialized(ConsumerContext session); - }