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