Bug 1303: BindingIndependentConnector splitted.
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / sal / binding / impl / connect / dom / DomToBindingRpcForwardingManager.java
1 package org.opendaylight.controller.sal.binding.impl.connect.dom;
2
3 import com.google.common.base.Optional;
4 import java.util.Map;
5 import java.util.Set;
6 import java.util.WeakHashMap;
7 import org.opendaylight.controller.md.sal.common.api.routing.RouteChange;
8 import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener;
9 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
10 import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier;
11 import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter;
12 import org.opendaylight.controller.sal.binding.impl.RpcProviderRegistryImpl;
13 import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry;
14 import org.opendaylight.controller.sal.core.api.RpcRegistrationListener;
15 import org.opendaylight.yangtools.yang.binding.BaseIdentity;
16 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
17 import org.opendaylight.yangtools.yang.binding.RpcService;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
20
21 /**
22  * Manager responsible for instantiating forwarders responsible for
23  * forwarding of RPC invocations from DOM Broker to Binding Aware Broker
24  *
25  */
26 class DomToBindingRpcForwardingManager implements
27     RouteChangeListener<RpcContextIdentifier, InstanceIdentifier<?>>,
28     RpcProviderRegistryImpl.RouterInstantiationListener,
29     RpcProviderRegistryImpl.GlobalRpcRegistrationListener, RpcRegistrationListener {
30
31     private final Map<Class<? extends RpcService>, DomToBindingRpcForwarder> forwarders = new WeakHashMap<>();
32     private final BindingIndependentMappingService mappingService;
33     private final RpcProvisionRegistry biRpcRegistry;
34     private final RpcProviderRegistry baRpcRegistry;
35     private RpcProviderRegistryImpl registryImpl;
36
37     DomToBindingRpcForwardingManager(final BindingIndependentMappingService mappingService, final RpcProvisionRegistry biRpcRegistry,
38         final RpcProviderRegistry baRpcRegistry) {
39         this.mappingService = mappingService;
40         this.biRpcRegistry = biRpcRegistry;
41         this.baRpcRegistry = baRpcRegistry;
42     }
43
44     public RpcProviderRegistryImpl getRegistryImpl() {
45         return registryImpl;
46     }
47
48     public void setRegistryImpl(final RpcProviderRegistryImpl registryImpl) {
49         this.registryImpl = registryImpl;
50     }
51
52     @Override
53     public void onGlobalRpcRegistered(final Class<? extends RpcService> cls) {
54         getRpcForwarder(cls, null).registerToDOMBroker();
55     }
56
57     @Override
58     public void onGlobalRpcUnregistered(final Class<? extends RpcService> cls) {
59         // NOOP
60     }
61
62     @Override
63     public void onRpcRouterCreated(final RpcRouter<?> router) {
64         Class<? extends BaseIdentity> ctx = router.getContexts().iterator().next();
65         getRpcForwarder(router.getServiceType(), ctx);
66     }
67
68     @Override
69     public void onRouteChange(final RouteChange<RpcContextIdentifier, InstanceIdentifier<?>> change) {
70         for (Map.Entry<RpcContextIdentifier, Set<InstanceIdentifier<?>>> entry : change.getAnnouncements().entrySet()) {
71             bindingRoutesAdded(entry);
72         }
73     }
74
75     private void bindingRoutesAdded(final Map.Entry<RpcContextIdentifier, Set<InstanceIdentifier<?>>> entry) {
76         Class<? extends BaseIdentity> context = entry.getKey().getRoutingContext();
77         Class<? extends RpcService> service = entry.getKey().getRpcService();
78         if (context != null) {
79             getRpcForwarder(service, context).registerPaths(context, service, entry.getValue());
80         }
81     }
82
83     private DomToBindingRpcForwarder getRpcForwarder(final Class<? extends RpcService> service,
84         final Class<? extends BaseIdentity> context) {
85         DomToBindingRpcForwarder potential = forwarders.get(service);
86         if (potential != null) {
87             return potential;
88         }
89         if (context == null) {
90             potential = new DomToBindingRpcForwarder(service, mappingService, biRpcRegistry, baRpcRegistry);
91         } else {
92             potential = new DomToBindingRpcForwarder(service, context, mappingService, biRpcRegistry, baRpcRegistry);
93         }
94
95         forwarders.put(service, potential);
96         return potential;
97     }
98
99     @Override
100     public void onRpcImplementationAdded(final QName name) {
101
102         final Optional<Class<? extends RpcService>> rpcInterface = mappingService.getRpcServiceClassFor(
103             name.getNamespace().toString(), name.getFormattedRevision());
104         if (rpcInterface.isPresent()) {
105             getRpcForwarder(rpcInterface.get(), null).registerToBindingBroker();
106         }
107     }
108
109     @Override
110     public void onRpcImplementationRemoved(final QName name) {
111
112     }
113 }