task4/solution11/src/org/apidesign/apifest08/currency/ExchangeRateDataSource.java
1 package org.apidesign.apifest08.currency;
4 import org.apidesign.apifest08.currency.ExchangeRateProvider.ExchangeRateRequest;
5 import org.apidesign.apifest08.currency.ExchangeRateProvider.ExchangeRateResponse;
8 * Exchange rate data source.
12 public final class ExchangeRateDataSource<AmountType, IdentifierType> {
14 private final IdentifierType currencyAIdentifier;
15 private final IdentifierType currencyBIdentifier;
16 private final ExchangeRateProvider<AmountType, IdentifierType> exchangeRateProvider;
17 private final Date validFrom;
18 private final Date validTill;
20 private ExchangeRateDataSource(
21 IdentifierType currencyAIdentifier,
22 IdentifierType currencyBIdentifier,
23 ExchangeRateProvider<AmountType, IdentifierType> exchangeRateProvider,
26 if (currencyAIdentifier == null ||
27 currencyBIdentifier == null ||
28 currencyAIdentifier.equals(currencyBIdentifier)) {
29 throw new IllegalArgumentException("Inappropriate exchange rates' identifiers!");
31 if (validFrom != null &&
33 !validTill.after(validFrom)) {
34 throw new IllegalArgumentException("Inappropriate exchange rate validity!");
37 this.currencyAIdentifier = currencyAIdentifier;
38 this.currencyBIdentifier = currencyBIdentifier;
39 this.exchangeRateProvider = exchangeRateProvider;
40 this.validFrom = validFrom;
41 this.validTill = validTill;
44 public IdentifierType getCurrencyAIdentifier() {
45 return currencyAIdentifier;
48 public IdentifierType getCurrencyBIdentifier() {
49 return currencyBIdentifier;
52 ExchangeRateProvider<AmountType, IdentifierType> getExchangeRateProvider() {
53 return exchangeRateProvider;
56 public Date getValidFrom() {
57 return validFrom != null ? (Date) validFrom.clone() : null;
60 public Date getValidTill() {
61 return validTill != null ? (Date) validTill.clone() : null;
64 public ExchangeRateValue<AmountType, IdentifierType> getExchangeRate() {
65 return getExchangeRate(new Date()); // System.currentTimeMillis()
68 public ExchangeRateValue<AmountType, IdentifierType> getExchangeRate(Date instant) {
69 ExchangeRateRequest<AmountType, IdentifierType> request =
70 new ExchangeRateRequest<AmountType, IdentifierType>();
71 ExchangeRateResponse<AmountType, IdentifierType> response =
72 new ExchangeRateResponse<AmountType, IdentifierType>();
74 request.setCurrencyAIdentifier(currencyAIdentifier);
75 request.setCurrencyBIdentifier(currencyBIdentifier);
76 request.setInstant(instant);
78 exchangeRateProvider.getExchangeRate(request, response);
80 ExchangeRateValue<AmountType, IdentifierType> result = response.getExchangeRate();
81 if (result.getCurrencyA().getIdentifier().equals(currencyAIdentifier) &&
82 result.getCurrencyB().getIdentifier().equals(currencyBIdentifier)) {
85 throw new IllegalStateException("Data source's provider returned inappropriate exchange rate!");
89 public static <AmountType, IdentifierType> ExchangeRateDataSource<AmountType, IdentifierType> getExchangeRateDataSource(
90 IdentifierType currencyAIdentifier,
91 IdentifierType currencyBIdentifier,
92 ExchangeRateProvider<AmountType, IdentifierType> exchangeRateProvider) {
93 return getExchangeRateDataSource(
101 public static <AmountType, IdentifierType> ExchangeRateDataSource<AmountType, IdentifierType> getExchangeRateDataSource(
102 IdentifierType currencyAIdentifier,
103 IdentifierType currencyBIdentifier,
104 ExchangeRateProvider<AmountType, IdentifierType> exchangeRateProvider,
107 return new ExchangeRateDataSource<AmountType, IdentifierType>(
110 exchangeRateProvider,
116 public boolean equals(Object obj) {
120 if (getClass() != obj.getClass()) {
123 final ExchangeRateDataSource other =
124 (ExchangeRateDataSource) obj;
125 if (this.currencyAIdentifier != other.currencyAIdentifier &&
126 (this.currencyAIdentifier == null || !this.currencyAIdentifier.equals(other.currencyAIdentifier))) {
129 if (this.currencyBIdentifier != other.currencyBIdentifier &&
130 (this.currencyBIdentifier == null || !this.currencyBIdentifier.equals(other.currencyBIdentifier))) {
133 if (this.exchangeRateProvider != other.exchangeRateProvider &&
134 (this.exchangeRateProvider == null || !this.exchangeRateProvider.equals(other.exchangeRateProvider))) {
137 if (this.validFrom != other.validFrom && (this.validFrom == null || !this.validFrom.equals(other.validFrom))) {
140 if (this.validTill != other.validTill && (this.validTill == null || !this.validTill.equals(other.validTill))) {
147 public int hashCode() {
149 hash = 83 * hash + (this.currencyAIdentifier != null ? this.currencyAIdentifier.hashCode() : 0);
150 hash = 83 * hash + (this.currencyBIdentifier != null ? this.currencyBIdentifier.hashCode() : 0);
151 hash = 83 * hash + (this.exchangeRateProvider != null ? this.exchangeRateProvider.hashCode() : 0);