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