You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by dk...@apache.org on 2012/07/16 18:56:41 UTC

svn commit: r1362130 - in /camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel: builder/xml/XsltBuilder.java component/xslt/XsltComponent.java

Author: dkulp
Date: Mon Jul 16 16:56:40 2012
New Revision: 1362130

URL: http://svn.apache.org/viewvc?rev=1362130&view=rev
Log:
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.10.x/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java
    camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java

Modified: camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java?rev=1362130&r1=1362129&r2=1362130&view=diff
==============================================================================
--- camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java (original)
+++ camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/builder/xml/XsltBuilder.java Mon Jul 16 16:56:40 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.10.x/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java?rev=1362130&r1=1362129&r2=1362130&view=diff
==============================================================================
--- camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java (original)
+++ camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java Mon Jul 16 16:56:40 2012
@@ -110,6 +110,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);
 
         // default to use the cache option from the component if the endpoint did not have the contentCache parameter
         boolean cache = getAndRemoveParameter(parameters, "contentCache", Boolean.class, contentCache);