-
Bug
-
Resolution: Done
-
Major
-
fuse-7.12-GA
-
None
+underlined text+If csv data has a column like "a,b", camel-bindy's unmarshall does not work as expected.
Please check the attached reproducer.
sample csv.data
SH-01L,"Android,10,0",3,4,5,6,7,8,9,100,0,0,0,0,0,0,0,0,0,0,1,0,0,0"
RdModelSupportAppCsvModel class has 8 fields.
@CsvRecord(separator = ",", autospanLine = true, quote = "\"", skipFirstLine = true)
public class RdModelSupportAppCsvModel {
@DataField(pos = 1)
private String uaName;
@DataField(pos = 2)
private String uaOs;
@DataField(pos = 3)
private String uaChar;
@DataField(pos = 4)
private String resultName;
@DataField(pos = 5)
private String resultHosting;
@DataField(pos = 6)
private String iosFlg;
@DataField(pos = 7)
private String nativeFlg;
@DataField(pos = 8)
@BindyConverter(AppIdentificationConvrtter.class)
private List<String> appIdentificationList;
camel-bindy does unmarshall the data like this.
13:39:06.793 [Camel (MyCamel) thread #1 - file://data] INFO csv-route - Post Body: SH-01LAndroid,10,03456,7,8,9,100,0,0,0,0,0,0,0,0,0,0,1,0,0,0 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - uaName : "SH-01L" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - uaOs : "Android,10,0" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - uaChar : "3" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - resultName : "4" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - resultHosting : "5" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - iosFlg : "6,7,8,9,100,0,0,0,0,0,0,0,0,0,0,1,0,0,0" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - nativeFlg : "" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - appIdentificationList:
The expected result is like this.
13:39:06.793 [Camel (MyCamel) thread #1 - file://data] INFO csv-route - Post Body: SH-01LAndroid,10,03456,7,8,9,100,0,0,0,0,0,0,0,0,0,0,1,0,0,0 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - uaName : "SH-01L" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - uaOs : "Android,10,0" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - uaChar : "3" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - resultName : "4" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - resultHosting : "5" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - iosFlg : "6" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - nativeFlg : "7" 13:39:06.794 [Camel (MyCamel) thread #1 - file://data] INFO com.sample.processor.ResultProcessor - appIdentificationList: "8,9,100,0,0,0,0,0,0,0,0,0,0,1,0,0,0"
It looks like org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat internally invokes java.util.regex.Pattern.split() and the result was not the expected one.
String[] tokens = pattern.split(trimmedLine, factory.getAutospanLine() ? factory.getMaxpos() : -1); //Line 234
Debugger shows the return value of pattern.split() as follows:
split() returned String[8] (id=138)
[0] "SH-01L" (id=170) [1] ""Android" (id=171) [2] "10" (id=172) [3] "0"" (id=173) [4] "3" (id=174) [5] "4" (id=175) [6] "5" (id=176) [7] "6,7,8,9,100,0,0,0,0,0,0,0,0,0,0,1,0,0,0" (id=177)
Unfortunately, pattern.split() does not have any option to treat the data pattern like "a,b", so I guess camel-bindy needs to use another Class to split the csv data as expected.