Return-Path: X-Original-To: apmail-camel-commits-archive@www.apache.org Delivered-To: apmail-camel-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 989D99F89 for ; Tue, 22 Nov 2011 14:30:50 +0000 (UTC) Received: (qmail 37674 invoked by uid 500); 22 Nov 2011 14:30:50 -0000 Delivered-To: apmail-camel-commits-archive@camel.apache.org Received: (qmail 37614 invoked by uid 500); 22 Nov 2011 14:30:50 -0000 Mailing-List: contact commits-help@camel.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@camel.apache.org Delivered-To: mailing list commits@camel.apache.org Received: (qmail 37607 invoked by uid 99); 22 Nov 2011 14:30:50 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 22 Nov 2011 14:30:50 +0000 X-ASF-Spam-Status: No, hits=-1998.0 required=5.0 tests=ALL_TRUSTED,FB_GET_MEDS,T_FILL_THIS_FORM_SHORT X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 22 Nov 2011 14:30:46 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 5FDC723889C5 for ; Tue, 22 Nov 2011 14:30:26 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1205018 [1/2] - in /camel/trunk: apache-camel/ apache-camel/src/main/descriptors/ camel-core/src/main/java/org/apache/camel/component/file/ camel-core/src/main/java/org/apache/camel/converter/jaxp/ camel-core/src/test/java/org/apache/camel... Date: Tue, 22 Nov 2011 14:30:24 -0000 To: commits@camel.apache.org From: davsclaus@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20111122143026.5FDC723889C5@eris.apache.org> Author: davsclaus Date: Tue Nov 22 14:30:16 2011 New Revision: 1205018 URL: http://svn.apache.org/viewvc?rev=1205018&view=rev Log: CAMEL-3999: camel-stax component. Thanks to Romain for the patch. Added: camel/trunk/components/camel-stax/ (with props) camel/trunk/components/camel-stax/pom.xml (with props) camel/trunk/components/camel-stax/src/ camel/trunk/components/camel-stax/src/main/ camel/trunk/components/camel-stax/src/main/java/ camel/trunk/components/camel-stax/src/main/java/org/ camel/trunk/components/camel-stax/src/main/java/org/apache/ camel/trunk/components/camel-stax/src/main/java/org/apache/camel/ camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/ camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/ camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXBuilder.java (with props) camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXComponent.java (with props) camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXJAXBIteratorExpression.java (with props) camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java (with props) camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXUtil.java (with props) camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StaxStreamXMLReader.java (with props) camel/trunk/components/camel-stax/src/main/resources/ camel/trunk/components/camel-stax/src/main/resources/META-INF/ camel/trunk/components/camel-stax/src/main/resources/META-INF/services/ camel/trunk/components/camel-stax/src/main/resources/META-INF/services/org/ camel/trunk/components/camel-stax/src/main/resources/META-INF/services/org/apache/ camel/trunk/components/camel-stax/src/main/resources/META-INF/services/org/apache/camel/ camel/trunk/components/camel-stax/src/main/resources/META-INF/services/org/apache/camel/component/ camel/trunk/components/camel-stax/src/main/resources/META-INF/services/org/apache/camel/component/stax camel/trunk/components/camel-stax/src/test/ camel/trunk/components/camel-stax/src/test/java/ camel/trunk/components/camel-stax/src/test/java/org/ camel/trunk/components/camel-stax/src/test/java/org/apache/ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/CountingHandler.java (with props) camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXComponentTest.java (with props) camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXJAXBIteratorExpressionTest.java (with props) camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXXPathSplitChoicePerformanceTest.java (with props) camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Order.java (with props) camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Orders.java (with props) camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Record.java (with props) camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Records.java (with props) camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/RecordsUtil.java (with props) camel/trunk/components/camel-stax/src/test/resources/ camel/trunk/components/camel-stax/src/test/resources/log4j.properties (with props) camel/trunk/components/camel-stax/src/test/resources/org/ camel/trunk/components/camel-stax/src/test/resources/org/apache/ camel/trunk/components/camel-stax/src/test/resources/org/apache/camel/ camel/trunk/components/camel-stax/src/test/resources/org/apache/camel/component/ camel/trunk/components/camel-stax/src/test/resources/org/apache/camel/component/stax/ camel/trunk/components/camel-stax/src/test/resources/org/apache/camel/component/stax/model/ camel/trunk/components/camel-stax/src/test/resources/org/apache/camel/component/stax/model/jaxb.index camel/trunk/components/camel-stax/src/test/resources/xsd/ camel/trunk/components/camel-stax/src/test/resources/xsd/records.xsd (with props) camel/trunk/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelStAXTest.java - copied, changed from r1204884, camel/trunk/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelStreamTest.java Modified: camel/trunk/apache-camel/pom.xml camel/trunk/apache-camel/src/main/descriptors/common-bin.xml camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConverter.java camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/StaxConverter.java camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/GenericFileConverterTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/converter/jaxp/XmlConverterTest.java camel/trunk/components/pom.xml camel/trunk/parent/pom.xml camel/trunk/platforms/karaf/features/src/main/resources/features.xml Modified: camel/trunk/apache-camel/pom.xml URL: http://svn.apache.org/viewvc/camel/trunk/apache-camel/pom.xml?rev=1205018&r1=1205017&r2=1205018&view=diff ============================================================================== --- camel/trunk/apache-camel/pom.xml (original) +++ camel/trunk/apache-camel/pom.xml Tue Nov 22 14:30:16 2011 @@ -427,6 +427,10 @@ org.apache.camel + camel-stax + + + org.apache.camel camel-stream Modified: camel/trunk/apache-camel/src/main/descriptors/common-bin.xml URL: http://svn.apache.org/viewvc/camel/trunk/apache-camel/src/main/descriptors/common-bin.xml?rev=1205018&r1=1205017&r2=1205018&view=diff ============================================================================== --- camel/trunk/apache-camel/src/main/descriptors/common-bin.xml (original) +++ camel/trunk/apache-camel/src/main/descriptors/common-bin.xml Tue Nov 22 14:30:16 2011 @@ -125,6 +125,7 @@ org.apache.camel:camel-spring-security org.apache.camel:camel-spring-ws org.apache.camel:camel-sql + org.apache.camel:camel-stax org.apache.camel:camel-stream org.apache.camel:camel-stringtemplate org.apache.camel:camel-syslog Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConverter.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConverter.java?rev=1205018&r1=1205017&r2=1205018&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConverter.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/file/GenericFileConverter.java Tue Nov 22 14:30:16 2011 @@ -16,6 +16,7 @@ */ package org.apache.camel.component.file; +import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -67,7 +68,7 @@ public final class GenericFileConverter if (exchange != null) { // use a file input stream if its a java.io.File if (file.getFile() instanceof java.io.File) { - return new FileInputStream((File) file.getFile()); + return new BufferedInputStream(new FileInputStream((File) file.getFile())); } // otherwise ensure the body is loaded as we want the input stream of the body file.getBinding().loadContent(exchange, file); 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=1205018&r1=1205017&r2=1205018&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 Tue Nov 22 14:30:16 2011 @@ -16,6 +16,10 @@ */ package org.apache.camel.converter.jaxp; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; @@ -89,6 +93,12 @@ public class StaxConverter { } @Converter + public XMLStreamReader createXMLStreamReader(File file, Exchange exchange) throws XMLStreamException, FileNotFoundException { + InputStream is = new BufferedInputStream(new FileInputStream(file)); + return getInputFactory().createXMLStreamReader(is, IOHelper.getCharsetName(exchange)); + } + + @Converter public XMLStreamReader createXMLStreamReader(Reader in) throws XMLStreamException { return getInputFactory().createXMLStreamReader(in); } @@ -112,6 +122,12 @@ public class StaxConverter { } @Converter + public XMLEventReader createXMLEventReader(File file, Exchange exchange) throws XMLStreamException, FileNotFoundException { + InputStream is = new BufferedInputStream(new FileInputStream(file)); + return getInputFactory().createXMLEventReader(is, IOHelper.getCharsetName(exchange)); + } + + @Converter public XMLEventReader createXMLEventReader(Reader in) throws XMLStreamException { return getInputFactory().createXMLEventReader(in); } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java?rev=1205018&r1=1205017&r2=1205018&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java Tue Nov 22 14:30:16 2011 @@ -16,6 +16,7 @@ */ package org.apache.camel.converter.jaxp; +import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; @@ -27,6 +28,7 @@ import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.lang.reflect.Constructor; +import java.nio.Buffer; import java.nio.ByteBuffer; import java.util.Properties; @@ -860,7 +862,13 @@ public class XmlConverter { } @Converter - public InputSource toInputSource(InputStream is) { + public InputSource toInputSource(InputStream is, Exchange exchange) { + return new InputSource(is); + } + + @Converter + public InputSource toInputSource(File file, Exchange exchange) throws FileNotFoundException { + InputStream is = new BufferedInputStream(new FileInputStream(file)); return new InputSource(is); } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/GenericFileConverterTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/GenericFileConverterTest.java?rev=1205018&r1=1205017&r2=1205018&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/GenericFileConverterTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/file/GenericFileConverterTest.java Tue Nov 22 14:30:16 2011 @@ -16,6 +16,7 @@ */ package org.apache.camel.component.file; +import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @@ -157,7 +158,7 @@ public class GenericFileConverterTest ex @Override public void process(Exchange exchange) throws Exception { Object body = exchange.getIn().getBody(); - assertIsInstanceOf(FileInputStream.class, body); + assertIsInstanceOf(BufferedInputStream.class, body); } }) .to("mock:result"); @@ -165,9 +166,11 @@ public class GenericFileConverterTest ex }); context.start(); + // a file input stream is wrapped in a buffered so its faster + MockEndpoint mock = getMockEndpoint("mock:result"); mock.expectedMessageCount(1); - mock.message(0).body().isInstanceOf(FileInputStream.class); + mock.message(0).body().isInstanceOf(BufferedInputStream.class); mock.message(0).body(String.class).isEqualTo("Hello World"); template.sendBodyAndHeader("file://target/gf", "Hello World", Exchange.FILE_NAME, "hello.txt"); Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/converter/jaxp/XmlConverterTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/jaxp/XmlConverterTest.java?rev=1205018&r1=1205017&r2=1205018&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/converter/jaxp/XmlConverterTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/converter/jaxp/XmlConverterTest.java Tue Nov 22 14:30:16 2011 @@ -474,11 +474,20 @@ public class XmlConverterTest extends Co XmlConverter conv = new XmlConverter(); InputStream is = context.getTypeConverter().convertTo(InputStream.class, "bar"); - InputSource out = conv.toInputSource(is); + InputSource out = conv.toInputSource(is, null); assertNotNull(out); assertNotNull(out.getByteStream()); } + public void testToInputSourceFromFile() throws Exception { + XmlConverter conv = new XmlConverter(); + File file = new File("./src/test/resources/org/apache/camel/converter/stream/test.xml").getAbsoluteFile(); + + InputSource out = conv.toInputSource(file, null); + assertNotNull(out); + assertNotNull(out.getByteStream()); + } + public void testOutOptionsFromCamelContext() throws Exception { CamelContext context = new DefaultCamelContext(); Exchange exchange = new DefaultExchange(context); Propchange: camel/trunk/components/camel-stax/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Tue Nov 22 14:30:16 2011 @@ -0,0 +1,8 @@ +eclipse-classes +.pmd +.checkstyle +target +.classpath +.project +.settings +*.i?? Added: camel/trunk/components/camel-stax/pom.xml URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/pom.xml?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/pom.xml (added) +++ camel/trunk/components/camel-stax/pom.xml Tue Nov 22 14:30:16 2011 @@ -0,0 +1,65 @@ + + + + 4.0.0 + + + org.apache.camel + components + 2.9-SNAPSHOT + + + camel-stax + bundle + Camel :: StAX + Camel StAX support + + + org.apache.camel.component.stax.* + + + + + + org.apache.camel + camel-core + + + + org.apache.camel + camel-test + test + + + + org.apache.camel + camel-jaxb + test + + + org.slf4j + slf4j-log4j12 + test + + + + + + Propchange: camel/trunk/components/camel-stax/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/pom.xml ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: camel/trunk/components/camel-stax/pom.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml Added: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXBuilder.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXBuilder.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXBuilder.java (added) +++ camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXBuilder.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,30 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax; + +import org.apache.camel.Expression; + +public final class StAXBuilder { + + private StAXBuilder() { + // no-op + } + + public static Expression stax(Class clazz) { + return new StAXJAXBIteratorExpression(clazz); + } +} Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXBuilder.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXBuilder.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXComponent.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXComponent.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXComponent.java (added) +++ camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXComponent.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax; + +import java.util.Map; + +import org.xml.sax.ContentHandler; + +import org.apache.camel.Endpoint; +import org.apache.camel.impl.DefaultComponent; +import org.apache.camel.impl.ProcessorEndpoint; + +public class StAXComponent extends DefaultComponent { + + @Override + protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception { + Class clazz = getCamelContext().getClassResolver().resolveMandatoryClass(remaining, ContentHandler.class); + + StAXProcessor processor = new StAXProcessor(clazz); + setProperties(processor, parameters); + return new ProcessorEndpoint(uri, this, processor); + } +} Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXComponent.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXComponent.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXJAXBIteratorExpression.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXJAXBIteratorExpression.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXJAXBIteratorExpression.java (added) +++ camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXJAXBIteratorExpression.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,184 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax; + +import java.io.Closeable; +import java.io.IOException; +import java.util.Iterator; +import java.util.Map; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.XMLEvent; + +import org.apache.camel.Exchange; +import org.apache.camel.InvalidPayloadException; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.support.ExpressionAdapter; +import org.apache.camel.util.LRUSoftCache; +import org.apache.camel.util.ObjectHelper; + +import static org.apache.camel.component.stax.StAXUtil.getTagName; + +/** + * {@link org.apache.camel.Expression} to walk a {@link org.apache.camel.Message} body + * using an {@link Iterator}, which uses StAX to walk in streaming mode. + * The elements returned is a POJO which is bound using JAXB annotations. + *

