Author: dkulp Date: Mon Jul 16 17:16:44 2012 New Revision: 1362144 URL: http://svn.apache.org/viewvc?rev=1362144&view=rev Log: Merged revisions 1362130 via git cherry-pick from https://svn.apache.org/repos/asf/camel/branches/camel-2.10.x
........ r1362130 | dkulp | 2012-07-16 12:56:40 -0400 (Mon, 16 Jul 2012) | 12 lines Merged revisions 1362126 via git cherry-pick from https://svn.apache.org/repos/asf/camel/trunk ........ r1362126 | dkulp | 2012-07-16 12:53:57 -0400 (Mon, 16 Jul 2012) | 4 lines [CAMEL-5450] Add support to xslt component to cache the transformers (off by default, but likely could/should be on and set to something like 5 or 10) ........ ........ Modified: camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java Modified: camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java?rev=1362144&r1=1362143&r2=1362144&view=diff ============================================================================== --- camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java (original) +++ camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java Mon Jul 16 17:16:44 2012 @@ -23,6 +23,9 @@ import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.ErrorListener; import javax.xml.transform.Result; @@ -69,6 +72,7 @@ public class XsltBuilder implements Proc private Map<String, Object> parameters = new HashMap<String, Object>(); private XmlConverter converter = new XmlConverter(); private Templates template; + private volatile BlockingQueue<Transformer> transformers; private ResultHandlerFactory resultHandlerFactory = new StringResultHandlerFactory(); private boolean failOnNullBody = true; private URIResolver uriResolver; @@ -97,7 +101,7 @@ public class XsltBuilder implements Proc exchange.addOnCompletion(new XsltBuilderOnCompletion(fileName)); } - Transformer transformer = getTemplate().newTransformer(); + Transformer transformer = getTransformer(); configureTransformer(transformer, exchange); transformer.setErrorListener(new DefaultTransformErrorHandler()); ResultHandler resultHandler = resultHandlerFactory.createResult(exchange); @@ -124,6 +128,7 @@ public class XsltBuilder implements Proc LOG.trace("Transform complete with result {}", result); resultHandler.setBody(out); } finally { + releaseTransformer(transformer); // IOHelper can handle if is is null IOHelper.close(is); } @@ -238,6 +243,16 @@ public class XsltBuilder implements Proc setAllowStAX(true); return this; } + + + public XsltBuilder transformerCacheSize(int numberToCache) { + if (numberToCache > 0) { + transformers = new ArrayBlockingQueue<Transformer>(numberToCache); + } else { + transformers = null; + } + return this; + } // Properties // ------------------------------------------------------------------------- @@ -252,6 +267,9 @@ public class XsltBuilder implements Proc public void setTemplate(Templates template) { this.template = template; + if (transformers != null) { + transformers.clear(); + } } public Templates getTemplate() { @@ -365,6 +383,23 @@ public class XsltBuilder implements Proc // Implementation methods // ------------------------------------------------------------------------- + private void releaseTransformer(Transformer transformer) { + if (transformers != null) { + transformer.reset(); + transformers.offer(transformer); + } + } + + private Transformer getTransformer() throws TransformerConfigurationException { + Transformer t = null; + if (transformers != null) { + t = transformers.poll(); + } + if (t == null) { + t = getTemplate().newTransformer(); + } + return t; + } /** * Checks whether we need an {@link InputStream} to access the message body. Modified: camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java?rev=1362144&r1=1362143&r2=1362144&view=diff ============================================================================== --- camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java (original) +++ camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java Mon Jul 16 17:16:44 2012 @@ -122,6 +122,9 @@ public class XsltComponent extends Defau } String output = getAndRemoveParameter(parameters, "output", String.class); configureOutput(xslt, output); + + Integer cs = getAndRemoveParameter(parameters, "transformerCacheSize", Integer.class, Integer.valueOf(0)); + xslt.transformerCacheSize(cs); configureXslt(xslt, uri, remaining, parameters);