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)