1 package com.atlassian.plugin.refimpl;
2
3 import com.atlassian.plugin.descriptors.servlet.ServletModuleManager;
4 import com.atlassian.plugin.descriptors.servlet.ServletModuleDescriptor;
5 import com.atlassian.plugin.osgi.container.OsgiContainerManager;
6 import com.atlassian.plugin.osgi.container.PackageScannerConfiguration;
7 import com.atlassian.plugin.osgi.container.impl.DefaultPackageScannerConfiguration;
8 import com.atlassian.plugin.osgi.container.felix.FelixOsgiContainerManager;
9 import com.atlassian.plugin.osgi.loader.OsgiPluginLoader;
10 import com.atlassian.plugin.osgi.loader.BundledOsgiPluginLoader;
11 import com.atlassian.plugin.osgi.hostcomponents.HostComponentProvider;
12 import com.atlassian.plugin.osgi.hostcomponents.ComponentRegistrar;
13 import com.atlassian.plugin.*;
14 import com.atlassian.plugin.event.PluginEventManager;
15 import com.atlassian.plugin.event.impl.PluginEventManagerImpl;
16 import com.atlassian.plugin.refimpl.servlet.SimpleServletModuleDescriptor;
17 import com.atlassian.plugin.loaders.DefaultPluginFactory;
18 import com.atlassian.plugin.store.MemoryPluginStateStore;
19
20 import javax.servlet.ServletContext;
21 import java.io.File;
22 import java.util.Arrays;
23
24
25
26
27
28
29
30
31 public class ContainerManager {
32
33 private final ServletModuleManager servletModuleManager;
34 private final OsgiContainerManager osgiContainerManager;
35 private final DefaultPluginManager pluginManager;
36 private final PluginEventManager pluginEventManager;
37 private final HostComponentProvider hostComponentProvider;
38 private final DefaultModuleDescriptorFactory moduleDescriptorFactory;
39
40 private static ContainerManager instance;
41
42 public ContainerManager(ServletContext servletContext) {
43 instance = this;
44 servletModuleManager = new ServletModuleManager();
45
46 PackageScannerConfiguration scannerConfig = new DefaultPackageScannerConfiguration();
47 osgiContainerManager = new FelixOsgiContainerManager(new File(servletContext.getRealPath("/WEB-INF/framework-bundles")),
48 scannerConfig);
49
50 hostComponentProvider = new SimpleHostComponentProvider();
51 OsgiPluginLoader osgiPluginLoader = new OsgiPluginLoader(
52 new File(servletContext.getRealPath("/WEB-INF/plugins")),
53 PluginManager.PLUGIN_DESCRIPTOR_FILENAME,
54 new DefaultPluginFactory(),
55 osgiContainerManager,
56 hostComponentProvider);
57
58 BundledOsgiPluginLoader bundledPluginLoader = new BundledOsgiPluginLoader(
59 getClass().getResource("/atlassian-bundled-plugins.zip"),
60 new File(servletContext.getRealPath("/WEB-INF/bundled-plugins")),
61 PluginManager.PLUGIN_DESCRIPTOR_FILENAME,
62 new DefaultPluginFactory(),
63 osgiContainerManager,
64 hostComponentProvider);
65 moduleDescriptorFactory = new DefaultModuleDescriptorFactory();
66 moduleDescriptorFactory.addModuleDescriptor("servlet", SimpleServletModuleDescriptor.class);
67 pluginEventManager = new PluginEventManagerImpl();
68 pluginManager = new DefaultPluginManager(new MemoryPluginStateStore(), Arrays.asList(bundledPluginLoader, osgiPluginLoader),
69 moduleDescriptorFactory, pluginEventManager);
70 try {
71 pluginManager.init();
72 } catch (PluginParseException e) {
73 e.printStackTrace();
74 }
75
76 }
77
78 public static synchronized void setInstance(ContainerManager mgr) {
79 instance = mgr;
80 }
81
82 public static synchronized ContainerManager getInstance() {
83 return instance;
84 }
85
86 public ServletModuleManager getServletModuleManager() {
87 return servletModuleManager;
88 }
89
90 public OsgiContainerManager getOsgiContainerManager() {
91 return osgiContainerManager;
92 }
93
94 public PluginManager getPluginManager() {
95 return pluginManager;
96 }
97
98 public HostComponentProvider getHostComponentProvider() {
99 return hostComponentProvider;
100 }
101
102 public ModuleDescriptorFactory getModuleDescriptorFactory() {
103 return moduleDescriptorFactory;
104 }
105
106 private class SimpleHostComponentProvider implements HostComponentProvider {
107
108 public void provide(ComponentRegistrar componentRegistrar) {
109 componentRegistrar.register(PluginManager.class, PluginAccessor.class, PluginController.class).forInstance(pluginManager).withName("pluginManager");
110 componentRegistrar.register(PluginEventManager.class).forInstance(pluginEventManager).withName("pluginEventManager");
111 }
112 }
113 }