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