Skip to content

Commit

Permalink
Error: exchange rate from USD to GBX not found
Browse files Browse the repository at this point in the history
We continue to hack here b/c we know that ECB provides everything to and
from EUR. However, when adding more providers, this will not work
anymore. We need something like Dijkstra's shortest path algorithm
implemented outside of rate provider. Adding some technical debt as
I do not have the time at the moment.

Issue: #618
  • Loading branch information
buchen committed Sep 10, 2016
1 parent 353ced7 commit e00051b
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package name.abuchen.portfolio.money.impl;

import static org.hamcrest.number.IsCloseTo.closeTo;
import static org.hamcrest.number.OrderingComparison.comparesEqualTo;
import static org.junit.Assert.assertThat;

Expand Down Expand Up @@ -35,5 +36,22 @@ public void testIt()
// GBP -> GBX
ExchangeRateTimeSeries gbp_gbx = factory.getTimeSeries("GBP", "GBX");
assertThat(gbp_gbx.lookupRate(LocalDate.now()).get().getValue(), comparesEqualTo(new BigDecimal(100.0)));

// GBX -> USD
// default value EUR -> GBP is 0.72666
// default value EUR -> USD is 1.0836
double calculatedRate = 0.01d * (1 / 0.72666d) * 1.0836d;

ExchangeRateTimeSeries gbx_usd = factory.getTimeSeries("GBX", "USD");
assertThat(gbx_usd.lookupRate(LocalDate.now()).get().getValue().doubleValue(),
closeTo(calculatedRate, 0.00000001));

// USD -> GBX
calculatedRate = (1 / 1.0836d) * 0.72666d * 100;

ExchangeRateTimeSeries usd_gbx = factory.getTimeSeries("USD", "GBX");
assertThat(usd_gbx.lookupRate(LocalDate.now()).get().getValue().doubleValue(),
closeTo(calculatedRate, 0.00000001));

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class ExchangeRateProviderFactory

public ExchangeRateProviderFactory()
{
providers = new ArrayList<ExchangeRateProvider>();
providers = new ArrayList<>();
Iterator<ExchangeRateProvider> registeredProvider = ServiceRegistry.lookupProviders(ExchangeRateProvider.class);
while (registeredProvider.hasNext())
{
Expand All @@ -35,7 +35,7 @@ public List<ExchangeRateProvider> getProviders()

public List<ExchangeRateTimeSeries> getAvailableTimeSeries()
{
List<ExchangeRateTimeSeries> series = new ArrayList<ExchangeRateTimeSeries>();
List<ExchangeRateTimeSeries> series = new ArrayList<>();
for (ExchangeRateProvider p : providers)
series.addAll(p.getAvailableTimeSeries());
return series;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,46 @@ else if (GBP.equals(baseCurrency) && GBX.equals(termCurrency))
{
return gbp2gbx;
}
else if (GBX.equals(baseCurrency) && CurrencyUnit.EUR.equals(termCurrency))
{
ExchangeRateTimeSeries series = factory.getTimeSeries(GBP, CurrencyUnit.EUR);
return new ChainedExchangeRateTimeSeries(gbx2gbp, series);
}
else if (CurrencyUnit.EUR.equals(baseCurrency) && GBX.equals(termCurrency))
{
ExchangeRateTimeSeries series = factory.getTimeSeries(CurrencyUnit.EUR, GBP);
return new ChainedExchangeRateTimeSeries(series, gbp2gbx);
else if (GBX.equals(baseCurrency))
{
if (CurrencyUnit.EUR.equals(termCurrency))
{
ExchangeRateTimeSeries series = factory.getTimeSeries(GBP, CurrencyUnit.EUR);
return new ChainedExchangeRateTimeSeries(gbx2gbp, series);
}
else
{
// We continue to hack here b/c we know that ECB provides
// everything we know to and from EUR. However, when adding more
// providers, this will not work anymore. We need something like
// Dijkstra's shortest path algorithm implemented outside of
// rate provider.

ExchangeRateTimeSeries eur2term = factory.getTimeSeries(CurrencyUnit.EUR, termCurrency);
if (eur2term == null)
return null;

ExchangeRateTimeSeries gbp2eur = factory.getTimeSeries(GBP, CurrencyUnit.EUR);
return new ChainedExchangeRateTimeSeries(gbx2gbp, gbp2eur, eur2term);
}

}
else if (GBX.equals(termCurrency))
{
if (CurrencyUnit.EUR.equals(baseCurrency))
{
ExchangeRateTimeSeries series = factory.getTimeSeries(CurrencyUnit.EUR, GBP);
return new ChainedExchangeRateTimeSeries(series, gbp2gbx);
}
else
{
ExchangeRateTimeSeries base2eur = factory.getTimeSeries(baseCurrency, CurrencyUnit.EUR);
if (base2eur == null)
return null;

ExchangeRateTimeSeries eur2gbp = factory.getTimeSeries(CurrencyUnit.EUR, GBP);
return new ChainedExchangeRateTimeSeries(base2eur, eur2gbp, gbp2gbx);
}
}
else
{
Expand Down

0 comments on commit e00051b

Please sign in to comment.