Add ActionProviderService adapter
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / osgi / DynamicBindingAdapter.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o. 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.mdsal.binding.dom.adapter.osgi;
9
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.ActionProviderService;
14 import org.opendaylight.mdsal.binding.api.ActionService;
15 import org.opendaylight.mdsal.binding.api.BindingService;
16 import org.opendaylight.mdsal.binding.api.DataBroker;
17 import org.opendaylight.mdsal.binding.api.DataTreeService;
18 import org.opendaylight.mdsal.binding.api.MountPointService;
19 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
20 import org.opendaylight.mdsal.binding.api.NotificationService;
21 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
22 import org.opendaylight.mdsal.binding.api.RpcProviderService;
23 import org.opendaylight.mdsal.binding.dom.adapter.spi.AdapterFactory;
24 import org.opendaylight.mdsal.dom.api.DOMActionProviderService;
25 import org.opendaylight.mdsal.dom.api.DOMActionService;
26 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
27 import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
28 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
29 import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
30 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
31 import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
32 import org.opendaylight.mdsal.dom.api.DOMRpcService;
33 import org.opendaylight.mdsal.dom.api.DOMService;
34 import org.osgi.framework.BundleContext;
35 import org.osgi.util.tracker.ServiceTracker;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 /**
40  * A component which watches the OSGi Service Registry for known {@link DOMService}s and publishes corresponding
41  * {@link BindingService}s backed by them.
42  *
43  * @author Robert Varga
44  */
45 public final class DynamicBindingAdapter implements AutoCloseable {
46     private static final Logger LOG = LoggerFactory.getLogger(DynamicBindingAdapter.class);
47
48     @GuardedBy("this")
49     private List<AdaptingTracker<?, ?>> trackers;
50
51     public DynamicBindingAdapter(final AdapterFactory factory, final BundleContext ctx) {
52         trackers = ImmutableList.of(
53             new AdaptingTracker<>(ctx, DOMDataBroker.class, DataBroker.class, factory::createDataBroker),
54             new AdaptingTracker<>(ctx, DOMDataTreeService.class, DataTreeService.class, factory::createDataTreeService),
55             new AdaptingTracker<>(ctx, DOMMountPointService.class, MountPointService.class,
56                     factory::createMountPointService),
57             new AdaptingTracker<>(ctx, DOMNotificationService.class, NotificationService.class,
58                     factory::createNotificationService),
59             new AdaptingTracker<>(ctx, DOMNotificationPublishService.class, NotificationPublishService.class,
60                     factory::createNotificationPublishService),
61             new AdaptingTracker<>(ctx, DOMRpcService.class, RpcConsumerRegistry.class,
62                     factory::createRpcConsumerRegistry),
63             new AdaptingTracker<>(ctx, DOMRpcProviderService.class, RpcProviderService.class,
64                     factory::createRpcProviderService),
65             new AdaptingTracker<>(ctx, DOMActionService.class, ActionService.class, factory::createActionService),
66             new AdaptingTracker<>(ctx, DOMActionProviderService.class, ActionProviderService.class,
67                 factory::createActionProviderService));
68
69         LOG.debug("Starting {} DOMService trackers", trackers.size());
70         trackers.forEach(ServiceTracker::open);
71         LOG.info("{} DOMService trackers started", trackers.size());
72     }
73
74     @Override
75     public void close() {
76         final List<AdaptingTracker<?, ?>> toClose;
77         synchronized (this) {
78             toClose = trackers;
79             trackers = ImmutableList.of();
80         }
81
82         LOG.debug("Stopping {} DOMService trackers", toClose.size());
83         if (!toClose.isEmpty()) {
84             toClose.forEach(AdaptingTracker::close);
85             LOG.info("{} DOMService trackers stopped", toClose.size());
86         }
87     }
88 }