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 }