1
2
3
4
5
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
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
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
174 transformer.setXslt(xsl);
175
176
177 Map params = new HashMap();
178 params.put("param1", param);
179 transformer.setContextProperties(params);
180
181
182 transformer.initialise();
183
184
185 String transformerResult = (String) transformer.transform(xml);
186
187
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
235 transformer.setXslt(xsl);
236
237
238 Map params = new HashMap();
239 params.put("param1", "#[header:myproperty]");
240 transformer.setContextProperties(params);
241
242
243 transformer.initialise();
244
245 MuleMessage message = new DefaultMuleMessage(xml, muleContext);
246 message.setOutboundProperty("myproperty", param);
247
248 String transformerResult = (String) transformer.transform(message);
249
250
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 }