View Javadoc

1   /*
2    * $Id: ParallelXsltTransformerTestCase.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  
11  package org.mule.transformers.xml;
12  
13  import org.mule.api.transformer.Transformer;
14  import org.mule.api.transformer.TransformerException;
15  import org.mule.module.xml.transformer.XsltTransformer;
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.Collection;
21  import java.util.concurrent.ConcurrentLinkedQueue;
22  
23  import org.custommonkey.xmlunit.XMLAssert;
24  import org.junit.Test;
25  
26  public class ParallelXsltTransformerTestCase extends AbstractMuleContextTestCase
27  {
28      private String srcData;
29      private String resultData;
30      private Collection<Object> actualResults = new ConcurrentLinkedQueue<Object>();
31  
32      @Override
33      protected void doSetUp() throws Exception
34      {
35          srcData = IOUtils.toString(IOUtils.getResourceAsStream("cdcatalog-utf-8.xml", getClass()), "UTF-8");
36          resultData = IOUtils.toString(IOUtils.getResourceAsStream("cdcatalog-utf-8.html", getClass()),
37              "UTF-8");
38      }
39  
40      public Transformer getTransformer() throws Exception
41      {
42          XsltTransformer transformer = new XsltTransformer();
43          transformer.setReturnDataType(DataTypeFactory.STRING);
44          transformer.setXslFile("cdcatalog.xsl");
45          transformer.setMuleContext(muleContext);
46          transformer.initialise();
47          return transformer;
48      }
49  
50      int running = 0;
51  
52      public synchronized void signalStarted()
53      {
54          ++running;
55      }
56  
57      public synchronized void signalDone()
58      {
59          if (--running == 0) this.notify();
60      }
61  
62      @Test
63      public void testParallelTransformation() throws Exception
64      {
65          final Transformer transformer = getTransformer();
66  
67          long startTime = System.currentTimeMillis();
68  
69          for (int i = 0; i < getParallelThreadCount(); ++i)
70          {
71              new Thread(new Runnable()
72              {
73                  @Override
74                  public void run()
75                  {
76                      signalStarted();
77                      for (int j = 0; j < getCallsPerThread(); ++j)
78                      {
79                          try
80                          {
81                              actualResults.add(transformer.transform(srcData));
82                          }
83                          catch (TransformerException e)
84                          {
85                              actualResults.add(e);
86                          }
87                      }
88                      signalDone();
89                  }
90              }).start();
91          }
92  
93          synchronized (this)
94          {
95              this.wait();
96          }
97  
98          long endTime = System.currentTimeMillis();
99  
100         checkResult();
101 
102         if (logger.isDebugEnabled())
103         {
104             logger.debug("Parallel transformations in " + getParallelThreadCount() + " threads with "
105                          + getCallsPerThread() + " calls/thread took " + (endTime - startTime) + " ms.");
106         }
107     }
108 
109     protected void checkResult() throws Exception
110     {
111         Object expectedResult = resultData;
112 
113         for (Object result : actualResults)
114         {
115             if (result instanceof Exception)
116             {
117                 throw (Exception) result;
118             }
119 
120             if (expectedResult instanceof String && result instanceof String)
121             {
122                 XMLAssert.assertXMLEqual((String) expectedResult, (String) result);
123             }
124             else
125             {
126                 XMLAssert.assertEquals(expectedResult, result);
127             }
128         }
129     }
130 
131     private int getParallelThreadCount()
132     {
133         return 20;
134     }
135 
136     private int getCallsPerThread()
137     {
138         return 100;
139     }
140 }