KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > junit > samples > money > MoneyBag


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 JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc toString() {
121         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
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 }
Popular Tags