Initial opendaylight infrastructure commit!!
[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.ExecutorService;\r
16 import java.util.concurrent.Future;\r
17 \r
18 import org.opendaylight.controller.sal.core.api.Broker;\r
19 import org.opendaylight.controller.sal.core.api.BrokerService;\r
20 import org.opendaylight.controller.sal.core.api.Consumer;\r
21 import org.opendaylight.controller.sal.core.api.Provider;\r
22 import org.opendaylight.controller.sal.core.spi.BrokerModule;\r
23 import org.opendaylight.controller.yang.common.QName;
24 import org.opendaylight.controller.yang.common.RpcResult;
25 import org.opendaylight.controller.yang.data.api.CompositeNode;
26 import org.slf4j.Logger;\r
27 import org.slf4j.LoggerFactory;\r
28 \r
29 \r
30 public class BrokerImpl implements Broker {\r
31     private static Logger log = LoggerFactory.getLogger(BrokerImpl.class);\r
32 \r
33     private Set<ConsumerSessionImpl> sessions = new HashSet<ConsumerSessionImpl>();\r
34     private Set<ProviderSessionImpl> providerSessions = new HashSet<ProviderSessionImpl>();\r
35     // private ExecutorService executor;\r
36     private Set<BrokerModule> modules = new HashSet<BrokerModule>();\r
37 \r
38     private Map<Class<? extends BrokerService>, BrokerModule> serviceProviders = new HashMap<Class<? extends BrokerService>, BrokerModule>();\r
39 \r
40     @Override\r
41     public ConsumerSession registerConsumer(Consumer consumer) {\r
42         checkPredicates(consumer);\r
43         log.info("Registering consumer " + consumer);\r
44 \r
45         ConsumerSessionImpl session = newSessionFor(consumer);\r
46         consumer.onSessionInitiated(session);\r
47 \r
48         sessions.add(session);\r
49 \r
50         return session;\r
51 \r
52     }\r
53 \r
54     @Override\r
55     public ProviderSession registerProvider(Provider provider) {\r
56         checkPredicates(provider);\r
57 \r
58         ProviderSessionImpl session = newSessionFor(provider);\r
59         provider.onSessionInitiated(session);\r
60 \r
61         providerSessions.add(session);\r
62         return session;\r
63     }\r
64 \r
65     public <T extends BrokerService> T serviceFor(Class<T> service,\r
66             ConsumerSessionImpl session) {\r
67         BrokerModule prov = serviceProviders.get(service);\r
68         if (prov == null) {\r
69             log.warn("Service " + service.toString() + " is not supported");\r
70             return null;\r
71         }\r
72         return prov.getServiceForSession(service, session);\r
73     }\r
74 \r
75     public Future<RpcResult<CompositeNode>> invokeRpc(QName rpc,\r
76             CompositeNode input) {\r
77         // TODO Implement this method\r
78         throw new UnsupportedOperationException("Not implemented");\r
79     }\r
80 \r
81     private void checkPredicates(Provider prov) {\r
82         if (prov == null)\r
83             throw new IllegalArgumentException("Provider should not be null.");\r
84         for (ProviderSessionImpl session : providerSessions) {\r
85             if (prov.equals(session.getProvider()))\r
86                 throw new IllegalStateException("Provider already registered");\r
87         }\r
88 \r
89     }\r
90 \r
91     private void checkPredicates(Consumer cons) {\r
92         if (cons == null)\r
93             throw new IllegalArgumentException("Consumer should not be null.");\r
94         for (ConsumerSessionImpl session : sessions) {\r
95             if (cons.equals(session.getConsumer()))\r
96                 throw new IllegalStateException("Consumer already registered");\r
97         }\r
98     }\r
99 \r
100     private ConsumerSessionImpl newSessionFor(Consumer cons) {\r
101         return new ConsumerSessionImpl(this, cons);\r
102     }\r
103 \r
104     private ProviderSessionImpl newSessionFor(Provider provider) {\r
105         return new ProviderSessionImpl(this, provider);\r
106     }\r
107 \r
108     public void addModule(BrokerModule module) {\r
109         log.info("Registering broker module " + module);\r
110         if (modules.contains(module)) {\r
111             log.error("Module already registered");\r
112             throw new IllegalArgumentException("Module already exists.");\r
113         }\r
114 \r
115         Set<Class<? extends BrokerService>> provServices = module\r
116                 .getProvidedServices();\r
117         for (Class<? extends BrokerService> serviceType : provServices) {\r
118             log.info("  Registering session service implementation: "\r
119                     + serviceType.getCanonicalName());\r
120             serviceProviders.put(serviceType, module);\r
121         }\r
122     }\r
123 \r
124     public void consumerSessionClosed(ConsumerSessionImpl consumerSessionImpl) {\r
125         sessions.remove(consumerSessionImpl);\r
126         providerSessions.remove(consumerSessionImpl);\r
127     }\r
128 \r
129 }\r
130