2209f84cac7ca86b29da96487dd1b45329daca5d
[controller.git] / opendaylight / sal / yang-prototype / sal / sal-binding-broker-impl / src / main / java / org / opendaylight / controller / sal / binding / impl / BindingBrokerImpl.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.sal.binding.impl;
9
10 import java.util.HashMap;
11 import java.util.HashSet;
12 import java.util.Map;
13 import java.util.Set;
14
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;
23
24 public class BindingBrokerImpl implements BindingAwareBroker {
25
26     private static Logger log = LoggerFactory
27             .getLogger(BindingBrokerImpl.class);
28
29     private Set<ConsumerSessionImpl> sessions = new HashSet<ConsumerSessionImpl>();
30     private Set<ProviderSessionImpl> providerSessions = new HashSet<ProviderSessionImpl>();
31
32     private Set<SALBindingModule> modules = new HashSet<SALBindingModule>();
33     private Map<Class<? extends BindingAwareService>, SALBindingModule> salServiceProviders = new HashMap<Class<? extends BindingAwareService>, SALBindingModule>();
34
35     @Override
36     public ConsumerSession registerConsumer(BindingAwareConsumer consumer) {
37         checkPredicates(consumer);
38         log.info("Registering consumer " + consumer);
39
40         ConsumerSessionImpl session = newSessionFor(consumer);
41         consumer.onSessionInitialized(session);
42
43         sessions.add(session);
44
45         return session;
46
47     }
48
49     @Override
50     public ProviderSession registerProvider(BindingAwareProvider provider) {
51         checkPredicates(provider);
52
53         ProviderSessionImpl session = newSessionFor(provider);
54         provider.onSessionInitiated(session);
55
56         providerSessions.add(session);
57         return session;
58     }
59
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.");
65         }
66
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);
73         }
74     }
75
76     public void consumerSessionClosed(ConsumerSessionImpl consumerSessionImpl) {
77         sessions.remove(consumerSessionImpl);
78         providerSessions.remove(consumerSessionImpl);
79     }
80
81     private void checkPredicates(BindingAwareProvider prov) {
82         if (prov == null)
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");
87         }
88
89     }
90
91     private void checkPredicates(BindingAwareConsumer cons) {
92         if (cons == null)
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");
97         }
98     }
99
100     private ConsumerSessionImpl newSessionFor(BindingAwareConsumer cons) {
101         return new ConsumerSessionImpl(cons);
102     }
103
104     private ProviderSessionImpl newSessionFor(BindingAwareProvider provider) {
105         return new ProviderSessionImpl(provider);
106     }
107
108     private <T extends BindingAwareService> T newSALServiceForSession(
109             Class<T> service, ConsumerSession session) {
110
111         SALBindingModule serviceProvider = salServiceProviders.get(service);
112         if (serviceProvider == null) {
113             return null;
114         }
115         return serviceProvider.getServiceForSession(service, session);
116
117     }
118
119     private class ConsumerSessionImpl implements
120             BindingAwareBroker.ConsumerSession {
121
122         private final BindingAwareConsumer consumer;
123         private Map<Class<? extends BindingAwareService>, BindingAwareService> sessionSalServices = new HashMap<Class<? extends BindingAwareService>, BindingAwareService>();
124
125         public ConsumerSessionImpl(BindingAwareConsumer cons) {
126             this.consumer = cons;
127         }
128
129         @Override
130         public <T extends BindingAwareService> T getSALService(Class<T> service) {
131
132             BindingAwareService serv = sessionSalServices.get(service);
133             if (serv != null) {
134                 if (service.isInstance(serv)) {
135                     @SuppressWarnings("unchecked")
136                     T ret = (T) serv;
137                     return ret;
138                 } else {
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());
144                 }
145             } else {
146                 T ret = BindingBrokerImpl.this.newSALServiceForSession(service,
147                         this);
148                 if (ret != null) {
149                     sessionSalServices.put(service, ret);
150                 }
151                 return ret;
152             }
153         }
154
155         @Override
156         public <T extends RpcService> T getRpcService(Class<T> module) {
157             // TODO Implement this method
158             throw new UnsupportedOperationException("Not implemented");
159         }
160
161         public BindingAwareConsumer getConsumer() {
162             return this.consumer;
163         }
164
165     }
166
167     private class ProviderSessionImpl extends ConsumerSessionImpl implements
168             BindingAwareBroker.ProviderSession {
169
170         private final BindingAwareProvider provider;
171
172         public ProviderSessionImpl(BindingAwareProvider provider2) {
173             super(null);
174             this.provider = provider2;
175         }
176
177         @Override
178         public void addRpcImplementation(RpcService implementation) {
179             // TODO Implement this method
180             throw new UnsupportedOperationException("Not implemented");
181         }
182
183         @Override
184         public void removeRpcImplementation(RpcService implementation) {
185             // TODO Implement this method
186             throw new UnsupportedOperationException("Not implemented");
187         }
188
189         public BindingAwareProvider getProvider() {
190             return this.provider;
191         }
192
193     }
194
195 }