package name.abuchen.portfolio.datatransfer.csv;
import java.text.MessageFormat;
import java.text.ParseException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import name.abuchen.portfolio.Messages;
import name.abuchen.portfolio.datatransfer.csv.CSVImporter.AmountField;
import name.abuchen.portfolio.datatransfer.csv.CSVImporter.Column;
import name.abuchen.portfolio.datatransfer.csv.CSVImporter.DateField;
import name.abuchen.portfolio.datatransfer.csv.CSVImporter.Field;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.model.SecurityPrice;
/* package */class CSVSecurityPriceExtractor extends CSVExtractor
{
private List<Field> fields;
/* package */ CSVSecurityPriceExtractor(Client client)
{
fields = new ArrayList<>();
fields.add(new DateField(Messages.CSVColumn_Date));
fields.add(new AmountField(Messages.CSVColumn_Quote));
}
@Override
public String getLabel()
{
return Messages.CSVDefHistoricalQuotes;
}
@Override
public List<Field> getFields()
{
return fields;
}
@Override
public List<Item> extract(int skipLines, List<String[]> rawValues, Map<String, Column> field2column,
List<Exception> errors)
{
Security dummy = new Security();
for (String[] line : rawValues)
{
try
{
SecurityPrice p = extract(line, field2column);
if (p != null)
dummy.addPrice(p);
}
catch (ParseException e)
{
errors.add(e);
}
}
List<Item> result = new ArrayList<>();
if (!dummy.getPrices().isEmpty())
result.add(new SecurityItem(dummy));
return result;
}
private SecurityPrice extract(String[] rawValues, Map<String, Column> field2column) throws ParseException
{
LocalDate date = getDate(Messages.CSVColumn_Date, rawValues, field2column);
if (date == null)
throw new ParseException(MessageFormat.format(Messages.CSVImportMissingField, Messages.CSVColumn_Date), 0);
Long amount = getQuote(Messages.CSVColumn_Quote, rawValues, field2column);
if (amount == null)
throw new ParseException(MessageFormat.format(Messages.CSVImportMissingField, Messages.CSVColumn_Quote), 0);
return new SecurityPrice(date, Math.abs(amount));
}
}