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 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 @Override
46 public Transformer getTransformer() throws Exception
47 {
48 XsltTransformer transformer = new XsltTransformer();
49 transformer.setReturnDataType(DataTypeFactory.STRING);
50 transformer.setXslFile("cdcatalog.xsl");
51 transformer.setMaxActiveTransformers(42);
52 transformer.setMuleContext(muleContext);
53 transformer.initialise();
54 return transformer;
55 }
56
57 @Override
58 public Transformer getRoundTripTransformer() throws Exception
59 {
60 return null;
61 }
62
63 @Override
64 public void testRoundtripTransform() throws Exception
65 {
66
67 }
68
69 @Override
70 public Object getTestData()
71 {
72 Map<String, Object> props = new HashMap<String, Object>();
73 props.put("ListTitle", "MyList");
74 props.put("ListRating", new Integer(6));
75 return new DefaultMuleMessage(srcData, props, muleContext);
76 }
77
78 @Override
79 public Object getResultData()
80 {
81 return resultData;
82 }
83
84 public void testAllXmlMessageTypes() throws Exception
85 {
86 List<?> list = XMLTestUtils.getXmlMessageVariants("cdcatalog.xml");
87 Iterator<?> it = list.iterator();
88
89 Object expectedResult = getResultData();
90 assertNotNull(expectedResult);
91
92 Object msg, result;
93 while (it.hasNext())
94 {
95 msg = it.next();
96 result = getTransformer().transform(msg);
97 assertNotNull(result);
98 assertTrue("Test failed for message type: " + msg.getClass(), compareResults(expectedResult, result));
99 }
100 }
101
102 public void testTransformXMLStreamReader() throws Exception
103 {
104 Object expectedResult = getResultData();
105 assertNotNull(expectedResult);
106
107 XsltTransformer transformer = (XsltTransformer) getTransformer();
108
109 InputStream is = IOUtils.getResourceAsStream("cdcatalog.xml", XMLTestUtils.class);
110 XMLStreamReader sr = XMLUtils.toXMLStreamReader(transformer.getXMLInputFactory(), is);
111
112 Object result = transformer.transform(sr);
113 assertNotNull(result);
114 assertTrue("expected: " + expectedResult + "\nresult: " + result, compareResults(expectedResult, result));
115 }
116
117 public void testCustomTransformerFactoryClass() throws InitialisationException
118 {
119 XsltTransformer t = new XsltTransformer();
120 t.setXslTransformerFactory("com.nosuchclass.TransformerFactory");
121 t.setXslFile("cdcatalog.xsl");
122
123 try
124 {
125 t.initialise();
126 fail("should have failed with ClassNotFoundException");
127 }
128 catch (InitialisationException iex)
129 {
130 assertEquals(ClassNotFoundException.class, iex.getCause().getClass());
131 }
132
133 t = new XsltTransformer();
134 t.setXslFile("cdcatalog.xsl");
135
136 t.setXslTransformerFactory(null);
137 t.initialise();
138 }
139
140 public void testTransformWithStaticParam() throws TransformerException, InitialisationException
141 {
142
143 String xml =
144 "<node1>" +
145 "<subnode1>sub node 1 original value</subnode1>" +
146 "<subnode2>sub node 2 original value</subnode2>" +
147 "</node1>";
148
149 String param = "sub node 2 cool new value";
150
151 String expectedTransformedxml =
152 "<node1>" +
153 "<subnode1>sub node 1 original value</subnode1>" +
154 "<subnode2>" + param + "</subnode2>" +
155 "</node1>";
156
157 String xsl = someXslText();
158
159 XsltTransformer transformer = new XsltTransformer();
160
161 transformer.setMuleContext(muleContext);
162 transformer.setReturnDataType(DataTypeFactory.STRING);
163
164 transformer.setXslt(xsl);
165
166
167 Map params = new HashMap();
168 params.put("param1", param);
169 transformer.setContextProperties(params);
170
171
172 transformer.initialise();
173
174
175 String transformerResult = (String) transformer.transform(xml);
176
177
178 transformerResult = transformerResult.substring(transformerResult.indexOf("?>") + 2);
179
180 assertTrue(transformerResult.indexOf(expectedTransformedxml) > -1);
181
182 }
183
184 private String someXslText()
185 {
186 return "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"2.0\"" +
187 " xmlns:wsdlsoap=\"http://schemas.xmlsoap.org/wsdl/soap/\"" +
188 " xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">" +
189 "<xsl:param name=\"param1\"/>" +
190 "<xsl:template match=\"@*|node()\">" +
191 "<xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy>" +
192 "</xsl:template>" +
193 "<xsl:template match=\"/node1/subnode2/text()\">" +
194 "<xsl:value-of select=\"$param1\"/>" +
195 "</xsl:template>" +
196 "</xsl:stylesheet>";
197 }
198
199 public void testTransformWithDynamicParam() throws Exception
200 {
201
202 String xml =
203 "<node1>" +
204 "<subnode1>sub node 1 original value</subnode1>" +
205 "<subnode2>sub node 2 original value</subnode2>" +
206 "</node1>";
207
208 String param = "sub node 2 cool new value";
209
210 String expectedTransformedxml =
211 "<node1>" +
212 "<subnode1>sub node 1 original value</subnode1>" +
213 "<subnode2>" + param + "</subnode2>" +
214 "</node1>";
215
216 String xsl = someXslText();
217
218 XsltTransformer transformer = new XsltTransformer();
219
220 transformer.setMuleContext(muleContext);
221 transformer.setReturnDataType(DataTypeFactory.STRING);
222 transformer.setMuleContext(muleContext);
223
224 transformer.setXslt(xsl);
225
226
227 Map params = new HashMap();
228 params.put("param1", "#[header:myproperty]");
229 transformer.setContextProperties(params);
230
231
232 transformer.initialise();
233
234 MuleMessage message = new DefaultMuleMessage(xml, muleContext);
235 message.setOutboundProperty("myproperty", param);
236
237 String transformerResult = (String) transformer.transform(message);
238
239
240 transformerResult = transformerResult.substring(transformerResult.indexOf("?>") + 2);
241
242 assertTrue(transformerResult.indexOf(expectedTransformedxml) > -1);
243 }
244
245 public void testInitialiseMustLoadXsltFile_dontLoadIfThereIsXslText() throws Exception
246 {
247 XsltTransformer xsltTransformer = new XsltTransformer();
248 xsltTransformer.setXslt(someXslText());
249 try
250 {
251 xsltTransformer.initialise();
252 assertEquals(someXslText(), xsltTransformer.getXslt());
253 }
254 catch (InitialisationException e)
255 {
256 fail("Should not have thrown an exception: " + e);
257 }
258 }
259
260 public void testInitialiseMustLoadXsltFile_ThrowExceptionIfNoXslTextNorFile() throws Exception
261 {
262 XsltTransformer xsltTransformer = new XsltTransformer();
263 try
264 {
265 xsltTransformer.initialise();
266 fail("Should have thrown an exception because nor xslt-text nor xslt-file was set.");
267 }
268 catch (InitialisationException e)
269 {
270 assertTrue(e.getMessage().contains("xsl-file or xsl-text"));
271 }
272 }
273
274 public void testInitialiseMustLoadXsltFile_ThrowExceptionIfXslFileDoesNotExist() throws Exception
275 {
276 XsltTransformer xsltTransformer = new XsltTransformer();
277 String someNonExistentFileName = "some nonexistent file";
278 xsltTransformer.setXslFile(someNonExistentFileName);
279 try
280 {
281 xsltTransformer.initialise();
282 fail("Should have thrown an exception because file '" + someNonExistentFileName
283 + "' does not exist.");
284 }
285 catch (InitialisationException e)
286 {
287 assertTrue(e.getMessage().contains(someNonExistentFileName));
288 }
289 }
290
291 public void testInitialiseMustLoadXsltFile_LoadsFromXslFile() throws Exception
292 {
293 XsltTransformer xsltTransformer = new XsltTransformer();
294 String someExistentFileName = "cdcatalog.xsl";
295 xsltTransformer.setXslFile(someExistentFileName);
296 try
297 {
298 xsltTransformer.initialise();
299 assertNotNull(xsltTransformer.getXslt());
300 String someTextThatIsInTheXslFile = "My CD Collection";
301 assertTrue("Should contain the text '" + someTextThatIsInTheXslFile + "', because it is in the '"
302 + someExistentFileName + "' file that we are setting.", xsltTransformer.getXslt()
303 .contains(
304 someTextThatIsInTheXslFile));
305 }
306 catch (InitialisationException e)
307 {
308 fail("Should NOT have thrown an exception because file '" + someExistentFileName
309 + "' DOES exist.");
310 }
311 }
312
313 }