This is an automated email from the ASF dual-hosted git repository. kaspersor pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/metamodel.git
commit 5cb7edf0dbc5234a203c607a81be9e164059cc20 Author: Arjan Seijkens <[email protected]> AuthorDate: Fri Jun 14 14:49:34 2019 +0200 Refactored based on feedback. Introduced the CsvParserBuilder class to work around the fact that we internally are able to use two different builders which don't share a common super class or interface. --- .../org/apache/metamodel/csv/CsvConfiguration.java | 17 -------- .../org/apache/metamodel/csv/CsvDataContext.java | 2 +- .../org/apache/metamodel/csv/CsvParserBuilder.java | 50 ++++++++++++++++++++++ .../apache/metamodel/csv/SingleLineCsvDataSet.java | 48 ++------------------- .../apache/metamodel/csv/SingleLineCsvRowTest.java | 6 +-- 5 files changed, 56 insertions(+), 67 deletions(-) diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java b/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java index d9f0f72..332ef4b 100644 --- a/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java +++ b/csv/src/main/java/org/apache/metamodel/csv/CsvConfiguration.java @@ -26,10 +26,6 @@ import org.apache.metamodel.schema.naming.ColumnNamingStrategy; import org.apache.metamodel.util.BaseObject; import org.apache.metamodel.util.FileHelper; -import com.opencsv.CSVParserBuilder; -import com.opencsv.ICSVParser; -import com.opencsv.RFC4180ParserBuilder; - /** * Represents the configuration for reading/parsing CSV files. */ @@ -199,17 +195,4 @@ public final class CsvConfiguration extends BaseObject implements Serializable { + ", separatorChar=" + separatorChar + ", quoteChar=" + quoteChar + ", escapeChar=" + escapeChar + ", failOnInconsistentRowLength=" + failOnInconsistentRowLength + "]"; } - - public ICSVParser createParser() { - if (getEscapeChar() == getQuoteChar()) { - return new RFC4180ParserBuilder().withSeparator(getSeparatorChar()).withQuoteChar(getQuoteChar()).build(); - } else { - return new CSVParserBuilder() - .withSeparator(getSeparatorChar()) - .withQuoteChar(getQuoteChar()) - .withEscapeChar(getEscapeChar()) - .build(); - } - } - } diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java b/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java index 515ebdd..5f50932 100644 --- a/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java +++ b/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java @@ -301,7 +301,7 @@ public final class CsvDataContext extends QueryPostprocessDataContext implements } private ICSVParser createParser() { - return _configuration.createParser(); + return new CsvParserBuilder(_configuration).build(); } protected CSVReader createCsvReader(int skipLines) { diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvParserBuilder.java b/csv/src/main/java/org/apache/metamodel/csv/CsvParserBuilder.java new file mode 100644 index 0000000..d238098 --- /dev/null +++ b/csv/src/main/java/org/apache/metamodel/csv/CsvParserBuilder.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel.csv; + +import com.opencsv.CSVParserBuilder; +import com.opencsv.ICSVParser; +import com.opencsv.RFC4180ParserBuilder; + +class CsvParserBuilder { + final CSVParserBuilder _csvParserBuilder; + final RFC4180ParserBuilder _rfc4180ParserBuilder; + + CsvParserBuilder(final CsvConfiguration csvConfiguration) { + if (csvConfiguration.getEscapeChar() == csvConfiguration.getQuoteChar()) { + _csvParserBuilder = null; + _rfc4180ParserBuilder = new RFC4180ParserBuilder() + .withSeparator(csvConfiguration.getSeparatorChar()) + .withQuoteChar(csvConfiguration.getQuoteChar()); + } else { + _csvParserBuilder = new CSVParserBuilder() + .withSeparator(csvConfiguration.getSeparatorChar()) + .withQuoteChar(csvConfiguration.getQuoteChar()) + .withEscapeChar(csvConfiguration.getEscapeChar()); + _rfc4180ParserBuilder = null; + } + } + + ICSVParser build() { + if (_csvParserBuilder == null) { + return _rfc4180ParserBuilder.build(); + } + return _csvParserBuilder.build(); + } +} diff --git a/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvDataSet.java b/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvDataSet.java index c734060..a479b2a 100644 --- a/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvDataSet.java +++ b/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvDataSet.java @@ -41,59 +41,23 @@ import com.opencsv.ICSVParser; final class SingleLineCsvDataSet extends AbstractDataSet { private final BufferedReader _reader; - private final ICSVParser _csvParser; private final int _columnsInTable; private final boolean _failOnInconsistentRowLength; - private final CsvConfiguration _csvConfiguration; + private final CsvParserBuilder _csvParserBuilder; private volatile int _rowNumber; private volatile Integer _rowsRemaining; private volatile Row _row; - /** - * @param reader - * @param csvParser - * @param columns - * @param maxRows - * @param columnsInTable - * @param failOnInconsistentRowLength - * - * @deprecated When instantiating a {@link SingleLineCsvDataSet} using this constructor the {@link ICSVParser} can - * be reused in different threads in a parallel manner which is not promised to work by the - * {@link ICSVParser}. Use - * {@link #SingleLineCsvDataSet(BufferedReader, CsvConfiguration, List, Integer, int, boolean)} instead. - */ - @Deprecated - public SingleLineCsvDataSet(BufferedReader reader, ICSVParser csvParser, List<Column> columns, Integer maxRows, - int columnsInTable, boolean failOnInconsistentRowLength) { - this(reader, csvParser, columns, maxRows, columnsInTable, failOnInconsistentRowLength, null); - } - - /** - * @param reader - * @param columns - * @param maxRows - * @param columnsInTable - * @param csvParser - * @param failOnInconsistentRowLength - */ public SingleLineCsvDataSet(final BufferedReader reader, final List<Column> columns, final Integer maxRows, final int columnsInTable, final CsvConfiguration csvConfiguration) { - this(reader, null, columns, maxRows, columnsInTable, csvConfiguration.isFailOnInconsistentRowLength(), - csvConfiguration); - } - - private SingleLineCsvDataSet(final BufferedReader reader, final ICSVParser csvParser, final List<Column> columns, - final Integer maxRows, final int columnsInTable, final boolean failOnInconsistentRowLength, - final CsvConfiguration csvConfiguration) { super(columns.stream().map(SelectItem::new).collect(Collectors.toList())); _reader = reader; - _csvParser = csvParser; _columnsInTable = columnsInTable; - _failOnInconsistentRowLength = failOnInconsistentRowLength; + _failOnInconsistentRowLength = csvConfiguration.isFailOnInconsistentRowLength(); _rowNumber = 0; _rowsRemaining = maxRows; - _csvConfiguration = csvConfiguration; + _csvParserBuilder = new CsvParserBuilder(csvConfiguration); } @Override @@ -131,10 +95,7 @@ final class SingleLineCsvDataSet extends AbstractDataSet { } protected ICSVParser getCsvParser() { - if (_csvConfiguration != null) { - return _csvConfiguration.createParser(); - } - return _csvParser; + return _csvParserBuilder.build(); } public boolean nextInternal() { @@ -167,5 +128,4 @@ final class SingleLineCsvDataSet extends AbstractDataSet { public Row getRow() { return _row; } - } diff --git a/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java b/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java index a2f0eea..6f36d21 100644 --- a/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java +++ b/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java @@ -36,8 +36,6 @@ import org.apache.metamodel.util.FileResource; import org.junit.Assert; import org.junit.Test; -import com.opencsv.CSVParser; - public class SingleLineCsvRowTest { @Test @@ -45,9 +43,7 @@ public class SingleLineCsvRowTest { final List<Column> columns = new ArrayList<>(); columns.add(new MutableColumn("1")); columns.add(new MutableColumn("2")); - CSVParser csvParser = new CSVParser(); - @SuppressWarnings("deprecation") - final SingleLineCsvDataSet dataSet = new SingleLineCsvDataSet(null, csvParser, columns, null, 2, false); + final SingleLineCsvDataSet dataSet = new SingleLineCsvDataSet(null, columns, null, 2, new CsvConfiguration()); final SingleLineCsvRow originalRow = new SingleLineCsvRow(dataSet, "foo,bar", 2, false, 1); final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
