Author: cmueller
Date: Wed Apr  4 06:23:55 2012
New Revision: 1309261

URL: http://svn.apache.org/viewvc?rev=1309261&view=rev
Log:
CAMEL-3776: Add pooling support for JAXB data format

Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java
    
camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
    
camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/example/DataFormatConcurrentTest.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java?rev=1309261&r1=1309260&r2=1309261&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java
 Wed Apr  4 06:23:55 2012
@@ -16,13 +16,7 @@
  */
 package org.apache.camel.converter.jaxp;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.Writer;
+import java.io.*;
 
 import javax.xml.stream.XMLEventReader;
 import javax.xml.stream.XMLEventWriter;
@@ -105,6 +99,11 @@ public class StaxConverter {
     public XMLStreamReader createXMLStreamReader(Source in) throws 
XMLStreamException {
         return getInputFactory().createXMLStreamReader(in);
     }
+
+    @Converter
+    public XMLStreamReader createXMLStreamReader(String string) throws 
XMLStreamException {
+        return getInputFactory().createXMLStreamReader(new 
StringReader(string));
+    }
     
     /**
      * @deprecated will be removed in Camel 3.0. Use the method which has 2 
parameters.

Modified: 
camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java?rev=1309261&r1=1309260&r2=1309261&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
 (original)
+++ 
camel/trunk/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
 Wed Apr  4 06:23:55 2012
@@ -36,6 +36,7 @@ import javax.xml.bind.annotation.XmlRoot
 import javax.xml.stream.FactoryConfigurationError;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 import javax.xml.transform.Source;
 
@@ -137,6 +138,14 @@ public class FallbackTypeConverter imple
         Unmarshaller unmarshaller = getOrCreateUnmarshaller(type);
 
         if (parentTypeConverter != null) {
+            if (!needFiltering(exchange)) {
+                // we cannot filter the XMLStreamReader if necessary
+                XMLStreamReader xmlReader = 
parentTypeConverter.convertTo(XMLStreamReader.class, value);
+                if (xmlReader != null) {
+                    Object unmarshalled = unmarshal(unmarshaller, exchange, 
xmlReader);
+                    return type.cast(unmarshalled);
+                }
+            }
             InputStream inputStream = 
parentTypeConverter.convertTo(InputStream.class, value);
             if (inputStream != null) {
                 Object unmarshalled = unmarshal(unmarshaller, exchange, 
inputStream);
@@ -195,10 +204,13 @@ public class FallbackTypeConverter imple
         return answer;
     }
 
-    protected Object unmarshal(Unmarshaller unmarshaller, Exchange exchange, 
Object value) throws JAXBException, UnsupportedEncodingException {
+    protected Object unmarshal(Unmarshaller unmarshaller, Exchange exchange, 
Object value) throws JAXBException, UnsupportedEncodingException, 
XMLStreamException {
         unmarshallerLock.lock();
         try {
-            if (value instanceof InputStream) {
+            if (value instanceof XMLStreamReader) {
+                XMLStreamReader xmlReader = (XMLStreamReader) value;
+                return unmarshaller.unmarshal(xmlReader);
+            } else if (value instanceof InputStream) {
                 if (needFiltering(exchange)) {
                     return unmarshaller.unmarshal(new NonXmlFilterReader(new 
InputStreamReader((InputStream)value, IOHelper.getCharsetName(exchange))));
                 }

Modified: 
camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/example/DataFormatConcurrentTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/example/DataFormatConcurrentTest.java?rev=1309261&r1=1309260&r2=1309261&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/example/DataFormatConcurrentTest.java
 (original)
+++ 
camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/example/DataFormatConcurrentTest.java
 Wed Apr  4 06:23:55 2012
@@ -67,7 +67,7 @@ public class DataFormatConcurrentTest ex
         template.setDefaultEndpointUri("direct:unmarshalFallback");
 
         ExecutorService pool = Executors.newFixedThreadPool(20);
-        //long start = System.currentTimeMillis();
+        long start = System.currentTimeMillis();
         for (int i = 0; i < counter; i++) {
             pool.execute(new Runnable() {
                 public void run() {
@@ -79,8 +79,8 @@ public class DataFormatConcurrentTest ex
 
         // should finish on fast machines in less than 3 seconds
         assertTrue(latch.await(10, TimeUnit.SECONDS));
-        //long end = System.currentTimeMillis();
-        //System.out.println("took " + (end - start) + "ms");
+        long end = System.currentTimeMillis();
+        System.out.println("took " + (end - start) + "ms");
     }
 
     @Test


Reply via email to