Claus Ibsen created CAMEL-25996:
-----------------------------------
Summary: camel-univocity-parsers - asMap fails with a
NullPointerException when the input has one data row and no final newline
Key: CAMEL-25996
URL: https://issues.apache.org/jira/browse/CAMEL-25996
Project: Camel
Issue Type: Bug
Components: camel-univocity-parsers
Affects Versions: 4.18.0, 4.22.0, 4.23.0
Reporter: Claus Ibsen
Fix For: 4.24.0
With {{asMap=true}}, the univocity data formats map each row by the header
names, which {{HeaderRowProcessor}} keeps in a thread-local value. It clears
that value in {{processEnded}} ({{HeaderRowProcessor}}, main 50d17f9c2614, line
59), which the parser calls when it reaches the end of the input. When the
input does not end with a newline, the end is reached while the last row is
read. The header names are then gone before that row is mapped, and
{{MapRowIterator.convertRow}} fails with {{NullPointerException: Cannot read
the array length because "this.headers" is null}} ({{Unmarshaller}}, line 158).
* Since CAMEL-24170 (4.22.0), the names are read when the iterator is created,
after the first row ({{Unmarshaller}}, line 153). So only an input with one
data row and no final newline fails.
* On 4.18.0 and 4.14.0 the names were read for each row, so any input without a
final newline failed.
This is easy to hit from a YAML route, because the {{constant}} expression
trims the text: {{setBody: constant: "a,b\n1,2\n"}} gives {{a,b\n1,2}}.
Checked with {{UniVocityCsvDataFormat}}, {{asMap=true}} and
{{headerExtractionEnabled=true}}:
|| input || 4.14.0 and 4.18.0 || 4.22.0 ||
| {{a,b\n1,2}} | NPE | NPE |
| {{a,b\n1,2\n3,4}} | NPE | two Maps |
| {{a,b\n1,2\n}} | one Map | one Map |
On 4.24.0-SNAPSHOT, with {{camel run}}: the same as 4.22.0 for univocityCsv,
univocityTsv and univocityFixed, and with header names given by
{{univocityHeader}} instead of extracted.
*Proposed change*: take the header names from the parsing context when the
first row is parsed, and keep them in the iterator, instead of reading the
thread-local value after {{processEnded}} has cleared it.
_Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)