1   package com.atlassian.plugins.rest.module.jersey;
2   
3   import com.atlassian.plugin.AutowireCapablePlugin;
4   import com.atlassian.plugin.Plugin;
5   import com.atlassian.plugin.PluginAccessor;
6   import com.atlassian.plugin.event.PluginEventListener;
7   import com.atlassian.plugin.event.PluginEventManager;
8   import com.atlassian.plugin.event.events.PluginEnabledEvent;
9   import com.atlassian.plugin.osgi.util.OsgiHeaderUtil;
10  import com.atlassian.sal.api.net.NonMarshallingRequestFactory;
11  import com.atlassian.sal.api.net.RequestFactory;
12  import org.osgi.framework.Bundle;
13  import org.osgi.framework.ServiceFactory;
14  import org.osgi.framework.ServiceRegistration;
15  
16  public class JerseyRequestFactoryServiceFactory implements ServiceFactory
17  {
18      private final PluginAccessor pluginAccessor;
19      private final NonMarshallingRequestFactory requestFactory;
20      private final PluginEventManager pluginEventManager;
21  
22      public JerseyRequestFactoryServiceFactory(PluginAccessor pluginAccessor, NonMarshallingRequestFactory requestFactory, PluginEventManager pluginEventManager)
23      {
24          this.pluginAccessor = pluginAccessor;
25          this.requestFactory = requestFactory;
26          this.pluginEventManager = pluginEventManager;
27      }
28  
29      public Object getService(final Bundle bundle, final ServiceRegistration serviceRegistration)
30      {
31          String pluginKey = OsgiHeaderUtil.getPluginKey(bundle);
32  
33          Plugin plugin = pluginAccessor.getPlugin(pluginKey);
34  
35          if (!(plugin instanceof AutowireCapablePlugin))
36          {
37              throw new IllegalStateException("Can't create RequestFactory for non OsgiPlugin");
38          }
39  
40          JerseyRequestFactory factory = new JerseyRequestFactory(requestFactory, plugin, bundle);
41  
42          pluginEventManager.register(new PluginEnabledListener(factory, pluginEventManager));
43  
44          return factory;
45      }
46  
47      public void ungetService(final Bundle bundle, final ServiceRegistration serviceRegistration, final Object o)
48      {
49          ((JerseyRequestFactory) o).destroy();
50      }
51  
52      public static class PluginEnabledListener
53      {
54          private final JerseyRequestFactory factory;
55          private final PluginEventManager pluginEventManager;
56  
57          private PluginEnabledListener(JerseyRequestFactory factory, PluginEventManager pluginEventManager)
58          {
59              this.factory = factory;
60              this.pluginEventManager = pluginEventManager;
61          }
62  
63          @PluginEventListener
64          public void init(PluginEnabledEvent event)
65          {
66              factory.init();
67              pluginEventManager.unregister(this);
68          }
69      }
70  }