1 package com.atlassian.plugin.refimpl;
2
3 import com.atlassian.plugin.*;
4 import com.atlassian.plugin.event.PluginEventManager;
5 import com.atlassian.plugin.event.impl.DefaultPluginEventManager;
6 import com.atlassian.plugin.loaders.DirectoryPluginLoader;
7 import com.atlassian.plugin.loaders.PluginLoader;
8 import com.atlassian.plugin.osgi.container.OsgiContainerManager;
9 import com.atlassian.plugin.osgi.container.PackageScannerConfiguration;
10 import com.atlassian.plugin.osgi.container.felix.FelixOsgiContainerManager;
11 import com.atlassian.plugin.osgi.container.impl.DefaultPackageScannerConfiguration;
12 import com.atlassian.plugin.osgi.factory.OsgiBundleFactory;
13 import com.atlassian.plugin.osgi.factory.OsgiPluginFactory;
14 import com.atlassian.plugin.osgi.hostcomponents.ComponentRegistrar;
15 import com.atlassian.plugin.osgi.hostcomponents.HostComponentProvider;
16 import com.atlassian.plugin.refimpl.servlet.*;
17 import com.atlassian.plugin.refimpl.webresource.SimpleWebResourceIntegration;
18 import com.atlassian.plugin.repositories.FilePluginInstaller;
19 import com.atlassian.plugin.servlet.*;
20 import com.atlassian.plugin.servlet.descriptors.ServletContextParamModuleDescriptor;
21 import com.atlassian.plugin.store.MemoryPluginStateStore;
22 import com.atlassian.plugin.webresource.WebResourceManager;
23 import com.atlassian.plugin.webresource.WebResourceManagerImpl;
24 import com.atlassian.plugin.webresource.WebResourceModuleDescriptor;
25
26 import javax.servlet.ServletContext;
27 import java.io.File;
28 import java.util.*;
29
30
31
32
33 public class ContainerManager
34 {
35 private final ServletModuleManager servletModuleManager;
36 private final WebResourceManager webResourceManager;
37 private final OsgiContainerManager osgiContainerManager;
38 private final DefaultPluginManager pluginManager;
39 private final PluginEventManager pluginEventManager;
40 private final HostComponentProvider hostComponentProvider;
41 private final DefaultModuleDescriptorFactory moduleDescriptorFactory;
42 private final Map<Class,Object> publicContainer;
43
44 private static ContainerManager instance;
45 private List<DownloadStrategy> downloadStrategies;
46
47 public ContainerManager(ServletContext servletContext)
48 {
49 instance = this;
50 pluginEventManager = new DefaultPluginEventManager();
51 servletModuleManager = new DefaultServletModuleManager(pluginEventManager);
52 webResourceManager = new WebResourceManagerImpl(new SimpleWebResourceIntegration(servletContext));
53
54 DefaultPackageScannerConfiguration scannerConfig = new DefaultPackageScannerConfiguration();
55 List<String> packageIncludes = new ArrayList<String>(scannerConfig.getPackageIncludes());
56 packageIncludes.add("org.bouncycastle*");
57 scannerConfig.setPackageIncludes(packageIncludes);
58
59 publicContainer = new HashMap<Class,Object>();
60 hostComponentProvider = new SimpleHostComponentProvider();
61 osgiContainerManager = new FelixOsgiContainerManager(
62 new File(servletContext.getRealPath("/WEB-INF/framework-bundles")),
63 scannerConfig, hostComponentProvider, pluginEventManager);
64
65 OsgiPluginFactory osgiPluginDeployer = new OsgiPluginFactory(PluginManager.PLUGIN_DESCRIPTOR_FILENAME,
66 osgiContainerManager);
67 OsgiBundleFactory osgiBundleDeployer = new OsgiBundleFactory(osgiContainerManager);
68
69 DirectoryPluginLoader directoryPluginLoader = new DirectoryPluginLoader(
70 new File(servletContext.getRealPath("/WEB-INF/plugins")),
71 Arrays.asList(osgiPluginDeployer, osgiBundleDeployer),
72 pluginEventManager);
73
74
75
76
77
78
79
80
81 moduleDescriptorFactory = new DefaultModuleDescriptorFactory();
82 moduleDescriptorFactory.addModuleDescriptor("servlet", SimpleServletModuleDescriptor.class);
83 moduleDescriptorFactory.addModuleDescriptor("servlet-filter", SimpleFilterModuleDescriptor.class);
84 moduleDescriptorFactory.addModuleDescriptor("servlet-context-param", ServletContextParamModuleDescriptor.class);
85 moduleDescriptorFactory.addModuleDescriptor("servlet-context-listener", SimpleContextListenerModuleDescriptor.class);
86 moduleDescriptorFactory.addModuleDescriptor("web-resource", WebResourceModuleDescriptor.class);
87 pluginManager = new DefaultPluginManager(new MemoryPluginStateStore(), Arrays.<PluginLoader>asList(
88 moduleDescriptorFactory, pluginEventManager);
89 File pluginDir = new File(servletContext.getRealPath("/WEB-INF/plugins"));
90 if (!pluginDir.exists())
91 {
92 pluginDir.mkdirs();
93 }
94 pluginManager.setPluginInstaller(new FilePluginInstaller(pluginDir));
95
96 publicContainer.put(PluginController.class, pluginManager);
97 publicContainer.put(PluginAccessor.class, pluginManager);
98 publicContainer.put(PluginEventManager.class, pluginEventManager);
99 publicContainer.put(Map.class, publicContainer);
100
101
102 try {
103 pluginManager.init();
104 }
105 catch (PluginParseException e)
106 {
107 e.printStackTrace();
108 }
109
110 downloadStrategies = new ArrayList<DownloadStrategy>();
111 PluginResourceDownload pluginDownloadStrategy = new PluginResourceDownload();
112 pluginDownloadStrategy.setPluginManager(pluginManager);
113 pluginDownloadStrategy.setContentTypeResolver(new SimpleContentTypeResolver());
114 pluginDownloadStrategy.setCharacterEncoding("UTF-8");
115 downloadStrategies.add(pluginDownloadStrategy);
116 }
117
118 public static synchronized void setInstance(ContainerManager mgr)
119 {
120 instance = mgr;
121 }
122
123 public static synchronized ContainerManager getInstance()
124 {
125 return instance;
126 }
127
128 public ServletModuleManager getServletModuleManager()
129 {
130 return servletModuleManager;
131 }
132
133 public OsgiContainerManager getOsgiContainerManager()
134 {
135 return osgiContainerManager;
136 }
137
138 public PluginManager getPluginManager()
139 {
140 return pluginManager;
141 }
142
143 public HostComponentProvider getHostComponentProvider()
144 {
145 return hostComponentProvider;
146 }
147
148 public ModuleDescriptorFactory getModuleDescriptorFactory()
149 {
150 return moduleDescriptorFactory;
151 }
152
153 public List<DownloadStrategy> getDownloadStrategies()
154 {
155 return downloadStrategies;
156 }
157
158
159
160
161 private class SimpleContentTypeResolver implements ContentTypeResolver
162 {
163 private final Map<String, String> mimeTypes;
164
165 SimpleContentTypeResolver()
166 {
167 Map<String, String> types = new HashMap<String, String>();
168 types.put("js", "application/x-javascript");
169 types.put("css", "text/css");
170 mimeTypes = Collections.unmodifiableMap(types);
171 }
172
173 public String getContentType(String requestUrl)
174 {
175 String extension = requestUrl.substring(requestUrl.lastIndexOf('.'));
176 return mimeTypes.get(extension);
177 }
178 }
179
180 private class SimpleHostComponentProvider implements HostComponentProvider
181 {
182 public void provide(ComponentRegistrar componentRegistrar) {
183 for (Map.Entry<Class,Object> entry : publicContainer.entrySet())
184 {
185 String name = entry.getKey().getSimpleName();
186 name = Character.toLowerCase(name.charAt(0)) + name.substring(1);
187 componentRegistrar.register(entry.getKey()).forInstance(entry.getValue()).withName(name);
188 }
189 componentRegistrar.register(WebResourceManager.class).forInstance(webResourceManager).withName("webResourceManager");
190 }
191 }
192 }