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