task4/solution11/src/org/apidesign/apifest08/currency/ExchangeRateDataSource.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 11 Oct 2008 23:38:46 +0200
changeset 61 58ec6da75f6f
parent 53 task3/solution11/src/org/apidesign/apifest08/currency/ExchangeRateDataSource.java@09d690bb97f6
child 66 aa3f99f845ef
permissions -rw-r--r--
Copying structure for task4
     1 package org.apidesign.apifest08.currency;
     2 
     3 import org.apidesign.apifest08.currency.ExchangeRateProvider.ExchangeRateRequest;
     4 import org.apidesign.apifest08.currency.ExchangeRateProvider.ExchangeRateResponse;
     5 
     6 /**
     7  * Exchange rate data source.
     8  * 
     9  * @author ked
    10  */
    11 public final class ExchangeRateDataSource<AmountType, IdentifierType> {
    12 
    13   private final IdentifierType currencyAIdentifier;
    14 
    15   private final IdentifierType currencyBIdentifier;
    16 
    17   private final ExchangeRateProvider<AmountType, IdentifierType> exchangeRateProvider;
    18 
    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!");
    27         }
    28   this.currencyAIdentifier = currencyAIdentifier;
    29     this.currencyBIdentifier = currencyBIdentifier;
    30     this.exchangeRateProvider = exchangeRateProvider;
    31   }
    32 
    33   public IdentifierType getCurrencyAIdentifier() {
    34     return currencyAIdentifier;
    35   }
    36 
    37   public IdentifierType getCurrencyBIdentifier() {
    38     return currencyBIdentifier;
    39   }
    40 
    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>();
    46 
    47     request.setCurrencyAIdentifier(currencyAIdentifier);
    48     request.setCurrencyBIdentifier(currencyBIdentifier);
    49 
    50     exchangeRateProvider.getExchangeRate(request, response);
    51 
    52     if (response.getExchangeRate().getCurrencyA().getIdentifier().equals(currencyAIdentifier) &&
    53         response.getExchangeRate().getCurrencyB().getIdentifier().equals(currencyBIdentifier)) {
    54       return response.getExchangeRate();
    55     } else {
    56       throw new IllegalStateException("Data source's provider returned inappropriate exchange rate!");
    57     }
    58   }
    59 
    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>(
    65         currencyAIdentifier,
    66         currencyBIdentifier,
    67         exchangeRateProvider);
    68   }
    69 
    70   @Override
    71   public boolean equals(Object obj) {
    72     if (obj == null) {
    73       return false;
    74     }
    75     if (getClass() != obj.getClass()) {
    76       return false;
    77     }
    78     final ExchangeRateDataSource other =
    79         (ExchangeRateDataSource) obj;
    80     if (this.currencyAIdentifier != other.currencyAIdentifier &&
    81         (this.currencyAIdentifier == null || !this.currencyAIdentifier.equals(other.currencyAIdentifier))) {
    82       return false;
    83     }
    84     if (this.currencyBIdentifier != other.currencyBIdentifier &&
    85         (this.currencyBIdentifier == null || !this.currencyBIdentifier.equals(other.currencyBIdentifier))) {
    86       return false;
    87     }
    88     if (this.exchangeRateProvider != other.exchangeRateProvider &&
    89         (this.exchangeRateProvider == null || !this.exchangeRateProvider.equals(other.exchangeRateProvider))) {
    90       return false;
    91     }
    92     return true;
    93   }
    94 
    95   @Override
    96   public int hashCode() {
    97     int hash = 7;
    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);
   101     return hash;
   102   }
   103 }