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