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