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