View Javadoc

1   package com.atlassian.plugin.osgi.factory.transform.stage;
2   
3   import com.atlassian.plugin.JarPluginArtifact;
4   import com.atlassian.plugin.PluginAccessor;
5   import junit.framework.TestCase;
6   import org.dom4j.DocumentException;
7   import org.dom4j.DocumentHelper;
8   import org.dom4j.Element;
9   import org.osgi.framework.Constants;
10  import org.osgi.framework.ServiceReference;
11  
12  import java.io.File;
13  import java.io.IOException;
14  import java.io.ByteArrayInputStream;
15  
16  import com.atlassian.plugin.osgi.factory.transform.TransformContext;
17  import com.atlassian.plugin.osgi.factory.transform.model.SystemExports;
18  import com.atlassian.plugin.osgi.container.OsgiContainerManager;
19  import com.atlassian.plugin.PluginArtifact;
20  import com.atlassian.plugin.util.validation.ValidationException;
21  import com.atlassian.plugin.test.PluginJarBuilder;
22  import com.mockobjects.dynamic.Mock;
23  import com.mockobjects.dynamic.C;
24  
25  import static org.mockito.Mockito.*;
26  
27  public class TestComponentSpringStage extends TestCase
28  {
29      public void testTransform() throws IOException, DocumentException
30      {
31          ComponentSpringStage transformer = new ComponentSpringStage();
32  
33          // private component
34          Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
35          Element component = pluginRoot.addElement("component");
36          component.addAttribute("key", "foo");
37          component.addAttribute("class", "my.Foo");
38          component.addAttribute("alias", "hohoho");
39          SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
40                                                                         "beans:alias[@name='foo' and @alias='hohoho']");
41  
42          // public component, interface
43          pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
44          component = pluginRoot.addElement("component");
45          component.addAttribute("key", "foo");
46          component.addAttribute("class", "my.Foo");
47          component.addAttribute("public", "true");
48          Element inf = component.addElement("interface");
49          inf.setText("my.IFoo");
50          SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
51                                                                         "osgi:service[@id='foo_osgiService' and @ref='foo']",
52                                                                         "//osgi:interfaces",
53                                                                         "//beans:value[.='my.IFoo']");
54  
55          // public component, interface as attribute
56          pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
57          component = pluginRoot.addElement("component");
58          component.addAttribute("key", "foo");
59          component.addAttribute("class", "my.Foo");
60          component.addAttribute("public", "true");
61          component.addAttribute("interface", "my.IFoo");
62          SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
63                                                                         "osgi:service[@id='foo_osgiService' and @ref='foo']",
64                                                                         "//osgi:interfaces",
65                                                                         "//beans:value[.='my.IFoo']");
66  
67      }
68  
69      public void testTransformWithServiceProperties() throws IOException, DocumentException
70      {
71          ComponentSpringStage transformer = new ComponentSpringStage();
72  
73          Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
74          Element component = pluginRoot.addElement("component");
75          component.addAttribute("key", "foo");
76          component.addAttribute("class", "my.Foo");
77          component.addAttribute("public", "true");
78          component.addAttribute("interface", "my.IFoo");
79  
80          Element svcprops = component.addElement("service-properties");
81          Element prop = svcprops.addElement("entry");
82          prop.addAttribute("key", "foo");
83          prop.addAttribute("value", "bar");
84          SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
85                                                                         "osgi:service[@id='foo_osgiService']/osgi:service-properties",
86                                                                         "osgi:service[@id='foo_osgiService']/osgi:service-properties/beans:entry[@key='foo' and @value='bar']",
87                                                                         "//osgi:interfaces",
88                                                                         "//beans:value[.='my.IFoo']");
89  
90          svcprops.clearContent();
91          try
92          {
93              SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
94                      "osgi:service[@id='foo_osgiService']/osgi:service-properties",
95                      "//osgi:interfaces",
96                      "//beans:value[.='my.IFoo']");
97              fail("Validation exception should have been thrown");
98          }
99          catch (ValidationException ex)
100         {
101             // expected
102         }
103     }
104 
105     public void testTransformForOneApp() throws IOException, DocumentException
106     {
107         ComponentSpringStage transformer = new ComponentSpringStage();
108 
109         // public component, interface
110         Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
111         Element component = pluginRoot.addElement("component");
112         component.addAttribute("key", "foo");
113         component.addAttribute("class", "my.Foo");
114         component.addAttribute("public", "true");
115         component.addAttribute("application", "bar");
116         Element inf = component.addElement("interface");
117         inf.setText("my.IFoo");
118         SpringTransformerTestHelper.transform(transformer, pluginRoot, "not(beans:bean[@id='foo' and @class='my.Foo'])");
119 
120         pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
121         component = pluginRoot.addElement("component");
122         component.addAttribute("key", "foo");
123         component.addAttribute("class", "my.Foo");
124         component.addAttribute("public", "true");
125         component.addAttribute("application", "foo");
126         inf = component.addElement("interface");
127         inf.setText("my.IFoo");
128         SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']");
129 
130     }
131 
132     public void testExportsAdded() throws IOException
133     {
134         ComponentSpringStage transformer = new ComponentSpringStage();
135         Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
136         Element component = pluginRoot.addElement("component");
137         component.addAttribute("key", "foo");
138         component.addAttribute("class", "my.Foo");
139         component.addAttribute("public", "true");
140         Element inf = component.addElement("interface");
141         inf.setText("my.IFoo");
142 
143         Mock mockPluginArtifact = new Mock(PluginArtifact.class);
144         mockPluginArtifact.matchAndReturn("toFile", new PluginJarBuilder().build());
145         mockPluginArtifact.expectAndReturn("getResourceAsStream", C.args(C.eq("foo")),
146                 new ByteArrayInputStream(SpringTransformerTestHelper.elementToString(pluginRoot).getBytes()));
147         mockPluginArtifact.expectAndReturn("doesResourceExist", C.args(C.eq("my/IFoo.class")), true);
148         OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
149         when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[0]);
150         TransformContext ctx = new TransformContext(null, SystemExports.NONE, (PluginArtifact) mockPluginArtifact.proxy(), null, "foo", osgiContainerManager);
151         transformer.execute(ctx);
152 
153         assertTrue(ctx.getExtraExports().contains("my"));
154 
155         // the generated bean should be tracked.
156         assertTrue(ctx.beanExists("foo"));
157 
158         mockPluginArtifact.verify();
159     }
160 
161     public void testExportsNotInJar() throws IOException
162     {
163         ComponentSpringStage transformer = new ComponentSpringStage();
164         Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
165         Element component = pluginRoot.addElement("component");
166         component.addAttribute("key", "foo");
167         component.addAttribute("class", "my.Foo");
168         component.addAttribute("public", "true");
169         Element inf = component.addElement("interface");
170         inf.setText("my.IFoo");
171 
172         Mock mockPluginArtifact = new Mock(PluginArtifact.class);
173         mockPluginArtifact.matchAndReturn("toFile", new PluginJarBuilder().build());
174         mockPluginArtifact.expectAndReturn("getResourceAsStream", C.args(C.eq("foo")),
175                 new ByteArrayInputStream(SpringTransformerTestHelper.elementToString(pluginRoot).getBytes()));
176         mockPluginArtifact.expectAndReturn("doesResourceExist", C.args(C.eq("my/IFoo.class")), false);
177         OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
178         when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[0]);
179         TransformContext ctx = new TransformContext(null, SystemExports.NONE, (PluginArtifact) mockPluginArtifact.proxy(), null, "foo", osgiContainerManager);
180         transformer.execute(ctx);
181 
182         assertFalse(ctx.getExtraExports().contains("my"));
183         // the generated bean should be tracked.
184         assertTrue(ctx.beanExists("foo"));
185 
186         mockPluginArtifact.verify();
187     }
188 
189     public void testExportsExist() throws IOException
190     {
191         ComponentSpringStage transformer = new ComponentSpringStage();
192         Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
193         Element component = pluginRoot.addElement("component");
194         component.addAttribute("key", "foo");
195         component.addAttribute("class", "my.Foo");
196         component.addAttribute("public", "true");
197         Element inf = component.addElement("interface");
198         inf.setText("my.IFoo");
199 
200         Mock mockPluginArtifact = new Mock(PluginArtifact.class);
201         mockPluginArtifact.matchAndReturn("toFile", new PluginJarBuilder().build());
202         mockPluginArtifact.expectAndReturn("getResourceAsStream", C.args(C.eq("foo")),
203                 new ByteArrayInputStream(SpringTransformerTestHelper.elementToString(pluginRoot).getBytes()));
204         OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
205         when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[0]);
206         TransformContext ctx = new TransformContext(null, SystemExports.NONE, (PluginArtifact) mockPluginArtifact.proxy(), null, "foo", osgiContainerManager);
207         ctx.getExtraExports().add("my");
208         transformer.execute(ctx);
209 
210         assertEquals(ctx.getExtraExports().indexOf("my"), ctx.getExtraExports().lastIndexOf("my"));
211         // the generated bean should be tracked.
212         assertTrue(ctx.beanExists("foo"));
213 
214         mockPluginArtifact.verify();
215     }
216 
217     public void testImportManifestGenerationOnInterfaces() throws Exception
218     {
219         final ComponentSpringStage stage = new ComponentSpringStage();
220 
221         final File pluginJar = new PluginJarBuilder()
222                 .addFormattedJava("my.MyFooChild",
223                         "package my;",
224                         "public class MyFooChild extends com.atlassian.plugin.osgi.factory.transform.dummypackage2.DummyClass2 {",
225                         "}")
226                 .addFormattedJava("my2.MyFooInterface",
227                         "package my2;",
228                         "public interface MyFooInterface {}")
229                 .addFormattedResource("atlassian-plugin.xml",
230                         "<atlassian-plugin name='plugin1' key='first' pluginsVersion='2'>",
231                         "    <plugin-info>",
232                         "        <version>1.0</version>",
233                         "    </plugin-info>",
234                         "    <component key='component1' class='my.MyFooChild' public='true'>",
235                         "       <interface>com.atlassian.plugin.osgi.factory.transform.dummypackage0.DummyInterface0</interface>",
236                         "       <interface>com.atlassian.plugin.osgi.factory.transform.dummypackage1.DummyInterface1</interface>",
237                         "       <interface>my2.MyFooInterface</interface>",
238                         "    </component>",
239                         "</atlassian-plugin>")
240                 .build();
241 
242         ServiceReference serviceReference = mock(ServiceReference.class);
243         when(serviceReference.getProperty(Constants.OBJECTCLASS)).thenReturn(new String[] { "my.Service"});
244 
245         OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
246         when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[] {serviceReference});
247 
248         final TransformContext context = new TransformContext(null, SystemExports.NONE, new JarPluginArtifact(pluginJar), null, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
249         stage.execute(context);
250 
251         // don't import local interface.
252         assertFalse(context.getExtraImports().contains("my2.MyFooInterface"));
253 
254         // import only interfaces that don't exist in the plugin itself.
255         assertTrue(context.getExtraImports().contains("com.atlassian.plugin.osgi.factory.transform.dummypackage1"));
256         assertTrue(context.getExtraImports().contains("com.atlassian.plugin.osgi.factory.transform.dummypackage0"));
257     }
258 }