1
2
3
4
5
6
7
8
9
10
11 package org.mule.transformers.xml;
12
13 import org.mule.api.transformer.Transformer;
14 import org.mule.api.transformer.TransformerException;
15 import org.mule.module.xml.transformer.XsltTransformer;
16 import org.mule.tck.junit4.AbstractMuleContextTestCase;
17 import org.mule.transformer.types.DataTypeFactory;
18 import org.mule.util.IOUtils;
19
20 import java.util.Collection;
21 import java.util.concurrent.ConcurrentLinkedQueue;
22
23 import org.custommonkey.xmlunit.XMLAssert;
24 import org.junit.Test;
25
26 public class ParallelXsltTransformerTestCase extends AbstractMuleContextTestCase
27 {
28 private String srcData;
29 private String resultData;
30 private Collection<Object> actualResults = new ConcurrentLinkedQueue<Object>();
31
32 @Override
33 protected void doSetUp() throws Exception
34 {
35 srcData = IOUtils.toString(IOUtils.getResourceAsStream("cdcatalog-utf-8.xml", getClass()), "UTF-8");
36 resultData = IOUtils.toString(IOUtils.getResourceAsStream("cdcatalog-utf-8.html", getClass()),
37 "UTF-8");
38 }
39
40 public Transformer getTransformer() throws Exception
41 {
42 XsltTransformer transformer = new XsltTransformer();
43 transformer.setReturnDataType(DataTypeFactory.STRING);
44 transformer.setXslFile("cdcatalog.xsl");
45 transformer.setMuleContext(muleContext);
46 transformer.initialise();
47 return transformer;
48 }
49
50 int running = 0;
51
52 public synchronized void signalStarted()
53 {
54 ++running;
55 }
56
57 public synchronized void signalDone()
58 {
59 if (--running == 0) this.notify();
60 }
61
62 @Test
63 public void testParallelTransformation() throws Exception
64 {
65 final Transformer transformer = getTransformer();
66
67 long startTime = System.currentTimeMillis();
68
69 for (int i = 0; i < getParallelThreadCount(); ++i)
70 {
71 new Thread(new Runnable()
72 {
73 @Override
74 public void run()
75 {
76 signalStarted();
77 for (int j = 0; j < getCallsPerThread(); ++j)
78 {
79 try
80 {
81 actualResults.add(transformer.transform(srcData));
82 }
83 catch (TransformerException e)
84 {
85 actualResults.add(e);
86 }
87 }
88 signalDone();
89 }
90 }).start();
91 }
92
93 synchronized (this)
94 {
95 this.wait();
96 }
97
98 long endTime = System.currentTimeMillis();
99
100 checkResult();
101
102 if (logger.isDebugEnabled())
103 {
104 logger.debug("Parallel transformations in " + getParallelThreadCount() + " threads with "
105 + getCallsPerThread() + " calls/thread took " + (endTime - startTime) + " ms.");
106 }
107 }
108
109 protected void checkResult() throws Exception
110 {
111 Object expectedResult = resultData;
112
113 for (Object result : actualResults)
114 {
115 if (result instanceof Exception)
116 {
117 throw (Exception) result;
118 }
119
120 if (expectedResult instanceof String && result instanceof String)
121 {
122 XMLAssert.assertXMLEqual((String) expectedResult, (String) result);
123 }
124 else
125 {
126 XMLAssert.assertEquals(expectedResult, result);
127 }
128 }
129 }
130
131 private int getParallelThreadCount()
132 {
133 return 20;
134 }
135
136 private int getCallsPerThread()
137 {
138 return 100;
139 }
140 }