1   /*
2    * $Id: XsltTransformerTestCase.java 10395 2008-01-18 15:27:42Z holger $
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.impl.RequestContext;
14  import org.mule.tck.MuleTestUtils;
15  import org.mule.umo.UMOEvent;
16  import org.mule.umo.lifecycle.InitialisationException;
17  import org.mule.umo.transformer.TransformerException;
18  import org.mule.umo.transformer.UMOTransformer;
19  import org.mule.util.IOUtils;
20  
21  import java.util.HashMap;
22  import java.util.Map;
23  
24  public class XsltTransformerTestCase extends AbstractXmlTransformerTestCase
25  {
26  
27      private String srcData;
28      private String resultData;
29  
30      // @Override
31      protected void doSetUp() throws Exception
32      {
33          srcData = IOUtils.getResourceAsString("cdcatalog.xml", getClass());
34          resultData = IOUtils.getResourceAsString("cdcatalog.html", getClass());
35      }
36  
37      public UMOTransformer getTransformer() throws Exception
38      {
39          XsltTransformer transformer = new XsltTransformer();
40          transformer.setXslFile("cdcatalog.xsl");
41          transformer.setMaxActiveTransformers(42);
42          transformer.initialise();
43          return transformer;
44      }
45  
46      public UMOTransformer getRoundTripTransformer() throws Exception
47      {
48          return null;
49      }
50  
51      // @Override
52      public void testRoundtripTransform() throws Exception
53      {
54          // disable this test
55      }
56  
57      public Object getTestData()
58      {
59          return srcData;
60      }
61  
62      public Object getResultData()
63      {
64          return resultData;
65      }
66  
67      public void testCustomTransformerFactoryClass() throws InitialisationException
68      {
69          XsltTransformer t = new XsltTransformer();
70          t.setXslTransformerFactory("com.nosuchclass.TransformerFactory");
71          t.setXslFile("cdcatalog.xsl");
72  
73          try
74          {
75              t.initialise();
76              fail("should have failed with ClassNotFoundException");
77          }
78          catch (InitialisationException iex)
79          {
80              assertEquals(ClassNotFoundException.class, iex.getCause().getClass());
81          }
82  
83          // try again with JDK default
84          t.setXslTransformerFactory(null);
85          t.initialise();
86      }
87  
88      // @Override
89      protected void doTestClone(UMOTransformer original, UMOTransformer clone) throws Exception
90      {
91          super.doTestClone(original, clone);
92  
93          XsltTransformer t1 = (XsltTransformer) original;
94          XsltTransformer t2 = (XsltTransformer) clone;
95  
96          // The transformerPool must be a new instance
97          assertNotSame("transformerPool", t1.transformerPool, t2.transformerPool);
98          // ..but it must have the same config value
99          assertEquals("transformerPool.maxActive", t1.getMaxActiveTransformers(),
100             t2.getMaxActiveTransformers());
101     }
102 
103     public void testTransformWithStaticParam() throws TransformerException, InitialisationException
104     {
105 
106         String xml =
107                 "<node1>" +
108                      "<subnode1>sub node 1 original value</subnode1>" +
109                      "<subnode2>sub node 2 original value</subnode2>" +
110                  "</node1>";
111 
112         String param = "sub node 2 cool new value";
113 
114         String expectedTransformedxml =
115                 "<node1>" +
116                     "<subnode1>sub node 1 original value</subnode1>" +
117                     "<subnode2>" + param + "</subnode2>" +
118                 "</node1>";
119 
120         String xsl =
121                 "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"2.0\"" +
122                      " xmlns:wsdlsoap=\"http://schemas.xmlsoap.org/wsdl/soap/\"" +
123                      " xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">" +
124                      "<xsl:param name=\"param1\"/>" +
125                      "<xsl:template match=\"@*|node()\">" +
126                          "<xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy>" +
127                      "</xsl:template>" +
128                          "<xsl:template match=\"/node1/subnode2/text()\">" +
129                          "<xsl:value-of select=\"$param1\"/>" +
130                      "</xsl:template>" +
131                  "</xsl:stylesheet>";
132 
133         XsltTransformer transformer = new XsltTransformer();
134 
135         // set stylesheet
136         transformer.setXslt(xsl);
137 
138         // set parameter
139         Map params = new HashMap();
140         params.put("param1", param);
141         transformer.setTransformParameters(params);
142 
143         // init transformer
144         transformer.initialise();
145 
146         // do transformation
147         String transformerResult = (String) transformer.transform(xml);
148 
149         // remove doc type and CRLFs
150         transformerResult = transformerResult.substring(transformerResult.indexOf("?>") + 2);
151 
152         assertTrue(transformerResult.indexOf(expectedTransformedxml) > -1);
153 
154     }
155 
156     public void testTransformWithDynamicParam() throws Exception
157     {
158 
159         String xml =
160                 "<node1>" +
161                      "<subnode1>sub node 1 original value</subnode1>" +
162                      "<subnode2>sub node 2 original value</subnode2>" +
163                  "</node1>";
164 
165         String param = "sub node 2 cool new value";
166 
167         String expectedTransformedxml =
168                 "<node1>" +
169                     "<subnode1>sub node 1 original value</subnode1>" +
170                     "<subnode2>" + param + "</subnode2>" +
171                 "</node1>";
172 
173         String xsl =
174                 "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"2.0\"" +
175                     " xmlns:wsdlsoap=\"http://schemas.xmlsoap.org/wsdl/soap/\"" +
176                     " xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">" +
177                     "<xsl:param name=\"param1\"/>" +
178                     "<xsl:template match=\"@*|node()\">" +
179                         "<xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy>" +
180                     "</xsl:template>" +
181                     "<xsl:template match=\"/node1/subnode2/text()\">" +
182                         "<xsl:value-of select=\"$param1\"/>" +
183                     "</xsl:template>" +
184                 "</xsl:stylesheet>";
185 
186         XsltTransformer transformer = new XsltTransformer();
187 
188         // set stylesheet
189         transformer.setXslt(xsl);
190 
191         // set parameter
192         Map params = new HashMap();
193         params.put("param1", "#getProperty(message,'myproperty')");
194         transformer.setTransformParameters(params);
195 
196         // init transformer
197         transformer.initialise();
198 
199         // set up UMOEventContext
200         UMOEvent event = MuleTestUtils.getTestEvent("test message data");
201         event.getMessage().setProperty("myproperty", param);
202         RequestContext.setEvent(event);
203 
204         // do transformation
205         String transformerResult = (String) transformer.transform(xml);
206 
207         // remove doc type and CRLFs
208         transformerResult = transformerResult.substring(transformerResult.indexOf("?>") + 2);
209 
210         assertTrue(transformerResult.indexOf(expectedTransformedxml) > -1);
211     }
212 
213 }