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
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
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
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
102 }
103 }
104
105 public void testTransformForOneApp() throws IOException, DocumentException
106 {
107 ComponentSpringStage transformer = new ComponentSpringStage();
108
109
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
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
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
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
252 assertFalse(context.getExtraImports().contains("my2.MyFooInterface"));
253
254
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 }