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
147 }
148 }
149 }
150 }