View Javadoc
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   * These tests are mainly here to demonstrate different edge cases you can encounter
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                  // passed
66              } else {
67                  fail("Should have thrown linkage error");
68              }
69          }
70      }
71  }