From 27050f065d3d566f7576a2951bbd37fdfccab08a Mon Sep 17 00:00:00 2001 From: Mathieu Lavigne Date: Mon, 23 Oct 2017 10:03:54 +0200 Subject: [PATCH] Option to skip ending line break FIX #155 --- .../jackson/dataformat/csv/CsvSchema.java | 52 ++++++++++++++++++- .../dataformat/csv/impl/CsvEncoder.java | 15 ++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java b/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java index 7166363..2f9b396 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvSchema.java @@ -608,6 +608,9 @@ protected void _checkIndex(int index) { protected final int _escapeChar; protected final char[] _lineSeparator; + + /** CSV ends with a line separator ? Default is true */ + protected final boolean _endingLineSeparator; /** * @since 2.5 @@ -648,6 +651,7 @@ public CsvSchema(Column[] columns, int features, _quoteChar = quoteChar; _escapeChar = escapeChar; _lineSeparator = lineSeparator; + _endingLineSeparator = true; _nullValue = nullValue; // and then we may need to create a mapping @@ -677,10 +681,33 @@ protected CsvSchema(Column[] columns, int features, _quoteChar = quoteChar; _escapeChar = escapeChar; _lineSeparator = lineSeparator; + _endingLineSeparator = true; + _arrayElementSeparator = arrayElementSeparator; + _nullValue = nullValue; + _columnsByName = columnsByName; + } + + /** + * Copy constructor used for creating variants using + * withXxx() methods. + */ + protected CsvSchema(Column[] columns, int features, + char columnSeparator, int quoteChar, int escapeChar, + char[] lineSeparator, boolean endingLineSeparator, int arrayElementSeparator, + char[] nullValue, + Map columnsByName) + { + _columns = columns; + _features = features; + _columnSeparator = columnSeparator; + _quoteChar = quoteChar; + _escapeChar = escapeChar; + _lineSeparator = lineSeparator; + _endingLineSeparator = endingLineSeparator; _arrayElementSeparator = arrayElementSeparator; _nullValue = nullValue; _columnsByName = columnsByName; - } + } /** * Copy constructor used for creating variants using @@ -693,6 +720,7 @@ protected CsvSchema(CsvSchema base, Column[] columns) { _quoteChar = base._quoteChar; _escapeChar = base._escapeChar; _lineSeparator = base._lineSeparator; + _endingLineSeparator = true; _arrayElementSeparator = base._arrayElementSeparator; _nullValue = base._nullValue; _columnsByName = base._columnsByName; @@ -710,6 +738,7 @@ protected CsvSchema(CsvSchema base, int features) { _quoteChar = base._quoteChar; _escapeChar = base._escapeChar; _lineSeparator = base._lineSeparator; + _endingLineSeparator = true; _arrayElementSeparator = base._arrayElementSeparator; _nullValue = base._nullValue; _columnsByName = base._columnsByName; @@ -890,6 +919,26 @@ public CsvSchema withLineSeparator(String sep) { _arrayElementSeparator, _nullValue, _columnsByName); } + /** + * @return + */ + public CsvSchema withEndingLineSeparator() { + + return new CsvSchema(_columns, _features, + _columnSeparator, _quoteChar, _escapeChar, _lineSeparator, true, + _arrayElementSeparator, _nullValue, _columnsByName); + } + + /** + * @return + */ + public CsvSchema withoutEndingLineSeparator() { + + return new CsvSchema(_columns, _features, + _columnSeparator, _quoteChar, _escapeChar, _lineSeparator, false, + _arrayElementSeparator, _nullValue, _columnsByName); + } + /** * @since 2.5 */ @@ -989,6 +1038,7 @@ public String getSchemaType() { public int getEscapeChar() { return _escapeChar; } public char[] getLineSeparator() { return _lineSeparator; } + public boolean getEndingLineSeparator() { return _endingLineSeparator; } /** * @return Null value defined, as char array, if one is defined to be recognized; Java null diff --git a/src/main/java/com/fasterxml/jackson/dataformat/csv/impl/CsvEncoder.java b/src/main/java/com/fasterxml/jackson/dataformat/csv/impl/CsvEncoder.java index 971116b..af5a937 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/csv/impl/CsvEncoder.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/csv/impl/CsvEncoder.java @@ -53,6 +53,8 @@ public class CsvEncoder final protected int _cfgEscapeCharacter; final protected char[] _cfgLineSeparator; + + final protected boolean _cfgEndingLineSeparator; /** * @since 2.5 @@ -177,6 +179,7 @@ public CsvEncoder(IOContext ctxt, int csvFeatures, Writer out, CsvSchema schema) _cfgEscapeCharacter = schema.getEscapeChar(); _cfgLineSeparator = schema.getLineSeparator(); _cfgLineSeparatorLength = (_cfgLineSeparator == null) ? 0 : _cfgLineSeparator.length; + _cfgEndingLineSeparator = schema.getEndingLineSeparator(); _cfgNullValue = schema.getNullValueOrEmpty(); _columnCount = schema.size(); @@ -205,6 +208,7 @@ public CsvEncoder(CsvEncoder base, CsvSchema newSchema) _cfgEscapeCharacter = newSchema.getEscapeChar(); _cfgLineSeparator = newSchema.getLineSeparator(); _cfgLineSeparatorLength = _cfgLineSeparator.length; + _cfgEndingLineSeparator = newSchema.getEndingLineSeparator(); _cfgNullValue = newSchema.getNullValueOrEmpty(); _cfgMinSafeChar = _calcSafeChar(); _columnCount = newSchema.size(); @@ -434,6 +438,14 @@ public void endRow() throws IOException System.arraycopy(_cfgLineSeparator, 0, _outputBuffer, _outputTail, _cfgLineSeparatorLength); _outputTail += _cfgLineSeparatorLength; } + + /** + * + */ + public void removeEndingLineSeparator() { + + _outputTail -= _cfgLineSeparatorLength; + } /* /********************************************************** @@ -830,6 +842,9 @@ public void flush(boolean flushStream) throws IOException public void close(boolean autoClose) throws IOException { + if (!_cfgEndingLineSeparator) { + removeEndingLineSeparator(); + } _flushBuffer(); if (autoClose) { _out.close();