2 * Copyright (c) 2018 Pantheon Technologies, s.r.o. 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.mdsal.binding.dom.adapter.osgi;
10 import com.google.common.collect.ImmutableList;
11 import java.util.List;
12 import javax.annotation.concurrent.GuardedBy;
13 import org.opendaylight.mdsal.binding.api.BindingService;
14 import org.opendaylight.mdsal.binding.api.DataBroker;
15 import org.opendaylight.mdsal.binding.api.DataTreeService;
16 import org.opendaylight.mdsal.binding.api.MountPointService;
17 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
18 import org.opendaylight.mdsal.binding.api.NotificationService;
19 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
20 import org.opendaylight.mdsal.binding.api.RpcProviderService;
21 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter;
22 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataTreeServiceAdapter;
23 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMMountPointServiceAdapter;
24 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationPublishServiceAdapter;
25 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationServiceAdapter;
26 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcProviderServiceAdapter;
27 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcServiceAdapter;
28 import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
29 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
30 import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
31 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
32 import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
33 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
34 import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
35 import org.opendaylight.mdsal.dom.api.DOMRpcService;
36 import org.opendaylight.mdsal.dom.api.DOMService;
37 import org.osgi.framework.BundleContext;
38 import org.osgi.util.tracker.ServiceTracker;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
43 * A component which watches the OSGi Service Registry for known {@link DOMService}s and publishes corresponding
44 * {@link BindingService}s backed by them.
46 * @author Robert Varga
48 public final class DynamicBindingAdapter implements AutoCloseable {
49 private static final Logger LOG = LoggerFactory.getLogger(DynamicBindingAdapter.class);
52 private List<AdaptingTracker<?, ?>> trackers;
54 public DynamicBindingAdapter(final BindingToNormalizedNodeCodec codec, final BundleContext ctx) {
55 trackers = ImmutableList.of(
56 new AdaptingTracker<>(ctx, DOMDataBroker.class, DataBroker.class, codec,
57 BindingDOMDataBrokerAdapter::new),
58 new AdaptingTracker<>(ctx, DOMDataTreeService.class, DataTreeService.class, codec,
59 BindingDOMDataTreeServiceAdapter::create),
60 new AdaptingTracker<>(ctx, DOMMountPointService.class, MountPointService.class, codec,
61 BindingDOMMountPointServiceAdapter::new),
62 new AdaptingTracker<>(ctx, DOMNotificationService.class, NotificationService.class, codec,
63 BindingDOMNotificationServiceAdapter::new),
64 new AdaptingTracker<>(ctx, DOMNotificationPublishService.class, NotificationPublishService.class, codec,
65 BindingDOMNotificationPublishServiceAdapter::new),
66 new AdaptingTracker<>(ctx, DOMRpcService.class, RpcConsumerRegistry.class, codec,
67 BindingDOMRpcServiceAdapter::new),
68 new AdaptingTracker<>(ctx, DOMRpcProviderService.class, RpcProviderService.class, codec,
69 BindingDOMRpcProviderServiceAdapter::new));
71 LOG.debug("Starting {} DOMService trackers", trackers.size());
72 trackers.forEach(ServiceTracker::open);
73 LOG.info("{} DOMService trackers started", trackers.size());
78 final List<AdaptingTracker<?, ?>> toClose;
81 trackers = ImmutableList.of();
84 LOG.debug("Stopping {} DOMService trackers", toClose.size());
85 if (!toClose.isEmpty()) {
86 toClose.forEach(AdaptingTracker::close);
87 LOG.info("{} DOMService trackers stopped", toClose.size());