Added Google Guava as dependency. Replaced Map<K,List<V> for SAL listeners.
[controller.git] / opendaylight / sal / yang-prototype / sal / sal-broker-impl / src / main / java / org / opendaylight / controller / sal / core / impl / BrokerImpl.java
1
2 /*\r
3  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
4  *\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
8  */\r
9 package org.opendaylight.controller.sal.core.impl;\r
10 \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
16 \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
27 \r
28 \r
29 public class BrokerImpl implements Broker {\r
30     private static Logger log = LoggerFactory.getLogger(BrokerImpl.class);\r
31 \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
36 \r
37     private Map<Class<? extends BrokerService>, BrokerModule> serviceProviders = new HashMap<Class<? extends BrokerService>, BrokerModule>();\r
38 \r
39     @Override\r
40     public ConsumerSession registerConsumer(Consumer consumer) {\r
41         checkPredicates(consumer);\r
42         log.info("Registering consumer " + consumer);\r
43 \r
44         ConsumerSessionImpl session = newSessionFor(consumer);\r
45         consumer.onSessionInitiated(session);\r
46 \r
47         sessions.add(session);\r
48 \r
49         return session;\r
50 \r
51     }\r
52 \r
53     @Override\r
54     public ProviderSession registerProvider(Provider provider) {\r
55         checkPredicates(provider);\r
56 \r
57         ProviderSessionImpl session = newSessionFor(provider);\r
58         provider.onSessionInitiated(session);\r
59 \r
60         providerSessions.add(session);\r
61         return session;\r
62     }\r
63 \r
64     public <T extends BrokerService> T serviceFor(Class<T> service,\r
65             ConsumerSessionImpl session) {\r
66         BrokerModule prov = serviceProviders.get(service);\r
67         if (prov == null) {\r
68             log.warn("Service " + service.toString() + " is not supported");\r
69             return null;\r
70         }\r
71         return prov.getServiceForSession(service, session);\r
72     }\r
73 \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
78     }\r
79 \r
80     private void checkPredicates(Provider prov) {\r
81         if (prov == null)\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
86         }\r
87 \r
88     }\r
89 \r
90     private void checkPredicates(Consumer cons) {\r
91         if (cons == null)\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
96         }\r
97     }\r
98 \r
99     private ConsumerSessionImpl newSessionFor(Consumer cons) {\r
100         return new ConsumerSessionImpl(this, cons);\r
101     }\r
102 \r
103     private ProviderSessionImpl newSessionFor(Provider provider) {\r
104         return new ProviderSessionImpl(this, provider);\r
105     }\r
106 \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
112         }\r
113 \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
120         }\r
121     }\r
122 \r
123     public void consumerSessionClosed(ConsumerSessionImpl consumerSessionImpl) {\r
124         sessions.remove(consumerSessionImpl);\r
125         providerSessions.remove(consumerSessionImpl);\r
126     }\r
127 \r
128 }\r
129