View Javadoc

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