package org.prevayler.demos.demo2.business; import java.util.*; public class Account implements java.io.Serializable { private static final long serialVersionUID=3998522662411373397L; private long number; private String holder; private long balance=0; private List transactionHistory=new ArrayList(); private transient Set listeners; private Account(){ } Account( long number, String holder) throws InvalidHolder { this.number=number; holder(holder); } public long number(){ return number; } public String toString(){ return numberString() + " - " + holder; } public String numberString(){ return numberString(number); } static String numberString( long number){ return (new java.text.DecimalFormat("00000").format(number)); } public String holder(){ return holder; } public void holder( String holder) throws InvalidHolder { verify(holder); this.holder=holder; notifyListeners(); } public long balance(){ return balance; } public void deposit( long amount, Date timestamp) throws InvalidAmount { verify(amount); register(amount,timestamp); } public void withdraw( long amount, Date timestamp) throws InvalidAmount { verify(amount); register(-amount,timestamp); } private void register( long amount, Date timestamp){ balance+=amount; transactionHistory.add(new AccountEntry(amount,timestamp)); notifyListeners(); } private void verify( long amount) throws InvalidAmount { if (amount <= 0) throw new InvalidAmount("Amount must be greater than zero."); if (amount > 10000) throw new InvalidAmount("Amount maximum (10000) exceeded."); } public List transactionHistory(){ return transactionHistory; } public void addAccountListener( AccountListener listener){ listeners().add(listener); } public void removeAccountListener( AccountListener listener){ listeners().remove(listener); } private Set listeners(){ if (listeners == null) listeners=new HashSet(); return listeners; } private void notifyListeners(){ Iterator it=listeners().iterator(); while (it.hasNext()) { ((AccountListener)it.next()).accountChanged(); } } public class InvalidAmount extends Exception { private static final long serialVersionUID=3343517565045905857L; InvalidAmount( String message){ super(message); } } private void verify( String holder) throws InvalidHolder { if (holder == null || holder.equals("")) throw new InvalidHolder(); } public class InvalidHolder extends Exception { private static final long serialVersionUID=-3234126892127577122L; InvalidHolder(){ super("Invalid holder name."); } } }