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