View Javadoc

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