1 package com.atlassian.plugin.osgi.factory.transform.stage;
2
3 import com.atlassian.plugin.Application;
4 import com.atlassian.plugin.JarPluginArtifact;
5 import com.atlassian.plugin.PluginAccessor;
6 import com.atlassian.plugin.osgi.container.OsgiContainerManager;
7 import com.atlassian.plugin.osgi.factory.transform.TransformContext;
8 import com.atlassian.plugin.osgi.factory.transform.TransformStage;
9 import com.atlassian.plugin.osgi.factory.transform.model.SystemExports;
10 import com.atlassian.plugin.osgi.hostcomponents.HostComponentRegistration;
11 import com.atlassian.plugin.test.PluginJarBuilder;
12 import com.google.common.collect.Sets;
13 import org.dom4j.Document;
14 import org.dom4j.DocumentException;
15 import org.dom4j.DocumentHelper;
16 import org.dom4j.Element;
17 import org.dom4j.Node;
18 import org.dom4j.XPath;
19 import org.dom4j.io.OutputFormat;
20 import org.dom4j.io.XMLWriter;
21 import org.junit.Assert;
22 import org.osgi.framework.ServiceReference;
23
24 import java.io.File;
25 import java.io.IOException;
26 import java.io.StringWriter;
27 import java.util.List;
28 import java.util.Set;
29
30 import static org.mockito.Mockito.mock;
31 import static org.mockito.Mockito.when;
32
33
34
35
36 public class SpringTransformerTestHelper {
37
38 public static Element transform(final TransformStage transformer, final Element pluginRoot, final String... xpaths) throws IOException, DocumentException {
39 return transform(transformer, null, pluginRoot, xpaths);
40 }
41
42 public static Element transform(final TransformStage transformer, final List<HostComponentRegistration> regs, final Element pluginRoot, final String... xpaths) throws IOException, DocumentException {
43 return transform(transformer, null, regs, pluginRoot, xpaths);
44 }
45
46 public static Element transform(final TransformStage transformer, File pluginJar, final List<HostComponentRegistration> regs, final Element pluginRoot, final String... xpaths) throws IOException, DocumentException {
47 if (pluginJar == null) {
48 final String swriter = elementToString(pluginRoot);
49 pluginJar = new PluginJarBuilder().addResource(PluginAccessor.Descriptor.FILENAME, swriter).build();
50 }
51 Set<Application> applications = Sets.newHashSet(newFooApp());
52
53 OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
54 when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[0]);
55
56 final TransformContext context = new TransformContext(regs, SystemExports.NONE, new JarPluginArtifact(pluginJar), applications, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
57
58 transformer.execute(context);
59
60 byte[] content = null;
61 for (byte[] entry : context.getFileOverrides().values()) {
62 if (entry.length > 0) {
63 content = entry;
64 }
65 }
66 if (content == null) {
67 return null;
68 }
69 final Document springDoc = DocumentHelper.parseText(new String(content));
70 final Element springRoot = springDoc.getRootElement();
71
72 for (final String xp : xpaths) {
73 final XPath xpath = DocumentHelper.createXPath(xp);
74 final Object obj = xpath.evaluate(springRoot);
75 if (obj instanceof Node) {
76
77 } else if (obj instanceof Boolean) {
78 if (!(Boolean) obj) {
79 printDocument(springDoc);
80 Assert.fail("Unable to match xpath: " + xp);
81 }
82 } else if (obj == null) {
83 printDocument(springDoc);
84 Assert.fail("Unable to match xpath: " + xp);
85 } else {
86 printDocument(springDoc);
87 Assert.fail("Unexpected result:" + obj);
88 }
89 }
90 return springRoot;
91 }
92
93 private static Application newFooApp() {
94 return new Application() {
95 @Override
96 public String getKey() {
97 return "foo";
98 }
99
100 @Override
101 public String getVersion() {
102 return null;
103 }
104
105 @Override
106 public String getBuildNumber() {
107 return null;
108 }
109 };
110 }
111
112 static String elementToString(Element pluginRoot)
113 throws IOException {
114 final StringWriter swriter = new StringWriter();
115 final OutputFormat outformat = OutputFormat.createPrettyPrint();
116 final XMLWriter writer = new XMLWriter(swriter, outformat);
117 writer.write(pluginRoot.getDocument());
118 writer.flush();
119 return swriter.toString();
120 }
121
122 private static void printDocument(final Document springDoc) throws IOException {
123 final OutputFormat outformat = OutputFormat.createPrettyPrint();
124 final XMLWriter writer = new XMLWriter(System.out, outformat);
125 writer.write(springDoc);
126 writer.flush();
127 }
128
129 }