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