1   package com.atlassian.plugin.osgi.factory;
2   
3   import com.atlassian.plugin.ModuleDescriptor;
4   import org.apache.commons.logging.Log;
5   import org.apache.commons.logging.LogFactory;
6   import org.apache.commons.lang.Validate;
7   import org.osgi.framework.Bundle;
8   import org.osgi.framework.ServiceReference;
9   import org.osgi.util.tracker.ServiceTrackerCustomizer;
10  
11  /**
12   * Tracks module descriptors registered as services, then updates the descriptors map accordingly
13   *
14   * @since 2.2.0
15   */
16  class ModuleDescriptorServiceTrackerCustomizer implements ServiceTrackerCustomizer
17  {
18      private static final Log log = LogFactory.getLog(ModuleDescriptorServiceTrackerCustomizer.class);
19  
20      private final Bundle bundle;
21      private final OsgiPlugin plugin;
22  
23      public ModuleDescriptorServiceTrackerCustomizer(OsgiPlugin plugin)
24      {
25          Validate.notNull(plugin);
26          this.bundle = plugin.getBundle();
27          Validate.notNull(bundle);
28          this.plugin = plugin;
29      }
30  
31      public Object addingService(final ServiceReference serviceReference)
32      {
33          ModuleDescriptor<?> descriptor = null;
34          if (serviceReference.getBundle() == bundle)
35          {
36              descriptor = (ModuleDescriptor<?>) bundle.getBundleContext().getService(serviceReference);
37              plugin.addModuleDescriptor(descriptor);
38              if (log.isInfoEnabled())
39              {
40                  log.info("Dynamically registered new module descriptor: " + descriptor.getCompleteKey());
41              }
42          }
43          return descriptor;
44      }
45  
46      public void modifiedService(final ServiceReference serviceReference, final Object o)
47      {
48          if (serviceReference.getBundle() == bundle)
49          {
50              final ModuleDescriptor<?> descriptor = (ModuleDescriptor<?>) o;
51              plugin.addModuleDescriptor(descriptor);
52              if (log.isInfoEnabled())
53              {
54                  log.info("Dynamically upgraded new module descriptor: " + descriptor.getCompleteKey());
55              }
56          }
57      }
58  
59      public void removedService(final ServiceReference serviceReference, final Object o)
60      {
61          if (serviceReference.getBundle() == bundle)
62          {
63              final ModuleDescriptor<?> descriptor = (ModuleDescriptor<?>) o;
64              plugin.clearModuleDescriptor(descriptor.getKey());
65              if (log.isInfoEnabled())
66              {
67                  log.info("Dynamically removed module descriptor: " + descriptor.getCompleteKey());
68              }
69          }
70      }
71  }