package name.abuchen.portfolio.checks.impl; import java.text.MessageFormat; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import name.abuchen.portfolio.Messages; import name.abuchen.portfolio.checks.Check; import name.abuchen.portfolio.checks.Issue; import name.abuchen.portfolio.model.Account; import name.abuchen.portfolio.model.BuySellEntry; import name.abuchen.portfolio.model.Client; import name.abuchen.portfolio.model.CrossEntry; import name.abuchen.portfolio.model.Portfolio; import name.abuchen.portfolio.model.PortfolioTransaction; /** * Detect dangling accounts which are not in the account list of the client but * still referenced as account from a portfolio or portfolio transaction. Due to * a bug in previous versions, when deleting an account from the account list, * it was not removed as reference account. */ public class DanglingAccountsCheck implements Check { @Override public List<Issue> execute(Client client) { Set<Account> accounts = new HashSet<Account>(client.getAccounts()); for (Portfolio portfolio : client.getPortfolios()) { Account referenceAccount = portfolio.getReferenceAccount(); check(client, accounts, referenceAccount); for (PortfolioTransaction transaction : portfolio.getTransactions()) { CrossEntry entry = transaction.getCrossEntry(); if (!(entry instanceof BuySellEntry)) continue; Account account = (Account) entry.getCrossOwner(transaction); check(client, accounts, account); } } return Collections.emptyList(); } private void check(Client client, Set<Account> accounts, Account account) { if (!accounts.contains(account)) { account.setName(MessageFormat.format(Messages.LabelNameReferenceAccountRecovered, account.getName())); accounts.add(account); client.addAccount(account); } } }