Author: davsclaus Date: Tue Apr 17 07:41:38 2012 New Revision: 1326972 URL: http://svn.apache.org/viewvc?rev=1326972&view=rev Log: CAMEL-5018 support the set the default value on the field of bindy CVS
Modified: camel/branches/camel-2.9.x/ (props changed) camel/branches/camel-2.9.x/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyCsvFactory.java camel/branches/camel-2.9.x/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java camel/branches/camel-2.9.x/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java camel/branches/camel-2.9.x/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/simple/oneclass/Order.java Propchange: camel/branches/camel-2.9.x/ ------------------------------------------------------------------------------ Merged /camel/trunk:r1292164 Propchange: camel/branches/camel-2.9.x/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: camel/branches/camel-2.9.x/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyCsvFactory.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyCsvFactory.java?rev=1326972&r1=1326971&r2=1326972&view=diff ============================================================================== --- camel/branches/camel-2.9.x/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyCsvFactory.java (original) +++ camel/branches/camel-2.9.x/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/BindyCsvFactory.java Tue Apr 17 07:41:38 2012 @@ -200,7 +200,11 @@ public class BindyCsvFactory extends Bin throw new IllegalArgumentException("Parsing error detected for field defined at the position: " + pos + ", line: " + line, e); } } else { - value = getDefaultValueForPrimitive(field.getType()); + if (!dataField.defaultValue().isEmpty()) { + value = format.parse(dataField.defaultValue()); + } else { + value = getDefaultValueForPrimitive(field.getType()); + } } field.set(modelField, value); @@ -211,14 +215,14 @@ public class BindyCsvFactory extends Bin LOG.debug("Counter mandatory fields: {}", counterMandatoryFields); - if (pos < totalFields) { - throw new IllegalArgumentException("Some fields are missing (optional or mandatory), line: " + line); - } - if (counterMandatoryFields < numberMandatoryFields) { throw new IllegalArgumentException("Some mandatory fields are missing, line: " + line); } + if (pos < totalFields) { + setDefaultValuesForFields(model); + } + } @SuppressWarnings("unchecked") @@ -559,6 +563,29 @@ public class BindyCsvFactory extends Bin } } } + /** + * Set the default values for the non defined fields. + * @param The model which has its default fields set. + * @throws IllegalAccessException if the underlying fields are inaccessible + * @throws Exception In case the field cannot be parsed + */ + private void setDefaultValuesForFields(final Map<String, Object> model) throws IllegalAccessException, + Exception { + // Set the default values, if defined + for (int i = 1; i <= dataFields.size(); i++) { + Field field = annotatedFields.get(i); + field.setAccessible(true); + DataField dataField = dataFields.get(i); + Object modelField = model.get(field.getDeclaringClass().getName()); + if (field.get(modelField) == null && !dataField.defaultValue().isEmpty()) { + String pattern = dataField.pattern(); + Format<?> format = FormatFactory.getFormat(field.getType(), pattern, getLocale(), + dataField.precision()); + Object value = format.parse(dataField.defaultValue()); + field.set(modelField, value); + } + } + } /** * Find the separator used to delimit the CSV fields Modified: camel/branches/camel-2.9.x/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java?rev=1326972&r1=1326971&r2=1326972&view=diff ============================================================================== --- camel/branches/camel-2.9.x/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java (original) +++ camel/branches/camel-2.9.x/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/annotation/DataField.java Tue Apr 17 07:41:38 2012 @@ -96,4 +96,9 @@ public @interface DataField { * Indicates to clip data in the field if it exceeds the allowed length when using fixed length. */ boolean clip() default false; + + /** + * Field's default value in case no value is set + */ + String defaultValue() default ""; } Modified: camel/branches/camel-2.9.x/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java?rev=1326972&r1=1326971&r2=1326972&view=diff ============================================================================== --- camel/branches/camel-2.9.x/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java (original) +++ camel/branches/camel-2.9.x/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/csv/BindySimpleCsvUnmarshallTest.java Tue Apr 17 07:41:38 2012 @@ -16,6 +16,9 @@ */ package org.apache.camel.dataformat.bindy.csv; +import java.util.List; +import java.util.Map; + import org.apache.camel.EndpointInject; import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; @@ -24,6 +27,7 @@ import org.apache.camel.ProducerTemplate import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.dataformat.bindy.format.FormatException; +import org.apache.camel.dataformat.bindy.model.simple.oneclass.Order; import org.apache.camel.processor.interceptor.Tracer; import org.apache.camel.test.junit4.TestSupport; import org.junit.Test; @@ -31,7 +35,10 @@ import org.springframework.test.annotati import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; + import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; @ContextConfiguration public class BindySimpleCsvUnmarshallTest extends AbstractJUnit4SpringContextTests { @@ -100,6 +107,32 @@ public class BindySimpleCsvUnmarshallTes } + @SuppressWarnings("unchecked") + @Test + @DirtiesContext + public void testUnMarshallMessageWithMissingFields() throws Exception { + + // We suppress the firstName field of the first record + expected = "01,,,Cartier,ISIN,BE12345678,SELL,,1500,EUR\r\n" + "02,A1,,Preud'Homme,ISIN,XD12345678,BUY,,2500,USD,08-01-2009\r\n" + + "03,A2,Jacques,,,BE12345678,SELL,,1500,EUR,08-01-2009\r\n" + "04,A3,Michel,Dupond,,,BUY,,2500,USD,08-01-2009\r\n" + + "05,A4,Annie,Dutronc,ISIN,BE12345678,,,1500,EUR,08-01-2009\r\n" + "06,A5,Andr" + "\uc3a9" + ",Rieux,ISIN,XD12345678,SELL,Share,,USD,08-01-2009\r\n" + + "07,A6,Myl" + "\uc3a8" + "ne,Farmer,ISIN,BE12345678,BUY,1500,,,08-01-2009\r\n" + "08,A7,Eva,Longoria,ISIN,XD12345678,SELL,Share,2500,USD,\r\n" + + ",,,D,,BE12345678,SELL,,,,08-01-2009\r\n" + ",,,D,ISIN,BE12345678,,,,,08-01-2009\r\n" + ",,,D,ISIN,LU123456789,,,,,\r\n" + + "10,A8,Pauline,M,ISIN,XD12345678,SELL,Share,2500,USD,08-01-2009\r\n" + "10,A9,Pauline,M,ISIN,XD12345678,BUY,Share,2500.45"; + + template.sendBody(expected); + + List<Map<String, Order>> orders = (List<Map<String, Order>>) result.getExchanges().get(0).getIn().getBody(); + + result.expectedMessageCount(1); + result.assertIsSatisfied(); + + assertNotNull(orders); + // As the @DataField defines a default value for the firstName, the + // value might not be empty + assertFalse(orders.get(0).get(Order.class.getName()).getFirstName().isEmpty()); + } + public static class ContextConfig extends RouteBuilder { BindyCsvDataFormat camelDataFormat = new BindyCsvDataFormat("org.apache.camel.dataformat.bindy.model.simple.oneclass"); Modified: camel/branches/camel-2.9.x/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/simple/oneclass/Order.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/simple/oneclass/Order.java?rev=1326972&r1=1326971&r2=1326972&view=diff ============================================================================== --- camel/branches/camel-2.9.x/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/simple/oneclass/Order.java (original) +++ camel/branches/camel-2.9.x/components/camel-bindy/src/test/java/org/apache/camel/dataformat/bindy/model/simple/oneclass/Order.java Tue Apr 17 07:41:38 2012 @@ -31,7 +31,7 @@ public class Order { @DataField(pos = 2) private String clientNr; - @DataField(pos = 3) + @DataField(pos = 3, defaultValue = "Joe") private String firstName; @DataField(pos = 4)