View Javadoc

1   package com.atlassian.plugin.osgi;
2   
3   import com.atlassian.plugin.DefaultModuleDescriptorFactory;
4   import com.atlassian.plugin.ModuleDescriptorFactory;
5   import com.atlassian.plugin.PluginAccessor;
6   import com.atlassian.plugin.event.PluginEventManager;
7   import com.atlassian.plugin.event.impl.DefaultPluginEventManager;
8   import com.atlassian.plugin.factories.LegacyDynamicPluginFactory;
9   import com.atlassian.plugin.factories.PluginFactory;
10  import com.atlassian.plugin.hostcontainer.SimpleConstructorHostContainer;
11  import com.atlassian.plugin.loaders.BundledPluginLoader;
12  import com.atlassian.plugin.loaders.DirectoryPluginLoader;
13  import com.atlassian.plugin.loaders.PluginLoader;
14  import com.atlassian.plugin.manager.DefaultPluginManager;
15  import com.atlassian.plugin.manager.store.MemoryPluginPersistentStateStore;
16  import com.atlassian.plugin.module.ClassPrefixModuleFactory;
17  import com.atlassian.plugin.module.ModuleFactory;
18  import com.atlassian.plugin.module.PrefixDelegatingModuleFactory;
19  import com.atlassian.plugin.module.PrefixModuleFactory;
20  import com.atlassian.plugin.osgi.container.OsgiContainerManager;
21  import com.atlassian.plugin.osgi.container.OsgiPersistentCache;
22  import com.atlassian.plugin.osgi.container.PackageScannerConfiguration;
23  import com.atlassian.plugin.osgi.container.felix.FelixOsgiContainerManager;
24  import com.atlassian.plugin.osgi.container.impl.DefaultOsgiPersistentCache;
25  import com.atlassian.plugin.osgi.container.impl.DefaultPackageScannerConfiguration;
26  import com.atlassian.plugin.osgi.factory.OsgiBundleFactory;
27  import com.atlassian.plugin.osgi.factory.OsgiPluginFactory;
28  import com.atlassian.plugin.osgi.hostcomponents.ComponentRegistrar;
29  import com.atlassian.plugin.osgi.hostcomponents.HostComponentProvider;
30  import com.atlassian.plugin.osgi.hostcomponents.InstanceBuilder;
31  import com.atlassian.plugin.osgi.module.BeanPrefixModuleFactory;
32  import com.atlassian.plugin.repositories.FilePluginInstaller;
33  import com.atlassian.plugin.test.PluginTestUtils;
34  
35  import com.google.common.collect.ImmutableSet;
36  import junit.framework.TestCase;
37  import org.apache.commons.io.FileUtils;
38  import org.apache.commons.io.IOUtils;
39  
40  import java.io.File;
41  import java.io.FileInputStream;
42  import java.io.FileOutputStream;
43  import java.io.IOException;
44  import java.io.InputStream;
45  import java.util.Arrays;
46  import java.util.HashMap;
47  import java.util.Map;
48  import java.util.zip.ZipEntry;
49  import java.util.zip.ZipOutputStream;
50  
51  /**
52   * Base for in-container unit tests
53   */
54  public abstract class PluginInContainerTestBase extends TestCase
55  {
56      protected OsgiContainerManager osgiContainerManager;
57      protected File tmpDir;
58      protected File cacheDir;
59      protected File pluginsDir;
60      protected ModuleDescriptorFactory moduleDescriptorFactory;
61      protected DefaultPluginManager pluginManager;
62      protected PluginEventManager pluginEventManager;
63      protected ModuleFactory moduleFactory;
64      protected SimpleConstructorHostContainer hostContainer;
65  
66      @Override
67      public void setUp() throws Exception
68      {
69          tmpDir = PluginTestUtils.createTempDirectory(PluginInContainerTestBase.class);
70          cacheDir = new File(tmpDir, "cache");
71          cacheDir.mkdir();
72          pluginsDir = new File(tmpDir, "plugins");
73          pluginsDir.mkdir();
74          this.pluginEventManager = new DefaultPluginEventManager();
75          moduleFactory = new PrefixDelegatingModuleFactory(ImmutableSet.<PrefixModuleFactory>of(
76              new ClassPrefixModuleFactory(hostContainer),
77              new BeanPrefixModuleFactory()));
78          hostContainer = createHostContainer(new HashMap<Class<?>, Object>());
79      }
80  
81      protected SimpleConstructorHostContainer createHostContainer(Map<Class<?>, Object> originalContext)
82      {
83          Map<Class<?>, Object> context = new HashMap<Class<?>, Object>(originalContext);
84          context.put(ModuleFactory.class, moduleFactory);
85          return new SimpleConstructorHostContainer(context);
86      }
87  
88      @Override
89      public void tearDown() throws Exception
90      {
91          if (osgiContainerManager != null)
92          {
93              osgiContainerManager.stop();
94          }
95          FileUtils.deleteDirectory(tmpDir);
96          osgiContainerManager = null;
97          tmpDir = null;
98          pluginsDir = null;
99          moduleDescriptorFactory = null;
100         pluginManager = null;
101         pluginEventManager = null;
102         moduleFactory = null;
103         hostContainer = null;
104     }
105 
106     protected void initPluginManager() throws Exception
107     {
108         initPluginManager(null, new DefaultModuleDescriptorFactory(hostContainer));
109     }
110 
111     protected void initPluginManager(final HostComponentProvider hostComponentProvider) throws Exception
112     {
113         initPluginManager(hostComponentProvider, new DefaultModuleDescriptorFactory(hostContainer));
114     }
115 
116     protected void initPluginManager(final HostComponentProvider hostComponentProvider, final ModuleDescriptorFactory moduleDescriptorFactory, final String version)
117             throws Exception
118     {
119         final PackageScannerConfiguration scannerConfig = buildScannerConfiguration(version);
120         HostComponentProvider requiredWrappingProvider = getWrappingHostComponentProvider(hostComponentProvider);
121         OsgiPersistentCache cache = new DefaultOsgiPersistentCache(cacheDir);
122         osgiContainerManager = new FelixOsgiContainerManager(cache, scannerConfig, requiredWrappingProvider, pluginEventManager);
123 
124         final LegacyDynamicPluginFactory legacyFactory = new LegacyDynamicPluginFactory(PluginAccessor.Descriptor.FILENAME, tmpDir);
125         final OsgiPluginFactory osgiPluginDeployer = new OsgiPluginFactory(PluginAccessor.Descriptor.FILENAME, (String) null, cache, osgiContainerManager, pluginEventManager);
126         final OsgiBundleFactory osgiBundleFactory = new OsgiBundleFactory(osgiContainerManager, pluginEventManager);
127 
128         final DirectoryPluginLoader loader = new DirectoryPluginLoader(pluginsDir, Arrays.asList(legacyFactory, osgiPluginDeployer, osgiBundleFactory),
129                 new DefaultPluginEventManager());
130         initPluginManager(moduleDescriptorFactory, loader);
131     }
132 
133     protected void initPluginManager(final HostComponentProvider hostComponentProvider, final ModuleDescriptorFactory moduleDescriptorFactory)
134             throws Exception
135     {
136         initPluginManager(hostComponentProvider, moduleDescriptorFactory, (String) null);
137     }
138 
139     protected void initPluginManager(final ModuleDescriptorFactory moduleDescriptorFactory, PluginLoader loader)
140             throws Exception
141     {
142         this.moduleDescriptorFactory = moduleDescriptorFactory;
143         pluginManager = new DefaultPluginManager(new MemoryPluginPersistentStateStore(), Arrays.<PluginLoader>asList(loader), moduleDescriptorFactory,
144                 pluginEventManager);
145         pluginManager.setPluginInstaller(new FilePluginInstaller(pluginsDir));
146         pluginManager.init();
147     }
148 
149     protected void initBundlingPluginManager(final ModuleDescriptorFactory moduleDescriptorFactory, File... bundledPluginJars) throws Exception
150     {
151         this.moduleDescriptorFactory = moduleDescriptorFactory;
152         final PackageScannerConfiguration scannerConfig = buildScannerConfiguration("1.0");
153         HostComponentProvider requiredWrappingProvider = getWrappingHostComponentProvider(null);
154         OsgiPersistentCache cache = new DefaultOsgiPersistentCache(cacheDir);
155         osgiContainerManager = new FelixOsgiContainerManager(cache, scannerConfig, requiredWrappingProvider, pluginEventManager);
156 
157         final OsgiPluginFactory osgiPluginDeployer = new OsgiPluginFactory(PluginAccessor.Descriptor.FILENAME, (String) null, cache, osgiContainerManager, pluginEventManager);
158 
159         final DirectoryPluginLoader loader = new DirectoryPluginLoader(pluginsDir, Arrays.<PluginFactory>asList(osgiPluginDeployer),
160             new DefaultPluginEventManager());
161 
162         File zip = new File(bundledPluginJars[0].getParentFile(), "bundled-plugins.zip");
163         for (File bundledPluginJar : bundledPluginJars)
164         {
165             ZipOutputStream stream = null;
166             InputStream in = null;
167             try
168             {
169                 stream = new ZipOutputStream(new FileOutputStream(zip));
170                 in = new FileInputStream(bundledPluginJar);
171                 stream.putNextEntry(new ZipEntry(bundledPluginJar.getName()));
172                 IOUtils.copy(in, stream);
173                 stream.closeEntry();
174             }
175             catch (IOException ex)
176             {
177                 IOUtils.closeQuietly(in);
178                 IOUtils.closeQuietly(stream);
179             }
180         }
181         File bundledDir = new File(bundledPluginJars[0].getParentFile(), "bundled-plugins");
182         final BundledPluginLoader bundledLoader = new BundledPluginLoader(zip.toURL(), bundledDir, Arrays.<PluginFactory>asList(osgiPluginDeployer),
183             new DefaultPluginEventManager());
184 
185         pluginManager = new DefaultPluginManager(new MemoryPluginPersistentStateStore(), Arrays.<PluginLoader> asList(bundledLoader, loader), moduleDescriptorFactory,
186             pluginEventManager);
187         pluginManager.setPluginInstaller(new FilePluginInstaller(pluginsDir));
188         pluginManager.init();
189     }
190 
191     private HostComponentProvider getWrappingHostComponentProvider(final HostComponentProvider hostComponentProvider)
192     {
193         HostComponentProvider requiredWrappingProvider = new HostComponentProvider()
194         {
195             public void provide(final ComponentRegistrar registrar)
196             {
197 
198                 if (hostComponentProvider != null)
199                 {
200                     hostComponentProvider.provide(new ComponentRegistrar()
201                     {
202                         public InstanceBuilder register(Class<?>... mainInterfaces)
203                         {
204                             if (!Arrays.asList(mainInterfaces).contains(PluginEventManager.class))
205                             {
206                                 return registrar.register(mainInterfaces);
207                             }
208                             return null;
209                         }
210                     });
211                 }
212                 registrar.register(ModuleFactory.class).forInstance(moduleFactory);
213                 registrar.register(PluginEventManager.class).forInstance(pluginEventManager);
214                 registrar.register(PluginAccessor.class).forInstance(pluginManager);
215             }
216         };
217         return requiredWrappingProvider;
218     }
219 
220     private PackageScannerConfiguration buildScannerConfiguration(String version)
221     {
222         final PackageScannerConfiguration scannerConfig = new DefaultPackageScannerConfiguration(version);
223         scannerConfig.getPackageIncludes().add("com.atlassian.plugin*");
224         scannerConfig.getPackageIncludes().add("javax.servlet*");
225         scannerConfig.getPackageIncludes().add("com_cenqua_clover");
226         scannerConfig.getPackageExcludes().add("com.atlassian.plugin.osgi.bridge*");
227         scannerConfig.getPackageExcludes().add("com.atlassian.plugin.osgi.bridge.external");
228         scannerConfig.getPackageExcludes().add("com.atlassian.plugin.osgi.spring.external");
229         scannerConfig.getPackageVersions().put("org.apache.commons.logging", "1.1.1");
230         return scannerConfig;
231     }
232 }