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