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() { //Returns something like "00123 - John Smith"
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.");
}
}
}