View Javadoc
1   /*
2    * #%L
3    * wcm.io
4    * %%
5    * Copyright (C) 2019 wcm.io
6    * %%
7    * Licensed under the Apache License, Version 2.0 (the "License");
8    * you may not use this file except in compliance with the License.
9    * You may obtain a copy of the License at
10   *
11   *      http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   * #L%
19   */
20  package io.wcm.caravan.jaxrs.publisher.impl;
21  
22  import static io.wcm.caravan.jaxrs.publisher.impl.ServletContainerBridge.isJaxRsGlobal;
23  
24  import org.osgi.framework.Bundle;
25  import org.osgi.framework.BundleContext;
26  import org.osgi.framework.ServiceReference;
27  import org.osgi.util.tracker.ServiceTracker;
28  
29  import io.wcm.caravan.jaxrs.publisher.JaxRsClassesProvider;
30  
31  /**
32   * Tracks {@link JaxRsClassesProvider} instances.
33   */
34  class JaxRsClassesProviderTracker extends ServiceTracker<JaxRsClassesProvider, Object> {
35  
36    private final ServletContainerBridge bridge;
37    private final BundleContext bundleContext;
38    private final Bundle bundle;
39  
40    JaxRsClassesProviderTracker(ServletContainerBridge bridge) {
41      super(bridge.getBundleContext(), JaxRsClassesProvider.class, null);
42      this.bridge = bridge;
43      this.bundleContext = bridge.getBundleContext();
44      this.bundle = bridge.getBundle();
45    }
46  
47    @Override
48    public Object addingService(ServiceReference<JaxRsClassesProvider> reference) {
49      if (isJaxRsGlobal(reference)) {
50        JaxRsClassesProvider serviceInstance = bundle.getBundleContext().getService(reference);
51        ServletContainerBridge.log.debug("Register global classes provider {} for {}", serviceInstance.getClass().getName(), bundle.getSymbolicName());
52        bridge.getGlobalClassesProviders().add(serviceInstance);
53        bridge.markAsDirty();
54      }
55      else if (reference.getBundle() == bundle) {
56        JaxRsClassesProvider serviceInstance = bundle.getBundleContext().getService(reference);
57        ServletContainerBridge.log.debug("Register classes provider {} for {}", serviceInstance.getClass().getName(), bundle.getSymbolicName());
58        bridge.getLocalClassesProviders().add(serviceInstance);
59        bridge.markAsDirty();
60      }
61      return super.addingService(reference);
62    }
63  
64    @Override
65    public void removedService(ServiceReference<JaxRsClassesProvider> reference, Object service) {
66      if (isJaxRsGlobal(reference)) {
67        JaxRsClassesProvider serviceInstance = bundle.getBundleContext().getService(reference);
68        ServletContainerBridge.log.debug("Unregister global classes provider {} for {}", serviceInstance.getClass().getName(), bundle.getSymbolicName());
69        bridge.getGlobalClassesProviders().remove(serviceInstance);
70        bundleContext.ungetService(reference);
71        bridge.markAsDirty();
72      }
73      else if (reference.getBundle() == bundle) {
74        JaxRsClassesProvider serviceInstance = bundle.getBundleContext().getService(reference);
75        ServletContainerBridge.log.debug("Unregister classes provider {} for {}", serviceInstance.getClass().getName(), bundle.getSymbolicName());
76        bridge.getLocalClassesProviders().remove(serviceInstance);
77        bundleContext.ungetService(reference);
78        bridge.markAsDirty();
79      }
80      super.removedService(reference, service);
81    }
82  
83  }