View Javadoc

1   /*
2    * $Id: ParallelXQueryTransformerTestCase.java 22387 2011-07-12 03:53:36Z dirk.olmes $
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.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 }