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
17
18
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
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 }