Source of MoneyBag.java


  1: package junit.samples.money;
  2: 
  3: import java.util.*;
  4: 
  5: /**
  6:  * A MoneyBag defers exchange rate conversions. For example adding 
  7:  * 12 Swiss Francs to 14 US Dollars is represented as a bag 
  8:  * containing the two Monies 12 CHF and 14 USD. Adding another
  9:  * 10 Swiss francs gives a bag with 22 CHF and 14 USD. Due to 
 10:  * the deferred exchange rate conversion we can later value a 
 11:  * MoneyBag with different exchange rates.
 12:  *
 13:  * A MoneyBag is represented as a list of Monies and provides 
 14:  * different constructors to create a MoneyBag. 
 15:  */ 
 16: class MoneyBag implements IMoney {
 17:         private Vector fMonies= new Vector(5);
 18: 
 19:         static IMoney create(IMoney m1, IMoney m2) {
 20:                 MoneyBag result= new MoneyBag();
 21:                 m1.appendTo(result);
 22:                 m2.appendTo(result);
 23:                 return result.simplify();
 24:         }
 25:         public IMoney add(IMoney m) {
 26:                 return m.addMoneyBag(this);
 27:         }
 28:         public IMoney addMoney(Money m) { 
 29:                 return MoneyBag.create(m, this);
 30:         }
 31:         public IMoney addMoneyBag(MoneyBag s) {
 32:                 return MoneyBag.create(s, this);
 33:         }
 34:         void appendBag(MoneyBag aBag) {
 35:                 for (Enumeration e= aBag.fMonies.elements(); e.hasMoreElements(); )
 36:                         appendMoney((Money)e.nextElement());
 37:         }
 38:         void appendMoney(Money aMoney) {
 39:                 if (aMoney.isZero()) return;
 40:                 IMoney old= findMoney(aMoney.currency());
 41:                 if (old == null) {
 42:                         fMonies.addElement(aMoney);
 43:                         return;
 44:                 }
 45:                 fMonies.removeElement(old);
 46:                 IMoney sum= old.add(aMoney);
 47:                 if (sum.isZero()) 
 48:                         return;
 49:                 fMonies.addElement(sum);
 50:         }
 51:         public boolean equals(Object anObject) {
 52:                 if (isZero())
 53:                         if (anObject instanceof IMoney)
 54:                                 return ((IMoney)anObject).isZero();
 55: 
 56:                 if (anObject instanceof MoneyBag) {
 57:                         MoneyBag aMoneyBag= (MoneyBag)anObject;
 58:                         if (aMoneyBag.fMonies.size() != fMonies.size())
 59:                                 return false;
 60: 
 61:                     for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) {
 62:                         Money m= (Money) e.nextElement();
 63:                                 if (!aMoneyBag.contains(m))
 64:                                         return false;
 65:                         }
 66:                         return true;
 67:                 }
 68:                 return false;
 69:         }
 70:         private Money findMoney(String currency) {
 71:                 for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) {
 72:                         Money m= (Money) e.nextElement();
 73:                         if (m.currency().equals(currency))
 74:                                 return m;
 75:                 }
 76:                 return null;
 77:         }
 78:         private boolean contains(Money m) {
 79:                 Money found= findMoney(m.currency());
 80:                 if (found == null) return false;
 81:                 return found.amount() == m.amount();
 82:         }
 83:         public int hashCode() {
 84:                 int hash= 0;
 85:             for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) {
 86:                 Object m= e.nextElement();
 87:                         hash^= m.hashCode();
 88:                 }
 89:             return hash;
 90:         }
 91:         public boolean isZero() {
 92:                 return fMonies.size() == 0;
 93:         }
 94:         public IMoney multiply(int factor) {
 95:                 MoneyBag result= new MoneyBag();
 96:                 if (factor != 0) {
 97:                         for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) {
 98:                                 Money m= (Money) e.nextElement();
 99:                                 result.appendMoney((Money)m.multiply(factor));
100:                         }
101:                 }
102:                 return result;
103:         }
104:         public IMoney negate() {
105:                 MoneyBag result= new MoneyBag();
106:             for (Enumeration e= fMonies.elements(); e.hasMoreElements(); ) {
107:                 Money m= (Money) e.nextElement();
108:                 result.appendMoney((Money)m.negate());
109:                 }
110:                 return result;
111:         }
112:         private IMoney simplify() {
113:                 if (fMonies.size() == 1)
114:                         return (IMoney)fMonies.elements().nextElement();
115:                 return this;
116:         }
117:         public IMoney subtract(IMoney m) {
118:                 return add(m.negate());
119:         }
120:         public String toString() {
121:                 StringBuffer buffer = new StringBuffer();
122:                 buffer.append("{");
123:                 for (Enumeration e= fMonies.elements(); e.hasMoreElements(); )
124:                     buffer.append(e.nextElement());
125:                 buffer.append("}");
126:                 return buffer.toString();
127:         }
128:         public void appendTo(MoneyBag m) {
129:                 m.appendBag(this);
130:         }
131: }