task4/solution11/src/org/apidesign/apifest08/currency/ExchangeRateDataSource.java
1 package org.apidesign.apifest08.currency;
3 import org.apidesign.apifest08.currency.ExchangeRateProvider.ExchangeRateRequest;
4 import org.apidesign.apifest08.currency.ExchangeRateProvider.ExchangeRateResponse;
7 * Exchange rate data source.
11 public final class ExchangeRateDataSource<AmountType, IdentifierType> {
13 private final IdentifierType currencyAIdentifier;
15 private final IdentifierType currencyBIdentifier;
17 private final ExchangeRateProvider<AmountType, IdentifierType> exchangeRateProvider;
19 private ExchangeRateDataSource(
20 IdentifierType currencyAIdentifier,
21 IdentifierType currencyBIdentifier,
22 ExchangeRateProvider<AmountType, IdentifierType> exchangeRateProvider) {
23 if (currencyAIdentifier == null ||
24 currencyBIdentifier == null ||
25 currencyAIdentifier.equals(currencyBIdentifier)) {
26 throw new IllegalArgumentException("Inappropriate exchange rates' identifiers!");
28 this.currencyAIdentifier = currencyAIdentifier;
29 this.currencyBIdentifier = currencyBIdentifier;
30 this.exchangeRateProvider = exchangeRateProvider;
33 public IdentifierType getCurrencyAIdentifier() {
34 return currencyAIdentifier;
37 public IdentifierType getCurrencyBIdentifier() {
38 return currencyBIdentifier;
41 public ExchangeRateValue<AmountType, IdentifierType> getExchangeRate() {
42 ExchangeRateRequest<AmountType, IdentifierType> request =
43 new ExchangeRateRequest<AmountType, IdentifierType>();
44 ExchangeRateResponse<AmountType, IdentifierType> response =
45 new ExchangeRateResponse<AmountType, IdentifierType>();
47 request.setCurrencyAIdentifier(currencyAIdentifier);
48 request.setCurrencyBIdentifier(currencyBIdentifier);
50 exchangeRateProvider.getExchangeRate(request, response);
52 if (response.getExchangeRate().getCurrencyA().getIdentifier().equals(currencyAIdentifier) &&
53 response.getExchangeRate().getCurrencyB().getIdentifier().equals(currencyBIdentifier)) {
54 return response.getExchangeRate();
56 throw new IllegalStateException("Data source's provider returned inappropriate exchange rate!");
60 public static <AmountType, IdentifierType> ExchangeRateDataSource<AmountType, IdentifierType> getExchangeRateDataSource(
61 IdentifierType currencyAIdentifier,
62 IdentifierType currencyBIdentifier,
63 ExchangeRateProvider<AmountType, IdentifierType> exchangeRateProvider) {
64 return new ExchangeRateDataSource<AmountType, IdentifierType>(
67 exchangeRateProvider);
71 public boolean equals(Object obj) {
75 if (getClass() != obj.getClass()) {
78 final ExchangeRateDataSource other =
79 (ExchangeRateDataSource) obj;
80 if (this.currencyAIdentifier != other.currencyAIdentifier &&
81 (this.currencyAIdentifier == null || !this.currencyAIdentifier.equals(other.currencyAIdentifier))) {
84 if (this.currencyBIdentifier != other.currencyBIdentifier &&
85 (this.currencyBIdentifier == null || !this.currencyBIdentifier.equals(other.currencyBIdentifier))) {
88 if (this.exchangeRateProvider != other.exchangeRateProvider &&
89 (this.exchangeRateProvider == null || !this.exchangeRateProvider.equals(other.exchangeRateProvider))) {
96 public int hashCode() {
98 hash = 83 * hash + (this.currencyAIdentifier != null ? this.currencyAIdentifier.hashCode() : 0);
99 hash = 83 * hash + (this.currencyBIdentifier != null ? this.currencyBIdentifier.hashCode() : 0);
100 hash = 83 * hash + (this.exchangeRateProvider != null ? this.exchangeRateProvider.hashCode() : 0);