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.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
8 import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
9 import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance;
10 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService;
11 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener;
12 import org.opendaylight.yangtools.concepts.ListenerRegistration;
13 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
15 public class BindingIndependentMountPointForwarder {
17 private MountProvisionService domMountService;
18 private MountProviderService baMountService;
19 private BindingIndependentMappingService mappingService;
21 private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager();
22 private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager();
24 private ConcurrentMap<InstanceIdentifier<?>, BindingIndependentConnector> connectors;
25 private ConcurrentMap<InstanceIdentifier<?>, org.opendaylight.yangtools.yang.data.api.InstanceIdentifier> forwarded;
26 private ListenerRegistration<MountProvisionListener> domListenerRegistration;
27 private ListenerRegistration<org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener> baListenerRegistration;
29 public MountProvisionService getDomMountService() {
30 return domMountService;
33 public void setDomMountService(MountProvisionService domMountService) {
34 this.domMountService = domMountService;
38 if(domMountService != null && baMountService != null) {
39 domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager);
40 baListenerRegistration = baMountService.registerProvisionListener(bindingForwardingManager);
44 private void tryToDeployConnector(InstanceIdentifier<?> baPath,
45 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
46 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier previous = forwarded.putIfAbsent(baPath, biPath);
47 if(previous != null) {
50 MountProviderInstance baMountPoint = baMountService.getMountPoint(baPath);
51 MountProvisionInstance domMountPoint = domMountService.getMountPoint(biPath);
52 BindingIndependentConnector connector = createForwarder(baPath, baMountPoint, domMountPoint);
53 connectors.put(baPath, connector);
54 connector.startDataForwarding();
55 connector.startRpcForwarding();
56 connector.startNotificationForwarding();
59 private BindingIndependentConnector createForwarder(InstanceIdentifier<?> path, MountProviderInstance baMountPoint,
60 MountProvisionInstance domMountPoint) {
61 BindingIndependentConnector connector = new BindingIndependentConnector();
63 connector.setBindingDataService(baMountPoint);
64 connector.setBindingRpcRegistry(baMountPoint);
65 //connector.setBindingNotificationBroker(baMountPoint);
67 connector.setDomDataService(domMountPoint);
68 connector.setDomRpcRegistry(domMountPoint);
69 //connector.setDomNotificationBroker(domMountPoint);
73 public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) {
74 InstanceIdentifier<?> baPath;
76 baPath = mappingService.fromDataDom(domPath);
77 BindingIndependentConnector potentialConnector = connectors.get(baPath);
78 if(potentialConnector != null) {
81 tryToDeployConnector(baPath,domPath);
82 } catch (DeserializationException e) {
87 public synchronized void tryToDeployBindingForwarder(InstanceIdentifier<?> baPath) {
88 BindingIndependentConnector potentialConnector =connectors.get(baPath);
89 if(potentialConnector != null) {
92 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = mappingService.toDataDom(baPath);
93 tryToDeployConnector(baPath, domPath);
96 public synchronized void undeployBindingForwarder(InstanceIdentifier<?> baPath) {
97 // FIXME: Implement closeMountPoint
100 public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
101 // FIXME: Implement closeMountPoint
104 private class DomMountPointForwardingManager implements MountProvisionListener {
107 public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
108 tryToDeployDomForwarder(path);
112 public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
113 undeployDomForwarder(path);
117 private class BindingMountPointForwardingManager implements
118 org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener {
121 public void onMountPointCreated(InstanceIdentifier<?> path) {
122 tryToDeployBindingForwarder(path);
126 public void onMountPointRemoved(InstanceIdentifier<?> path) {
127 undeployBindingForwarder(path);