You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by on...@apache.org on 2018/10/05 22:52:18 UTC
[camel] 01/02: CAMEL-12698: Use the Stream API to read files
instead of Scanner
This is an automated email from the ASF dual-hosted git repository.
onders pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 248cb88ffca1dfe5ae26f4dbbac6348a5b042523
Merge: 081474d 9d946dc
Author: onders <on...@apache.org>
AuthorDate: Sat Oct 6 00:03:32 2018 +0300
CAMEL-12698: Use the Stream API to read files instead of Scanner
.../camel/dataformat/bindy/WrappedException.java | 38 ++++++++
.../dataformat/bindy/csv/BindyCsvDataFormat.java | 108 +++++++++++----------
.../bindy/kvp/BindyKeyValuePairDataFormat.java | 85 +++++++++-------
...indySimpleCsvUnmarshallUnicodeNextLineTest.java | 72 ++++++++++++++
...BindySimpleKeyValuePairUnicodeNextLineTest.java | 100 +++++++++++++++++++
.../bindy/model/unicode/LocationRecord.java | 51 ++++++++++
...pleCsvUnmarshallUnicodeNextLineTest-context.xml | 34 +++++++
...mpleKeyValuePairUnicodeNextLineTest-context.xml | 34 +++++++
8 files changed, 437 insertions(+), 85 deletions(-)
diff --cc components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
index 82edf8e,5906982..4f1c927
--- a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
+++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/csv/BindyCsvDataFormat.java
@@@ -147,41 -148,59 +149,60 @@@ public class BindyCsvDataFormat extend
if (checkEmptyStream(factory, inputStream)) {
return models;
}
-
+
in = new InputStreamReader(inputStream, IOHelper.getCharsetName(exchange));
- // Scanner is used to read big file
- scanner = new Scanner(in);
-
// Retrieve the separator defined to split the record
String separator = factory.getSeparator();
String quote = factory.getQuote();
- Boolean removeQuotes = factory.getRemoveQuotes();
ObjectHelper.notNull(separator, "The separator has not been defined in the annotation @CsvRecord or not instantiated during initModel.");
+
- int count = 0;
+ AtomicInteger count = new AtomicInteger(0);
- // If the first line of the CSV file contains columns name, then we
- // skip this line
- if (factory.getSkipFirstLine()) {
- // Check if scanner is empty
- if (scanner.hasNextLine()) {
- scanner.nextLine();
- }
- }
+ // Use a Stream to stream a file across.
+ try (Stream<String> lines = new BufferedReader(in).lines()) {
+ int linesToSkip = 0;
- while (scanner.hasNextLine()) {
+ // If the first line of the CSV file contains columns name, then we
+ // skip this line
+ if (factory.getSkipFirstLine()) {
+ linesToSkip = 1;
+ }
- // Read the line
- String line = scanner.nextLine().trim();
+ // Consume the lines in the file via a consumer method, passing in state as necessary.
+ // If the internals of the consumer fail, we unrap the checked exception upstream.
+ try {
+ lines.skip(linesToSkip)
+ .forEachOrdered(consumeFile(factory, models, separator, quote, count));
+ } catch (WrappedException e) {
+ throw e.getWrappedException();
+ }
- if (ObjectHelper.isEmpty(line)) {
- // skip if line is empty
- continue;
+ // BigIntegerFormatFactory if models list is empty or not
+ // If this is the case (correspond to an empty stream, ...)
+ if (models.size() == 0) {
+ throw new java.lang.IllegalArgumentException("No records have been defined in the CSV");
+ } else {
+ return extractUnmarshalResult(models);
}
+ }
+ } finally {
+ if (in != null) {
+ IOHelper.close(in, "in", LOG);
+ }
+ }
+
+ }
+ private Consumer<String> consumeFile(BindyCsvFactory factory, List<Map<String, Object>> models,
+ String separator, String quote, AtomicInteger count) {
+ return line -> {
+ try {
+ // Trim the line coming in to remove any trailing whitespace
+ String trimmedLine = line.trim();
// Increment counter
- count++;
+ count.incrementAndGet();
+ Map<String, Object> model;
// Create POJO where CSV data will be stored
model = factory.factory();
@@@ -201,22 -220,21 +222,24 @@@
separators.add(separators.get(separators.size() - 1));
}
- String[] tokens = pattern.split(line, factory.getAutospanLine() ? factory.getMaxpos() : -1);
+ String[] tokens = pattern.split(trimmedLine, factory.getAutospanLine() ? factory.getMaxpos() : -1);
++
List<String> result = Arrays.asList(tokens);
+
// must unquote tokens before use
- if (removeQuotes) {
- result = unquoteTokens(result, separators, quote);
- }
+
- if (result.size() == 0 || result.isEmpty()) {
- throw new java.lang.IllegalArgumentException("No records have been defined in the CSV");
+ result = unquoteTokens(result, separators, quote);
+
+ if (result.isEmpty()) {
+ throw new IllegalArgumentException("No records have been defined in the CSV");
} else {
if (LOG.isDebugEnabled()) {
LOG.debug("Size of the record splitted : {}", result.size());
}
// Bind data from CSV record with model classes
- factory.bind(getCamelContext(), result, model, count);
++
+ factory.bind(getCamelContext(), result, model, count.get());
// Link objects together
factory.link(model);