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();