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