You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2019/06/20 10:01:29 UTC
[metamodel] 04/07: 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.
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 <a....@quadient.com>
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();