View Javadoc

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