@Override public CurrencyConversion getCurrencyConversion(ConversionQuery conversionQuery) { return new LazyBoundCurrencyConversion(conversionQuery, this, ConversionContext .of(getContext().getProviderName(), getContext().getRateTypes().iterator().next())); }
/** * Creates a new {@link ProviderContext} with the data from this Builder * instance. * * @return a new {@link ProviderContext}. never {@code null}. */ public ProviderContext build() { return new ProviderContext(this); }
/** * Get the deferred flag. Exchange rates can be deferred or real.time. * * @return the deferred flag, or {code null}. */ public Set<RateType> getRateTypes() { @SuppressWarnings("unchecked") Set<RateType> rateSet = get(KEY_RATE_TYPES, Set.class); if (rateSet == null) { return Collections.emptySet(); } return Collections.unmodifiableSet(rateSet); }
/** * Checks if an {@link ExchangeRate} between two {@link CurrencyUnit} is * available from this provider. This method should check, if a given rate * is <i>currently</i> defined. * * @param conversionQuery the required {@link ConversionQuery}, not {@code null} * @return {@code true}, if such an {@link ExchangeRate} is currently * defined. */ default boolean isAvailable(ConversionQuery conversionQuery){ Objects.requireNonNull(conversionQuery); try{ return conversionQuery.getProviderNames().isEmpty() || conversionQuery.getProviderNames().contains(getContext().getProviderName()); } catch(Exception e){ return false; } }
/** * Create a new Builder, hereby using the given {@link ProviderContext} * 's values as defaults. This allows changing an existing * {@link ProviderContext} easily. * * @param context the context, not {@code null} */ private ProviderContextBuilder(ProviderContext context) { importContext(context); Set<RateType> rts = new HashSet<>(); rts.addAll(context.getRateTypes()); set(ProviderContext.KEY_RATE_TYPES, rts); }
/** * Initialize the exchange provider and start polling thread */ @Override public synchronized void start() { if (!started) { started = true; exchange = ExchangeFactory.INSTANCE.createExchange(exchangeClassName); name = exchange.getExchangeSpecification().getExchangeName(); providerContext = ProviderContext.of(name, RateType.DEFERRED); marketDataService = exchange.getMarketDataService(); future = stpe.scheduleWithFixedDelay(this::poll, initialDelay, period, TimeUnit.SECONDS); } }
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(); } }
@Override public CurrencyConversion getCurrencyConversion(ConversionQuery conversionQuery) { if (getContext().getRateTypes().size() == 1) { return new LazyBoundCurrencyConversion(conversionQuery, this, ConversionContext .of(getContext().getProviderName(), getContext().getRateTypes().iterator().next())); } return new LazyBoundCurrencyConversion(conversionQuery, this, ConversionContext.of(getContext().getProviderName(), RateType.ANY)); }
@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); }
private static ProviderContext createContext(Iterable<ExchangeRateProvider> providers) { Set<RateType> rateTypeSet = new HashSet<>(); StringBuilder providerName = new StringBuilder("Compound: "); List<ProviderContext> childContextList = new ArrayList<>(); for (ExchangeRateProvider exchangeRateProvider : providers) { childContextList.add(exchangeRateProvider.getContext()); providerName.append(exchangeRateProvider.getContext().getProviderName()); providerName.append(',' ); rateTypeSet.addAll(exchangeRateProvider.getContext().getRateTypes()); } providerName.setLength(providerName.length() - 1); ProviderContextBuilder builder = ProviderContextBuilder.of(providerName.toString(), rateTypeSet); builder.set(CHILD_PROVIDER_CONTEXTS_KEY, childContextList); return builder.build(); }
@Override public ExchangeRate getExchangeRate(ConversionQuery conversionQuery) { Objects.requireNonNull(conversionQuery.getBaseCurrency()); if (isAvailable(conversionQuery)) { return new TestExchangeRate.Builder(getContext().getProviderName(), RateType.OTHER) .setFactor(new TestNumberValue(FACTOR)).setBase(conversionQuery.getBaseCurrency()) .setTerm(conversionQuery.getCurrency()).build(); } return null; }
/** * Test if all providers returns valid meta data. * * @see javax.money.convert.ProviderContext */ @Test(description = "4.3.1 Test if all ExchangeRateProvider instances returns valid ProviderContext.") @SpecAssertion(id = "431-A3", section = "4.3.1") public void testProviderMetadata() { for (String providerName : MonetaryConversions.getConversionProviderNames()) { ExchangeRateProvider prov = MonetaryConversions.getExchangeRateProvider(providerName); AssertJUnit.assertNotNull("Provider mot accessible: " + providerName, prov); ProviderContext ctx = prov.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.getRateTypes()); AssertJUnit.assertFalse( "ExchangeProvider's ProviderContext declares empty RateTypes to be returned: " + providerName, ctx.getRateTypes().isEmpty()); } }
@Override public ExchangeRate getExchangeRate(ConversionQuery query) { if (isAvailable(query)) { return new TestExchangeRate.Builder(PC.getProviderName(), RateType.OTHER).setFactor(new TestNumberValue(FACTOR)) .setBase(query.getBaseCurrency()).setTerm(query.getCurrency()).build(); } return null; }