CAMEL-9939: beanio - Add support for custom BeanReaderErrorHandler
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/66594e97 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/66594e97 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/66594e97 Branch: refs/heads/master Commit: 66594e97a89dddd4d298a7332787ee07444b2f91 Parents: 8efbf03 Author: Andrea Cosentino <anco...@gmail.com> Authored: Wed May 4 13:57:28 2016 +0200 Committer: Andrea Cosentino <anco...@gmail.com> Committed: Wed May 4 14:56:01 2016 +0200 ---------------------------------------------------------------------- .../dataformat/beanio/BeanIOConfiguration.java | 11 ++ .../dataformat/beanio/BeanIODataFormat.java | 15 ++- ...tSimpleCustomBeanReaderErrorHandlerTest.java | 129 +++++++++++++++++++ 3 files changed, 154 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/66594e97/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIOConfiguration.java ---------------------------------------------------------------------- diff --git a/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIOConfiguration.java b/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIOConfiguration.java index 973badf..18c6642 100644 --- a/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIOConfiguration.java +++ b/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIOConfiguration.java @@ -19,6 +19,8 @@ package org.apache.camel.dataformat.beanio; import java.nio.charset.Charset; import java.util.Properties; +import org.beanio.BeanReaderErrorHandler; + /** * To configure the BeanIO data format, or BeanIO splitter. */ @@ -31,6 +33,7 @@ public class BeanIOConfiguration { private boolean ignoreInvalidRecords; private Charset encoding = Charset.defaultCharset(); private Properties properties; + private BeanReaderErrorHandler beanReaderErrorHandler; public String getMapping() { return mapping; @@ -87,4 +90,12 @@ public class BeanIOConfiguration { public void setProperties(Properties properties) { this.properties = properties; } + + public BeanReaderErrorHandler getBeanReaderErrorHandler() { + return beanReaderErrorHandler; + } + + public void setBeanReaderErrorHandler(BeanReaderErrorHandler beanReaderErrorHandler) { + this.beanReaderErrorHandler = beanReaderErrorHandler; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/66594e97/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java ---------------------------------------------------------------------- diff --git a/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java b/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java index e33d7ff..3526208 100644 --- a/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java +++ b/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java @@ -38,6 +38,7 @@ import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.ResourceHelper; import org.beanio.BeanReader; +import org.beanio.BeanReaderErrorHandler; import org.beanio.BeanWriter; import org.beanio.StreamFactory; import org.slf4j.Logger; @@ -147,7 +148,11 @@ public class BeanIODataFormat extends ServiceSupport implements DataFormat, Data BeanReader in = factory.createReader(getStreamName(), streamReader); try { - in.setErrorHandler(new BeanIOErrorHandler(configuration)); + if (ObjectHelper.isNotEmpty(configuration.getBeanReaderErrorHandler())) { + in.setErrorHandler(configuration.getBeanReaderErrorHandler()); + } else { + in.setErrorHandler(new BeanIOErrorHandler(configuration)); + } Object readObject; while ((readObject = in.read()) != null) { @@ -218,4 +223,12 @@ public class BeanIODataFormat extends ServiceSupport implements DataFormat, Data public Charset getEncoding() { return configuration.getEncoding(); } + + public BeanReaderErrorHandler getBeanReaderErrorHandler() { + return configuration.getBeanReaderErrorHandler(); + } + + public void setBeanReaderErrorHandler(BeanReaderErrorHandler beanReaderErrorHandler) { + configuration.setBeanReaderErrorHandler(beanReaderErrorHandler); + } } http://git-wip-us.apache.org/repos/asf/camel/blob/66594e97/components/camel-beanio/src/test/java/org/apache/camel/dataformat/beanio/BeanIODataFormatSimpleCustomBeanReaderErrorHandlerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-beanio/src/test/java/org/apache/camel/dataformat/beanio/BeanIODataFormatSimpleCustomBeanReaderErrorHandlerTest.java b/components/camel-beanio/src/test/java/org/apache/camel/dataformat/beanio/BeanIODataFormatSimpleCustomBeanReaderErrorHandlerTest.java new file mode 100644 index 0000000..2ffa6ac --- /dev/null +++ b/components/camel-beanio/src/test/java/org/apache/camel/dataformat/beanio/BeanIODataFormatSimpleCustomBeanReaderErrorHandlerTest.java @@ -0,0 +1,129 @@ +/** + * 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.dataformat.beanio; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.beanio.BeanReaderErrorHandler; +import org.beanio.BeanReaderException; +import org.junit.Test; + +public class BeanIODataFormatSimpleCustomBeanReaderErrorHandlerTest extends CamelTestSupport { + + // START SNIPPET: e2 + private static final String FIXED_DATA = + "Joe,Smith,Developer,75000,10012009" + LS + + "Jane,Doe,Architect,80000,01152008" + LS + + "Jon,Anderson,Manager,85000,03182007" + LS; + // END SNIPPET: e2 + + @Test + public void testMarshal() throws Exception { + List<Employee> employees = getEmployees(); + + MockEndpoint mock = getMockEndpoint("mock:beanio-marshal"); + mock.expectedBodiesReceived(FIXED_DATA); + + template.sendBody("direct:marshal", employees); + + mock.assertIsSatisfied(); + } + + @Test + public void testUnmarshal() throws Exception { + List<Employee> employees = getEmployees(); + + MockEndpoint mock = getMockEndpoint("mock:beanio-unmarshal"); + mock.expectedBodiesReceived(employees); + + template.sendBody("direct:unmarshal", FIXED_DATA); + + mock.assertIsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + // START SNIPPET: e1 + // setup beanio data format using the mapping file, loaded from the classpath + BeanIODataFormat format = new BeanIODataFormat( + "org/apache/camel/dataformat/beanio/mappings.xml", + "employeeFile"); + + BeanReaderErrorHandler reader = new BeanReaderErrorHandler() { + + @Override + public void handleError(BeanReaderException ex) throws Exception { + log.info("Error: " + ex.getMessage() + ": " + ex.getRecordContext().getRecordText()); + return; + } + }; + format.setBeanReaderErrorHandler(reader); + + // a route which uses the bean io data format to format a CSV data + // to java objects + from("direct:unmarshal") + .unmarshal(format) + // and then split the message body so we get a message for each row + .split(body()) + .to("mock:beanio-unmarshal"); + + // convert list of java objects back to flat format + from("direct:marshal") + .marshal(format) + .to("mock:beanio-marshal"); + // END SNIPPET: e1 + } + }; + } + + private List<Employee> getEmployees() throws ParseException { + List<Employee> employees = new ArrayList<Employee>(); + Employee one = new Employee(); + one.setFirstName("Joe"); + one.setLastName("Smith"); + one.setTitle("Developer"); + one.setSalary(75000); + one.setHireDate(new SimpleDateFormat("MMddyyyy").parse("10012009")); + employees.add(one); + + Employee two = new Employee(); + two.setFirstName("Jane"); + two.setLastName("Doe"); + two.setTitle("Architect"); + two.setSalary(80000); + two.setHireDate(new SimpleDateFormat("MMddyyyy").parse("01152008")); + employees.add(two); + + Employee three = new Employee(); + three.setFirstName("Jon"); + three.setLastName("Anderson"); + three.setTitle("Manager"); + three.setSalary(85000); + three.setHireDate(new SimpleDateFormat("MMddyyyy").parse("03182007")); + employees.add(three); + return employees; + } +}