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