View Javadoc

1   /*
2    * $Id: ParallelXQueryTransformerTestCase.java 20321 2010-11-24 15:21:24Z dfeist $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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 }