1 package org.apidesign.apifest08.currency;
3 import java.io.Serializable;
4 import java.math.BigDecimal;
5 import java.math.RoundingMode;
6 import java.util.Currency;
9 * Default {@link Convertor} implementation. Exchange rate is stored as equivalents. It means if we have USD to CZK convertor and USD1 = CZK17
10 * we store 1 in sourceEquivalent and 17 in destinationEquivalent. This class is immutable.
14 class DefaultConvertor implements Convertor, Serializable {
16 private static final long serialVersionUID = -1754789142402148099L;
19 * Equivalent in source currency.
21 private final BigDecimal sourceEquivalent;
24 * Equivalent in destination currency.
26 private final BigDecimal destinationEquivalent;
28 private final Currency sourceCurrency;
30 private final Currency destinationCurrency;
32 public DefaultConvertor(BigDecimal sourceEquivalent, BigDecimal destinationEquivalent, Currency sourceCurrency, Currency destinationCurrency) {
34 this.sourceEquivalent = sourceEquivalent;
35 this.destinationEquivalent = destinationEquivalent;
36 this.sourceCurrency = sourceCurrency;
37 this.destinationCurrency = destinationCurrency;
40 public Money convert(Money money) {
43 throw new NullPointerException("Money is null");
45 if (!money.getCurrency().equals(getSourceCurrency()))
47 throw new IllegalArgumentException("Can not convert from "+money.getCurrency()+". Converts "+getSourceCurrency()+" to "+getDestinationCurrency());
49 BigDecimal sourceAmount = money.getAmount();
50 BigDecimal destinationAmount = sourceAmount.multiply(destinationEquivalent).divide(sourceEquivalent, 2, RoundingMode.HALF_DOWN);
51 return new MoneyImpl(destinationAmount, getDestinationCurrency());
55 public Convertor revert() {
56 return new DefaultConvertor(destinationEquivalent, sourceEquivalent, destinationCurrency, sourceCurrency);
59 public BigDecimal getSourceEquivalent() {
60 return sourceEquivalent;
63 public BigDecimal getDestinationEquivalent() {
64 return destinationEquivalent;
67 public Currency getSourceCurrency() {
68 return sourceCurrency;
71 public Currency getDestinationCurrency() {
72 return destinationCurrency;
76 public String toString() {
77 return getClass().getName()+" converts "+getSourceCurrency()+" to "+getDestinationCurrency()+" "
78 +getSourceCurrency()+getSourceEquivalent()+"="+getDestinationCurrency()+getDestinationEquivalent();
82 public int hashCode() {
87 + ((destinationCurrency == null) ? 0 : destinationCurrency
91 + ((destinationEquivalent == null) ? 0 : destinationEquivalent
93 result = prime * result
94 + ((sourceCurrency == null) ? 0 : sourceCurrency.hashCode());
97 + ((sourceEquivalent == null) ? 0 : sourceEquivalent.hashCode());
102 public boolean equals(Object obj) {
107 if (!(obj instanceof DefaultConvertor))
109 DefaultConvertor other = (DefaultConvertor) obj;
110 if (destinationCurrency == null) {
111 if (other.destinationCurrency != null)
113 } else if (!destinationCurrency.equals(other.destinationCurrency))
115 if (destinationEquivalent == null) {
116 if (other.destinationEquivalent != null)
118 } else if (!destinationEquivalent.equals(other.destinationEquivalent))
120 if (sourceCurrency == null) {
121 if (other.sourceCurrency != null)
123 } else if (!sourceCurrency.equals(other.sourceCurrency))
125 if (sourceEquivalent == null) {
126 if (other.sourceEquivalent != null)
128 } else if (!sourceEquivalent.equals(other.sourceEquivalent))