package name.abuchen.portfolio.snapshot.security;
import java.util.List;
import name.abuchen.portfolio.model.AccountTransaction;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.Transaction;
import name.abuchen.portfolio.money.CurrencyConverter;
/* package */abstract class Calculation
{
private String termCurrency;
public String getTermCurrency()
{
return termCurrency;
}
public void setTermCurrency(String termCurrency)
{
this.termCurrency = termCurrency;
}
public void visit(CurrencyConverter converter, DividendInitialTransaction t)
{}
public void visit(CurrencyConverter converter, DividendFinalTransaction t)
{}
public void visit(CurrencyConverter converter, DividendTransaction t)
{}
public void visit(CurrencyConverter converter, PortfolioTransaction t)
{}
public void visit(CurrencyConverter converter, AccountTransaction t)
{}
public final void visitAll(CurrencyConverter converter, List<? extends Transaction> transactions)
{
for (Transaction t : transactions)
{
if (t instanceof DividendInitialTransaction)
visit(converter, (DividendInitialTransaction) t);
else if (t instanceof DividendFinalTransaction)
visit(converter, (DividendFinalTransaction) t);
else if (t instanceof DividendTransaction)
visit(converter, (DividendTransaction) t);
else if (t instanceof PortfolioTransaction)
visit(converter, (PortfolioTransaction) t);
else if (t instanceof AccountTransaction)
visit(converter, (AccountTransaction) t);
else
throw new UnsupportedOperationException();
}
}
public static <T extends Calculation> T perform(Class<T> type, CurrencyConverter converter,
List<? extends Transaction> transactions)
{
try
{
T thing = type.newInstance();
thing.setTermCurrency(converter.getTermCurrency());
thing.visitAll(converter, transactions);
return thing;
}
catch (Exception e)
{
throw new UnsupportedOperationException(e);
}
}
}