/** * Get the deferred flag. Exchange rates can be deferred or real.time. * * @return the deferred flag, or {code null}. */ public RateType getRateType() { return get(RateType.class); }
/** * Sets the exchange rate type * * @param rateType the {@link javax.money.convert.RateType} contained */ public Builder(String provider, RateType rateType) { this(ConversionContext.of(provider, rateType)); }
/** * Get the provider of this rate. The provider of a rate can have different * contexts in different usage scenarios, such as the service type or the * stock exchange. * * @return the provider, or {code null}. */ public String getProviderName() { return getText("provider"); }
protected ConversionContext getExchangeContext(String key) { int scale = getScale(key); if(scale < 0) { return ConversionContext.of(this.context.getProviderName(), RateType.HISTORIC); } else { return ConversionContext.of(this.context.getProviderName(), RateType.HISTORIC).toBuilder().set(KEY_SCALE, scale).build(); } }
/** * Test if all providers returns valid meta data. * * @see javax.money.convert.ProviderContext */ @Test(description = "4.3.1 Test if all CurrencyConversion instances returns valid ConversionContext, accessed by " + "currency code.") @SpecAssertion(id = "431-A3", section = "4.3.1") public void testProviderMetadata2() { for (String providerName : MonetaryConversions.getConversionProviderNames()) { if (MonetaryConversions.isConversionAvailable("XXX", providerName)) { CurrencyConversion conv = MonetaryConversions.getConversion("XXX", providerName); ConversionContext ctx = conv.getContext(); AssertJUnit.assertNotNull( "ExchangeProvider must return a valid ProviderContext, but returned null: " + providerName, ctx); AssertJUnit.assertEquals("ExchangeProvider's ProviderContext returns invalid name: " + providerName, providerName, ctx.getProviderName()); AssertJUnit.assertNotNull( "ExchangeProvider's ProviderContext declares invalid RateTypes to be returned (null): " + providerName, ctx.getRateType()); } } }
/** * Ensure additional ConversionContext is passed correctly to SPIs.<p> * Hint: this assertion will require some custom SPIs to be registered and selected for chain inclusion! */ @Test(description = "4.3.3 Ensure additional ConversionQuery data is passed correctly to SPIs.") @SpecAssertion(id = "433-A2", section = "4.3.3") public void testPassingOverConversionContextToSPIs() { ExchangeRateProvider prov = MonetaryConversions.getExchangeRateProvider("TestRateProvider"); ConversionQuery ctx = ConversionQueryBuilder.of().set(Locale.CANADA).set("Foo", "bar").setBaseCurrency(FOO_UNIT) .setTermCurrency(Monetary.getCurrency("XXX")).build(); ExchangeRate rate = prov.getExchangeRate(ctx); AssertJUnit.assertNotNull("No test rate returned by getExchangeRate(ConversionQuery), " + "probably TestProvider is not correct registered."); AssertJUnit.assertEquals( "Text parameter Locale.class was not correctly passed to ExchangeRateProvider implementation.", "bar", rate.getContext().getText("Foo")); AssertJUnit.assertEquals( "Object parameter Locale.class was not correctly passed to ExchangeRateProvider implementation.", Locale.CANADA, rate.getContext().get(Locale.class)); }
@Override public ExchangeRate getReversed(ExchangeRate rate) { ConversionQuery reverseQuery = rate.getContext().toQueryBuilder().setBaseCurrency(rate.getCurrency()) .setTermCurrency(rate.getBaseCurrency()).build(); if(isAvailable(reverseQuery)){ return getExchangeRate(reverseQuery); } return null; }
@Override public int compareTo(ExchangeRate o) { Objects.requireNonNull(o); int compare = this.getBaseCurrency().getCurrencyCode().compareTo(o.getBaseCurrency().getCurrencyCode()); if (compare == 0) { compare = this.getCurrency().getCurrencyCode().compareTo(o.getCurrency().getCurrencyCode()); } if (compare == 0) { compare = this.getContext().getProviderName().compareTo(o.getContext().getProviderName()); } return compare; }
/** * Creates a new {@link ConversionContext} with the data from this * Builder instance. * * @return a new {@link ConversionContext}. never {@code null}. */ public ConversionContext build() { return new ConversionContext(this); }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((base == null) ? 0 : base.hashCode()); result = prime * result + ((conversionContext == null) ? 0 : conversionContext.hashCode()); result = prime * result + ((factor == null) ? 0 : factor.hashCode()); result = prime * result + ((term == null) ? 0 : term.hashCode()); result = prime * result + ((chain == null) ? 0 : chain.hashCode()); return result; }
return false; } else if (!conversionContext.equals(other.conversionContext)) { return false;
/** * Test if all providers returns valid meta data. * * @see javax.money.convert.ProviderContext */ @Test(description = "4.3.1 Test if all CurrencyConversion instances returns valid ConversionContext, accessed by " + "CurrencyUnit.") @SpecAssertion(id = "431-A3", section = "4.3.1") public void testProviderMetadata3() { for (String providerName : MonetaryConversions.getConversionProviderNames()) { if (MonetaryConversions.isConversionAvailable(Monetary.getCurrency("XXX"), providerName)) { CurrencyConversion conv = MonetaryConversions.getConversion(Monetary.getCurrency("XXX"), providerName); ConversionContext ctx = conv.getContext(); AssertJUnit.assertNotNull( "ExchangeProvider must return a valid ProviderContext, but returned null: " + providerName, ctx); AssertJUnit.assertEquals("ExchangeProvider's ProviderContext returns invalid name: " + providerName, providerName, ctx.getProviderName()); AssertJUnit.assertNotNull( "ExchangeProvider's ProviderContext declares invalid RateTypes to be returned (null): " + providerName, ctx.getRateType()); } } }
@Override public ExchangeRate getReversed(ExchangeRate rate) { ConversionQuery reverseQuery = rate.getContext().toQueryBuilder().setBaseCurrency(rate.getCurrency()) .setTermCurrency(rate.getBaseCurrency()).build(); if(isAvailable(reverseQuery)){ return getExchangeRate(reverseQuery); } return null; }
@Override public int compareTo(ExchangeRate o) { if (o == null) { return -1; } int compare = this.getBaseCurrency().getCurrencyCode().compareTo(o.getBaseCurrency().getCurrencyCode()); if (compare == 0) { compare = this.getCurrency().getCurrencyCode().compareTo(o.getCurrency().getCurrencyCode()); } if (compare == 0) { compare = this.getContext().getProviderName().compareTo(o.getContext().getProviderName()); } return compare; }
/** * Sets the exchange rate type * * @param rateType the {@link javax.money.convert.RateType} contained */ public ExchangeRateBuilder(String provider, RateType rateType) { this(ConversionContext.of(provider, rateType)); }
/** * Test if all providers returns valid meta data. * * @see javax.money.convert.ProviderContext */ @Test(description = "4.3.1 Test if all CurrencyConversion instances returns valid ConversionContext, accessed by " + "ConversionQuery/currency code.") @SpecAssertion(id = "431-A3", section = "4.3.1") public void testProviderMetadata2WithContext() { for (String providerName : MonetaryConversions.getConversionProviderNames()) { ConversionQuery query = ConversionQueryBuilder.of(). setTermCurrency("XXX").setProviderNames(providerName).build(); if (MonetaryConversions.isConversionAvailable(query)) { CurrencyConversion conv = MonetaryConversions.getConversion(query); ConversionContext ctx = conv.getContext(); AssertJUnit.assertNotNull( "ExchangeProvider must return a valid ProviderContext, but returned null: " + providerName, ctx); AssertJUnit.assertEquals("ExchangeProvider's ProviderContext returns invalid name: " + providerName, providerName, ctx.getProviderName()); AssertJUnit.assertNotNull( "ExchangeProvider's ProviderContext declares invalid RateTypes to be returned (null): " + providerName, ctx.getRateType()); } } }
@Override public ExchangeRate getReversed(ExchangeRate rate) { ConversionQuery reverseQuery = rate.getContext().toQueryBuilder().setBaseCurrency(rate.getCurrency()) .setTermCurrency(rate.getBaseCurrency()).build(); if(isAvailable(reverseQuery)){ return getExchangeRate(reverseQuery); } return null; }
/** * 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)); } }
/** * Compare conversions done with exchange rates provided for same currency pair. */ @Test(description = "4.3.2 Test correct ExchangeRate is returned for CHF -> FOO, using TestRateProvider.") @SpecAssertion(id = "432-A2", section = "4.3.2") public void testConversionComparedWithRate() { final CurrencyUnit FOO = new TestCurrencyUnit("FOO"); ExchangeRate rate = MonetaryConversions.getExchangeRateProvider("TestRateProvider") .getExchangeRate(Monetary.getCurrency("CHF"), FOO); AssertJUnit.assertEquals(rate.getBaseCurrency(), Monetary.getCurrency("CHF")); AssertJUnit.assertEquals(rate.getCurrency().getCurrencyCode(), FOO.getCurrencyCode()); AssertJUnit.assertEquals(rate.getFactor().intValueExact(), 2); AssertJUnit.assertEquals("TestRateProvider", rate.getContext().getProviderName()); }
@Override public CurrencyConversion getCurrencyConversion(ConversionQuery conversionQuery) { return new LazyBoundCurrencyConversion(conversionQuery, this, ConversionContext .of(getContext().getProviderName(), getContext().getRateTypes().iterator().next())); }