task1/solution02/src/org/apidesign/apifest08/currency/DefaultConvertor.java
author japod@localhost
Sun, 28 Sep 2008 14:12:38 +0200
changeset 6 97662396c0fd
child 16 2864c6d744c0
permissions -rw-r--r--
Adding solutions received for task1
japod@6
     1
package org.apidesign.apifest08.currency;
japod@6
     2
japod@6
     3
import java.io.Serializable;
japod@6
     4
import java.math.BigDecimal;
japod@6
     5
import java.math.RoundingMode;
japod@6
     6
import java.util.Currency;
japod@6
     7
japod@6
     8
/**
japod@6
     9
 * Default {@link Convertor} implementation. Exchange rate is stored as equivalents. It means if we have USD to CZK convertor and USD1 = CZK17 
japod@6
    10
 * we store 1 in sourceEquivalent and 17 in destinationEquivalent. This class is immutable.
japod@6
    11
 * @author lukas
japod@6
    12
 *
japod@6
    13
 */
japod@6
    14
class DefaultConvertor implements Convertor, Serializable {
japod@6
    15
japod@6
    16
	private static final long serialVersionUID = -1754789142402148099L;
japod@6
    17
japod@6
    18
	/**
japod@6
    19
	 * Equivalent in source currency.
japod@6
    20
	 */
japod@6
    21
	private final BigDecimal sourceEquivalent;
japod@6
    22
	
japod@6
    23
	/**
japod@6
    24
	 * Equivalent in destination currency.
japod@6
    25
	 */
japod@6
    26
	private final BigDecimal destinationEquivalent;
japod@6
    27
	
japod@6
    28
	private final Currency sourceCurrency;
japod@6
    29
	
japod@6
    30
	private final Currency destinationCurrency;
japod@6
    31
	
japod@6
    32
	public DefaultConvertor(BigDecimal sourceEquivalent, BigDecimal destinationEquivalent, Currency sourceCurrency, Currency destinationCurrency) {
japod@6
    33
		super();
japod@6
    34
		this.sourceEquivalent = sourceEquivalent;
japod@6
    35
		this.destinationEquivalent = destinationEquivalent;
japod@6
    36
		this.sourceCurrency = sourceCurrency;
japod@6
    37
		this.destinationCurrency = destinationCurrency;
japod@6
    38
	}
japod@6
    39
	
japod@6
    40
	public Money convert(Money money) {
japod@6
    41
		if (money==null)
japod@6
    42
		{
japod@6
    43
			throw new NullPointerException("Money is null");
japod@6
    44
		}
japod@6
    45
		if (!money.getCurrency().equals(getSourceCurrency()))
japod@6
    46
		{
japod@6
    47
			throw new IllegalArgumentException("Can not convert from "+money.getCurrency()+". Converts "+getSourceCurrency()+" to "+getDestinationCurrency());
japod@6
    48
		}
japod@6
    49
		BigDecimal sourceAmount = money.getAmount();
japod@6
    50
		BigDecimal destinationAmount = sourceAmount.multiply(destinationEquivalent).divide(sourceEquivalent, 2, RoundingMode.HALF_DOWN);
japod@6
    51
		return new MoneyImpl(destinationAmount, getDestinationCurrency());
japod@6
    52
	}
japod@6
    53
japod@6
    54
japod@6
    55
	public Convertor revert() {
japod@6
    56
		return new DefaultConvertor(destinationEquivalent, sourceEquivalent, destinationCurrency, sourceCurrency);
japod@6
    57
	}
japod@6
    58
japod@6
    59
	public BigDecimal getSourceEquivalent() {
japod@6
    60
		return sourceEquivalent;
japod@6
    61
	}
japod@6
    62
japod@6
    63
	public BigDecimal getDestinationEquivalent() {
japod@6
    64
		return destinationEquivalent;
japod@6
    65
	}
japod@6
    66
japod@6
    67
	public Currency getSourceCurrency() {
japod@6
    68
		return sourceCurrency;
japod@6
    69
	}
japod@6
    70
japod@6
    71
	public Currency getDestinationCurrency() {
japod@6
    72
		return destinationCurrency;
japod@6
    73
	}
japod@6
    74
	
japod@6
    75
	@Override
japod@6
    76
	public String toString() {
japod@6
    77
		return getClass().getName()+" converts "+getSourceCurrency()+" to "+getDestinationCurrency()+" "
japod@6
    78
			+getSourceCurrency()+getSourceEquivalent()+"="+getDestinationCurrency()+getDestinationEquivalent();
japod@6
    79
	}
japod@6
    80
japod@6
    81
	@Override
japod@6
    82
	public int hashCode() {
japod@6
    83
		final int prime = 31;
japod@6
    84
		int result = 1;
japod@6
    85
		result = prime
japod@6
    86
				* result
japod@6
    87
				+ ((destinationCurrency == null) ? 0 : destinationCurrency
japod@6
    88
						.hashCode());
japod@6
    89
		result = prime
japod@6
    90
				* result
japod@6
    91
				+ ((destinationEquivalent == null) ? 0 : destinationEquivalent
japod@6
    92
						.hashCode());
japod@6
    93
		result = prime * result
japod@6
    94
				+ ((sourceCurrency == null) ? 0 : sourceCurrency.hashCode());
japod@6
    95
		result = prime
japod@6
    96
				* result
japod@6
    97
				+ ((sourceEquivalent == null) ? 0 : sourceEquivalent.hashCode());
japod@6
    98
		return result;
japod@6
    99
	}
japod@6
   100
japod@6
   101
	@Override
japod@6
   102
	public boolean equals(Object obj) {
japod@6
   103
		if (this == obj)
japod@6
   104
			return true;
japod@6
   105
		if (obj == null)
japod@6
   106
			return false;
japod@6
   107
		if (!(obj instanceof DefaultConvertor))
japod@6
   108
			return false;
japod@6
   109
		DefaultConvertor other = (DefaultConvertor) obj;
japod@6
   110
		if (destinationCurrency == null) {
japod@6
   111
			if (other.destinationCurrency != null)
japod@6
   112
				return false;
japod@6
   113
		} else if (!destinationCurrency.equals(other.destinationCurrency))
japod@6
   114
			return false;
japod@6
   115
		if (destinationEquivalent == null) {
japod@6
   116
			if (other.destinationEquivalent != null)
japod@6
   117
				return false;
japod@6
   118
		} else if (!destinationEquivalent.equals(other.destinationEquivalent))
japod@6
   119
			return false;
japod@6
   120
		if (sourceCurrency == null) {
japod@6
   121
			if (other.sourceCurrency != null)
japod@6
   122
				return false;
japod@6
   123
		} else if (!sourceCurrency.equals(other.sourceCurrency))
japod@6
   124
			return false;
japod@6
   125
		if (sourceEquivalent == null) {
japod@6
   126
			if (other.sourceEquivalent != null)
japod@6
   127
				return false;
japod@6
   128
		} else if (!sourceEquivalent.equals(other.sourceEquivalent))
japod@6
   129
			return false;
japod@6
   130
		return true;
japod@6
   131
	}
japod@6
   132
japod@6
   133
japod@6
   134
}