View Javadoc
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   * Executes a transformation stage and tests xpath expressions against it
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                  // test passed
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 }