@Override public String toString() { return "CurrencyConversionException [base=" + base + ", term=" + term + ", conversionContext=" + conversionContext + "]: " + getMessage(); }
@Override public ExchangeRate getExchangeRate(ConversionQuery conversionQuery) { for (ExchangeRateProvider prov : this.providers) { try { if (prov.isAvailable(conversionQuery)) { ExchangeRate rate = prov.getExchangeRate(conversionQuery); if (Objects.nonNull(rate)) { return rate; } } } catch (Exception e) { Logger.getLogger(getClass().getName()).log(Level.WARNING, "Rate Provider did not return data though at check before data was flagged as available," + " provider=" + prov.getContext().getProviderName() + ", query=" + conversionQuery); } } throw new CurrencyConversionException(conversionQuery.getBaseCurrency(), conversionQuery.getCurrency(), null, "All delegate prov iders failed to deliver rate, providers=" + this.providers + ", query=" + conversionQuery); }
@Override public ExchangeRate getExchangeRate(ConversionQuery conversionQuery) { CurrencyUnitPair pair = new CurrencyUnitPair(conversionQuery.getBaseCurrency(), conversionQuery.getCurrency()); MonitoredCurrency monitoredCurrency = monitoredCurrencies.get(pair); if (monitoredCurrency == null) { throw new CurrencyConversionException(pair.getBase(), pair.getTarget(), null, "Pair not found."); } ExchangeRate rate = null; try { rate = buildExchangeRate(pair, monitoredCurrency.getTicker()); } catch (TimeoutException e) { throw new MonetaryException("Timeout loading exchange rate", e); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // Restore interruption flag } return rate; }
/** * Method that converts the source {@link MonetaryAmount} to an * {@link MonetaryAmount} based on the {@link ExchangeRate} of this * conversion. * @param amount The source amount * @return The converted amount, never null. * @throws CurrencyConversionException if conversion failed, or the required data is not available. * @see #getExchangeRate(MonetaryAmount) */ @Override public MonetaryAmount apply(MonetaryAmount amount) { if (termCurrency.equals(Objects.requireNonNull(amount).getCurrency())) { return amount; } ExchangeRate rate = getExchangeRate(amount); if (Objects.isNull(rate) || !amount.getCurrency().equals(rate.getBaseCurrency())) { throw new CurrencyConversionException(amount.getCurrency(), this.termCurrency, null); } NumberValue factor = rate.getFactor(); factor = roundFactor(amount, factor); Integer scale = rate.getContext().get(KEY_SCALE, Integer.class); if(Objects.isNull(scale) || scale < 0) { return amount.multiply(factor).getFactory().setCurrency(rate.getCurrency()).create(); } else { return amount.multiply(factor).getFactory().setCurrency(rate.getCurrency()).create().with(MonetaryOperators.rounding(scale)); } }
private ExchangeRate createExchangeRate(ConversionQuery query, ExchangeRateBuilder builder, ExchangeRate sourceRate, ExchangeRate target) { if (areBothBaseCurrencies(query)) { builder.setFactor(DefaultNumberValue.ONE); return builder.build(); } else if (BASE_CURRENCY_CODE.equals(query.getCurrency().getCurrencyCode())) { if (Objects.isNull(sourceRate)) { return null; } return reverse(sourceRate); } else if (BASE_CURRENCY_CODE.equals(query.getBaseCurrency() .getCurrencyCode())) { return target; } else { ExchangeRate rate1 = getExchangeRate( query.toBuilder().setTermCurrency(Monetary.getCurrency(BASE_CURRENCY_CODE)).build()); ExchangeRate rate2 = getExchangeRate( query.toBuilder().setBaseCurrency(Monetary.getCurrency(BASE_CURRENCY_CODE)) .setTermCurrency(query.getCurrency()).build()); if (Objects.nonNull(rate1) && Objects.nonNull(rate2)) { builder.setFactor(multiply(rate1.getFactor(), rate2.getFactor())); builder.setRateChain(rate1, rate2); return builder.build(); } throw new CurrencyConversionException(query.getBaseCurrency(), query.getCurrency(), sourceRate.getContext()); } }