View Javadoc

1   package it.com.atlassian.plugin.osgi;
2   
3   import com.atlassian.plugin.JarPluginArtifact;
4   import com.atlassian.plugin.osgi.DummyHostComponent;
5   import com.atlassian.plugin.osgi.PluginInContainerTestBase;
6   import com.atlassian.plugin.osgi.hostcomponents.ComponentRegistrar;
7   import com.atlassian.plugin.osgi.hostcomponents.HostComponentProvider;
8   import com.atlassian.plugin.osgi.hostcomponents.ContextClassLoaderStrategy;
9   import com.atlassian.plugin.test.PluginJarBuilder;
10  import junit.framework.TestCase;
11  
12  import java.io.File;
13  
14  public class TestContextClassLoader extends PluginInContainerTestBase
15  {
16  
17      public void testCorrectContextClassLoaderForHostComponents() throws Exception
18      {
19          final DummyHostComponentImpl comp = new DummyHostComponentImpl(TestCase.class.getName());
20          File plugin = new PluginJarBuilder("ccltest")
21                  .addResource("atlassian-plugin.xml",
22                          "<atlassian-plugin key=\"ccltest\" pluginsVersion=\"2\">\n" +
23                          "    <plugin-info>\n" +
24                          "        <version>1.0</version>\n" +
25                          "    </plugin-info>\n" +
26                          "    <component key=\"foo\" class=\"my.FooImpl\" />\n" +
27                          "</atlassian-plugin>")
28                  .addJava("my.Foo", "package my;public interface Foo {}")
29                  .addJava("my.FooImpl", "package my;import com.atlassian.plugin.osgi.DummyHostComponent;" +
30                          "public class FooImpl implements Foo {public FooImpl(DummyHostComponent comp) throws Exception { comp.evaluate(); }}")
31                  .build();
32          HostComponentProvider prov = new HostComponentProvider()
33          {
34              public void provide(ComponentRegistrar registrar)
35              {
36                  registrar.register(DummyHostComponent.class).forInstance(comp).withName("hostComp");
37              }
38          };
39  
40          initPluginManager(prov);
41          pluginManager.installPlugin(new JarPluginArtifact(plugin));
42  
43          assertNotNull(comp.cl);
44          assertNotNull(comp.testClass);
45          assertTrue(comp.testClass == TestCase.class);
46  
47      }
48  
49      public void testCorrectContextClassLoaderForHostComponentsUsePluginStrategy() throws Exception
50      {
51          final DummyHostComponentImpl comp = new DummyHostComponentImpl(TestCase.class.getName());
52          File plugin = new PluginJarBuilder("ccltest")
53                  .addResource("atlassian-plugin.xml",
54                          "<atlassian-plugin key=\"ccltest\" pluginsVersion=\"2\">\n" +
55                          "    <plugin-info>\n" +
56                          "        <version>1.0</version>\n" +
57                          "    </plugin-info>\n" +
58                          "    <component key=\"foo\" class=\"my.FooImpl\" />\n" +
59                          "</atlassian-plugin>")
60                  .addJava("my.Foo", "package my;public interface Foo {}")
61                  .addJava("my.FooImpl", "package my;import com.atlassian.plugin.osgi.DummyHostComponent;" +
62                          "public class FooImpl implements Foo {public FooImpl(DummyHostComponent comp) throws Exception { comp.evaluate(); }}")
63                  .build();
64          HostComponentProvider prov = new HostComponentProvider()
65          {
66              public void provide(ComponentRegistrar registrar)
67              {
68                  registrar.register(DummyHostComponent.class).forInstance(comp).withName("hostComp").withContextClassLoaderStrategy(ContextClassLoaderStrategy.USE_PLUGIN);
69              }
70          };
71  
72          initPluginManager(prov);
73          pluginManager.installPlugin(new JarPluginArtifact(plugin));
74  
75          assertNotNull(comp.cl);
76          assertNull(comp.testClass);
77      }
78  
79      public void testCorrectContextClassLoaderForHostComponentsUsePluginStrategyLoadingLocalClass() throws Exception
80      {
81          final DummyHostComponentImpl comp = new DummyHostComponentImpl("my.Foo");
82          File plugin = new PluginJarBuilder("ccltest")
83                  .addResource("atlassian-plugin.xml",
84                          "<atlassian-plugin key=\"ccltest\" pluginsVersion=\"2\">\n" +
85                          "    <plugin-info>\n" +
86                          "        <version>1.0</version>\n" +
87                          "    </plugin-info>\n" +
88                          "    <component key=\"foo\" class=\"my.FooImpl\" />\n" +
89                          "</atlassian-plugin>")
90                  .addJava("my.Foo", "package my;public interface Foo {}")
91                  .addJava("my.FooImpl", "package my;import com.atlassian.plugin.osgi.DummyHostComponent;" +
92                          "public class FooImpl implements Foo {public FooImpl(DummyHostComponent comp) throws Exception { comp.evaluate(); }}")
93                  .build();
94          HostComponentProvider prov = new HostComponentProvider()
95          {
96              public void provide(ComponentRegistrar registrar)
97              {
98                  registrar.register(DummyHostComponent.class).forInstance(comp).withName("hostComp").withContextClassLoaderStrategy(ContextClassLoaderStrategy.USE_PLUGIN);
99              }
100         };
101 
102         initPluginManager(prov);
103         pluginManager.installPlugin(new JarPluginArtifact(plugin));
104 
105         assertNotNull(comp.cl);
106         assertNotNull(comp.testClass);
107     }
108 
109     public void testCorrectContextClassLoaderForHostComponentsUseHostStrategy() throws Exception
110     {
111         final DummyHostComponentImpl comp = new DummyHostComponentImpl(TestCase.class.getName());
112         File plugin = new PluginJarBuilder("ccltest")
113                 .addResource("atlassian-plugin.xml",
114                         "<atlassian-plugin key=\"ccltest\" pluginsVersion=\"2\">\n" +
115                         "    <plugin-info>\n" +
116                         "        <version>1.0</version>\n" +
117                         "    </plugin-info>\n" +
118                         "    <component key=\"foo\" class=\"my.FooImpl\" />\n" +
119                         "</atlassian-plugin>")
120                 .addJava("my.Foo", "package my;public interface Foo {}")
121                 .addJava("my.FooImpl", "package my;import com.atlassian.plugin.osgi.DummyHostComponent;" +
122                         "public class FooImpl implements Foo {public FooImpl(DummyHostComponent comp) throws Exception { comp.evaluate(); }}")
123                 .build();
124         HostComponentProvider prov = new HostComponentProvider()
125         {
126             public void provide(ComponentRegistrar registrar)
127             {
128                 registrar.register(DummyHostComponent.class).forInstance(comp).withName("hostComp").withContextClassLoaderStrategy(ContextClassLoaderStrategy.USE_HOST);
129             }
130         };
131 
132         initPluginManager(prov);
133         pluginManager.installPlugin(new JarPluginArtifact(plugin));
134 
135         assertNotNull(comp.cl);
136         assertNotNull(comp.testClass);
137         assertTrue(comp.testClass == TestCase.class);
138     }
139 
140     public static class DummyHostComponentImpl implements DummyHostComponent
141     {
142         public ClassLoader cl;
143         public Class testClass;
144         private String classToLoad;
145 
146         public DummyHostComponentImpl(String classToLoad)
147         {
148             this.classToLoad = classToLoad;
149         }
150 
151         public void evaluate()
152         {
153             cl = Thread.currentThread().getContextClassLoader();
154             try
155             {
156                 testClass = cl.loadClass(classToLoad);
157             } catch (ClassNotFoundException ex) {}
158         }
159     }
160 }