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.binding.impl;
10 import java.util.HashMap;
11 import java.util.HashSet;
15 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
16 import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer;
17 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
18 import org.opendaylight.controller.sal.binding.api.BindingAwareService;
19 import org.opendaylight.controller.sal.binding.spi.SALBindingModule;
20 import org.opendaylight.controller.yang.binding.RpcService;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
24 public class BindingBrokerImpl implements BindingAwareBroker {
26 private static Logger log = LoggerFactory
27 .getLogger(BindingBrokerImpl.class);
29 private Set<ConsumerSessionImpl> sessions = new HashSet<ConsumerSessionImpl>();
30 private Set<ProviderSessionImpl> providerSessions = new HashSet<ProviderSessionImpl>();
32 private Set<SALBindingModule> modules = new HashSet<SALBindingModule>();
33 private Map<Class<? extends BindingAwareService>, SALBindingModule> salServiceProviders = new HashMap<Class<? extends BindingAwareService>, SALBindingModule>();
36 public ConsumerSession registerConsumer(BindingAwareConsumer consumer) {
37 checkPredicates(consumer);
38 log.info("Registering consumer " + consumer);
40 ConsumerSessionImpl session = newSessionFor(consumer);
41 consumer.onSessionInitialized(session);
43 sessions.add(session);
50 public ProviderSession registerProvider(BindingAwareProvider provider) {
51 checkPredicates(provider);
53 ProviderSessionImpl session = newSessionFor(provider);
54 provider.onSessionInitiated(session);
56 providerSessions.add(session);
60 public void addModule(SALBindingModule module) {
61 log.info("Registering broker module " + module);
62 if (modules.contains(module)) {
63 log.error("Module already registered");
64 throw new IllegalArgumentException("Module already exists.");
67 Set<Class<? extends BindingAwareService>> provServices = module
68 .getProvidedServices();
69 for (Class<? extends BindingAwareService> serviceType : provServices) {
70 log.info(" Registering session service implementation: "
71 + serviceType.getCanonicalName());
72 salServiceProviders.put(serviceType, module);
76 public void consumerSessionClosed(ConsumerSessionImpl consumerSessionImpl) {
77 sessions.remove(consumerSessionImpl);
78 providerSessions.remove(consumerSessionImpl);
81 private void checkPredicates(BindingAwareProvider prov) {
83 throw new IllegalArgumentException("Provider should not be null.");
84 for (ProviderSessionImpl session : providerSessions) {
85 if (prov.equals(session.getProvider()))
86 throw new IllegalStateException("Provider already registered");
91 private void checkPredicates(BindingAwareConsumer cons) {
93 throw new IllegalArgumentException("Consumer should not be null.");
94 for (ConsumerSessionImpl session : sessions) {
95 if (cons.equals(session.getConsumer()))
96 throw new IllegalStateException("Consumer already registered");
100 private ConsumerSessionImpl newSessionFor(BindingAwareConsumer cons) {
101 return new ConsumerSessionImpl(cons);
104 private ProviderSessionImpl newSessionFor(BindingAwareProvider provider) {
105 return new ProviderSessionImpl(provider);
108 private <T extends BindingAwareService> T newSALServiceForSession(
109 Class<T> service, ConsumerSession session) {
111 SALBindingModule serviceProvider = salServiceProviders.get(service);
112 if (serviceProvider == null) {
115 return serviceProvider.getServiceForSession(service, session);
119 private class ConsumerSessionImpl implements
120 BindingAwareBroker.ConsumerSession {
122 private final BindingAwareConsumer consumer;
123 private Map<Class<? extends BindingAwareService>, BindingAwareService> sessionSalServices = new HashMap<Class<? extends BindingAwareService>, BindingAwareService>();
125 public ConsumerSessionImpl(BindingAwareConsumer cons) {
126 this.consumer = cons;
130 public <T extends BindingAwareService> T getSALService(Class<T> service) {
132 BindingAwareService serv = sessionSalServices.get(service);
134 if (service.isInstance(serv)) {
135 @SuppressWarnings("unchecked")
139 log.error("Implementation for service " + service.getName()
140 + " does not implement the service interface");
141 throw new IllegalStateException("Service implementation "
142 + serv.getClass().getName() + "does not implement "
143 + service.getName());
146 T ret = BindingBrokerImpl.this.newSALServiceForSession(service,
149 sessionSalServices.put(service, ret);
156 public <T extends RpcService> T getRpcService(Class<T> module) {
157 // TODO Implement this method
158 throw new UnsupportedOperationException("Not implemented");
161 public BindingAwareConsumer getConsumer() {
162 return this.consumer;
167 private class ProviderSessionImpl extends ConsumerSessionImpl implements
168 BindingAwareBroker.ProviderSession {
170 private final BindingAwareProvider provider;
172 public ProviderSessionImpl(BindingAwareProvider provider2) {
174 this.provider = provider2;
178 public void addRpcImplementation(RpcService implementation) {
179 // TODO Implement this method
180 throw new UnsupportedOperationException("Not implemented");
184 public void removeRpcImplementation(RpcService implementation) {
185 // TODO Implement this method
186 throw new UnsupportedOperationException("Not implemented");
189 public BindingAwareProvider getProvider() {
190 return this.provider;