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
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 }