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