View Javadoc

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