View Javadoc

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