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