1 package org.opendaylight.controller.sal.binding.impl.connect.dom;
3 import java.util.concurrent.ConcurrentMap;
5 import org.opendaylight.controller.sal.binding.api.mount.MountProviderInstance;
6 import org.opendaylight.controller.sal.binding.api.mount.MountProviderService;
7 import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance;
8 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService;
9 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener;
10 import org.opendaylight.yangtools.concepts.ListenerRegistration;
11 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
13 public class BindingIndependentMountPointForwarder {
15 private MountProvisionService domMountService;
16 private MountProviderService baMountService;
17 private BindingIndependentMappingService mappingService;
19 private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager();
20 private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager();
22 private ConcurrentMap<InstanceIdentifier<?>, BindingIndependentConnector> connectors;
23 private ConcurrentMap<InstanceIdentifier<?>, org.opendaylight.yangtools.yang.data.api.InstanceIdentifier> forwarded;
24 private ListenerRegistration<MountProvisionListener> domListenerRegistration;
25 private ListenerRegistration<org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener> baListenerRegistration;
27 public MountProvisionService getDomMountService() {
28 return domMountService;
31 public void setDomMountService(MountProvisionService domMountService) {
32 this.domMountService = domMountService;
36 if(domMountService != null && baMountService != null) {
37 domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager);
38 baListenerRegistration = baMountService.registerProvisionListener(bindingForwardingManager);
42 private void tryToDeployConnector(InstanceIdentifier<?> baPath,
43 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
44 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier previous = forwarded.putIfAbsent(baPath, biPath);
45 if(previous != null) {
48 MountProviderInstance baMountPoint = baMountService.getMountPoint(baPath);
49 MountProvisionInstance domMountPoint = domMountService.getMountPoint(biPath);
50 BindingIndependentConnector connector = createForwarder(baPath, baMountPoint, domMountPoint);
51 connectors.put(baPath, connector);
52 connector.startDataForwarding();
53 connector.startRpcForwarding();
54 connector.startNotificationForwarding();
57 private BindingIndependentConnector createForwarder(InstanceIdentifier<?> path, MountProviderInstance baMountPoint,
58 MountProvisionInstance domMountPoint) {
59 BindingIndependentConnector connector = new BindingIndependentConnector();
61 connector.setBindingDataService(baMountPoint);
62 connector.setBindingRpcRegistry(baMountPoint);
63 //connector.setBindingNotificationBroker(baMountPoint);
65 connector.setDomDataService(domMountPoint);
66 connector.setDomRpcRegistry(domMountPoint);
67 //connector.setDomNotificationBroker(domMountPoint);
71 public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) {
72 InstanceIdentifier<?> baPath;
74 baPath = mappingService.fromDataDom(domPath);
75 BindingIndependentConnector potentialConnector = connectors.get(baPath);
76 if(potentialConnector != null) {
79 tryToDeployConnector(baPath,domPath);
80 } catch (DeserializationException e) {
85 public synchronized void tryToDeployBindingForwarder(InstanceIdentifier<?> baPath) {
86 BindingIndependentConnector potentialConnector =connectors.get(baPath);
87 if(potentialConnector != null) {
90 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = mappingService.toDataDom(baPath);
91 tryToDeployConnector(baPath, domPath);
94 public synchronized void undeployBindingForwarder(InstanceIdentifier<?> baPath) {
95 // FIXME: Implement closeMountPoint
98 public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
99 // FIXME: Implement closeMountPoint
102 private class DomMountPointForwardingManager implements MountProvisionListener {
105 public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
106 tryToDeployDomForwarder(path);
110 public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
111 undeployDomForwarder(path);
115 private class BindingMountPointForwardingManager implements
116 org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener {
119 public void onMountPointCreated(InstanceIdentifier<?> path) {
120 tryToDeployBindingForwarder(path);
124 public void onMountPointRemoved(InstanceIdentifier<?> path) {
125 undeployBindingForwarder(path);