2 * Copyright (c) 2013 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.controller.sal.dom.broker;
10 import java.util.Collections;
11 import java.util.HashSet;
13 import java.util.concurrent.Future;
15 import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener;
16 import org.opendaylight.controller.sal.core.api.Broker;
17 import org.opendaylight.controller.sal.core.api.BrokerService;
18 import org.opendaylight.controller.sal.core.api.Consumer;
19 import org.opendaylight.controller.sal.core.api.Provider;
20 import org.opendaylight.controller.sal.core.api.RoutedRpcDefaultImplementation;
21 import org.opendaylight.controller.sal.core.api.RpcImplementation;
22 import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry;
23 import org.opendaylight.controller.sal.core.api.RpcRegistrationListener;
24 import org.opendaylight.controller.sal.core.api.RpcRoutingContext;
25 import org.opendaylight.controller.sal.dom.broker.spi.RpcRouter;
26 import org.opendaylight.yangtools.concepts.ListenerRegistration;
27 import org.opendaylight.yangtools.yang.common.QName;
28 import org.opendaylight.yangtools.yang.common.RpcResult;
29 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
31 import org.osgi.framework.BundleContext;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
35 import com.google.common.base.Optional;
36 import com.google.common.base.Preconditions;
37 import com.google.common.collect.ClassToInstanceMap;
38 import com.google.common.collect.ImmutableClassToInstanceMap;
39 import com.google.common.util.concurrent.ListenableFuture;
41 public class BrokerImpl implements Broker, RpcProvisionRegistry, AutoCloseable {
42 private final static Logger log = LoggerFactory.getLogger(BrokerImpl.class);
44 // Broker Generic Context
45 private final Set<ConsumerContextImpl> sessions = Collections
46 .synchronizedSet(new HashSet<ConsumerContextImpl>());
47 private final Set<ProviderContextImpl> providerSessions = Collections
48 .synchronizedSet(new HashSet<ProviderContextImpl>());
50 private AutoCloseable deactivator = null;
52 private RpcRouter router = null;
54 private final ClassToInstanceMap<BrokerService> services;
56 public BrokerImpl(final RpcRouter router,final ClassToInstanceMap<BrokerService> services) {
57 this.router = Preconditions.checkNotNull(router, "RPC Router must not be null");
58 this.services = ImmutableClassToInstanceMap.copyOf(services);
63 public ConsumerSession registerConsumer(final Consumer consumer,
64 final BundleContext ctx) {
65 return registerConsumer(consumer);
69 public ProviderSession registerProvider(final Provider provider,
70 final BundleContext ctx) {
71 return registerProvider(provider);
74 protected Future<RpcResult<CompositeNode>> invokeRpcAsync(final QName rpc,
75 final CompositeNode input) {
76 return router.invokeRpc(rpc, input);
80 private void checkPredicates(final Provider prov) {
81 Preconditions.checkNotNull(prov, "Provider should not be null.");
82 for (ProviderContextImpl session : providerSessions) {
83 if (prov.equals(session.getProvider())) {
84 throw new IllegalStateException("Provider already registered");
90 private void checkPredicates(final Consumer cons) {
91 Preconditions.checkNotNull(cons, "Consumer should not be null.");
92 for (ConsumerContextImpl session : sessions) {
93 if (cons.equals(session.getConsumer())) {
94 throw new IllegalStateException("Consumer already registered");
99 // Private Factory methods
100 private ConsumerContextImpl newSessionFor(final Consumer provider) {
101 ConsumerContextImpl ret = new ConsumerContextImpl(provider, this);
105 private ProviderContextImpl newSessionFor(final Provider provider) {
106 ProviderContextImpl ret = new ProviderContextImpl(provider, this);
110 protected void consumerSessionClosed(
111 final ConsumerContextImpl consumerContextImpl) {
112 sessions.remove(consumerContextImpl);
113 providerSessions.remove(consumerContextImpl);
117 public void close() throws Exception {
118 if (deactivator != null) {
125 public RpcRegistration addRpcImplementation(final QName rpcType,
126 final RpcImplementation implementation)
127 throws IllegalArgumentException {
128 return router.addRpcImplementation(rpcType, implementation);
132 public RoutedRpcRegistration addRoutedRpcImplementation(
133 final QName rpcType, final RpcImplementation implementation) {
134 return router.addRoutedRpcImplementation(rpcType, implementation);
138 public void setRoutedRpcDefaultDelegate(
139 final RoutedRpcDefaultImplementation defaultImplementation) {
140 router.setRoutedRpcDefaultDelegate(defaultImplementation);
144 public ListenerRegistration<RpcRegistrationListener> addRpcRegistrationListener(
145 final RpcRegistrationListener listener) {
146 return router.addRpcRegistrationListener(listener);
150 public <L extends RouteChangeListener<RpcRoutingContext, YangInstanceIdentifier>> ListenerRegistration<L> registerRouteChangeListener(
152 return router.registerRouteChangeListener(listener);
156 public Set<QName> getSupportedRpcs() {
157 return router.getSupportedRpcs();
161 public ListenableFuture<RpcResult<CompositeNode>> invokeRpc(
162 final QName rpc, final CompositeNode input) {
163 return router.invokeRpc(rpc, input);
167 * @return the deactivator
169 public AutoCloseable getDeactivator() {
175 * the deactivator to set
177 public void setDeactivator(final AutoCloseable deactivator) {
178 this.deactivator = deactivator;
184 public RpcRouter getRouter() {
192 public void setRouter(final RpcRouter router) {
193 this.router = router;
196 protected <T extends BrokerService> Optional<T> getGlobalService(final Class<T> service) {
197 return Optional.fromNullable(services.getInstance(service));
202 public ConsumerSession registerConsumer(Consumer consumer) {
203 checkPredicates(consumer);
204 log.trace("Registering consumer {}", consumer);
205 final ConsumerContextImpl session = newSessionFor(consumer);
206 consumer.onSessionInitiated(session);
207 sessions.add(session);
213 public ProviderSession registerProvider(Provider provider) {
214 checkPredicates(provider);
215 final ProviderContextImpl session = newSessionFor(provider);
216 provider.onSessionInitiated(session);
217 providerSessions.add(session);