1 package org.opendaylight.controller.sal.binding.impl;
3 import java.util.HashMap;
4 import java.util.HashSet;
8 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
9 import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer;
10 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
11 import org.opendaylight.controller.sal.binding.api.BindingAwareService;
12 import org.opendaylight.controller.sal.binding.spi.SALBindingModule;
13 import org.opendaylight.controller.yang.binding.RpcService;
14 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory;
17 public class BindingBrokerImpl implements BindingAwareBroker {
19 private static Logger log = LoggerFactory
20 .getLogger(BindingBrokerImpl.class);
22 private Set<ConsumerSessionImpl> sessions = new HashSet<ConsumerSessionImpl>();
23 private Set<ProviderSessionImpl> providerSessions = new HashSet<ProviderSessionImpl>();
25 private Set<SALBindingModule> modules = new HashSet<SALBindingModule>();
26 private Map<Class<? extends BindingAwareService>, SALBindingModule> salServiceProviders = new HashMap<Class<? extends BindingAwareService>, SALBindingModule>();
29 public ConsumerSession registerConsumer(BindingAwareConsumer consumer) {
30 checkPredicates(consumer);
31 log.info("Registering consumer " + consumer);
33 ConsumerSessionImpl session = newSessionFor(consumer);
34 consumer.onSessionInitialized(session);
36 sessions.add(session);
43 public ProviderSession registerProvider(BindingAwareProvider provider) {
44 checkPredicates(provider);
46 ProviderSessionImpl session = newSessionFor(provider);
47 provider.onSessionInitiated(session);
49 providerSessions.add(session);
53 public void addModule(SALBindingModule module) {
54 log.info("Registering broker module " + module);
55 if (modules.contains(module)) {
56 log.error("Module already registered");
57 throw new IllegalArgumentException("Module already exists.");
60 Set<Class<? extends BindingAwareService>> provServices = module
61 .getProvidedServices();
62 for (Class<? extends BindingAwareService> serviceType : provServices) {
63 log.info(" Registering session service implementation: "
64 + serviceType.getCanonicalName());
65 salServiceProviders.put(serviceType, module);
69 public void consumerSessionClosed(ConsumerSessionImpl consumerSessionImpl) {
70 sessions.remove(consumerSessionImpl);
71 providerSessions.remove(consumerSessionImpl);
74 private void checkPredicates(BindingAwareProvider prov) {
76 throw new IllegalArgumentException("Provider should not be null.");
77 for (ProviderSessionImpl session : providerSessions) {
78 if (prov.equals(session.getProvider()))
79 throw new IllegalStateException("Provider already registered");
84 private void checkPredicates(BindingAwareConsumer cons) {
86 throw new IllegalArgumentException("Consumer should not be null.");
87 for (ConsumerSessionImpl session : sessions) {
88 if (cons.equals(session.getConsumer()))
89 throw new IllegalStateException("Consumer already registered");
93 private ConsumerSessionImpl newSessionFor(BindingAwareConsumer cons) {
94 return new ConsumerSessionImpl(cons);
97 private ProviderSessionImpl newSessionFor(BindingAwareProvider provider) {
98 return new ProviderSessionImpl(provider);
101 private <T extends BindingAwareService> T newSALServiceForSession(
102 Class<T> service, ConsumerSession session) {
104 SALBindingModule serviceProvider = salServiceProviders.get(service);
105 if (serviceProvider == null) {
108 return serviceProvider.getServiceForSession(service, session);
112 private class ConsumerSessionImpl implements
113 BindingAwareBroker.ConsumerSession {
115 private final BindingAwareConsumer consumer;
116 private Map<Class<? extends BindingAwareService>, BindingAwareService> sessionSalServices = new HashMap<Class<? extends BindingAwareService>, BindingAwareService>();
118 public ConsumerSessionImpl(BindingAwareConsumer cons) {
119 this.consumer = cons;
123 public <T extends BindingAwareService> T getSALService(Class<T> service) {
125 BindingAwareService serv = sessionSalServices.get(service);
127 if (service.isInstance(serv)) {
128 @SuppressWarnings("unchecked")
132 log.error("Implementation for service " + service.getName()
133 + " does not implement the service interface");
134 throw new IllegalStateException("Service implementation "
135 + serv.getClass().getName() + "does not implement "
136 + service.getName());
139 T ret = BindingBrokerImpl.this.newSALServiceForSession(service,
142 sessionSalServices.put(service, ret);
149 public <T extends RpcService> T getRpcService(Class<T> module) {
150 // TODO Implement this method
151 throw new UnsupportedOperationException("Not implemented");
154 public BindingAwareConsumer getConsumer() {
155 return this.consumer;
160 private class ProviderSessionImpl extends ConsumerSessionImpl implements
161 BindingAwareBroker.ProviderSession {
163 private final BindingAwareProvider provider;
165 public ProviderSessionImpl(BindingAwareProvider provider2) {
167 this.provider = provider2;
171 public void addRpcImplementation(RpcService implementation) {
172 // TODO Implement this method
173 throw new UnsupportedOperationException("Not implemented");
177 public void removeRpcImplementation(RpcService implementation) {
178 // TODO Implement this method
179 throw new UnsupportedOperationException("Not implemented");
182 public BindingAwareProvider getProvider() {
183 return this.provider;