package com.brightgenerous.csv.delegate;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.LinkedList;
import java.util.List;
import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.CSVWriter;
import com.brightgenerous.csv.CsvException;
import com.brightgenerous.csv.IDataConverter;
import com.brightgenerous.csv.IFormatStrategy;
import com.brightgenerous.csv.IParseStrategy;
class CsvDelegaterOpenCsv implements CsvDelegater {
{
check();
}
private static void check() {
try {
Class.forName(CSVReader.class.getName());
Class.forName(CSVWriter.class.getName());
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
@Override
public <T> List<T> parse(String csv, IParseStrategy<T> strategy) throws CsvException {
return parse(new StringReader(csv), strategy);
}
@Override
public <T> List<T> parse(Reader csv, IParseStrategy<T> strategy) throws CsvException {
List<T> ret = new LinkedList<>();
try (CSVReader reader = new CSVReader(csv, strategy.getSeparator(), strategy.getQuote(),
strategy.getEscape(), strategy.getSkipLines(), strategy.getStrictQuotes(),
strategy.getIgnoreLeadingWhiteSpace())) {
IDataConverter<T> converter = strategy.getConverter();
String[] line;
while ((line = reader.readNext()) != null) {
ret.add(converter.convertToData(line));
}
} catch (IOException e) {
throw new CsvException(e);
}
return ret;
}
@Override
public <T> String format(List<T> datas, IFormatStrategy<T> strategy) throws CsvException {
StringWriter sw = new StringWriter();
format(datas, strategy, sw);
return sw.toString();
}
@Override
public <T> void format(List<T> datas, IFormatStrategy<T> strategy, Writer out)
throws CsvException {
try (CSVWriter writer = new CSVWriter(out, strategy.getSeparator(), strategy.getQuote(),
strategy.getEscape(), strategy.getLineEnd())) {
IDataConverter<T> converter = strategy.getConverter();
{
String[] header = converter.header();
if (header != null) {
writer.writeNext(header);
}
}
for (T data : datas) {
writer.writeNext(converter.convertToLine(data));
}
} catch (IOException e) {
throw new CsvException(e);
}
}
}