Merge "Fix for Bug 3"
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / sal / binding / impl / connect / dom / BindingIndependentMountPointForwarder.java
1 package org.opendaylight.controller.sal.binding.impl.connect.dom;
2
3 import java.util.concurrent.ConcurrentMap;
4
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;
12
13 public class BindingIndependentMountPointForwarder {
14
15     private MountProvisionService domMountService;
16     private MountProviderService baMountService;
17     private BindingIndependentMappingService mappingService;
18     
19     private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager();
20     private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager();
21
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;
26
27     public MountProvisionService getDomMountService() {
28         return domMountService;
29     }
30
31     public void setDomMountService(MountProvisionService domMountService) {
32         this.domMountService = domMountService;
33     }
34
35     public void start() {
36         if(domMountService != null && baMountService != null) {
37             domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager);
38             baListenerRegistration = baMountService.registerProvisionListener(bindingForwardingManager);
39         }
40     }
41
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) {
46             return;
47         }
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();
55     }
56
57     private BindingIndependentConnector createForwarder(InstanceIdentifier<?> path, MountProviderInstance baMountPoint,
58             MountProvisionInstance domMountPoint) {
59         BindingIndependentConnector connector = new BindingIndependentConnector();
60         
61         connector.setBindingDataService(baMountPoint);
62         connector.setBindingRpcRegistry(baMountPoint);
63         //connector.setBindingNotificationBroker(baMountPoint);
64         
65         connector.setDomDataService(domMountPoint);
66         connector.setDomRpcRegistry(domMountPoint);
67         //connector.setDomNotificationBroker(domMountPoint);
68         return connector;
69     }
70
71     public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) {
72         InstanceIdentifier<?> baPath;
73         try {
74             baPath = mappingService.fromDataDom(domPath);
75             BindingIndependentConnector potentialConnector = connectors.get(baPath);
76             if(potentialConnector != null) {
77                 return;
78             }
79             tryToDeployConnector(baPath,domPath);
80         } catch (DeserializationException e) {
81             
82         }
83     }
84
85     public synchronized void tryToDeployBindingForwarder(InstanceIdentifier<?> baPath) {
86         BindingIndependentConnector potentialConnector =connectors.get(baPath);
87         if(potentialConnector != null) {
88             return;
89         }
90         org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = mappingService.toDataDom(baPath);
91         tryToDeployConnector(baPath, domPath);
92     }
93
94     public synchronized void undeployBindingForwarder(InstanceIdentifier<?> baPath) {
95         // FIXME: Implement closeMountPoint
96     }
97
98     public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
99         // FIXME: Implement closeMountPoint
100     }
101
102     private class DomMountPointForwardingManager implements MountProvisionListener {
103
104         @Override
105         public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
106             tryToDeployDomForwarder(path);
107         }
108
109         @Override
110         public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
111             undeployDomForwarder(path);
112         }
113     }
114
115     private class BindingMountPointForwardingManager implements
116             org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener {
117
118         @Override
119         public void onMountPointCreated(InstanceIdentifier<?> path) {
120             tryToDeployBindingForwarder(path);
121         }
122
123         @Override
124         public void onMountPointRemoved(InstanceIdentifier<?> path) {
125             undeployBindingForwarder(path);
126         }
127     }
128 }