1f68b347ca878628fc2ead1a8f72c2a143d3b6f7
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / sal / binding / impl / forward / DomForwardedBindingBrokerImpl.java
1 package org.opendaylight.controller.sal.binding.impl.forward;
2
3 import java.util.concurrent.ConcurrentHashMap;
4 import java.util.concurrent.ConcurrentMap;
5
6 import org.opendaylight.controller.sal.binding.api.mount.MountProviderInstance;
7 import org.opendaylight.controller.sal.binding.impl.RootBindingAwareBroker;
8 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingDomConnectorDeployer;
9 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector;
10 import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
11 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
12 import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance;
13 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService;
14 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener;
15 import org.opendaylight.yangtools.concepts.ListenerRegistration;
16 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
17
18 public class DomForwardedBindingBrokerImpl extends RootBindingAwareBroker implements DomForwardedBroker {
19
20     private ProviderSession domProviderContext;
21     private BindingIndependentConnector connector;
22
23     private MountProvisionService domMountService;
24
25     private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager();
26     private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager();
27
28     private ConcurrentMap<InstanceIdentifier<?>, BindingIndependentConnector> connectors = new ConcurrentHashMap<>();
29     private ConcurrentMap<InstanceIdentifier<?>, org.opendaylight.yangtools.yang.data.api.InstanceIdentifier> forwarded = new ConcurrentHashMap<>();
30     private ListenerRegistration<MountProvisionListener> domListenerRegistration;
31     private ListenerRegistration<org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener> baListenerRegistration;
32
33
34     public DomForwardedBindingBrokerImpl(String instanceName) {
35         super(instanceName);
36     }
37
38     @Override
39     public BindingIndependentConnector getConnector() {
40         return connector;
41     }
42
43     @Override
44     public ProviderSession getDomProviderContext() {
45         return domProviderContext;
46     }
47
48     @Override
49     public void setConnector(BindingIndependentConnector connector) {
50         this.connector = connector;
51     }
52
53     @Override
54     public void setDomProviderContext(ProviderSession domProviderContext) {
55         this.domProviderContext = domProviderContext;
56     }
57
58     @Override
59     public void startForwarding() {
60         BindingDomConnectorDeployer.startDataForwarding(getConnector(), getDataBroker(), getDomProviderContext());
61         BindingDomConnectorDeployer.startRpcForwarding(getConnector(), getRpcProviderRegistry(),
62                 getDomProviderContext());
63         BindingDomConnectorDeployer.startNotificationForwarding(getConnector(), getNotificationBroker(),
64                 getDomProviderContext());
65         startMountpointForwarding();
66     }
67
68     private void startMountpointForwarding() {
69         domMountService = getDomProviderContext().getService(MountProvisionService.class);
70         if (domMountService != null && getMountManager() != null) {
71             domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager);
72             baListenerRegistration = getMountManager().registerProvisionListener(bindingForwardingManager);
73         }
74     }
75
76     public MountProvisionService getDomMountService() {
77         return domMountService;
78     }
79
80     public void setDomMountService(MountProvisionService domMountService) {
81         this.domMountService = domMountService;
82     }
83
84     private void tryToDeployConnector(InstanceIdentifier<?> baPath,
85             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
86         org.opendaylight.yangtools.yang.data.api.InstanceIdentifier previous = forwarded.putIfAbsent(baPath, biPath);
87         if (previous != null) {
88             return;
89         }
90         MountProviderInstance baMountPoint = getMountManager().createOrGetMountPoint(baPath);
91         MountProvisionInstance domMountPoint = domMountService.createOrGetMountPoint(biPath);
92         BindingIndependentConnector connector = createForwarder(baPath, baMountPoint, domMountPoint);
93         connectors.put(baPath, connector);
94     }
95
96     private BindingIndependentConnector createForwarder(InstanceIdentifier<?> path, MountProviderInstance baMountPoint,
97             MountProvisionInstance domMountPoint) {
98         BindingIndependentConnector mountConnector = BindingDomConnectorDeployer.createConnector(getConnector());
99
100         BindingDomConnectorDeployer.startDataForwarding(mountConnector, baMountPoint, domMountPoint);
101         BindingDomConnectorDeployer.startRpcForwarding(mountConnector, baMountPoint, domMountPoint);
102         BindingDomConnectorDeployer.startNotificationForwarding(mountConnector, baMountPoint, domMountPoint);
103         // connector.setDomNotificationBroker(domMountPoint);
104         return connector;
105     }
106
107     public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) {
108         InstanceIdentifier<?> baPath;
109         try {
110             baPath = connector.getMappingService().fromDataDom(domPath);
111             BindingIndependentConnector potentialConnector = connectors.get(baPath);
112             if (potentialConnector != null) {
113                 return;
114             }
115             tryToDeployConnector(baPath, domPath);
116         } catch (DeserializationException e) {
117
118         }
119     }
120
121     public synchronized void tryToDeployBindingForwarder(InstanceIdentifier<?> baPath) {
122         BindingIndependentConnector potentialConnector = connectors.get(baPath);
123         if (potentialConnector != null) {
124             return;
125         }
126         org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = connector.getMappingService().toDataDom(baPath);
127         tryToDeployConnector(baPath, domPath);
128     }
129
130     public synchronized void undeployBindingForwarder(InstanceIdentifier<?> baPath) {
131         // FIXME: Implement closeMountPoint
132     }
133
134     public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
135         // FIXME: Implement closeMountPoint
136     }
137
138     private class DomMountPointForwardingManager implements MountProvisionListener {
139
140         @Override
141         public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
142             tryToDeployDomForwarder(path);
143         }
144
145         @Override
146         public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
147             undeployDomForwarder(path);
148         }
149     }
150
151     private class BindingMountPointForwardingManager implements
152             org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener {
153
154         @Override
155         public void onMountPointCreated(InstanceIdentifier<?> path) {
156             tryToDeployBindingForwarder(path);
157         }
158
159         @Override
160         public void onMountPointRemoved(InstanceIdentifier<?> path) {
161             undeployBindingForwarder(path);
162         }
163     }
164
165 }