View Javadoc

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 }