View Javadoc

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   * A simple class that behaves like Spring's ContianerManager class.
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          /*BundledPluginLoader bundledPluginLoader = new BundledPluginLoader(
75              getClass().getResource("/atlassian-bundled-plugins.zip"),
76              new File(servletContext.getRealPath("/WEB-INF/bundled-plugins")),
77              Arrays.asList(osgiPluginDeployer, osgiBundleDeployer),
78              pluginEventManager);
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(/*bundledPluginLoader, */directoryPluginLoader),
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      * A simple content type resolver that can identify css and js resources.
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 }