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