Skip to content

Commit 27511be

Browse files
authored
Adding a boolean to drive byte tracking opt-in behavior (#14)
Adding a boolean to drive byte tracking opt-in behavior
1 parent 344f282 commit 27511be

File tree

4 files changed

+17
-8
lines changed

4 files changed

+17
-8
lines changed

src/main/java/org/apache/commons/csv/CSVParser.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ public static class Builder extends AbstractStreamBuilder<CSVParser, Builder> {
153153
private CSVFormat format;
154154
private long characterOffset;
155155
private long recordNumber = 1;
156+
private boolean enableByteTracking = false;
156157

157158
/**
158159
* Constructs a new instance.
@@ -164,7 +165,7 @@ protected Builder() {
164165
@SuppressWarnings("resource")
165166
@Override
166167
public CSVParser get() throws IOException {
167-
return new CSVParser(getReader(), format != null ? format : CSVFormat.DEFAULT, characterOffset, recordNumber, getCharset());
168+
return new CSVParser(getReader(), format != null ? format : CSVFormat.DEFAULT, characterOffset, recordNumber, getCharset(), enableByteTracking);
168169
}
169170

170171
/**
@@ -200,6 +201,11 @@ public Builder setRecordNumber(final long recordNumber) {
200201
return asThis();
201202
}
202203

204+
public Builder setEnableByteTracking(final boolean enableByteTracking) {
205+
this.enableByteTracking = enableByteTracking;
206+
return asThis();
207+
}
208+
203209
}
204210

205211
final class CSVRecordIterator implements Iterator<CSVRecord> {
@@ -507,7 +513,7 @@ public CSVParser(final Reader reader, final CSVFormat format) throws IOException
507513
@SuppressWarnings("resource")
508514
public CSVParser(final Reader reader, final CSVFormat format, final long characterOffset, final long recordNumber)
509515
throws IOException {
510-
this(reader, format, characterOffset, recordNumber, null);
516+
this(reader, format, characterOffset, recordNumber, null, false);
511517
}
512518

513519
/**
@@ -535,12 +541,13 @@ public CSVParser(final Reader reader, final CSVFormat format, final long charact
535541
* @throws CSVException Thrown on invalid input.
536542
* @since 1.13.0.
537543
*/
538-
private CSVParser(final Reader reader, final CSVFormat format, final long characterOffset, final long recordNumber, final Charset charset)
544+
private CSVParser(final Reader reader, final CSVFormat format, final long characterOffset, final long recordNumber,
545+
final Charset charset, final boolean enableByteTracking)
539546
throws IOException {
540547
Objects.requireNonNull(reader, "reader");
541548
Objects.requireNonNull(format, "format");
542549
this.format = format.copy();
543-
this.lexer = new Lexer(format, new ExtendedBufferedReader(reader, charset));
550+
this.lexer = new Lexer(format, new ExtendedBufferedReader(reader, charset, enableByteTracking));
544551
this.csvRecordIterator = new CSVRecordIterator();
545552
this.headers = createHeaders();
546553
this.characterOffset = characterOffset;

src/main/java/org/apache/commons/csv/ExtendedBufferedReader.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ final class ExtendedBufferedReader extends UnsynchronizedBufferedReader {
6767
super(reader);
6868
}
6969

70-
ExtendedBufferedReader(final Reader reader, Charset charset) {
70+
ExtendedBufferedReader(final Reader reader, Charset charset, boolean enableByteTracking) {
7171
super(reader);
72-
if (charset != null) {
72+
if (charset != null && enableByteTracking) {
7373
encoder = charset.newEncoder();
7474
}
7575
}

src/test/java/org/apache/commons/csv/CSVParserTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ public void testGetRecordThreeBytesRead() throws Exception {
711711
.setDelimiter(',')
712712
.setQuote('\'')
713713
.get();
714-
try (CSVParser parser = CSVParser.builder().setReader(new StringReader(code)).setFormat(format).setCharset(UTF_8).get() ) {
714+
try (CSVParser parser = CSVParser.builder().setReader(new StringReader(code)).setFormat(format).setCharset(UTF_8).setEnableByteTracking(true).get() ) {
715715
CSVRecord record = new CSVRecord(parser, null, null, 1L, 0L, 0L);
716716

717717
assertEquals(0, parser.getRecordNumber());
@@ -748,7 +748,7 @@ public void testGetRecordFourBytesRead() throws Exception {
748748
.setDelimiter(',')
749749
.setQuote('\'')
750750
.get();
751-
try (CSVParser parser = CSVParser.builder().setReader(new StringReader(code)).setFormat(format).setCharset(UTF_8).get()) {
751+
try (CSVParser parser = CSVParser.builder().setReader(new StringReader(code)).setFormat(format).setCharset(UTF_8).setEnableByteTracking(true).get()) {
752752
CSVRecord record = new CSVRecord(parser, null, null, 1L, 0L, 0L);
753753

754754
assertEquals(0, parser.getRecordNumber());

src/test/java/org/apache/commons/csv/JiraCsv196Test.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public void parseThreeBytes() throws IOException {
3737
.setFormat(format)
3838
.setReader(getTestInput("org/apache/commons/csv/CSV-196/japanese.csv"))
3939
.setCharset(StandardCharsets.UTF_8)
40+
.setEnableByteTracking(true)
4041
.get();
4142
long[] charByteKey = {0, 89, 242, 395};
4243
int idx = 0;
@@ -57,6 +58,7 @@ public void parseFourBytes() throws IOException {
5758
.setFormat(format)
5859
.setReader(getTestInput("org/apache/commons/csv/CSV-196/emoji.csv"))
5960
.setCharset(StandardCharsets.UTF_8)
61+
.setEnableByteTracking(true)
6062
.get();
6163
long[] charByteKey = {0, 84, 701, 1318, 1935};
6264
int idx = 0;

0 commit comments

Comments
 (0)