blob: e5f69b94d82bde4be10450e0d2fe87f3e1f16f1f [file] [log] [blame]
/**
* 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.Date;
import java.util.List;
import java.util.Locale;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.beanio.InvalidRecordException;
import org.beanio.UnexpectedRecordException;
import org.beanio.UnidentifiedRecordException;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class BeanIODataFormatComplexTest extends CamelTestSupport {
private static Locale defaultLocale;
private final String recordData = "0001917A112345.678900 " + LS
+ "0002374A159303290.020 " + LS
+ "0015219B1SECURITY ONE " + LS
+ "END OF SECTION 1 " + LS
+ "0076647A10.0000000001 " + LS
+ "0135515A1999999999999 " + LS
+ "2000815B1SECURITY TWO " + LS
+ "2207122B1SECURITY THR " + LS
+ "END OF FILE 000007 " + LS;
private final String data = "0000000A1030808PRICE " + LS
+ "0000000B1030808SECURITY " + LS
+ "HEADER END " + LS
+ recordData;
private final String unExpectedData = "0000000A1030808PRICE " + LS
+ "0000000B1030808SECURITY " + LS
+ "0000000B1030808SECURITY " + LS
+ "HEADER END " + LS
+ recordData;
private final String invalidData = "0000000A1030808PRICE " + LS
+ "0000000B1030808SECURITY EXTRA DATA" + LS
+ "0000000B1030808SECURITY " + LS
+ "HEADER END " + LS
+ recordData;
private final String unidentifiedData = "0000000A1030808PRICE " + LS
+ "0000000C1030808SECURITY " + LS
+ "0000000B1030808SECURITY " + LS
+ "HEADER END " + LS
+ recordData;
@BeforeClass
public static void setLocale() {
if (!Locale.getDefault().equals(Locale.ENGLISH)) {
// the Locale used for the number formatting of the above data is
// english which could be other than the default locale
defaultLocale = Locale.getDefault();
Locale.setDefault(Locale.ENGLISH);
}
}
@AfterClass
public static void resetLocale() {
if (defaultLocale != null) {
Locale.setDefault(defaultLocale);
}
}
@Test
public void testMarshal() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:beanio-marshal");
mock.expectedBodiesReceived(data);
template.sendBody("direct:marshal", createTestData(false));
mock.assertIsSatisfied();
}
@Test
public void testUnmarshal() throws Exception {
context.setTracing(true);
MockEndpoint mock = getMockEndpoint("mock:beanio-unmarshal");
mock.expectedBodiesReceived(createTestData(false));
template.sendBody("direct:unmarshal", data);
mock.assertIsSatisfied();
}
@Test
public void testUnmarshalUnexpected() throws Exception {
Throwable ex = null;
try {
template.sendBody("direct:unmarshal", unExpectedData);
} catch (Exception e) {
ex = e.getCause();
}
assertIsInstanceOf(UnexpectedRecordException.class, ex);
}
@Test
public void testUnmarshalInvalid() throws Exception {
Throwable ex = null;
try {
template.sendBody("direct:unmarshal", invalidData);
} catch (Exception e) {
ex = e.getCause();
}
assertIsInstanceOf(InvalidRecordException.class, ex);
}
@Test
public void testUnmarshalUnidentifiedIgnore() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:beanio-unmarshal");
mock.expectedBodiesReceived(createTestData(false));
template.sendBody("direct:unmarshal-forgiving", unidentifiedData);
mock.assertIsSatisfied();
}
@Test
public void testUnmarshalUnexpectedIgnore() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:beanio-unmarshal");
mock.expectedBodiesReceived(createTestData(false));
template.sendBody("direct:unmarshal-forgiving", unExpectedData);
mock.assertIsSatisfied();
}
@Test
public void testUnmarshalInvalidIgnore() throws Exception {
context.setTracing(true);
MockEndpoint mock = getMockEndpoint("mock:beanio-unmarshal");
mock.expectedBodiesReceived(createTestData(true));
template.sendBody("direct:unmarshal-forgiving", invalidData);
mock.assertIsSatisfied();
}
@Test
public void testUnmarshalUnidentified() throws Exception {
Throwable ex = null;
try {
template.sendBody("direct:unmarshal", unidentifiedData);
} catch (Exception e) {
ex = e.getCause();
}
assertIsInstanceOf(UnidentifiedRecordException.class, ex);
}
private List<Object> createTestData(boolean skipB1header) throws ParseException {
String source = "camel-beanio";
List<Object> body = new ArrayList<Object>();
Date date = new SimpleDateFormat("ddMMyy").parse("030808");
Header hFirst = new Header("A1", date, "PRICE");
Header hSecond = new Header("B1", date, "SECURITY");
Separator headerEnd = new Separator("HEADER END");
A1Record first = new A1Record("0001917", source, 12345.678900);
A1Record second = new A1Record("0002374", source, 59303290.020);
B1Record third = new B1Record("0015219", source, "SECURITY ONE");
Separator sectionEnd = new Separator("END OF SECTION 1");
A1Record fourth = new A1Record("0076647", source, 0.0000000001);
A1Record fifth = new A1Record("0135515", source, 999999999999d);
B1Record sixth = new B1Record("2000815", source, "SECURITY TWO");
B1Record seventh = new B1Record("2207122", source, "SECURITY THR");
body.add(hFirst);
if (!skipB1header) {
body.add(hSecond);
}
body.add(headerEnd);
body.add(first);
body.add(second);
body.add(third);
body.add(sectionEnd);
body.add(fourth);
body.add(fifth);
body.add(sixth);
body.add(seventh);
Trailer trailer = new Trailer(7);
body.add(trailer);
return body;
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
BeanIODataFormat format = new BeanIODataFormat("org/apache/camel/dataformat/beanio/mappings.xml", "securityData");
BeanIODataFormat forgivingFormat = new BeanIODataFormat("org/apache/camel/dataformat/beanio/mappings.xml", "securityData");
forgivingFormat.setIgnoreInvalidRecords(true);
forgivingFormat.setIgnoreUnexpectedRecords(true);
forgivingFormat.setIgnoreUnidentifiedRecords(true);
from("direct:unmarshal").unmarshal(format).split(simple("body")).to("mock:beanio-unmarshal");
from("direct:unmarshal-forgiving").unmarshal(forgivingFormat).split(simple("body")).to("mock:beanio-unmarshal");
from("direct:marshal").marshal(format).to("mock:beanio-marshal");
}
};
}
}