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