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.yangtools.yang.data.impl.codec.DeserializationException;
11 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
12 import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance;
13 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService;
14 import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener;
15 import org.opendaylight.yangtools.concepts.ListenerRegistration;
16 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
18 public class DomForwardedBindingBrokerImpl extends RootBindingAwareBroker implements DomForwardedBroker {
20 private ProviderSession domProviderContext;
21 private BindingIndependentConnector connector;
23 private MountProvisionService domMountService;
25 private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager();
26 private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager();
28 private ConcurrentMap<InstanceIdentifier<?>, BindingIndependentConnector> connectors = new ConcurrentHashMap<>();
29 private ConcurrentMap<InstanceIdentifier<?>, org.opendaylight.yangtools.yang.data.api.InstanceIdentifier> forwarded = new ConcurrentHashMap<>();
30 private ListenerRegistration<MountProvisionListener> domListenerRegistration;
31 private ListenerRegistration<org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener> baListenerRegistration;
34 public DomForwardedBindingBrokerImpl(String instanceName) {
39 public BindingIndependentConnector getConnector() {
44 public ProviderSession getDomProviderContext() {
45 return domProviderContext;
49 public void setConnector(BindingIndependentConnector connector) {
50 this.connector = connector;
54 public void setDomProviderContext(ProviderSession domProviderContext) {
55 this.domProviderContext = domProviderContext;
59 public void startForwarding() {
60 BindingDomConnectorDeployer.startDataForwarding(getConnector(), getDataBroker(), getDomProviderContext());
61 BindingDomConnectorDeployer.startRpcForwarding(getConnector(), getRpcProviderRegistry(),
62 getDomProviderContext());
63 BindingDomConnectorDeployer.startNotificationForwarding(getConnector(), getNotificationBroker(),
64 getDomProviderContext());
65 startMountpointForwarding();
68 private void startMountpointForwarding() {
69 domMountService = getDomProviderContext().getService(MountProvisionService.class);
70 if (domMountService != null && getMountManager() != null) {
71 domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager);
72 baListenerRegistration = getMountManager().registerProvisionListener(bindingForwardingManager);
76 public MountProvisionService getDomMountService() {
77 return domMountService;
80 public void setDomMountService(MountProvisionService domMountService) {
81 this.domMountService = domMountService;
84 private void tryToDeployConnector(InstanceIdentifier<?> baPath,
85 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
86 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier previous = forwarded.putIfAbsent(baPath, biPath);
87 if (previous != null) {
90 MountProviderInstance baMountPoint = getMountManager().createOrGetMountPoint(baPath);
91 MountProvisionInstance domMountPoint = domMountService.createOrGetMountPoint(biPath);
92 BindingIndependentConnector connector = createForwarder(baPath, baMountPoint, domMountPoint);
93 connectors.put(baPath, connector);
96 private BindingIndependentConnector createForwarder(InstanceIdentifier<?> path, MountProviderInstance baMountPoint,
97 MountProvisionInstance domMountPoint) {
98 BindingIndependentConnector mountConnector = BindingDomConnectorDeployer.createConnector(getConnector());
100 BindingDomConnectorDeployer.startDataForwarding(mountConnector, baMountPoint, domMountPoint);
101 BindingDomConnectorDeployer.startRpcForwarding(mountConnector, baMountPoint, domMountPoint);
102 BindingDomConnectorDeployer.startNotificationForwarding(mountConnector, baMountPoint, domMountPoint);
103 // connector.setDomNotificationBroker(domMountPoint);
107 public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) {
108 InstanceIdentifier<?> baPath;
110 baPath = connector.getMappingService().fromDataDom(domPath);
111 BindingIndependentConnector potentialConnector = connectors.get(baPath);
112 if (potentialConnector != null) {
115 tryToDeployConnector(baPath, domPath);
116 } catch (DeserializationException e) {
121 public synchronized void tryToDeployBindingForwarder(InstanceIdentifier<?> baPath) {
122 BindingIndependentConnector potentialConnector = connectors.get(baPath);
123 if (potentialConnector != null) {
126 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = connector.getMappingService().toDataDom(baPath);
127 tryToDeployConnector(baPath, domPath);
130 public synchronized void undeployBindingForwarder(InstanceIdentifier<?> baPath) {
131 // FIXME: Implement closeMountPoint
134 public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
135 // FIXME: Implement closeMountPoint
138 private class DomMountPointForwardingManager implements MountProvisionListener {
141 public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
142 tryToDeployDomForwarder(path);
146 public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
147 undeployDomForwarder(path);
151 private class BindingMountPointForwardingManager implements
152 org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener {
155 public void onMountPointCreated(InstanceIdentifier<?> path) {
156 tryToDeployBindingForwarder(path);
160 public void onMountPointRemoved(InstanceIdentifier<?> path) {
161 undeployBindingForwarder(path);