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.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   * 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(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 }