+ * The message body must be able to convert to {@link XMLEventReader} type which is used as stream + * to access the message body. And there must be a JAXB annotated class to use as binding. + */ +public class StAXJAXBIteratorExpression extends ExpressionAdapter { + private static final Map, JAXBContext> JAX_CONTEXTS = new LRUSoftCache, JAXBContext>(1000); + + private final Class handled; + + /** + * Creates this expression. + * + * @param handled the class which has JAXB annotations to bind POJO. + */ + public StAXJAXBIteratorExpression(Class handled) { + ObjectHelper.notNull(handled, "handled"); + this.handled = handled; + } + + private static JAXBContext jaxbContext(Class handled) throws JAXBException { + if (JAX_CONTEXTS.containsKey(handled)) { + return JAX_CONTEXTS.get(handled); + } + + JAXBContext context; + synchronized (JAX_CONTEXTS) { + context = JAXBContext.newInstance(handled); + JAX_CONTEXTS.put(handled, context); + } + return context; + } + + @Override + public Object evaluate(Exchange exchange) { + try { + XMLEventReader reader = exchange.getIn().getMandatoryBody(XMLEventReader.class); + return createIterator(reader, handled); + } catch (InvalidPayloadException e) { + exchange.setException(e); + return null; + } catch (JAXBException e) { + exchange.setException(e); + return null; + } + } + + private Iterator createIterator(XMLEventReader reader, Class clazz) throws JAXBException { + return new StAXJAXBIterator(clazz, reader); + } + + /** + * Iterator to walk the XML reader + */ + static class StAXJAXBIterator implements Iterator, Closeable { + + private final XMLEventReader reader; + private final Class clazz; + private final String name; + private final Unmarshaller unmarshaller; + private T element; + + StAXJAXBIterator(Class clazz, XMLEventReader reader) throws JAXBException { + this.clazz = clazz; + this.reader = reader; + + name = getTagName(clazz); + JAXBContext jaxb = jaxbContext(clazz); + // unmarshaller is not thread safe so we need to create a new instance per iterator + unmarshaller = jaxb.createUnmarshaller(); + } + + @Override + public boolean hasNext() { + if (element == null) { + element = getNextElement(); + } + return element != null; + } + + @Override + public T next() { + if (element == null) { + element = getNextElement(); + } + + T answer = element; + element = null; + return answer; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + @SuppressWarnings("unchecked") + T getNextElement() { + XMLEvent xmlEvent; + boolean found = false; + while (!found && reader.hasNext()) { + try { + xmlEvent = reader.peek(); + if (xmlEvent != null && xmlEvent.isStartElement() && name.equals(xmlEvent.asStartElement().getName().getLocalPart())) { + found = true; + } else { + reader.nextEvent(); + } + } catch (XMLStreamException e) { + throw new RuntimeCamelException(e); + } + } + + if (!found) { + return null; + } + + Object answer; + try { + answer = unmarshaller.unmarshal(reader, clazz); + if (answer != null && answer.getClass() == JAXBElement.class) { + JAXBElement jbe = (JAXBElement) answer; + answer = jbe.getValue(); + } + } catch (JAXBException e) { + throw new RuntimeCamelException(e); + } + + return (T) answer; + } + + @Override + public void close() throws IOException { + try { + reader.close(); + } catch (XMLStreamException e) { + throw new IOException(e); + } + } + } + +} Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXJAXBIteratorExpression.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXJAXBIteratorExpression.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java (added) +++ camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,62 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax; + +import javax.xml.stream.XMLStreamReader; + +import org.xml.sax.ContentHandler; +import org.xml.sax.InputSource; +import org.xml.sax.XMLReader; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.util.ExchangeHelper; + +/** + * It uses SAX content handler to handle events. + *

+ * The {@link Exchange} is expected to contain a message body, that is + * convertable to both a {@link InputSource} and a {@link XMLStreamReader} + * to support StAX streaming. + */ +public class StAXProcessor implements Processor { + private final Class contentHandlerClass; + + public StAXProcessor(Class contentHandlerClass) { + this.contentHandlerClass = contentHandlerClass; + } + + @Override + public void process(Exchange exchange) throws Exception { + InputSource is = exchange.getIn().getMandatoryBody(InputSource.class); + XMLStreamReader stream = exchange.getIn().getMandatoryBody(XMLStreamReader.class); + XMLReader reader = new StaxStreamXMLReader(stream); + + ContentHandler handler = contentHandlerClass.newInstance(); + reader.setContentHandler(handler); + reader.parse(is); + + if (ExchangeHelper.isOutCapable(exchange)) { + // preserve headers + exchange.getOut().setHeaders(exchange.getIn().getHeaders()); + exchange.getOut().setBody(handler); + } else { + exchange.getIn().setBody(handler); + } + } + +} Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXUtil.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXUtil.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXUtil.java (added) +++ camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXUtil.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax; + +import java.util.Map; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + +import org.apache.camel.util.LRUSoftCache; + +public final class StAXUtil { + private static final Map, String> TAG_NAMES = new LRUSoftCache, String>(1000); + + private StAXUtil() { + // no-op + } + + public static String getTagName(Class handled) { + if (TAG_NAMES.containsKey(handled)) { + return TAG_NAMES.get(handled); + } + + XmlType xmlType = handled.getAnnotation(XmlType.class); + if (xmlType != null && xmlType.name() != null && xmlType.name().trim().length() > 0) { + TAG_NAMES.put(handled, xmlType.name()); + return xmlType.name(); + } else { + XmlRootElement xmlRoot = handled.getAnnotation(XmlRootElement.class); + if (xmlRoot != null && xmlRoot.name() != null && xmlRoot.name().trim().length() > 0) { + TAG_NAMES.put(handled, xmlRoot.name()); + return xmlRoot.name(); + } + } + throw new IllegalArgumentException("XML name not found for " + handled.getName()); + } +} Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXUtil.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXUtil.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StaxStreamXMLReader.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StaxStreamXMLReader.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StaxStreamXMLReader.java (added) +++ camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StaxStreamXMLReader.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,571 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax; + +import java.util.LinkedHashMap; +import java.util.Map; +import javax.xml.namespace.QName; +import javax.xml.stream.Location; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; +import org.xml.sax.EntityResolver; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; +import org.xml.sax.ext.LexicalHandler; +import org.xml.sax.ext.Locator2; +import org.xml.sax.helpers.AttributesImpl; + +import org.apache.camel.util.ObjectHelper; + +/** + * class extracted from spring 3.0.6.RELEASE. + */ +// CHECKSTYLE:OFF +public class StaxStreamXMLReader implements XMLReader { + + private static final String DEFAULT_XML_VERSION = "1.0"; + + private static final String NAMESPACES_FEATURE_NAME = "http://xml.org/sax/features/namespaces"; + + private static final String NAMESPACE_PREFIXES_FEATURE_NAME = "http://xml.org/sax/features/namespace-prefixes"; + + private static final String IS_STANDALONE_FEATURE_NAME = "http://xml.org/sax/features/is-standalone"; + + private DTDHandler dtdHandler; + + private ContentHandler contentHandler; + + private EntityResolver entityResolver; + + private ErrorHandler errorHandler; + + private LexicalHandler lexicalHandler; + + private boolean namespacesFeature = true; + + private boolean namespacePrefixesFeature = false; + + private Boolean isStandalone; + + private final Map namespaces = new LinkedHashMap(); + + private final XMLStreamReader reader; + + private String xmlVersion = DEFAULT_XML_VERSION; + + private String encoding; + + /** + * Constructs a new instance of the StaxStreamXmlReader that reads from the given + * XMLStreamReader. The supplied stream reader must be in XMLStreamConstants.START_DOCUMENT + * or XMLStreamConstants.START_ELEMENT state. + * + * @param reader the XMLEventReader to read from + * @throws IllegalStateException if the reader is not at the start of a document or element + */ + StaxStreamXMLReader(XMLStreamReader reader) { + if (reader == null) { + throw new IllegalArgumentException("'reader' must not be null"); + } + int event = reader.getEventType(); + if (!(event == XMLStreamConstants.START_DOCUMENT || event == XMLStreamConstants.START_ELEMENT)) { + throw new IllegalStateException("XMLEventReader not at start of document or element"); + } + this.reader = reader; + } + + protected void parseInternal() throws SAXException, XMLStreamException { + boolean documentStarted = false; + boolean documentEnded = false; + int elementDepth = 0; + int eventType = reader.getEventType(); + while (true) { + if (eventType != XMLStreamConstants.START_DOCUMENT && eventType != XMLStreamConstants.END_DOCUMENT && + !documentStarted) { + handleStartDocument(); + documentStarted = true; + } + switch (eventType) { + case XMLStreamConstants.START_ELEMENT: + elementDepth++; + handleStartElement(); + break; + case XMLStreamConstants.END_ELEMENT: + elementDepth--; + if (elementDepth >= 0) { + handleEndElement(); + } + break; + case XMLStreamConstants.PROCESSING_INSTRUCTION: + handleProcessingInstruction(); + break; + case XMLStreamConstants.CHARACTERS: + case XMLStreamConstants.SPACE: + case XMLStreamConstants.CDATA: + handleCharacters(); + break; + case XMLStreamConstants.START_DOCUMENT: + handleStartDocument(); + documentStarted = true; + break; + case XMLStreamConstants.END_DOCUMENT: + handleEndDocument(); + documentEnded = true; + break; + case XMLStreamConstants.COMMENT: + handleComment(); + break; + case XMLStreamConstants.DTD: + handleDtd(); + break; + case XMLStreamConstants.ENTITY_REFERENCE: + handleEntityReference(); + break; + } + if (reader.hasNext() && elementDepth >= 0) { + eventType = reader.next(); + } + else { + break; + } + } + if (!documentEnded) { + handleEndDocument(); + } + } + + private void handleStartDocument() throws SAXException { + if (XMLStreamConstants.START_DOCUMENT == reader.getEventType()) { + String xmlVersion = reader.getVersion(); + if (ObjectHelper.isNotEmpty(xmlVersion)) { + this.xmlVersion = xmlVersion; + } + this.encoding = reader.getCharacterEncodingScheme(); + } + + if (getContentHandler() != null) { + final Location location = reader.getLocation(); + + getContentHandler().setDocumentLocator(new Locator2() { + + public int getColumnNumber() { + return location != null ? location.getColumnNumber() : -1; + } + + public int getLineNumber() { + return location != null ? location.getLineNumber() : -1; + } + + public String getPublicId() { + return location != null ? location.getPublicId() : null; + } + + public String getSystemId() { + return location != null ? location.getSystemId() : null; + } + + public String getXMLVersion() { + return xmlVersion; + } + + public String getEncoding() { + return encoding; + } + }); + getContentHandler().startDocument(); + if (reader.standaloneSet()) { + setStandalone(reader.isStandalone()); + } + } + } + + private void handleStartElement() throws SAXException { + if (getContentHandler() != null) { + QName qName = reader.getName(); + if (hasNamespacesFeature()) { + for (int i = 0; i < reader.getNamespaceCount(); i++) { + startPrefixMapping(reader.getNamespacePrefix(i), reader.getNamespaceURI(i)); + } + for (int i = 0; i < reader.getAttributeCount(); i++) { + String prefix = reader.getAttributePrefix(i); + String namespace = reader.getAttributeNamespace(i); + if (ObjectHelper.isNotEmpty(namespace)) { + startPrefixMapping(prefix, namespace); + } + } + getContentHandler().startElement(qName.getNamespaceURI(), qName.getLocalPart(), toQualifiedName(qName), + getAttributes()); + } + else { + getContentHandler().startElement("", "", toQualifiedName(qName), getAttributes()); + } + } + } + + private void handleEndElement() throws SAXException { + if (getContentHandler() != null) { + QName qName = reader.getName(); + if (hasNamespacesFeature()) { + getContentHandler().endElement(qName.getNamespaceURI(), qName.getLocalPart(), toQualifiedName(qName)); + for (int i = 0; i < reader.getNamespaceCount(); i++) { + String prefix = reader.getNamespacePrefix(i); + if (prefix == null) { + prefix = ""; + } + endPrefixMapping(prefix); + } + } + else { + getContentHandler().endElement("", "", toQualifiedName(qName)); + } + } + } + + private void handleCharacters() throws SAXException { + if (getContentHandler() != null && reader.isWhiteSpace()) { + getContentHandler() + .ignorableWhitespace(reader.getTextCharacters(), reader.getTextStart(), reader.getTextLength()); + return; + } + if (XMLStreamConstants.CDATA == reader.getEventType() && getLexicalHandler() != null) { + getLexicalHandler().startCDATA(); + } + if (getContentHandler() != null) { + getContentHandler().characters(reader.getTextCharacters(), reader.getTextStart(), reader.getTextLength()); + } + if (XMLStreamConstants.CDATA == reader.getEventType() && getLexicalHandler() != null) { + getLexicalHandler().endCDATA(); + } + } + + private void handleComment() throws SAXException { + if (getLexicalHandler() != null) { + getLexicalHandler().comment(reader.getTextCharacters(), reader.getTextStart(), reader.getTextLength()); + } + } + + private void handleDtd() throws SAXException { + if (getLexicalHandler() != null) { + javax.xml.stream.Location location = reader.getLocation(); + getLexicalHandler().startDTD(null, location.getPublicId(), location.getSystemId()); + } + if (getLexicalHandler() != null) { + getLexicalHandler().endDTD(); + } + } + + private void handleEntityReference() throws SAXException { + if (getLexicalHandler() != null) { + getLexicalHandler().startEntity(reader.getLocalName()); + } + if (getLexicalHandler() != null) { + getLexicalHandler().endEntity(reader.getLocalName()); + } + } + + private void handleEndDocument() throws SAXException { + if (getContentHandler() != null) { + getContentHandler().endDocument(); + } + } + + private void handleProcessingInstruction() throws SAXException { + if (getContentHandler() != null) { + getContentHandler().processingInstruction(reader.getPITarget(), reader.getPIData()); + } + } + + private Attributes getAttributes() { + AttributesImpl attributes = new AttributesImpl(); + + for (int i = 0; i < reader.getAttributeCount(); i++) { + String namespace = reader.getAttributeNamespace(i); + if (namespace == null || !hasNamespacesFeature()) { + namespace = ""; + } + String type = reader.getAttributeType(i); + if (type == null) { + type = "CDATA"; + } + attributes.addAttribute(namespace, reader.getAttributeLocalName(i), + toQualifiedName(reader.getAttributeName(i)), type, reader.getAttributeValue(i)); + } + if (hasNamespacePrefixesFeature()) { + for (int i = 0; i < reader.getNamespaceCount(); i++) { + String prefix = reader.getNamespacePrefix(i); + String namespaceUri = reader.getNamespaceURI(i); + String qName; + if (ObjectHelper.isNotEmpty(prefix)) { + qName = "xmlns:" + prefix; + } + else { + qName = "xmlns"; + } + attributes.addAttribute("", "", qName, "CDATA", namespaceUri); + } + } + + return attributes; + } + + // AbstractStaxXmlReader + @Override + public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { + if (NAMESPACES_FEATURE_NAME.equals(name)) { + return this.namespacesFeature; + } + else if (NAMESPACE_PREFIXES_FEATURE_NAME.equals(name)) { + return this.namespacePrefixesFeature; + } + else if (IS_STANDALONE_FEATURE_NAME.equals(name)) { + if (this.isStandalone != null) { + return this.isStandalone; + } + else { + throw new SAXNotSupportedException("startDocument() callback not completed yet"); + } + } + else { + throw new SAXNotRecognizedException(name); + } + } + + @Override + public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException { + if (NAMESPACES_FEATURE_NAME.equals(name)) { + this.namespacesFeature = value; + } + else if (NAMESPACE_PREFIXES_FEATURE_NAME.equals(name)) { + this.namespacePrefixesFeature = value; + } + else { + throw new SAXNotRecognizedException(name); + } + } + + protected void setStandalone(boolean standalone) { + this.isStandalone = standalone; + } + + /** + * Indicates whether the SAX feature http://xml.org/sax/features/namespaces is turned on. + */ + protected boolean hasNamespacesFeature() { + return this.namespacesFeature; + } + + /** + * Indicates whether the SAX feature http://xml.org/sax/features/namespaces-prefixes is turned on. + */ + protected boolean hasNamespacePrefixesFeature() { + return this.namespacePrefixesFeature; + } + + /** + * Convert a QName to a qualified name, as used by DOM and SAX. + * The returned string has a format of prefix:localName if the + * prefix is set, or just localName if not. + * @param qName the QName + * @return the qualified name + */ + protected String toQualifiedName(QName qName) { + String prefix = qName.getPrefix(); + if (!ObjectHelper.isNotEmpty(prefix)) { + return qName.getLocalPart(); + } + else { + return prefix + ":" + qName.getLocalPart(); + } + } + + + /** + * Parse the StAX XML reader passed at construction-time. + *

NOTE:: The given InputSource is not read, but ignored. + * @param ignored is ignored + * @throws SAXException a SAX exception, possibly wrapping a XMLStreamException + */ + public final void parse(InputSource ignored) throws SAXException { + parse(); + } + + /** + * Parse the StAX XML reader passed at construction-time. + *

NOTE:: The given system identifier is not read, but ignored. + * @param ignored is ignored + * @throws SAXException A SAX exception, possibly wrapping a XMLStreamException + */ + public final void parse(String ignored) throws SAXException { + parse(); + } + + private void parse() throws SAXException { + try { + parseInternal(); + } catch (XMLStreamException ex) { + Locator locator = null; + if (ex.getLocation() != null) { + locator = new StaxLocator(ex.getLocation()); + } + SAXParseException saxException = new SAXParseException(ex.getMessage(), locator, ex); + if (getErrorHandler() != null) { + getErrorHandler().fatalError(saxException); + } + else { + throw saxException; + } + } + } + + /** + * Starts the prefix mapping for the given prefix. + * @see org.xml.sax.ContentHandler#startPrefixMapping(String, String) + */ + protected void startPrefixMapping(String prefix, String namespace) throws SAXException { + if (getContentHandler() != null) { + if (prefix == null) { + prefix = ""; + } + if (!ObjectHelper.isNotEmpty(namespace)) { + return; + } + if (!namespace.equals(namespaces.get(prefix))) { + getContentHandler().startPrefixMapping(prefix, namespace); + namespaces.put(prefix, namespace); + } + } + } + + /** + * Ends the prefix mapping for the given prefix. + * @see org.xml.sax.ContentHandler#endPrefixMapping(String) + */ + protected void endPrefixMapping(String prefix) throws SAXException { + if (getContentHandler() != null) { + if (namespaces.containsKey(prefix)) { + getContentHandler().endPrefixMapping(prefix); + namespaces.remove(prefix); + } + } + } + + /** + * Implementation of the Locator interface that is based on a StAX Location. + * @see Locator + * @see Location + */ + private static class StaxLocator implements Locator { + + private Location location; + + protected StaxLocator(Location location) { + this.location = location; + } + + public String getPublicId() { + return location.getPublicId(); + } + + public String getSystemId() { + return location.getSystemId(); + } + + public int getLineNumber() { + return location.getLineNumber(); + } + + public int getColumnNumber() { + return location.getColumnNumber(); + } + } + + // AbstractXMLReader + + public ContentHandler getContentHandler() { + return contentHandler; + } + + public void setContentHandler(ContentHandler contentHandler) { + this.contentHandler = contentHandler; + } + + public void setDTDHandler(DTDHandler dtdHandler) { + this.dtdHandler = dtdHandler; + } + + public DTDHandler getDTDHandler() { + return dtdHandler; + } + + public EntityResolver getEntityResolver() { + return entityResolver; + } + + public void setEntityResolver(EntityResolver entityResolver) { + this.entityResolver = entityResolver; + } + + public ErrorHandler getErrorHandler() { + return errorHandler; + } + + public void setErrorHandler(ErrorHandler errorHandler) { + this.errorHandler = errorHandler; + } + + protected LexicalHandler getLexicalHandler() { + return lexicalHandler; + } + + /** + * Throws a SAXNotRecognizedException exception when the given property does not signify a lexical + * handler. The property name for a lexical handler is http://xml.org/sax/properties/lexical-handler. + */ + public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException { + if ("http://xml.org/sax/properties/lexical-handler".equals(name)) { + return lexicalHandler; + } + else { + throw new SAXNotRecognizedException(name); + } + } + + /** + * Throws a SAXNotRecognizedException exception when the given property does not signify a lexical + * handler. The property name for a lexical handler is http://xml.org/sax/properties/lexical-handler. + */ + public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException { + if ("http://xml.org/sax/properties/lexical-handler".equals(name)) { + lexicalHandler = (LexicalHandler) value; + } + else { + throw new SAXNotRecognizedException(name); + } + } +} +// CHECKSTYLE:ON Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StaxStreamXMLReader.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/main/java/org/apache/camel/component/stax/StaxStreamXMLReader.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/main/resources/META-INF/services/org/apache/camel/component/stax URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/main/resources/META-INF/services/org/apache/camel/component/stax?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/main/resources/META-INF/services/org/apache/camel/component/stax (added) +++ camel/trunk/components/camel-stax/src/main/resources/META-INF/services/org/apache/camel/component/stax Tue Nov 22 14:30:16 2011 @@ -0,0 +1,17 @@ +## ------------------------------------------------------------------------ +## Licensed to the Apache Software Foundation (ASF) under one or more +## contributor license agreements. See the NOTICE file distributed with +## this work for additional information regarding copyright ownership. +## The ASF licenses this file to You under the Apache License, Version 2.0 +## (the "License"); you may not use this file except in compliance with +## the License. You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## ------------------------------------------------------------------------ +class=org.apache.camel.component.stax.StAXComponent Added: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/CountingHandler.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/CountingHandler.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/CountingHandler.java (added) +++ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/CountingHandler.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +public class CountingHandler extends DefaultHandler { + private int number; + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + number++; + } + + public int getNumber() { + return number; + } +} Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/CountingHandler.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/CountingHandler.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXComponentTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXComponentTest.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXComponentTest.java (added) +++ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXComponentTest.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,65 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax; + +import org.apache.camel.EndpointInject; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.component.stax.model.RecordsUtil; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.BeforeClass; +import org.junit.Test; + +public class StAXComponentTest extends CamelTestSupport { + + @EndpointInject(uri = "mock:records") + private MockEndpoint recordsEndpoint; + + @BeforeClass + public static void initRouteExample() { + RecordsUtil.createXMLFile(); + } + + @Override + public RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("file:target/in") + .routeId("stax-parser") + .to("stax:" + CountingHandler.class.getName()) + .process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + assertEquals(11, exchange.getIn().getBody(CountingHandler.class).getNumber()); + } + }) + .to("mock:records"); + } + }; + } + + @Test + public void testStax() throws Exception { + recordsEndpoint.expectedMessageCount(1); + recordsEndpoint.message(0).body().isInstanceOf(CountingHandler.class); + + recordsEndpoint.assertIsSatisfied(); + } +} Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXComponentTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXComponentTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXJAXBIteratorExpressionTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXJAXBIteratorExpressionTest.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXJAXBIteratorExpressionTest.java (added) +++ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXJAXBIteratorExpressionTest.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax; + +import org.apache.camel.EndpointInject; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.component.stax.model.Record; +import org.apache.camel.component.stax.model.RecordsUtil; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.apache.camel.component.stax.StAXBuilder.stax; + +public class StAXJAXBIteratorExpressionTest extends CamelTestSupport { + @EndpointInject(uri = "mock:records") + private MockEndpoint recordsEndpoint; + + @BeforeClass + public static void initRouteExample() { + RecordsUtil.createXMLFile(); + } + + @Override + public RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("file:target/in") + .routeId("stax-test") + .split(stax(Record.class)) + .to("mock:records"); + } + }; + } + + @Test + public void testStaxExpression() throws InterruptedException { + recordsEndpoint.expectedMessageCount(10); + recordsEndpoint.allMessages().body().isInstanceOf(Record.class); + + recordsEndpoint.assertIsSatisfied(); + + Record five = recordsEndpoint.getReceivedExchanges().get(4).getIn().getBody(Record.class); + assertEquals("4", five.getKey()); + assertEquals("#4", five.getValue()); + } +} Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXJAXBIteratorExpressionTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXJAXBIteratorExpressionTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXXPathSplitChoicePerformanceTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXXPathSplitChoicePerformanceTest.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXXPathSplitChoicePerformanceTest.java (added) +++ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXXPathSplitChoicePerformanceTest.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,186 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.NotifyBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.stax.model.Order; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.apache.camel.util.StopWatch; +import org.apache.camel.util.TimeUtils; +import org.junit.Ignore; +import org.junit.Test; +import org.slf4j.Logger; + +import static org.apache.camel.component.stax.StAXBuilder.stax; + +/** + * + */ +@Ignore("this is a manual test") +public class StAXXPathSplitChoicePerformanceTest extends CamelTestSupport { + + private int size = 20 * 1000; + private final AtomicInteger tiny = new AtomicInteger(); + private final AtomicInteger small = new AtomicInteger(); + private final AtomicInteger med = new AtomicInteger(); + private final AtomicInteger large = new AtomicInteger(); + private final StopWatch watch = new StopWatch(); + + @Override + public void setUp() throws Exception { + createDataFile(log, size); + super.setUp(); + } + + @Test + public void testXPathSTaXPerformanceRoute() throws Exception { + NotifyBuilder notify = new NotifyBuilder(context).whenDone(size).create(); + + boolean matches = notify.matches(60, TimeUnit.SECONDS); + log.info("Processed file with " + size + " elements in: " + TimeUtils.printDuration(watch.stop())); + + log.info("Processed " + tiny.get() + " tiny messages"); + log.info("Processed " + small.get() + " small messages"); + log.info("Processed " + med.get() + " medium messages"); + log.info("Processed " + large.get() + " large messages"); + + assertEquals((size / 10) * 4, tiny.get()); + assertEquals((size / 10) * 2, small.get()); + assertEquals((size / 10) * 3, med.get()); + assertEquals((size / 10) * 1, large.get()); + + assertTrue("Should complete route", matches); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("file:target/data?noop=true") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + log.info("Starting to process file"); + watch.restart(); + } + }) + .split(stax(Order.class)).streaming() + .choice() + .when().xpath("/order/amount < 10") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + String xml = exchange.getIn().getBody(String.class); + assertTrue(xml, xml.contains("3")); + + int num = tiny.incrementAndGet(); + if (num % 100 == 0) { + log.info("Processed " + num + " tiny messages"); + log.debug(xml); + } + } + }) + .when().xpath("/order/amount < 50") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + String xml = exchange.getIn().getBody(String.class); + assertTrue(xml, xml.contains("44")); + + int num = small.incrementAndGet(); + if (num % 100 == 0) { + log.info("Processed " + num + " small messages"); + log.debug(xml); + } + } + }) + .when().xpath("/order/amount < 100") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + String xml = exchange.getIn().getBody(String.class); + assertTrue(xml, xml.contains("88")); + + int num = med.incrementAndGet(); + if (num % 100 == 0) { + log.info("Processed " + num + " medium messages"); + log.debug(xml); + } + } + }) + .otherwise() + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + String xml = exchange.getIn().getBody(String.class); + assertTrue(xml, xml.contains("123")); + + int num = large.incrementAndGet(); + if (num % 100 == 0) { + log.info("Processed " + num + " large messages"); + log.debug(xml); + } + } + }) + .end() // choice + .end(); // split + } + }; + } + + public static void createDataFile(Logger log, int size) throws Exception { + deleteDirectory("target/data"); + createDirectory("target/data"); + + log.info("Creating data file ..."); + + File file = new File("target/data/data.xml"); + FileOutputStream fos = new FileOutputStream(file, true); + fos.write("\n".getBytes()); + + for (int i = 0; i < size; i++) { + fos.write("\n".getBytes()); + fos.write((" " + i + "\n").getBytes()); + int num = i % 10; + if (num >= 0 && num <= 3) { + fos.write(" 3\n".getBytes()); + fos.write(" 333\n".getBytes()); + } else if (num >= 4 && num <= 5) { + fos.write(" 44\n".getBytes()); + fos.write(" 444\n".getBytes()); + } else if (num >= 6 && num <= 8) { + fos.write(" 88\n".getBytes()); + fos.write(" 888\n".getBytes()); + } else { + fos.write(" 123\n".getBytes()); + fos.write(" 123123\n".getBytes()); + } + fos.write(" bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla\n".getBytes()); + fos.write("\n".getBytes()); + } + + fos.write("".getBytes()); + fos.close(); + + log.info("Creating data file done."); + } + +} Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXXPathSplitChoicePerformanceTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/StAXXPathSplitChoicePerformanceTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Order.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Order.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Order.java (added) +++ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Order.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,76 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax.model; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlRootElement(name = "order") +public class Order { + + @XmlElement(required = true) + protected String id; + @XmlElement(required = true) + protected int amount; + @XmlElement(required = true) + protected int customerId; + @XmlElement(required = true) + protected String description; + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public int getCustomerId() { + return customerId; + } + + public void setCustomerId(int customerId) { + this.customerId = customerId; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String toString() { + return "Order[" + id + "]"; + } +} Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Order.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Order.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Orders.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Orders.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Orders.java (added) +++ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Orders.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,41 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax.model; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlRootElement(name = "orders") +public class Orders { + @XmlElement(required = true) + protected List orders; + + public List getOrders() { + if (orders == null) { + orders = new ArrayList(); + } + return orders; + } +} Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Orders.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Orders.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Record.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Record.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Record.java (added) +++ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Record.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,53 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax.model; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "record", propOrder = { "key", "value" }) +public class Record { + @XmlAttribute(required = true) + protected String key; + + @XmlAttribute(required = true) + protected String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "Record[" + key + "]"; + } +} Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Record.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Record.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Records.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Records.java?rev=1205018&view=auto ============================================================================== --- camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Records.java (added) +++ camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Records.java Tue Nov 22 14:30:16 2011 @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.stax.model; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlRootElement(name = "records") +public class Records { + @XmlElement(required = true) + protected List record; + + public List getRecord() { + if (record == null) { + record = new ArrayList(); + } + return record; + } +} Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Records.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-stax/src/test/java/org/apache/camel/component/stax/model/Records.java ------------------------------------------------------------------------------ svn:keywords = Rev Date