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 org.mule.DefaultMuleMessage;
10  import org.mule.api.MuleMessage;
11  import org.mule.api.lifecycle.InitialisationException;
12  import org.mule.api.transformer.Transformer;
13  import org.mule.api.transformer.TransformerException;
14  import org.mule.module.xml.transformer.XsltTransformer;
15  import org.mule.module.xml.util.XMLTestUtils;
16  import org.mule.module.xml.util.XMLUtils;
17  import org.mule.transformer.types.DataTypeFactory;
18  import org.mule.util.IOUtils;
19  
20  import java.io.InputStream;
21  import java.util.HashMap;
22  import java.util.Iterator;
23  import java.util.List;
24  import java.util.Map;
25  
26  import javax.xml.stream.XMLStreamReader;
27  
28  import org.junit.Test;
29  
30  import static org.junit.Assert.assertEquals;
31  import static org.junit.Assert.assertNotNull;
32  import static org.junit.Assert.assertTrue;
33  import static org.junit.Assert.fail;
34  
35  public class XsltTransformerJDKTransformerTestCase extends AbstractXmlTransformerTestCase
36  {
37  
38      private String srcData;
39      private String resultData;
40  
41      @Override
42      protected void doSetUp() throws Exception
43      {
44          srcData = IOUtils.getResourceAsString("cdcatalog.xml", getClass());
45          resultData = IOUtils.getResourceAsString("cdcatalog.html", getClass());
46      }
47  
48      @Override
49      public Transformer getTransformer() throws Exception
50      {
51          XsltTransformer transformer = new XsltTransformer();
52          transformer.setReturnDataType(DataTypeFactory.STRING);
53          transformer.setXslFile("cdcatalog.xsl");
54          transformer.setMaxActiveTransformers(42);
55          //Will default to JDK
56          transformer.setXslTransformerFactory(null);
57          initialiseObject(transformer);
58          return transformer;
59      }
60  
61      @Override
62      public Transformer getRoundTripTransformer() throws Exception
63      {
64          return null;
65      }
66  
67      @Override
68      @Test
69      public void testRoundtripTransform() throws Exception
70      {
71          // disable this test
72      }
73  
74      @Override
75      public Object getTestData()
76      {
77          Map props = new HashMap();
78          props.put("ListTitle", "MyList");
79          props.put("ListRating", new Integer(6));
80          return new DefaultMuleMessage(srcData, props, muleContext);
81      }
82  
83      @Override
84      public Object getResultData()
85      {
86          return resultData;
87      }
88  
89      @Test
90      public void testAllXmlMessageTypes() throws Exception
91      {
92          List list = XMLTestUtils.getXmlMessageVariants("cdcatalog.xml");
93          Iterator it = list.iterator();
94  
95          Object expectedResult = getResultData();
96          assertNotNull(expectedResult);
97  
98          Object msg, result;
99          while (it.hasNext())
100         {
101             msg = it.next();
102             result = getTransformer().transform(msg);
103             assertNotNull(result);
104             assertTrue("Test failed for message type: " + msg.getClass(), compareResults(expectedResult, result));
105         }
106     }
107 
108     @Test
109     public void testTransformXMLStreamReader() throws Exception
110     {
111         Object expectedResult = getResultData();
112         assertNotNull(expectedResult);
113 
114         XsltTransformer transformer = (XsltTransformer) getTransformer();
115 
116         InputStream is = IOUtils.getResourceAsStream("cdcatalog.xml", XMLTestUtils.class);
117         XMLStreamReader sr = XMLUtils.toXMLStreamReader(transformer.getXMLInputFactory(), is);
118 
119         Object result = transformer.transform(sr);
120         assertNotNull(result);
121         assertTrue("expected: " + expectedResult + "\nresult: " + result, compareResults(expectedResult, result));
122     }
123 
124     @Test
125     public void testCustomTransformerFactoryClass() throws InitialisationException
126     {
127         XsltTransformer t = new XsltTransformer();
128         t.setXslTransformerFactory("com.nosuchclass.TransformerFactory");
129         t.setXslFile("cdcatalog.xsl");
130 
131         try
132         {
133             t.initialise();
134             fail("should have failed with ClassNotFoundException");
135         }
136         catch (InitialisationException iex)
137         {
138             assertEquals(ClassNotFoundException.class, iex.getCause().getClass());
139         }
140 
141         t = new XsltTransformer();
142         t.setXslFile("cdcatalog.xsl");
143         // try again with JDK default
144         t.setXslTransformerFactory(null);
145         t.initialise();
146     }
147 
148     @Test
149     public void testTransformWithStaticParam() throws TransformerException, InitialisationException
150     {
151 
152         String xml =
153                 "<node1>" +
154                      "<subnode1>sub node 1 original value</subnode1>" +
155                      "<subnode2>sub node 2 original value</subnode2>" +
156                  "</node1>";
157 
158         String param = "sub node 2 cool new value";
159 
160         String expectedTransformedxml =
161                 "<node1>" +
162                     "<subnode1>sub node 1 original value</subnode1>" +
163                     "<subnode2>" + param + "</subnode2>" +
164                 "</node1>";
165 
166         String xsl =
167                 "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"2.0\"" +
168                      " xmlns:wsdlsoap=\"http://schemas.xmlsoap.org/wsdl/soap/\"" +
169                      " xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">" +
170                      "<xsl:param name=\"param1\"/>" +
171                      "<xsl:template match=\"@*|node()\">" +
172                          "<xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy>" +
173                      "</xsl:template>" +
174                          "<xsl:template match=\"/node1/subnode2/text()\">" +
175                          "<xsl:value-of select=\"$param1\"/>" +
176                      "</xsl:template>" +
177                  "</xsl:stylesheet>";
178 
179         XsltTransformer transformer = new XsltTransformer();
180 
181         transformer.setMuleContext(muleContext);
182         transformer.setReturnDataType(DataTypeFactory.STRING);
183         // set stylesheet
184         transformer.setXslt(xsl);
185 
186         // set parameter
187         Map params = new HashMap();
188         params.put("param1", param);
189         transformer.setContextProperties(params);
190 
191         // init transformer
192         transformer.initialise();
193 
194         // do transformation
195         String transformerResult = (String) transformer.transform(xml);
196 
197         // remove doc type and CRLFs
198         transformerResult = transformerResult.substring(transformerResult.indexOf("?>") + 2);
199 
200         assertTrue(transformerResult.indexOf(expectedTransformedxml) > -1);
201 
202     }
203 
204     @Test
205     public void testTransformWithDynamicParam() throws Exception
206     {
207 
208         String xml =
209                 "<node1>" +
210                      "<subnode1>sub node 1 original value</subnode1>" +
211                      "<subnode2>sub node 2 original value</subnode2>" +
212                  "</node1>";
213 
214         String param = "sub node 2 cool new value";
215 
216         String expectedTransformedxml =
217                 "<node1>" +
218                     "<subnode1>sub node 1 original value</subnode1>" +
219                     "<subnode2>" + param + "</subnode2>" +
220                 "</node1>";
221 
222         String xsl =
223                 "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"2.0\"" +
224                     " xmlns:wsdlsoap=\"http://schemas.xmlsoap.org/wsdl/soap/\"" +
225                     " xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">" +
226                     "<xsl:param name=\"param1\"/>" +
227                     "<xsl:template match=\"@*|node()\">" +
228                         "<xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy>" +
229                     "</xsl:template>" +
230                     "<xsl:template match=\"/node1/subnode2/text()\">" +
231                         "<xsl:value-of select=\"$param1\"/>" +
232                     "</xsl:template>" +
233                 "</xsl:stylesheet>";
234 
235         XsltTransformer transformer = new XsltTransformer();
236 
237         transformer.setMuleContext(muleContext);
238         transformer.setReturnDataType(DataTypeFactory.STRING);
239         transformer.setMuleContext(muleContext);
240         // set stylesheet
241         transformer.setXslt(xsl);
242 
243         // set parameter
244         Map params = new HashMap();
245         params.put("param1", "#[header:myproperty]");
246         transformer.setContextProperties(params);
247 
248         // init transformer
249         transformer.initialise();
250 
251         MuleMessage message = new DefaultMuleMessage(xml, muleContext);
252         message.setOutboundProperty("myproperty", param);
253         // do transformation
254         String transformerResult = (String) transformer.transform(message);
255 
256         // remove doc type and CRLFs
257         transformerResult = transformerResult.substring(transformerResult.indexOf("?>") + 2);
258 
259         assertTrue(transformerResult.indexOf(expectedTransformedxml) > -1);
260     }
261 
262 }