View Javadoc
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   * Tests around the creation of the module class of {@link com.atlassian.plugin.ModuleDescriptor}
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 }