Bulk-add copyright headers to java files
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / sal / binding / impl / connect / dom / BindingIndependentMountPointForwarder.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.sal.binding.impl.connect.dom;
9
10 import java.util.concurrent.ConcurrentMap;
11
12 import org.opendaylight.controller.sal.binding.api.mount.MountProviderInstance;
13 import org.opendaylight.controller.sal.binding.api.mount.MountProviderService;
14 import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
15 import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
16 import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance;
17 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService;
18 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener;
19 import org.opendaylight.yangtools.concepts.ListenerRegistration;
20 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
21
22 public class BindingIndependentMountPointForwarder {
23
24     private MountProvisionService domMountService;
25     private MountProviderService baMountService;
26     private BindingIndependentMappingService mappingService;
27
28     private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager();
29     private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager();
30
31     private ConcurrentMap<InstanceIdentifier<?>, BindingIndependentConnector> connectors;
32     private ConcurrentMap<InstanceIdentifier<?>, org.opendaylight.yangtools.yang.data.api.InstanceIdentifier> forwarded;
33     private ListenerRegistration<MountProvisionListener> domListenerRegistration;
34     private ListenerRegistration<org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener> baListenerRegistration;
35
36     public MountProvisionService getDomMountService() {
37         return domMountService;
38     }
39
40     public void setDomMountService(MountProvisionService domMountService) {
41         this.domMountService = domMountService;
42     }
43
44     public void start() {
45         if(domMountService != null && baMountService != null) {
46             domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager);
47             baListenerRegistration = baMountService.registerProvisionListener(bindingForwardingManager);
48         }
49     }
50
51     private void tryToDeployConnector(InstanceIdentifier<?> baPath,
52             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
53         org.opendaylight.yangtools.yang.data.api.InstanceIdentifier previous = forwarded.putIfAbsent(baPath, biPath);
54         if(previous != null) {
55             return;
56         }
57         MountProviderInstance baMountPoint = baMountService.getMountPoint(baPath);
58         MountProvisionInstance domMountPoint = domMountService.getMountPoint(biPath);
59         BindingIndependentConnector connector = createForwarder(baPath, baMountPoint, domMountPoint);
60         connectors.put(baPath, connector);
61         connector.startDataForwarding();
62         connector.startRpcForwarding();
63         connector.startNotificationForwarding();
64     }
65
66     private BindingIndependentConnector createForwarder(InstanceIdentifier<?> path, MountProviderInstance baMountPoint,
67             MountProvisionInstance domMountPoint) {
68         BindingIndependentConnector connector = new BindingIndependentConnector();
69
70         connector.setBindingDataService(baMountPoint);
71         connector.setBindingRpcRegistry(baMountPoint);
72         //connector.setBindingNotificationBroker(baMountPoint);
73
74         connector.setDomDataService(domMountPoint);
75         connector.setDomRpcRegistry(domMountPoint);
76         //connector.setDomNotificationBroker(domMountPoint);
77         return connector;
78     }
79
80     public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) {
81         InstanceIdentifier<?> baPath;
82         try {
83             baPath = mappingService.fromDataDom(domPath);
84             BindingIndependentConnector potentialConnector = connectors.get(baPath);
85             if(potentialConnector != null) {
86                 return;
87             }
88             tryToDeployConnector(baPath,domPath);
89         } catch (DeserializationException e) {
90
91         }
92     }
93
94     public synchronized void tryToDeployBindingForwarder(InstanceIdentifier<?> baPath) {
95         BindingIndependentConnector potentialConnector =connectors.get(baPath);
96         if(potentialConnector != null) {
97             return;
98         }
99         org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = mappingService.toDataDom(baPath);
100         tryToDeployConnector(baPath, domPath);
101     }
102
103     public synchronized void undeployBindingForwarder(InstanceIdentifier<?> baPath) {
104         // FIXME: Implement closeMountPoint
105     }
106
107     public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
108         // FIXME: Implement closeMountPoint
109     }
110
111     private class DomMountPointForwardingManager implements MountProvisionListener {
112
113         @Override
114         public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
115             tryToDeployDomForwarder(path);
116         }
117
118         @Override
119         public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
120             undeployDomForwarder(path);
121         }
122     }
123
124     private class BindingMountPointForwardingManager implements
125             org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener {
126
127         @Override
128         public void onMountPointCreated(InstanceIdentifier<?> path) {
129             tryToDeployBindingForwarder(path);
130         }
131
132         @Override
133         public void onMountPointRemoved(InstanceIdentifier<?> path) {
134             undeployBindingForwarder(path);
135         }
136     }
137 }