View Javadoc
1   package com.atlassian.plugin.osgi.factory;
2   
3   import com.atlassian.plugin.ModuleDescriptor;
4   import com.atlassian.plugin.event.PluginEventManager;
5   import com.atlassian.plugin.event.events.PluginModuleAvailableEvent;
6   import com.atlassian.plugin.event.events.PluginModuleUnavailableEvent;
7   import org.osgi.framework.Bundle;
8   import org.osgi.framework.ServiceReference;
9   import org.osgi.util.tracker.ServiceTrackerCustomizer;
10  import org.slf4j.Logger;
11  import org.slf4j.LoggerFactory;
12  
13  import static com.google.common.base.Preconditions.checkNotNull;
14  
15  /**
16   * Tracks module descriptors registered as services, then updates the descriptors map accordingly
17   *
18   * @since 2.2.0
19   */
20  class ModuleDescriptorServiceTrackerCustomizer implements ServiceTrackerCustomizer {
21      private static final Logger log = LoggerFactory.getLogger(ModuleDescriptorServiceTrackerCustomizer.class);
22  
23      private final Bundle bundle;
24      private final OsgiPlugin plugin;
25      private final PluginEventManager pluginEventManager;
26  
27      public ModuleDescriptorServiceTrackerCustomizer(OsgiPlugin plugin, PluginEventManager pluginEventManager) {
28          this.plugin = checkNotNull(plugin);
29          this.bundle = checkNotNull(plugin.getBundle());
30          this.pluginEventManager = checkNotNull(pluginEventManager);
31      }
32  
33      public Object addingService(final ServiceReference serviceReference) {
34          ModuleDescriptor<?> descriptor = null;
35          if (serviceReference.getBundle() == bundle) {
36              descriptor = (ModuleDescriptor<?>) bundle.getBundleContext().getService(serviceReference);
37              plugin.addModuleDescriptor(descriptor);
38              if (log.isInfoEnabled()) {
39                  log.info("Dynamically registered new module descriptor: " + descriptor.getCompleteKey());
40              }
41              pluginEventManager.broadcast(new PluginModuleAvailableEvent(descriptor));
42          }
43          return descriptor;
44      }
45  
46      public void modifiedService(final ServiceReference serviceReference, final Object o) {
47          // Don't bother doing anything as it only represents a change in properties
48      }
49  
50      public void removedService(final ServiceReference serviceReference, final Object o) {
51          if (serviceReference.getBundle() == bundle) {
52              final ModuleDescriptor<?> descriptor = (ModuleDescriptor<?>) o;
53              pluginEventManager.broadcast(new PluginModuleUnavailableEvent(descriptor));
54              plugin.clearModuleDescriptor(descriptor.getKey());
55              if (log.isInfoEnabled()) {
56                  log.info("Dynamically removed module descriptor: " + descriptor.getCompleteKey());
57              }
58          }
59      }
60  }