Add binding adapter components for RPC services
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / osgi / AdaptingComponentTracker.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.opendaylight.mdsal.binding.api.BindingService;
14 import org.opendaylight.mdsal.dom.api.DOMService;
15 import org.osgi.framework.BundleContext;
16 import org.osgi.framework.ServiceReference;
17 import org.osgi.service.component.ComponentFactory;
18 import org.osgi.service.component.ComponentInstance;
19
20 final class AdaptingComponentTracker<D extends DOMService, B extends BindingService>
21         extends AbstractAdaptingTracker<D, B, AdaptingComponentTracker.ComponentHolder<B>> {
22     static final class ComponentHolder<B extends BindingService> {
23         final B binding;
24         ComponentInstance component;
25
26         ComponentHolder(final B binding, final ComponentInstance component) {
27             this.binding = requireNonNull(binding);
28             this.component = requireNonNull(component);
29         }
30     }
31
32     private final ComponentFactory componentFactory;
33
34     AdaptingComponentTracker(final BundleContext ctx, final Class<D> domClass, final Class<B> bindingClass,
35             final Function<D, B> bindingFactory, final ComponentFactory componentFactory) {
36         super(ctx, domClass, bindingClass, bindingFactory);
37         this.componentFactory = requireNonNull(componentFactory);
38     }
39
40     @Override
41     ComponentHolder<B> addingService(final ServiceReference<D> reference, final D dom, final B binding) {
42         return new ComponentHolder<>(binding, componentFactory.newInstance(Dict.fromReference(reference, binding)));
43     }
44
45     @Override
46     void removedService(final ComponentHolder<B> service) {
47         service.component.dispose();
48     }
49
50     @Override
51     void updatedService(final ServiceReference<D> reference, final ComponentHolder<B> service) {
52         service.component.dispose();
53         service.component = componentFactory.newInstance(Dict.fromReference(reference, service.binding));
54     }
55 }