package org.prevayler.demos.demo2.business; import java.util.*; public class Bank implements java.io.Serializable { private static final long serialVersionUID = 9202866398345361997L; private long nextAccountNumber = 1; private Map accountsByNumber = new HashMap(); private transient BankListener bankListener; public Account createAccount(String holder) throws Account.InvalidHolder { Account account = new Account(nextAccountNumber, holder); accountsByNumber.put(new Long(nextAccountNumber++), account); if (bankListener != null) bankListener.accountCreated(account); return account; } public void deleteAccount(long number) throws AccountNotFound { Account account = findAccount(number); accountsByNumber.remove(new Long(number)); if (bankListener != null) bankListener.accountDeleted(account); } public List accounts() { List accounts = new ArrayList(accountsByNumber.values()); Collections.sort(accounts, new Comparator() { public int compare(Object acc1, Object acc2) { return ((Account)acc1).number() < ((Account)acc2).number() ? -1 : 1; } }); return accounts; } public void setBankListener(BankListener bankListener) { this.bankListener = bankListener; } public Account findAccount(long number) throws AccountNotFound { Account account = searchAccount(number); if (account == null) throw new AccountNotFound(number); return account; } public void transfer(long sourceNumber, long destinationNumber, long amount, Date timestamp) throws AccountNotFound, Account.InvalidAmount { Account source = findAccount(sourceNumber); Account destination = findAccount(destinationNumber); source.withdraw(amount, timestamp); if (amount == 666) throw new RuntimeException("Runtime Exception simulated for rollback demonstration purposes."); destination.deposit(amount, timestamp); } private Account searchAccount(long number) { return (Account)accountsByNumber.get(new Long(number)); } public class AccountNotFound extends Exception { private static final long serialVersionUID = 5107181766636463559L; AccountNotFound(long number) { super("Account not found: " + Account.numberString(number) + ".\nMight have been deleted."); } } }