1 package org.opendaylight.controller.sal.binding.impl.forward;
3 import java.util.concurrent.ConcurrentHashMap;
4 import java.util.concurrent.ConcurrentMap;
6 import org.opendaylight.controller.sal.binding.api.mount.MountProviderInstance;
7 import org.opendaylight.controller.sal.binding.impl.RootBindingAwareBroker;
8 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingDomConnectorDeployer;
9 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector;
10 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentMappingService;
11 import org.opendaylight.controller.sal.binding.impl.connect.dom.DeserializationException;
12 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
13 import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance;
14 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService;
15 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener;
16 import org.opendaylight.yangtools.concepts.ListenerRegistration;
17 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
19 public class DomForwardedBindingBrokerImpl extends RootBindingAwareBroker implements DomForwardedBroker {
21 private ProviderSession domProviderContext;
22 private BindingIndependentConnector connector;
24 private MountProvisionService domMountService;
26 private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager();
27 private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager();
29 private ConcurrentMap<InstanceIdentifier<?>, BindingIndependentConnector> connectors = new ConcurrentHashMap<>();
30 private ConcurrentMap<InstanceIdentifier<?>, org.opendaylight.yangtools.yang.data.api.InstanceIdentifier> forwarded = new ConcurrentHashMap<>();
31 private ListenerRegistration<MountProvisionListener> domListenerRegistration;
32 private ListenerRegistration<org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener> baListenerRegistration;
35 public DomForwardedBindingBrokerImpl(String instanceName) {
40 public BindingIndependentConnector getConnector() {
45 public ProviderSession getDomProviderContext() {
46 return domProviderContext;
50 public void setConnector(BindingIndependentConnector connector) {
51 this.connector = connector;
55 public void setDomProviderContext(ProviderSession domProviderContext) {
56 this.domProviderContext = domProviderContext;
60 public void startForwarding() {
61 BindingDomConnectorDeployer.startDataForwarding(getConnector(), getDataBroker(), getDomProviderContext());
62 BindingDomConnectorDeployer.startRpcForwarding(getConnector(), getRpcProviderRegistry(),
63 getDomProviderContext());
64 BindingDomConnectorDeployer.startNotificationForwarding(getConnector(), getNotificationBroker(),
65 getDomProviderContext());
66 startMountpointForwarding();
69 private void startMountpointForwarding() {
70 domMountService = getDomProviderContext().getService(MountProvisionService.class);
71 if (domMountService != null && getMountManager() != null) {
72 domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager);
73 baListenerRegistration = getMountManager().registerProvisionListener(bindingForwardingManager);
77 public MountProvisionService getDomMountService() {
78 return domMountService;
81 public void setDomMountService(MountProvisionService domMountService) {
82 this.domMountService = domMountService;
85 private void tryToDeployConnector(InstanceIdentifier<?> baPath,
86 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
87 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier previous = forwarded.putIfAbsent(baPath, biPath);
88 if (previous != null) {
91 MountProviderInstance baMountPoint = getMountManager().createOrGetMountPoint(baPath);
92 MountProvisionInstance domMountPoint = domMountService.createOrGetMountPoint(biPath);
93 BindingIndependentConnector connector = createForwarder(baPath, baMountPoint, domMountPoint);
94 connectors.put(baPath, connector);
97 private BindingIndependentConnector createForwarder(InstanceIdentifier<?> path, MountProviderInstance baMountPoint,
98 MountProvisionInstance domMountPoint) {
99 BindingIndependentConnector mountConnector = BindingDomConnectorDeployer.createConnector(getConnector());
101 BindingDomConnectorDeployer.startDataForwarding(mountConnector, baMountPoint, domMountPoint);
102 BindingDomConnectorDeployer.startRpcForwarding(mountConnector, baMountPoint, domMountPoint);
103 BindingDomConnectorDeployer.startNotificationForwarding(mountConnector, baMountPoint, domMountPoint);
104 // connector.setDomNotificationBroker(domMountPoint);
108 public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) {
109 InstanceIdentifier<?> baPath;
111 baPath = connector.getMappingService().fromDataDom(domPath);
112 BindingIndependentConnector potentialConnector = connectors.get(baPath);
113 if (potentialConnector != null) {
116 tryToDeployConnector(baPath, domPath);
117 } catch (DeserializationException e) {
122 public synchronized void tryToDeployBindingForwarder(InstanceIdentifier<?> baPath) {
123 BindingIndependentConnector potentialConnector = connectors.get(baPath);
124 if (potentialConnector != null) {
127 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = connector.getMappingService().toDataDom(baPath);
128 tryToDeployConnector(baPath, domPath);
131 public synchronized void undeployBindingForwarder(InstanceIdentifier<?> baPath) {
132 // FIXME: Implement closeMountPoint
135 public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
136 // FIXME: Implement closeMountPoint
139 private class DomMountPointForwardingManager implements MountProvisionListener {
142 public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
143 tryToDeployDomForwarder(path);
147 public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
148 undeployDomForwarder(path);
152 private class BindingMountPointForwardingManager implements
153 org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener {
156 public void onMountPointCreated(InstanceIdentifier<?> path) {
157 tryToDeployBindingForwarder(path);
161 public void onMountPointRemoved(InstanceIdentifier<?> path) {
162 undeployBindingForwarder(path);