use of javax.money.convert.RateType in project jsr354-ri by JavaMoney.
the class ECBRateReadingHandler method addRate.
/**
* Method to add a currency exchange rate.
*
* @param term the term (target) currency, mapped from EUR.
* @param rate The rate.
*/
void addRate(CurrencyUnit term, LocalDate localDate, Number rate) {
RateType rateType = RateType.HISTORIC;
ExchangeRateBuilder builder;
if (Objects.nonNull(localDate)) {
// TODO check/test!
if (localDate.equals(LocalDate.now())) {
rateType = RateType.DEFERRED;
}
builder = new ExchangeRateBuilder(ConversionContextBuilder.create(context, rateType).set(localDate).build());
} else {
builder = new ExchangeRateBuilder(ConversionContextBuilder.create(context, rateType).build());
}
builder.setBase(ECBHistoricRateProvider.BASE_CURRENCY);
builder.setTerm(term);
builder.setFactor(DefaultNumberValue.of(rate));
ExchangeRate exchangeRate = builder.build();
Map<String, ExchangeRate> rateMap = this.historicRates.get(localDate);
if (Objects.isNull(rateMap)) {
synchronized (this.historicRates) {
rateMap = Optional.ofNullable(this.historicRates.get(localDate)).orElse(new ConcurrentHashMap<>());
this.historicRates.putIfAbsent(localDate, rateMap);
}
}
rateMap.put(term.getCurrencyCode(), exchangeRate);
}
use of javax.money.convert.RateType in project jsr354-ri-bp by JavaMoney.
the class CompoundRateProvider method createContext.
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();
}
use of javax.money.convert.RateType in project jsr354-ri-bp by JavaMoney.
the class IMFRateProvider method loadRatesTSV.
@SuppressWarnings("unchecked")
private void loadRatesTSV(InputStream inputStream) throws IOException, ParseException {
Map<CurrencyUnit, List<ExchangeRate>> newCurrencyToSdr = new HashMap<>();
Map<CurrencyUnit, List<ExchangeRate>> newSdrToCurrency = new HashMap<>();
NumberFormat f = new DecimalFormat("#0.0000000000");
f.setGroupingUsed(false);
BufferedReader pr = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String line = pr.readLine();
if (line.contains("Request Rejected")) {
throw new IOException("Request has been rejected by IMF server.");
}
// int lineType = 0;
boolean currencyToSdr = true;
// SDRs per Currency unit (2)
//
// Currency January 31, 2013 January 30, 2013 January 29, 2013
// January 28, 2013 January 25, 2013
// Euro 0.8791080000 0.8789170000 0.8742470000 0.8752180000
// 0.8768020000
// Currency units per SDR(3)
//
// Currency January 31, 2013 January 30, 2013 January 29, 2013
// January 28, 2013 January 25, 2013
// Euro 1.137520 1.137760 1.143840 1.142570 1.140510
List<LocalDate> timestamps = null;
while (line != null) {
if (line.trim().isEmpty()) {
line = pr.readLine();
continue;
}
if (line.startsWith("SDRs per Currency unit")) {
currencyToSdr = false;
line = pr.readLine();
continue;
} else if (line.startsWith("Currency units per SDR")) {
currencyToSdr = true;
line = pr.readLine();
continue;
} else if (line.startsWith("Currency")) {
timestamps = readTimestamps(line);
line = pr.readLine();
continue;
}
String[] parts = line.split("\\t");
CurrencyUnit currency = currenciesByName.get(parts[0]);
if (currency == null) {
LOGGER.finest("Uninterpretable data from IMF data feed: " + parts[0]);
line = pr.readLine();
continue;
}
Double[] values = parseValues(parts);
for (int i = 0; i < values.length; i++) {
if (values[i] == null) {
continue;
}
LocalDate fromTS = timestamps != null ? timestamps.get(i) : null;
if (fromTS == null) {
continue;
}
RateType rateType = RateType.HISTORIC;
if (fromTS.equals(LocalDate.now())) {
rateType = RateType.DEFERRED;
}
if (currencyToSdr) {
// Currency -> SDR
ExchangeRate rate = new ExchangeRateBuilder(ConversionContextBuilder.create(CONTEXT, rateType).set(fromTS).build()).setBase(currency).setTerm(SDR).setFactor(new DefaultNumberValue(1d / values[i])).build();
List<ExchangeRate> rates = newCurrencyToSdr.get(currency);
if (rates == null) {
rates = new ArrayList<>(5);
newCurrencyToSdr.put(currency, rates);
}
rates.add(rate);
} else {
// SDR -> Currency
ExchangeRate rate = new ExchangeRateBuilder(ConversionContextBuilder.create(CONTEXT, rateType).set(fromTS).set("LocalTime", fromTS.toString()).build()).setBase(SDR).setTerm(currency).setFactor(DefaultNumberValue.of(1d / values[i])).build();
List<ExchangeRate> rates = newSdrToCurrency.get(currency);
if (rates == null) {
rates = new ArrayList<>(5);
newSdrToCurrency.put(currency, rates);
}
rates.add(rate);
}
}
line = pr.readLine();
}
// Cast is save, since contained DefaultExchangeRate is Comparable!
for (List<ExchangeRate> list : newSdrToCurrency.values()) {
Collections.sort(List.class.cast(list));
}
for (List<ExchangeRate> list : newCurrencyToSdr.values()) {
Collections.sort(List.class.cast(list));
}
this.sdrToCurrency = newSdrToCurrency;
this.currencyToSdr = newCurrencyToSdr;
for (Map.Entry<CurrencyUnit, List<ExchangeRate>> entry : this.sdrToCurrency.entrySet()) {
LOGGER.finest("SDR -> " + entry.getKey().getCurrencyCode() + ": " + entry.getValue());
}
for (Map.Entry<CurrencyUnit, List<ExchangeRate>> entry : this.currencyToSdr.entrySet()) {
LOGGER.finest(entry.getKey().getCurrencyCode() + " -> SDR: " + entry.getValue());
}
}
use of javax.money.convert.RateType in project jsr354-ri by JavaMoney.
the class CompoundRateProvider method createContext.
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();
}
use of javax.money.convert.RateType in project jsr354-ri by JavaMoney.
the class IMFRateReadingHandler method saveExchangeRate.
private void saveExchangeRate(Map<CurrencyUnit, List<ExchangeRate>> currencyToSdr, Map<CurrencyUnit, List<ExchangeRate>> sdrToCurrency, boolean isCurrencyToSdr, List<LocalDate> timestamps, CurrencyUnit currency, Double[] values) {
for (int index = 0; index < values.length; index++) {
if (Objects.isNull(values[index]) || Objects.isNull(getLocalDateFromTS(timestamps, index))) {
continue;
}
LocalDate fromTS = getLocalDateFromTS(timestamps, index);
RateType rateType = getRateType(fromTS);
if (isCurrencyToSdr) {
ExchangeRate rate = new ExchangeRateBuilder(ConversionContextBuilder.create(context, rateType).set(fromTS).build()).setBase(currency).setTerm(IMFAbstractRateProvider.SDR).setFactor(new DefaultNumberValue(1D / values[index])).build();
List<ExchangeRate> rates = currencyToSdr.computeIfAbsent(currency, c -> new ArrayList<>(5));
rates.add(rate);
} else {
ExchangeRate rate = new ExchangeRateBuilder(ConversionContextBuilder.create(context, rateType).set(fromTS).build()).setBase(IMFAbstractRateProvider.SDR).setTerm(currency).setFactor(DefaultNumberValue.of(1D / values[index])).build();
List<ExchangeRate> rates = sdrToCurrency.computeIfAbsent(currency, (c) -> new ArrayList<>(5));
rates.add(rate);
}
}
}
Aggregations