All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.batch.engine.internal.reader.CSVBatchEngineImportTaskItemReaderImpl Maven / Gradle / Ivy

/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.batch.engine.internal.reader;

import com.liferay.petra.io.unsync.UnsyncBufferedReader;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.util.CSVUtil;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Serializable;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;

/**
 * @author Ivica Cardic
 * @author Igor Beslic
 * @author Matija Petanjek
 */
public class CSVBatchEngineImportTaskItemReaderImpl
	implements BatchEngineImportTaskItemReader {

	public CSVBatchEngineImportTaskItemReaderImpl(
			String delimiter, InputStream inputStream,
			Map parameters)
		throws IOException {

		_delimiter = (String)parameters.getOrDefault("delimiter", delimiter);

		_enclosingCharacter = (String)parameters.getOrDefault(
			"enclosingCharacter", StringPool.QUOTE);

		_csvParser = CSVParser.parse(
			new UnsyncBufferedReader(new InputStreamReader(inputStream)),
			CSVFormat.Builder.create(
			).setDelimiter(
				_delimiter
			).setIgnoreEmptyLines(
				true
			).setQuote(
				_enclosingCharacter.charAt(0)
			).build());

		_iterator = _csvParser.iterator();

		_fieldNames = _getFieldNames(
			Boolean.valueOf(
				(String)parameters.getOrDefault(
					"containsHeaders", StringPool.TRUE)),
			_iterator);
	}

	@Override
	public void close() throws IOException {
		_csvParser.close();
	}

	@Override
	public Map read() throws Exception {
		if (!_iterator.hasNext()) {
			return null;
		}

		Map fieldNameValueMap = new LinkedHashMap<>();

		CSVRecord csvRecord = _iterator.next();

		List values = csvRecord.toList();

		for (int i = 0; i < values.size(); i++) {
			String fieldName = _fieldNames[i];

			if (fieldName == null) {
				continue;
			}

			FieldNameValueMapHandlerFactory.FieldNameValueMapHandler
				fieldNameValueMapHandler =
					FieldNameValueMapHandlerFactory.getFieldNameValueMapHandler(
						fieldName);

			fieldNameValueMapHandler.handle(
				fieldName, fieldNameValueMap,
				CSVUtil.decode(_enclosingCharacter, _delimiter, values.get(i)));
		}

		return fieldNameValueMap;
	}

	private String[] _getFieldNames(
		boolean containsHeaders, Iterator csvRecordIterator) {

		if (containsHeaders) {
			CSVRecord csvRecord = csvRecordIterator.next();

			List fieldNamesList = csvRecord.toList();

			return fieldNamesList.toArray(new String[0]);
		}

		String[] fieldNames = new String[100];

		for (int i = 0; i < fieldNames.length; i++) {
			fieldNames[i] = String.valueOf(i);
		}

		return fieldNames;
	}

	private final CSVParser _csvParser;
	private final String _delimiter;
	private final String _enclosingCharacter;
	private final String[] _fieldNames;
	private final Iterator _iterator;

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy