package name.abuchen.portfolio.datatransfer.csv;
import java.io.File;
import java.math.BigDecimal;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.Map;
import name.abuchen.portfolio.datatransfer.Extractor;
import name.abuchen.portfolio.datatransfer.csv.CSVImporter.Column;
import name.abuchen.portfolio.datatransfer.csv.CSVImporter.Field;
import name.abuchen.portfolio.datatransfer.csv.CSVImporter.FieldFormat;
import name.abuchen.portfolio.money.Values;
public abstract class CSVExtractor implements Extractor
{
public abstract List<Field> getFields();
public abstract List<Item> extract(int skipLines, List<String[]> rawValues, Map<String, Column> field2column,
List<Exception> errors);
@Override
public String getFilterExtension()
{
return "*.csv"; //$NON-NLS-1$
}
@Override
public List<Item> extract(List<File> files, List<Exception> errors)
{
throw new UnsupportedOperationException();
}
protected String getText(String name, String[] rawValues, Map<String, Column> field2column)
{
Column column = field2column.get(name);
if (column == null)
return null;
int columnIndex = column.getColumnIndex();
if (columnIndex < 0 || columnIndex >= rawValues.length)
return null;
String value = rawValues[columnIndex];
return value != null && value.trim().length() == 0 ? null : value;
}
protected Long getAmount(String name, String[] rawValues, Map<String, Column> field2column) throws ParseException
{
return getValue(name, rawValues, field2column, Values.Amount);
}
protected Long getQuote(String name, String[] rawValues, Map<String, Column> field2column) throws ParseException
{
return getValue(name, rawValues, field2column, Values.Quote);
}
protected Long getValue(String name, String[] rawValues, Map<String, Column> field2column, Values<Long> values)
throws ParseException
{
String value = getText(name, rawValues, field2column);
if (value == null)
return null;
Number num = (Number) field2column.get(name).getFormat().getFormat().parseObject(value);
return Long.valueOf((long) Math.round(num.doubleValue() * values.factor()));
}
protected LocalDate getDate(String name, String[] rawValues, Map<String, Column> field2column) throws ParseException
{
String value = getText(name, rawValues, field2column);
if (value == null)
return null;
Date date = (Date) field2column.get(name).getFormat().getFormat().parseObject(value);
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate();
}
protected final BigDecimal getBigDecimal(String name, String[] rawValues, Map<String, Column> field2column)
throws ParseException
{
String value = getText(name, rawValues, field2column);
if (value == null)
return null;
Number num = (Number) field2column.get(name).getFormat().getFormat().parseObject(value);
return BigDecimal.valueOf(num.doubleValue());
}
protected final Long getShares(String name, String[] rawValues, Map<String, Column> field2column)
throws ParseException
{
String value = getText(name, rawValues, field2column);
if (value == null)
return null;
Number num = (Number) field2column.get(name).getFormat().getFormat().parseObject(value);
return Math.round(Math.abs(num.doubleValue()) * Values.Share.factor());
}
@SuppressWarnings("unchecked")
protected final <E extends Enum<E>> E getEnum(String name, Class<E> type, String[] rawValues,
Map<String, Column> field2column) throws ParseException
{
String value = getText(name, rawValues, field2column);
if (value == null)
return null;
FieldFormat ff = field2column.get(name).getFormat();
if (ff != null && ff.getFormat() != null)
return (E) ff.getFormat().parseObject(value);
else
return Enum.valueOf(type, value);
}
}