1   /*
2    * $Id:XsltTransformerTestCase.java 5937 2007-04-09 22:35:04Z rossmason $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.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.RequestContext;
14  import org.mule.api.MuleEvent;
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.tck.MuleTestUtils;
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  public class XsltTransformerTestCase extends AbstractXmlTransformerTestCase
33  {
34  
35      private String srcData;
36      private String resultData;
37  
38      // @Override
39      protected void doSetUp() throws Exception
40      {
41          srcData = IOUtils.getResourceAsString("cdcatalog.xml", getClass());
42          resultData = IOUtils.getResourceAsString("cdcatalog.html", getClass());
43      }
44  
45      public Transformer getTransformer() throws Exception
46      {
47          XsltTransformer transformer = new XsltTransformer();
48          transformer.setReturnClass(String.class);
49          transformer.setXslFile("cdcatalog.xsl");
50          transformer.setMaxActiveTransformers(42);
51          transformer.initialise();
52          return transformer;
53      }
54  
55      public Transformer getRoundTripTransformer() throws Exception
56      {
57          return null;
58      }
59  
60      // @Override
61      public void testRoundtripTransform() throws Exception
62      {
63          // disable this test
64      }
65  
66      public Object getTestData()
67      {
68          return srcData;
69      }
70  
71      public Object getResultData()
72      {
73          return resultData;
74      }
75  
76      public void testAllXmlMessageTypes() throws Exception
77      {
78          List list = XMLTestUtils.getXmlMessageVariants("cdcatalog.xml");
79          Iterator it = list.iterator();
80          
81          Object expectedResult = getResultData();
82          assertNotNull(expectedResult);
83          
84          Object msg, result;
85          while (it.hasNext())
86          {
87              msg = it.next();
88              result = getTransformer().transform(msg);
89              assertNotNull(result);
90              assertTrue("Test failed for message type: " + msg.getClass(), compareResults(expectedResult, result));
91          }        
92      }
93  
94      public void testTransformXMLStreamReader() throws Exception
95      {
96          Object expectedResult = getResultData();
97          assertNotNull(expectedResult);
98          
99          XsltTransformer transformer = (XsltTransformer) getTransformer();
100         
101         InputStream is = IOUtils.getResourceAsStream("cdcatalog.xml", XMLTestUtils.class);
102         XMLStreamReader sr = XMLUtils.toXMLStreamReader(transformer.getXMLInputFactory(), is);
103 
104         Object result = transformer.transform(sr);
105         assertNotNull(result);
106         assertTrue("expected: " + expectedResult + "\nresult: " + result, compareResults(expectedResult, result));
107     }
108     
109     public void testCustomTransformerFactoryClass() throws InitialisationException
110     {
111         XsltTransformer t = new XsltTransformer();
112         t.setXslTransformerFactory("com.nosuchclass.TransformerFactory");
113         t.setXslFile("cdcatalog.xsl");
114 
115         try
116         {
117             t.initialise();
118             fail("should have failed with ClassNotFoundException");
119         }
120         catch (InitialisationException iex)
121         {
122             assertEquals(ClassNotFoundException.class, iex.getCause().getClass());
123         }
124 
125         // try again with JDK default
126         t.setXslTransformerFactory(null);
127         t.initialise();
128     }
129 
130     public void testTransformWithStaticParam() throws TransformerException, InitialisationException
131     {
132 
133         String xml =
134                 "<node1>" +
135                      "<subnode1>sub node 1 original value</subnode1>" +
136                      "<subnode2>sub node 2 original value</subnode2>" +
137                  "</node1>";
138 
139         String param = "sub node 2 cool new value";
140 
141         String expectedTransformedxml =
142                 "<node1>" +
143                     "<subnode1>sub node 1 original value</subnode1>" +
144                     "<subnode2>" + param + "</subnode2>" +
145                 "</node1>";
146 
147         String xsl =
148                 "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"2.0\"" +
149                      " xmlns:wsdlsoap=\"http://schemas.xmlsoap.org/wsdl/soap/\"" +
150                      " xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">" +
151                      "<xsl:param name=\"param1\"/>" +
152                      "<xsl:template match=\"@*|node()\">" +
153                          "<xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy>" +
154                      "</xsl:template>" +
155                          "<xsl:template match=\"/node1/subnode2/text()\">" +
156                          "<xsl:value-of select=\"$param1\"/>" +
157                      "</xsl:template>" +
158                  "</xsl:stylesheet>";
159 
160         XsltTransformer transformer = new XsltTransformer();
161 
162         transformer.setReturnClass(String.class);
163         // set stylesheet
164         transformer.setXslt(xsl);
165 
166         // set parameter
167         Map params = new HashMap();
168         params.put("param1", param);
169         transformer.setContextProperties(params);
170 
171         // init transformer
172         transformer.initialise();
173 
174         // do transformation
175         String transformerResult = (String) transformer.transform(xml);
176 
177         // remove doc type and CRLFs
178         transformerResult = transformerResult.substring(transformerResult.indexOf("?>") + 2);
179 
180         assertTrue(transformerResult.indexOf(expectedTransformedxml) > -1);
181 
182     }
183 
184     public void testTransformWithDynamicParam() throws Exception
185     {
186 
187         String xml =
188                 "<node1>" +
189                      "<subnode1>sub node 1 original value</subnode1>" +
190                      "<subnode2>sub node 2 original value</subnode2>" +
191                  "</node1>";
192 
193         String param = "sub node 2 cool new value";
194 
195         String expectedTransformedxml =
196                 "<node1>" +
197                     "<subnode1>sub node 1 original value</subnode1>" +
198                     "<subnode2>" + param + "</subnode2>" +
199                 "</node1>";
200 
201         String xsl =
202                 "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"2.0\"" +
203                     " xmlns:wsdlsoap=\"http://schemas.xmlsoap.org/wsdl/soap/\"" +
204                     " xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">" +
205                     "<xsl:param name=\"param1\"/>" +
206                     "<xsl:template match=\"@*|node()\">" +
207                         "<xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy>" +
208                     "</xsl:template>" +
209                     "<xsl:template match=\"/node1/subnode2/text()\">" +
210                         "<xsl:value-of select=\"$param1\"/>" +
211                     "</xsl:template>" +
212                 "</xsl:stylesheet>";
213 
214         XsltTransformer transformer = new XsltTransformer();
215 
216         transformer.setReturnClass(String.class);
217         
218         // set stylesheet
219         transformer.setXslt(xsl);
220 
221         // set parameter
222         Map params = new HashMap();
223         params.put("param1", "${header:myproperty}");
224         transformer.setContextProperties(params);
225 
226         // init transformer
227         transformer.initialise();
228 
229         // set up MuleEventContext
230         MuleEvent event = MuleTestUtils.getTestEvent("test message data", muleContext);
231         event.getMessage().setProperty("myproperty", param);
232         RequestContext.setEvent(event);
233 
234         // do transformation
235         String transformerResult = (String) transformer.transform(xml);
236 
237         // remove doc type and CRLFs
238         transformerResult = transformerResult.substring(transformerResult.indexOf("?>") + 2);
239 
240         assertTrue(transformerResult.indexOf(expectedTransformedxml) > -1);
241     }
242 
243 }