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