1 package com.atlassian.plugin.osgi;
2
3 import com.atlassian.plugin.test.PluginJarBuilder;
4 import com.atlassian.plugin.JarPluginArtifact;
5 import com.atlassian.plugin.DefaultModuleDescriptorFactory;
6 import com.atlassian.plugin.hostcontainer.DefaultHostContainer;
7 import com.atlassian.plugin.osgi.hostcomponents.HostComponentProvider;
8 import com.atlassian.plugin.osgi.hostcomponents.ComponentRegistrar;
9 import com.atlassian.plugin.osgi.factory.OsgiPlugin;
10
11 import java.io.File;
12 import java.lang.reflect.InvocationTargetException;
13 import java.lang.reflect.Method;
14
15
16
17
18 public class TestClassLoaderEdgeCases extends PluginInContainerTestBase
19 {
20 public void testLinkageError() throws Exception
21 {
22 File privateJar = new PluginJarBuilder("private-jar")
23 .addFormattedJava("com.atlassian.plugin.osgi.Callable2",
24 "package com.atlassian.plugin.osgi;",
25 "public interface Callable2 {",
26 " String call() throws Exception;",
27 "}")
28 .build();
29
30 File pluginJar = new PluginJarBuilder("privatejartest")
31 .addFormattedResource("atlassian-plugin.xml",
32 "<atlassian-plugin name='Test' key='test.privatejar.plugin' pluginsVersion='2'>",
33 " <plugin-info>",
34 " <version>1.0</version>",
35 " </plugin-info>",
36 " <object key='obj' class='my.Foo'/>",
37 "</atlassian-plugin>")
38 .addFormattedJava("my.Foo",
39 "package my;",
40 "import com.atlassian.plugin.osgi.Callable2;",
41 "import com.atlassian.plugin.osgi.test.Callable2Factory;",
42 "public class Foo {",
43 " public String call() throws Exception { return 'hi ' + new Callable2Factory().create().call();}",
44 "}")
45 .addFile("META-INF/lib/private.jar", privateJar)
46 .build();
47 DefaultModuleDescriptorFactory factory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
48 factory.addModuleDescriptor("object", ObjectModuleDescriptor.class);
49 initPluginManager(null, factory);
50 pluginManager.installPlugin(new JarPluginArtifact(pluginJar));
51 assertEquals(1, pluginManager.getEnabledPlugins().size());
52 OsgiPlugin plugin = (OsgiPlugin) pluginManager.getPlugin("test.privatejar.plugin");
53 assertEquals("Test", plugin.getName());
54 Class foo = plugin.getModuleDescriptor("obj").getModuleClass();
55 Object fooObj = plugin.autowire(foo);
56 try
57 {
58 Method method = foo.getMethod("call");
59 method.invoke(fooObj);
60 fail("Should have thrown linkage error");
61 }
62 catch (InvocationTargetException ex)
63 {
64 if (ex.getTargetException() instanceof LinkageError) {
65
66 }
67 else
68 {
69 fail("Should have thrown linkage error");
70 }
71 }
72 }
73 }