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.ArgumentMatchers.any;
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(registrar -> {}, moduleDescriptorFactory);
73
74 pluginController.installPlugins(new JarPluginArtifact(jar));
75
76 assertEquals(1, pluginAccessor.getEnabledPlugins().size());
77 assertEquals("first.MyServlet", pluginAccessor.getPlugin("first").getModuleDescriptor("foo").getModule().getClass().getName());
78 assertEquals(1, pluginAccessor.getPlugin("first").getModuleDescriptorsByModuleClass(TestServlet.class).size());
79 }
80
81 @Test
82 public void testInstallPlugins1AndGetModuleClass() throws Exception {
83 ClassPathPluginLoader classPathPluginLoader = new ClassPathPluginLoader("testInstallPlugins1AndGetModuleClass.xml");
84 final ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
85 final HostContainer hostContainer = mock(HostContainer.class);
86 moduleFactory = new PrefixDelegatingModuleFactory(new HashSet<PrefixModuleFactory>() {{
87 add(new ClassPrefixModuleFactory(hostContainer));
88 add(new BeanPrefixModuleFactory());
89 }});
90 when(hostContainer.create(StubServletModuleDescriptor.class)).thenReturn(new StubServletModuleDescriptor(moduleFactory, servletModuleManager));
91 when(hostContainer.create(TestServlet.class)).thenReturn(new TestServlet());
92
93 final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(hostContainer);
94 moduleDescriptorFactory.addModuleDescriptor("servlet", StubServletModuleDescriptor.class);
95
96 initPluginManager(moduleDescriptorFactory, classPathPluginLoader);
97
98 assertEquals(1, pluginAccessor.getEnabledPlugins().size());
99 assertEquals("com.atlassian.plugin.osgi.test.TestServlet", pluginAccessor.getPlugin("first").getModuleDescriptor("foo").getModule().getClass().getName());
100 }
101
102 @Test
103 public void testInstallPlugins1AndFailToGetModuleClassFromSpring() throws Exception {
104 ClassPathPluginLoader classPathPluginLoader = new ClassPathPluginLoader("testInstallPlugins1AndFailToGetModuleClassFromSpring.xml");
105 final ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
106
107 final HostContainer hostContainer = mock(HostContainer.class);
108 moduleFactory = new PrefixDelegatingModuleFactory(new HashSet<PrefixModuleFactory>() {{
109 add(new ClassPrefixModuleFactory(hostContainer));
110 add(new BeanPrefixModuleFactory());
111 }});
112 when(hostContainer.create(StubServletModuleDescriptor.class)).thenReturn(new StubServletModuleDescriptor(moduleFactory, servletModuleManager));
113 when(hostContainer.create(TestServlet.class)).thenReturn(new TestServlet());
114 doAnswer(invocation -> {
115 invocation.<ServletModuleDescriptor>getArgument(0).getModule();
116 return null;
117 }).when(servletModuleManager).addServletModule(any());
118
119 final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(hostContainer);
120 moduleDescriptorFactory.addModuleDescriptor("servlet", StubServletModuleDescriptor.class);
121
122 initPluginManager(moduleDescriptorFactory, classPathPluginLoader);
123 assertEquals(1, pluginAccessor.getPlugins().size());
124 final Plugin plugin = pluginAccessor.getPlugins().iterator().next();
125 assertTrue(plugin instanceof UnloadablePlugin);
126 assertEquals(0, pluginAccessor.getEnabledPlugins().size());
127 }
128
129 @Test
130 public void testInstallPlugins2AndGetModuleClassFromSpring() throws Exception {
131 final PluginJarBuilder firstBuilder = new PluginJarBuilder("first");
132 final File jar = firstBuilder
133 .addFormattedResource("atlassian-plugin.xml",
134 "<atlassian-plugin name='Test' key='first' pluginsVersion='2'>",
135 " <plugin-info>",
136 " <version>1.0</version>",
137 " </plugin-info>",
138 " <servlet key='foo' class='bean:obj'>",
139 " <url-pattern>/foo</url-pattern>",
140 " </servlet>",
141 "<component key='obj' class='first.MyServlet'/>",
142 "</atlassian-plugin>")
143 .addFormattedJava("first.MyServlet",
144 "package first;",
145 "import javax.servlet.http.HttpServlet;",
146 "public class MyServlet extends javax.servlet.http.HttpServlet {",
147 " public String getServletInfo() {",
148 " return 'bob';",
149 " }",
150 "}")
151 .build();
152
153 final ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
154 HostContainer hostContainer = mock(HostContainer.class);
155 when(hostContainer.create(StubServletModuleDescriptor.class)).thenReturn(new StubServletModuleDescriptor(moduleFactory, servletModuleManager));
156
157 final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(hostContainer);
158 moduleDescriptorFactory.addModuleDescriptor("servlet", StubServletModuleDescriptor.class);
159
160 initPluginManager(registrar -> {}, moduleDescriptorFactory);
161
162 pluginController.installPlugins(new JarPluginArtifact(jar));
163
164 assertEquals(1, pluginAccessor.getEnabledPlugins().size());
165 assertEquals("first.MyServlet", pluginAccessor.getPlugin("first").getModuleDescriptor("foo").getModule().getClass().getName());
166 }
167
168 @Test
169 public void testGetModuleClassFromComponentModuleDescriptor() throws Exception {
170 final PluginJarBuilder firstBuilder = new PluginJarBuilder("first");
171 final File jar = firstBuilder
172 .addFormattedResource("atlassian-plugin.xml",
173 "<atlassian-plugin name='Test' key='first' pluginsVersion='2'>",
174 " <plugin-info>",
175 " <version>1.0</version>",
176 " </plugin-info>",
177 "<component key='obj' class='first.MyServlet'/>",
178 "</atlassian-plugin>")
179 .addFormattedJava("first.MyServlet",
180 "package first;",
181 "import javax.servlet.http.HttpServlet;",
182 "public class MyServlet extends javax.servlet.http.HttpServlet {",
183 " public String getServletInfo() {",
184 " return 'bob';",
185 " }",
186 "}")
187 .build();
188
189
190 initPluginManager();
191
192 pluginController.installPlugins(new JarPluginArtifact(jar));
193
194 assertEquals(1, pluginAccessor.getEnabledPlugins().size());
195 assertEquals("first.MyServlet", pluginAccessor.getPlugin("first").getModuleDescriptor("obj").getModule().getClass().getName());
196 }
197
198 @Test
199 public void testGetModuleClassFromComponentImportModuleDescriptor() throws Exception {
200 final PluginJarBuilder firstBuilder = new PluginJarBuilder("first");
201 final File jar1 = firstBuilder
202 .addFormattedResource("atlassian-plugin.xml",
203 "<atlassian-plugin name='Test1' key='first' pluginsVersion='2'>",
204 " <plugin-info>",
205 " <version>1.0</version>",
206 " </plugin-info>",
207 "<component key='obj' class='first.MyServlet' public='true'>",
208 "<interface>com.atlassian.plugin.osgi.SomeInterface</interface>",
209 "</component>",
210 "</atlassian-plugin>")
211 .addFormattedJava("com.atlassian.plugin.osgi.SomeInterface",
212 "package com.atlassian.plugin.osgi;",
213 "public interface SomeInterface {}")
214 .addFormattedJava("first.MyServlet",
215 "package first;",
216 "import javax.servlet.http.HttpServlet;",
217 "public class MyServlet extends javax.servlet.http.HttpServlet implements com.atlassian.plugin.osgi.SomeInterface {",
218 " public String getServletInfo() {",
219 " return 'bob';",
220 " }",
221 "}")
222 .build();
223
224 final File jar2 = new PluginJarBuilder("second")
225 .addFormattedResource("atlassian-plugin.xml",
226 "<atlassian-plugin name='Test2' key='second' pluginsVersion='2'>",
227 " <plugin-info>",
228 " <version>1.0</version>",
229 " </plugin-info>",
230 " <component-import key='obj' interface='com.atlassian.plugin.osgi.SomeInterface' />",
231 "</atlassian-plugin>"
232 )
233 .addFormattedJava("com.atlassian.plugin.osgi.SomeInterface",
234 "package com.atlassian.plugin.osgi;",
235 "public interface SomeInterface {}")
236 .build();
237
238 initPluginManager();
239 pluginController.installPlugins(new JarPluginArtifact(jar1));
240 pluginController.installPlugins(new JarPluginArtifact(jar2));
241
242 assertEquals(2, pluginAccessor.getEnabledPlugins().size());
243 assertEquals("first.MyServlet", pluginAccessor.getPlugin("first").getModuleDescriptor("obj").getModule().getClass().getName());
244 assertTrue(pluginAccessor.getPlugin("second").getModuleDescriptor("obj").getModule() instanceof SomeInterface);
245 }
246
247 @Test
248 public void testFailToGetModuleClassFromSpring() throws Exception {
249 final PluginJarBuilder firstBuilder = new PluginJarBuilder("first");
250 final File jar = firstBuilder
251 .addFormattedResource("atlassian-plugin.xml",
252 "<atlassian-plugin name='Test' key='first' pluginsVersion='2'>",
253 " <plugin-info>",
254 " <version>1.0</version>",
255 " </plugin-info>",
256 " <servlet key='foo' class='bean:beanId' name='spring bean for servlet'>",
257 " <url-pattern>/foo</url-pattern>",
258 " </servlet>",
259 "<component key='obj' class='first.MyServlet' />",
260 "</atlassian-plugin>")
261 .addFormattedJava("first.MyServlet",
262 "package first;",
263 "import javax.servlet.http.HttpServlet;",
264 "public class MyServlet extends javax.servlet.http.HttpServlet {",
265 " public String getServletInfo() {",
266 " return 'bob';",
267 " }",
268 "}")
269 .build();
270
271 final ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
272 doAnswer(invocation -> {
273 invocation.<ServletModuleDescriptor>getArgument(0).getModule();
274 return null;
275 }).when(servletModuleManager).addServletModule(any());
276 final HostContainer hostContainer = mock(HostContainer.class);
277 moduleFactory = new PrefixDelegatingModuleFactory(new HashSet<PrefixModuleFactory>() {{
278 add(new ClassPrefixModuleFactory(hostContainer));
279 add(new BeanPrefixModuleFactory());
280 }});
281 when(hostContainer.create(StubServletModuleDescriptor.class)).thenReturn(new StubServletModuleDescriptor(moduleFactory, servletModuleManager));
282
283 final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(hostContainer);
284 moduleDescriptorFactory.addModuleDescriptor("servlet", StubServletModuleDescriptor.class);
285
286 initPluginManager(registrar -> {}, moduleDescriptorFactory);
287
288 pluginController.installPlugins(new JarPluginArtifact(jar));
289 assertEquals(0, pluginAccessor.getEnabledPlugins().size());
290 final Plugin plugin = pluginAccessor.getPlugins().iterator().next();
291 assertTrue(plugin instanceof UnloadablePlugin);
292 }
293 }