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."); } } }