2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.sal.binding.impl.connect.dom;
10 import java.util.concurrent.ConcurrentMap;
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;
22 public class BindingIndependentMountPointForwarder {
24 private MountProvisionService domMountService;
25 private MountProviderService baMountService;
26 private BindingIndependentMappingService mappingService;
28 private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager();
29 private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager();
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;
36 public MountProvisionService getDomMountService() {
37 return domMountService;
40 public void setDomMountService(MountProvisionService domMountService) {
41 this.domMountService = domMountService;
45 if(domMountService != null && baMountService != null) {
46 domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager);
47 baListenerRegistration = baMountService.registerProvisionListener(bindingForwardingManager);
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) {
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();
66 private BindingIndependentConnector createForwarder(InstanceIdentifier<?> path, MountProviderInstance baMountPoint,
67 MountProvisionInstance domMountPoint) {
68 BindingIndependentConnector connector = new BindingIndependentConnector();
70 connector.setBindingDataService(baMountPoint);
71 connector.setBindingRpcRegistry(baMountPoint);
72 //connector.setBindingNotificationBroker(baMountPoint);
74 connector.setDomDataService(domMountPoint);
75 connector.setDomRpcRegistry(domMountPoint);
76 //connector.setDomNotificationBroker(domMountPoint);
80 public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) {
81 InstanceIdentifier<?> baPath;
83 baPath = mappingService.fromDataDom(domPath);
84 BindingIndependentConnector potentialConnector = connectors.get(baPath);
85 if(potentialConnector != null) {
88 tryToDeployConnector(baPath,domPath);
89 } catch (DeserializationException e) {
94 public synchronized void tryToDeployBindingForwarder(InstanceIdentifier<?> baPath) {
95 BindingIndependentConnector potentialConnector =connectors.get(baPath);
96 if(potentialConnector != null) {
99 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = mappingService.toDataDom(baPath);
100 tryToDeployConnector(baPath, domPath);
103 public synchronized void undeployBindingForwarder(InstanceIdentifier<?> baPath) {
104 // FIXME: Implement closeMountPoint
107 public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
108 // FIXME: Implement closeMountPoint
111 private class DomMountPointForwardingManager implements MountProvisionListener {
114 public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
115 tryToDeployDomForwarder(path);
119 public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
120 undeployDomForwarder(path);
124 private class BindingMountPointForwardingManager implements
125 org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener {
128 public void onMountPointCreated(InstanceIdentifier<?> path) {
129 tryToDeployBindingForwarder(path);
133 public void onMountPointRemoved(InstanceIdentifier<?> path) {
134 undeployBindingForwarder(path);