1 package com.atlassian.plugin.osgi;
2
3 import com.atlassian.plugin.DefaultModuleDescriptorFactory;
4 import com.atlassian.plugin.JarPluginArtifact;
5 import com.atlassian.plugin.Plugin;
6 import com.atlassian.plugin.descriptors.AbstractModuleDescriptor;
7 import com.atlassian.plugin.hostcontainer.HostContainer;
8 import com.atlassian.plugin.impl.UnloadablePlugin;
9 import com.atlassian.plugin.loaders.ClassPathPluginLoader;
10 import com.atlassian.plugin.module.ClassPrefixModuleFactory;
11 import com.atlassian.plugin.module.PrefixDelegatingModuleFactory;
12 import com.atlassian.plugin.module.PrefixModuleFactory;
13 import com.atlassian.plugin.osgi.hostcomponents.ComponentRegistrar;
14 import com.atlassian.plugin.osgi.hostcomponents.HostComponentProvider;
15 import com.atlassian.plugin.osgi.module.BeanPrefixModuleFactory;
16 import com.atlassian.plugin.osgi.test.TestServlet;
17 import com.atlassian.plugin.servlet.ServletModuleManager;
18 import com.atlassian.plugin.servlet.descriptors.ServletModuleDescriptor;
19 import com.atlassian.plugin.test.PluginJarBuilder;
20 import org.mockito.invocation.InvocationOnMock;
21 import org.mockito.stubbing.Answer;
22
23 import java.io.File;
24 import java.util.HashSet;
25
26 import static org.mockito.Matchers.anyObject;
27 import static org.mockito.Mockito.doAnswer;
28 import static org.mockito.Mockito.mock;
29 import static org.mockito.Mockito.when;
30
31
32
33
34 public class TestPluginModuleCreation extends PluginInContainerTestBase
35 {
36 public void testInstallPlugin2AndGetModuleClass() throws Exception
37 {
38 final PluginJarBuilder firstBuilder = new PluginJarBuilder("first");
39 final File jar = firstBuilder
40 .addFormattedResource("atlassian-plugin.xml",
41 "<atlassian-plugin name='Test' key='first' pluginsVersion='2'>",
42 " <plugin-info>",
43 " <version>1.0</version>",
44 " </plugin-info>",
45 " <servlet key='foo' class='first.MyServlet'>",
46 " <url-pattern>/foo</url-pattern>",
47 " </servlet>",
48 " <component key='obj' class='com.atlassian.plugin.osgi.test.TestServlet'/>",
49 "</atlassian-plugin>")
50 .addFormattedJava("first.MyServlet",
51 "package first;",
52 "import javax.servlet.http.HttpServlet;",
53 "public class MyServlet extends javax.servlet.http.HttpServlet {",
54 " public String getServletInfo() {",
55 " return 'bob';",
56 " }",
57 "}")
58 .build();
59
60 final ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
61
62 HostContainer hostContainer = mock(HostContainer.class);
63 when(hostContainer.create(StubServletModuleDescriptor.class)).thenReturn(new StubServletModuleDescriptor(moduleFactory, servletModuleManager));
64
65 final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(hostContainer);
66 moduleDescriptorFactory.addModuleDescriptor("servlet", StubServletModuleDescriptor.class);
67
68 initPluginManager(new HostComponentProvider()
69 {
70 public void provide(final ComponentRegistrar registrar)
71 {
72 }
73 }, moduleDescriptorFactory);
74
75 pluginManager.installPlugin(new JarPluginArtifact(jar));
76
77 assertEquals(1, pluginManager.getEnabledPlugins().size());
78 assertEquals("first.MyServlet", pluginManager.getPlugin("first").getModuleDescriptor("foo").getModule().getClass().getName());
79 assertEquals(1, pluginManager.getPlugin("first").getModuleDescriptorsByModuleClass(TestServlet.class).size());
80 }
81
82 public void testInstallPlugins1AndGetModuleClass() throws Exception
83 {
84 ClassPathPluginLoader classPathPluginLoader = new ClassPathPluginLoader("testInstallPlugins1AndGetModuleClass.xml");
85 final ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
86 final HostContainer hostContainer = mock(HostContainer.class);
87 moduleFactory = new PrefixDelegatingModuleFactory(new HashSet<PrefixModuleFactory>()
88 {{
89 add(new ClassPrefixModuleFactory(hostContainer));
90 add(new BeanPrefixModuleFactory());
91 }});
92 when(hostContainer.create(StubServletModuleDescriptor.class)).thenReturn(new StubServletModuleDescriptor(moduleFactory, servletModuleManager));
93 when(hostContainer.create(TestServlet.class)).thenReturn(new TestServlet());
94
95 final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(hostContainer);
96 moduleDescriptorFactory.addModuleDescriptor("servlet", StubServletModuleDescriptor.class);
97
98 initPluginManager(moduleDescriptorFactory, classPathPluginLoader);
99
100 assertEquals(1, pluginManager.getEnabledPlugins().size());
101 assertEquals("com.atlassian.plugin.osgi.test.TestServlet", pluginManager.getPlugin("first").getModuleDescriptor("foo").getModule().getClass().getName());
102 }
103
104 public void testInstallPlugins1AndFailToGetModuleClassFromSpring() throws Exception
105 {
106 ClassPathPluginLoader classPathPluginLoader = new ClassPathPluginLoader("testInstallPlugins1AndFailToGetModuleClassFromSpring.xml");
107 final ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
108
109 final HostContainer hostContainer = mock(HostContainer.class);
110 moduleFactory = new PrefixDelegatingModuleFactory(new HashSet<PrefixModuleFactory>()
111 {{
112 add(new ClassPrefixModuleFactory(hostContainer));
113 add(new BeanPrefixModuleFactory());
114 }});
115 when(hostContainer.create(StubServletModuleDescriptor.class)).thenReturn(new StubServletModuleDescriptor(moduleFactory, servletModuleManager));
116 when(hostContainer.create(TestServlet.class)).thenReturn(new TestServlet());
117 doAnswer(new Answer()
118 {
119 public Object answer(InvocationOnMock invocation) throws Throwable
120 {
121 ((ServletModuleDescriptor)invocation.getArguments()[0]).getModule();
122 return null;
123 }
124 }).when(servletModuleManager).addServletModule((ServletModuleDescriptor)anyObject());
125
126 final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(hostContainer);
127 moduleDescriptorFactory.addModuleDescriptor("servlet", StubServletModuleDescriptor.class);
128
129 initPluginManager(moduleDescriptorFactory, classPathPluginLoader);
130 assertEquals(1, pluginManager.getPlugins().size());
131 final Plugin plugin = pluginManager.getPlugins().iterator().next();
132 assertTrue(plugin instanceof UnloadablePlugin);
133 assertEquals(0, pluginManager.getEnabledPlugins().size());
134 }
135
136 public void testInstallPlugins2AndGetModuleClassFromSpring() throws Exception
137 {
138 final PluginJarBuilder firstBuilder = new PluginJarBuilder("first");
139 final File jar = firstBuilder
140 .addFormattedResource("atlassian-plugin.xml",
141 "<atlassian-plugin name='Test' key='first' pluginsVersion='2'>",
142 " <plugin-info>",
143 " <version>1.0</version>",
144 " </plugin-info>",
145 " <servlet key='foo' class='bean:obj'>",
146 " <url-pattern>/foo</url-pattern>",
147 " </servlet>",
148 "<component key='obj' class='first.MyServlet'/>",
149 "</atlassian-plugin>")
150 .addFormattedJava("first.MyServlet",
151 "package first;",
152 "import javax.servlet.http.HttpServlet;",
153 "public class MyServlet extends javax.servlet.http.HttpServlet {",
154 " public String getServletInfo() {",
155 " return 'bob';",
156 " }",
157 "}")
158 .build();
159
160 final ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
161 HostContainer hostContainer = mock(HostContainer.class);
162 when(hostContainer.create(StubServletModuleDescriptor.class)).thenReturn(new StubServletModuleDescriptor(moduleFactory, servletModuleManager));
163
164 final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(hostContainer);
165 moduleDescriptorFactory.addModuleDescriptor("servlet", StubServletModuleDescriptor.class);
166
167 initPluginManager(new HostComponentProvider()
168 {
169 public void provide(final ComponentRegistrar registrar)
170 {
171 }
172 }, moduleDescriptorFactory);
173
174 pluginManager.installPlugin(new JarPluginArtifact(jar));
175
176 assertEquals(1, pluginManager.getEnabledPlugins().size());
177 assertEquals("first.MyServlet", pluginManager.getPlugin("first").getModuleDescriptor("foo").getModule().getClass().getName());
178 }
179
180 public void testGetModuleClassFromComponentModuleDescriptor() throws Exception
181 {
182 final PluginJarBuilder firstBuilder = new PluginJarBuilder("first");
183 final File jar = firstBuilder
184 .addFormattedResource("atlassian-plugin.xml",
185 "<atlassian-plugin name='Test' key='first' pluginsVersion='2'>",
186 " <plugin-info>",
187 " <version>1.0</version>",
188 " </plugin-info>",
189 "<component key='obj' class='first.MyServlet'/>",
190 "</atlassian-plugin>")
191 .addFormattedJava("first.MyServlet",
192 "package first;",
193 "import javax.servlet.http.HttpServlet;",
194 "public class MyServlet extends javax.servlet.http.HttpServlet {",
195 " public String getServletInfo() {",
196 " return 'bob';",
197 " }",
198 "}")
199 .build();
200
201
202 initPluginManager();
203
204 pluginManager.installPlugin(new JarPluginArtifact(jar));
205
206 assertEquals(1, pluginManager.getEnabledPlugins().size());
207 assertEquals("first.MyServlet", pluginManager.getPlugin("first").getModuleDescriptor("obj").getModule().getClass().getName());
208 }
209
210 public void testGetModuleClassFromComponentImportModuleDescriptor() throws Exception
211 {
212 final PluginJarBuilder firstBuilder = new PluginJarBuilder("first");
213 final File jar1 = firstBuilder
214 .addFormattedResource("atlassian-plugin.xml",
215 "<atlassian-plugin name='Test1' key='first' pluginsVersion='2'>",
216 " <plugin-info>",
217 " <version>1.0</version>",
218 " </plugin-info>",
219 "<component key='obj' class='first.MyServlet' public='true'>",
220 "<interface>com.atlassian.plugin.osgi.SomeInterface</interface>",
221 "</component>",
222 "</atlassian-plugin>")
223 .addFormattedJava("com.atlassian.plugin.osgi.SomeInterface",
224 "package com.atlassian.plugin.osgi;",
225 "public interface SomeInterface {}")
226 .addFormattedJava("first.MyServlet",
227 "package first;",
228 "import javax.servlet.http.HttpServlet;",
229 "public class MyServlet extends javax.servlet.http.HttpServlet implements com.atlassian.plugin.osgi.SomeInterface {",
230 " public String getServletInfo() {",
231 " return 'bob';",
232 " }",
233 "}")
234 .build();
235
236 final File jar2 = new PluginJarBuilder("second")
237 .addFormattedResource("atlassian-plugin.xml",
238 "<atlassian-plugin name='Test2' key='second' pluginsVersion='2'>",
239 " <plugin-info>",
240 " <version>1.0</version>",
241 " </plugin-info>",
242 " <component-import key='obj' interface='com.atlassian.plugin.osgi.SomeInterface' />",
243 "</atlassian-plugin>"
244 )
245 .addFormattedJava("com.atlassian.plugin.osgi.SomeInterface",
246 "package com.atlassian.plugin.osgi;",
247 "public interface SomeInterface {}")
248 .build();
249
250 initPluginManager();
251 pluginManager.installPlugin(new JarPluginArtifact(jar1));
252 pluginManager.installPlugin(new JarPluginArtifact(jar2));
253
254
255 assertEquals(2, pluginManager.getEnabledPlugins().size());
256 assertEquals("first.MyServlet", pluginManager.getPlugin("first").getModuleDescriptor("obj").getModule().getClass().getName());
257 assertTrue(pluginManager.getPlugin("second").getModuleDescriptor("obj").getModule() instanceof SomeInterface);
258 }
259
260 public void testFailToGetModuleClassFromSpring() throws Exception
261 {
262 final PluginJarBuilder firstBuilder = new PluginJarBuilder("first");
263 final File jar = firstBuilder
264 .addFormattedResource("atlassian-plugin.xml",
265 "<atlassian-plugin name='Test' key='first' pluginsVersion='2'>",
266 " <plugin-info>",
267 " <version>1.0</version>",
268 " </plugin-info>",
269 " <servlet key='foo' class='bean:beanId' name='spring bean for servlet'>",
270 " <url-pattern>/foo</url-pattern>",
271 " </servlet>",
272 "<component key='obj' class='first.MyServlet' />",
273 "</atlassian-plugin>")
274 .addFormattedJava("first.MyServlet",
275 "package first;",
276 "import javax.servlet.http.HttpServlet;",
277 "public class MyServlet extends javax.servlet.http.HttpServlet {",
278 " public String getServletInfo() {",
279 " return 'bob';",
280 " }",
281 "}")
282 .build();
283
284 final ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
285 doAnswer(new Answer()
286 {
287 public Object answer(InvocationOnMock invocation) throws Throwable
288 {
289 ((ServletModuleDescriptor)invocation.getArguments()[0]).getModule();
290 return null;
291 }
292 }).when(servletModuleManager).addServletModule((ServletModuleDescriptor)anyObject());
293 final HostContainer hostContainer = mock(HostContainer.class);
294 moduleFactory = new PrefixDelegatingModuleFactory(new HashSet<PrefixModuleFactory>()
295 {{
296 add(new ClassPrefixModuleFactory(hostContainer));
297 add(new BeanPrefixModuleFactory());
298 }});
299 when(hostContainer.create(StubServletModuleDescriptor.class)).thenReturn(new StubServletModuleDescriptor(moduleFactory, servletModuleManager));
300
301 final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(hostContainer);
302 moduleDescriptorFactory.addModuleDescriptor("servlet", StubServletModuleDescriptor.class);
303
304 initPluginManager(new HostComponentProvider()
305 {
306 public void provide(final ComponentRegistrar registrar)
307 {
308 }
309 }, moduleDescriptorFactory);
310
311 pluginManager.installPlugin(new JarPluginArtifact(jar));
312 assertEquals(0, pluginManager.getEnabledPlugins().size());
313 final Plugin plugin = pluginManager.getPlugins().iterator().next();
314 assertTrue(plugin instanceof UnloadablePlugin);
315 }
316 }