Correct ActionProviderService method definition
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / osgi / AdaptingTracker.java
1 /*
2  * Copyright (c) 2020 PANTHEON.tech, 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 static java.util.Objects.requireNonNull;
11
12 import java.util.function.Function;
13 import org.eclipse.jdt.annotation.NonNull;
14 import org.opendaylight.mdsal.binding.api.BindingService;
15 import org.opendaylight.mdsal.dom.api.DOMService;
16 import org.osgi.framework.BundleContext;
17 import org.osgi.framework.ServiceReference;
18 import org.osgi.service.component.ComponentFactory;
19 import org.osgi.service.component.ComponentInstance;
20 import org.osgi.util.tracker.ServiceTracker;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23
24 /**
25  * A ServiceTracker which adapts a DOMService to a BindingService.
26  *
27  * @param <D> DOMService type
28  * @param <B> BindingService type
29  * @author Robert Varga
30  */
31 final class AdaptingTracker<D extends DOMService, B extends BindingService>
32         extends ServiceTracker<D, AdaptingTracker.ComponentHolder<B>> {
33     static final class ComponentHolder<B extends BindingService> {
34         final B binding;
35         ComponentInstance<? extends B> component;
36
37         ComponentHolder(final B binding, final ComponentInstance<? extends B> component) {
38             this.binding = requireNonNull(binding);
39             this.component = requireNonNull(component);
40         }
41     }
42
43     private static final Logger LOG = LoggerFactory.getLogger(AdaptingTracker.class);
44
45     private final Function<D, B> bindingFactory;
46     private final @NonNull Class<B> bindingClass;
47     private final ComponentFactory<? extends B> componentFactory;
48
49     AdaptingTracker(final BundleContext ctx, final Class<D> domClass, final Class<B> bindingClass,
50             final Function<D, B> bindingFactory, final ComponentFactory<? extends B> componentFactory) {
51         super(ctx, domClass, null);
52         this.bindingClass = requireNonNull(bindingClass);
53         this.bindingFactory = requireNonNull(bindingFactory);
54         this.componentFactory = requireNonNull(componentFactory);
55     }
56
57     @Override
58     public void open(final boolean trackAllServices) {
59         LOG.debug("Starting tracker for {}", bindingClass.getName());
60         super.open(trackAllServices);
61         LOG.debug("Tracker for {} started", bindingClass.getName());
62     }
63
64     @Override
65     public ComponentHolder<B> addingService(final ServiceReference<D> reference) {
66         if (reference == null) {
67             LOG.debug("Null reference for {}, ignoring it", bindingClass.getName());
68             return null;
69         }
70         if (reference.getProperty(ServiceProperties.IGNORE_PROP) != null) {
71             LOG.debug("Ignoring reference {} due to {}", reference, ServiceProperties.IGNORE_PROP);
72             return null;
73         }
74
75         final D dom = context.getService(reference);
76         if (dom == null) {
77             LOG.debug("Could not get {} service from {}, ignoring it", bindingClass.getName(), reference);
78             return null;
79         }
80
81         final B binding = bindingFactory.apply(dom);
82         return new ComponentHolder<>(binding, componentFactory.newInstance(Dict.fromReference(reference, binding)));
83     }
84
85     @Override
86     public void modifiedService(final ServiceReference<D> reference, final ComponentHolder<B> service) {
87         if (service != null && reference != null) {
88             service.component.dispose();
89             service.component = componentFactory.newInstance(Dict.fromReference(reference, service.binding));
90         }
91     }
92
93     @Override
94     public void removedService(final ServiceReference<D> reference, final ComponentHolder<B> service) {
95         if (service != null) {
96             context.ungetService(reference);
97             service.component.dispose();
98             LOG.debug("Unregistered service {}", service);
99         }
100     }
101 }