View Javadoc

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