View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.transformers.xml;
8   
9   import static org.junit.Assert.assertEquals;
10  import static org.junit.Assert.assertNotNull;
11  import static org.junit.Assert.assertTrue;
12  import static org.junit.Assert.fail;
13  import org.mule.DefaultMuleMessage;
14  import org.mule.api.MuleMessage;
15  import org.mule.api.lifecycle.InitialisationException;
16  import org.mule.api.transformer.Transformer;
17  import org.mule.api.transformer.TransformerException;
18  import org.mule.module.xml.transformer.XsltTransformer;
19  import org.mule.module.xml.util.LocalURIResolver;
20  import org.mule.module.xml.util.XMLTestUtils;
21  import org.mule.module.xml.util.XMLUtils;
22  import org.mule.transformer.types.DataTypeFactory;
23  import org.mule.util.IOUtils;
24  
25  import java.io.InputStream;
26  import java.util.HashMap;
27  import java.util.Iterator;
28  import java.util.List;
29  import java.util.Map;
30  
31  import javax.xml.stream.XMLStreamReader;
32  import javax.xml.transform.URIResolver;
33  
34  import org.junit.Test;
35  
36  public class XsltTransformerTestCase extends AbstractXmlTransformerTestCase
37  {
38  
39      public static final String VALID_XSL_FILENAME = "cdcatalog.xsl";
40  
41      private String srcData;
42      private String resultData;
43  
44      @Override
45      protected void doSetUp() throws Exception
46      {
47          srcData = IOUtils.getResourceAsString("cdcatalog.xml", getClass());
48          resultData = IOUtils.getResourceAsString("cdcatalog.html", getClass());
49      }
50  
51      @Override
52      public Transformer getTransformer() throws Exception
53      {
54          XsltTransformer transformer = new XsltTransformer();
55          transformer.setReturnDataType(DataTypeFactory.STRING);
56          transformer.setXslFile(VALID_XSL_FILENAME);
57          transformer.setMaxActiveTransformers(42);
58          transformer.setMuleContext(muleContext);
59          transformer.initialise();
60          return transformer;
61      }
62  
63      @Override
64      public Transformer getRoundTripTransformer() throws Exception
65      {
66          return null;
67      }
68  
69      @Override
70      public void testRoundtripTransform() throws Exception
71      {
72          // disable this test
73      }
74  
75      @Override
76      public Object getTestData()
77      {
78          Map<String, Object> props = new HashMap<String, Object>();
79          props.put("ListTitle", "MyList");
80          props.put("ListRating", new Integer(6));
81          return new DefaultMuleMessage(srcData, props, muleContext);
82      }
83  
84      @Override
85      public Object getResultData()
86      {
87          return resultData;
88      }
89  
90      @Test
91      public void testAllXmlMessageTypes() throws Exception
92      {
93          List<?> list = XMLTestUtils.getXmlMessageVariants("cdcatalog.xml");
94          Iterator<?> it = list.iterator();
95          
96          Object expectedResult = getResultData();
97          assertNotNull(expectedResult);
98          
99          Object msg, result;
100         while (it.hasNext())
101         {
102             msg = it.next();
103             result = getTransformer().transform(msg);
104             assertNotNull(result);
105             assertTrue("Test failed for message type: " + msg.getClass(), compareResults(expectedResult, result));
106         }
107     }
108 
109     @Test
110     public void testTransformXMLStreamReader() throws Exception
111     {
112         Object expectedResult = getResultData();
113         assertNotNull(expectedResult);
114         
115         XsltTransformer transformer = (XsltTransformer) getTransformer();
116         
117         InputStream is = IOUtils.getResourceAsStream("cdcatalog.xml", XMLTestUtils.class);
118         XMLStreamReader sr = XMLUtils.toXMLStreamReader(transformer.getXMLInputFactory(), is);
119 
120         Object result = transformer.transform(sr);
121         assertNotNull(result);
122         assertTrue("expected: " + expectedResult + "\nresult: " + result, compareResults(expectedResult, result));
123     }
124     
125     @Test
126     public void testCustomTransformerFactoryClass() throws InitialisationException
127     {
128         XsltTransformer t = new XsltTransformer();
129         t.setXslTransformerFactory("com.nosuchclass.TransformerFactory");
130         t.setXslFile(VALID_XSL_FILENAME);
131 
132         try
133         {
134             t.initialise();
135             fail("should have failed with ClassNotFoundException");
136         }
137         catch (InitialisationException iex)
138         {
139             assertEquals(ClassNotFoundException.class, iex.getCause().getClass());
140         }
141 
142         t = new XsltTransformer();
143         t.setXslFile(VALID_XSL_FILENAME);
144         // try again with JDK default
145         t.setXslTransformerFactory(null);
146         t.initialise();
147     }
148 
149     @Test
150     public void testTransformWithStaticParam() throws TransformerException, InitialisationException
151     {
152 
153         String xml =
154                 "<node1>" +
155                      "<subnode1>sub node 1 original value</subnode1>" +
156                      "<subnode2>sub node 2 original value</subnode2>" +
157                  "</node1>";
158 
159         String param = "sub node 2 cool new value";
160 
161         String expectedTransformedxml =
162                 "<node1>" +
163                     "<subnode1>sub node 1 original value</subnode1>" +
164                     "<subnode2>" + param + "</subnode2>" +
165                 "</node1>";
166 
167         String xsl = someXslText();
168 
169         XsltTransformer transformer = new XsltTransformer();
170 
171         transformer.setMuleContext(muleContext);
172         transformer.setReturnDataType(DataTypeFactory.STRING);
173         // set stylesheet
174         transformer.setXslt(xsl);
175 
176         // set parameter
177         Map params = new HashMap();
178         params.put("param1", param);
179         transformer.setContextProperties(params);
180 
181         // init transformer
182         transformer.initialise();
183 
184         // do transformation
185         String transformerResult = (String) transformer.transform(xml);
186 
187         // remove doc type and CRLFs
188         transformerResult = transformerResult.substring(transformerResult.indexOf("?>") + 2);
189 
190         assertTrue(transformerResult.indexOf(expectedTransformedxml) > -1);
191 
192     }
193 
194     private String someXslText()
195     {
196         return "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"2.0\"" +
197              " xmlns:wsdlsoap=\"http://schemas.xmlsoap.org/wsdl/soap/\"" +
198              " xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">" +
199              "<xsl:param name=\"param1\"/>" +
200              "<xsl:template match=\"@*|node()\">" +
201                  "<xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy>" +
202              "</xsl:template>" +
203                  "<xsl:template match=\"/node1/subnode2/text()\">" +
204                  "<xsl:value-of select=\"$param1\"/>" +
205              "</xsl:template>" +
206          "</xsl:stylesheet>";
207     }
208 
209     @Test
210     public void testTransformWithDynamicParam() throws Exception
211     {
212 
213         String xml =
214                 "<node1>" +
215                      "<subnode1>sub node 1 original value</subnode1>" +
216                      "<subnode2>sub node 2 original value</subnode2>" +
217                  "</node1>";
218 
219         String param = "sub node 2 cool new value";
220 
221         String expectedTransformedxml =
222                 "<node1>" +
223                     "<subnode1>sub node 1 original value</subnode1>" +
224                     "<subnode2>" + param + "</subnode2>" +
225                 "</node1>";
226 
227         String xsl = someXslText();
228 
229         XsltTransformer transformer = new XsltTransformer();
230 
231         transformer.setMuleContext(muleContext);
232         transformer.setReturnDataType(DataTypeFactory.STRING);
233         transformer.setMuleContext(muleContext);
234         // set stylesheet
235         transformer.setXslt(xsl);
236 
237         // set parameter
238         Map params = new HashMap();
239         params.put("param1", "#[header:myproperty]");
240         transformer.setContextProperties(params);
241 
242         // init transformer
243         transformer.initialise();
244 
245         MuleMessage message = new DefaultMuleMessage(xml, muleContext);
246         message.setOutboundProperty("myproperty", param);
247         // do transformation
248         String transformerResult = (String) transformer.transform(message);
249 
250         // remove doc type and CRLFs
251         transformerResult = transformerResult.substring(transformerResult.indexOf("?>") + 2);
252 
253         assertTrue(transformerResult.indexOf(expectedTransformedxml) > -1);
254     }
255 
256     @Test
257     public void testInitialiseMustLoadXsltFile_dontLoadIfThereIsXslText() throws Exception
258     {
259         XsltTransformer xsltTransformer = new XsltTransformer();
260         xsltTransformer.setXslt(someXslText());
261         try
262         {
263             xsltTransformer.initialise();
264             assertEquals(someXslText(), xsltTransformer.getXslt());
265         }
266         catch (InitialisationException e)
267         {
268             fail("Should not have thrown an exception: " + e);
269         }
270     }
271 
272     @Test
273     public void testInitialiseMustLoadXsltFile_ThrowExceptionIfNoXslTextNorFile() throws Exception
274     {
275         XsltTransformer xsltTransformer = new XsltTransformer();
276         try
277         {
278             xsltTransformer.initialise();
279             fail("Should have thrown an exception because nor xslt-text nor xslt-file was set.");
280         }
281         catch (InitialisationException e)
282         {
283             assertTrue(e.getMessage().contains("xsl-file or xsl-text"));
284         }
285     }
286 
287     @Test
288     public void testInitialiseMustLoadXsltFile_ThrowExceptionIfXslFileDoesNotExist() throws Exception
289     {
290         XsltTransformer xsltTransformer = new XsltTransformer();
291         String someNonExistentFileName = "some nonexistent file";
292         xsltTransformer.setXslFile(someNonExistentFileName);
293         try
294         {
295             xsltTransformer.initialise();
296             fail("Should have thrown an exception because file '" + someNonExistentFileName
297                  + "' does not exist.");
298         }
299         catch (InitialisationException e)
300         {
301             assertTrue(e.getMessage().contains(someNonExistentFileName));
302         }
303     }
304 
305     @Test
306     public void testInitialiseMustLoadXsltFile_LoadsFromXslFile() throws Exception
307     {
308         XsltTransformer xsltTransformer = new XsltTransformer();
309         xsltTransformer.setXslFile(VALID_XSL_FILENAME);
310         try
311         {
312             xsltTransformer.initialise();
313             assertNotNull(xsltTransformer.getXslt());
314             String someTextThatIsInTheXslFile = "My CD Collection";
315             assertTrue("Should contain the text '" + someTextThatIsInTheXslFile + "', because it is in the '"
316                        + VALID_XSL_FILENAME + "' file that we are setting.", xsltTransformer.getXslt()
317                 .contains(
318                 someTextThatIsInTheXslFile));
319         }
320         catch (InitialisationException e)
321         {
322             fail("Should NOT have thrown an exception because file '" + VALID_XSL_FILENAME
323                  + "' DOES exist.");
324         }
325     }
326 
327     @Test
328     public void testInitialiseUriResolverIfNotSet() throws Exception
329     {
330         XsltTransformer xsltTransformer = new XsltTransformer();
331         xsltTransformer.setXslFile(VALID_XSL_FILENAME);
332 
333         xsltTransformer.initialise();
334         assertTrue(xsltTransformer.getUriResolver() instanceof LocalURIResolver);
335     }
336 
337     @Test
338     public void testInitialiseMaintainsUriResolverIfSet() throws Exception
339     {
340         XsltTransformer xsltTransformer = new XsltTransformer();
341         xsltTransformer.setXslFile(VALID_XSL_FILENAME);
342 
343         URIResolver uriResolver = new LocalURIResolver();
344         xsltTransformer.setUriResolver(uriResolver);
345         xsltTransformer.initialise();
346         assertEquals(uriResolver, xsltTransformer.getUriResolver());
347     }
348 
349 }