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