3 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
\r
5 * This program and the accompanying materials are made available under the
\r
6 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r
7 * and is available at http://www.eclipse.org/legal/epl-v10.html
\r
9 package org.opendaylight.controller.sal.core.impl;
\r
11 import java.util.HashMap;
\r
12 import java.util.HashSet;
\r
13 import java.util.Map;
\r
14 import java.util.Set;
\r
15 import java.util.concurrent.Future;
\r
17 import org.opendaylight.controller.sal.core.api.Broker;
\r
18 import org.opendaylight.controller.sal.core.api.BrokerService;
\r
19 import org.opendaylight.controller.sal.core.api.Consumer;
\r
20 import org.opendaylight.controller.sal.core.api.Provider;
\r
21 import org.opendaylight.controller.sal.core.spi.BrokerModule;
\r
22 import org.opendaylight.controller.yang.common.QName;
23 import org.opendaylight.controller.yang.common.RpcResult;
24 import org.opendaylight.controller.yang.data.api.CompositeNode;
25 import org.slf4j.Logger;
\r
26 import org.slf4j.LoggerFactory;
\r
29 public class BrokerImpl implements Broker {
\r
30 private static Logger log = LoggerFactory.getLogger(BrokerImpl.class);
\r
32 private Set<ConsumerSessionImpl> sessions = new HashSet<ConsumerSessionImpl>();
\r
33 private Set<ProviderSessionImpl> providerSessions = new HashSet<ProviderSessionImpl>();
\r
34 // private ExecutorService executor;
\r
35 private Set<BrokerModule> modules = new HashSet<BrokerModule>();
\r
37 private Map<Class<? extends BrokerService>, BrokerModule> serviceProviders = new HashMap<Class<? extends BrokerService>, BrokerModule>();
\r
40 public ConsumerSession registerConsumer(Consumer consumer) {
\r
41 checkPredicates(consumer);
\r
42 log.info("Registering consumer " + consumer);
\r
44 ConsumerSessionImpl session = newSessionFor(consumer);
\r
45 consumer.onSessionInitiated(session);
\r
47 sessions.add(session);
\r
54 public ProviderSession registerProvider(Provider provider) {
\r
55 checkPredicates(provider);
\r
57 ProviderSessionImpl session = newSessionFor(provider);
\r
58 provider.onSessionInitiated(session);
\r
60 providerSessions.add(session);
\r
64 public <T extends BrokerService> T serviceFor(Class<T> service,
\r
65 ConsumerSessionImpl session) {
\r
66 BrokerModule prov = serviceProviders.get(service);
\r
68 log.warn("Service " + service.toString() + " is not supported");
\r
71 return prov.getServiceForSession(service, session);
\r
74 public Future<RpcResult<CompositeNode>> invokeRpc(QName rpc,
\r
75 CompositeNode input) {
\r
76 // TODO Implement this method
\r
77 throw new UnsupportedOperationException("Not implemented");
\r
80 private void checkPredicates(Provider prov) {
\r
82 throw new IllegalArgumentException("Provider should not be null.");
\r
83 for (ProviderSessionImpl session : providerSessions) {
\r
84 if (prov.equals(session.getProvider()))
\r
85 throw new IllegalStateException("Provider already registered");
\r
90 private void checkPredicates(Consumer cons) {
\r
92 throw new IllegalArgumentException("Consumer should not be null.");
\r
93 for (ConsumerSessionImpl session : sessions) {
\r
94 if (cons.equals(session.getConsumer()))
\r
95 throw new IllegalStateException("Consumer already registered");
\r
99 private ConsumerSessionImpl newSessionFor(Consumer cons) {
\r
100 return new ConsumerSessionImpl(this, cons);
\r
103 private ProviderSessionImpl newSessionFor(Provider provider) {
\r
104 return new ProviderSessionImpl(this, provider);
\r
107 public void addModule(BrokerModule module) {
\r
108 log.info("Registering broker module " + module);
\r
109 if (modules.contains(module)) {
\r
110 log.error("Module already registered");
\r
111 throw new IllegalArgumentException("Module already exists.");
\r
114 Set<Class<? extends BrokerService>> provServices = module
\r
115 .getProvidedServices();
\r
116 for (Class<? extends BrokerService> serviceType : provServices) {
\r
117 log.info(" Registering session service implementation: "
\r
118 + serviceType.getCanonicalName());
\r
119 serviceProviders.put(serviceType, module);
\r
123 public void consumerSessionClosed(ConsumerSessionImpl consumerSessionImpl) {
\r
124 sessions.remove(consumerSessionImpl);
\r
125 providerSessions.remove(consumerSessionImpl);
\r