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 }