Skip to content

Commit

Permalink
Added GBX as available currency
Browse files Browse the repository at this point in the history
Issue: #406
  • Loading branch information
buchen committed Jan 17, 2016
1 parent 17273e2 commit 987fedf
Show file tree
Hide file tree
Showing 9 changed files with 235 additions and 4 deletions.
1 change: 1 addition & 0 deletions name.abuchen.portfolio.tests/infinitest.filters
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
name.abuchen.portfolio.money.impl.GBXExchangeRateProviderTest
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package name.abuchen.portfolio.money.impl;

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

import java.math.BigDecimal;
import java.time.LocalDate;

import org.junit.Test;

import name.abuchen.portfolio.money.ExchangeRateProviderFactory;
import name.abuchen.portfolio.money.ExchangeRateTimeSeries;

@SuppressWarnings("nls")
public class GBXExchangeRateProviderTest
{
@Test
public void testIt()
{
ExchangeRateProviderFactory factory = new ExchangeRateProviderFactory();

// default value EUR -> GBP is 0.72666
ExchangeRateTimeSeries eur_gbx = factory.getTimeSeries("EUR", "GBX");
assertThat(eur_gbx.lookupRate(LocalDate.now()).get().getValue(), comparesEqualTo(new BigDecimal("72.666")));

// inverse of default EUR -> GBP
ExchangeRateTimeSeries gbx_eur = factory.getTimeSeries("GBX", "EUR");
assertThat(gbx_eur.lookupRate(LocalDate.now()).get().getValue(), comparesEqualTo(
BigDecimal.ONE.divide(new BigDecimal("72.666"), 12, BigDecimal.ROUND_HALF_DOWN)));

// GBX -> GBP
ExchangeRateTimeSeries gbx_gbp = factory.getTimeSeries("GBX", "GBP");
assertThat(gbx_gbp.lookupRate(LocalDate.now()).get().getValue(), comparesEqualTo(new BigDecimal("0.01")));

// GBP -> GBX
ExchangeRateTimeSeries gbp_gbx = factory.getTimeSeries("GBP", "GBX");
assertThat(gbp_gbx.lookupRate(LocalDate.now()).get().getValue(), comparesEqualTo(new BigDecimal(100.0)));
}
}
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
name.abuchen.portfolio.money.impl.ECBExchangeRateProvider
name.abuchen.portfolio.money.impl.GBXExchangeRateProvider
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ public interface ExchangeRateProvider
*/
String getName();

/**
* Initializes the exchange rate provider with the factory.
*/
void init(ExchangeRateProviderFactory factory);

/**
* Loads the stored exchange rates from local storage.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ public ExchangeRateProviderFactory()
providers = new ArrayList<ExchangeRateProvider>();
Iterator<ExchangeRateProvider> registeredProvider = ServiceRegistry.lookupProviders(ExchangeRateProvider.class);
while (registeredProvider.hasNext())
providers.add(registeredProvider.next());
{
ExchangeRateProvider provider = registeredProvider.next();
provider.init(this);
providers.add(provider);
}
}

public List<ExchangeRateProvider> getProviders()
Expand All @@ -39,7 +43,6 @@ public List<ExchangeRateTimeSeries> getAvailableTimeSeries()

public ExchangeRateTimeSeries getTimeSeries(String baseCurrency, String termCurrency)
{
// TODO pick exchange rate with best quality of service
for (ExchangeRateProvider p : providers)
{
ExchangeRateTimeSeries s = p.getTimeSeries(baseCurrency, termCurrency);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ GBP = British Pound Sterling

GBP.symbol = \u00A3

GBX = British Pence Sterling

HKD = Hong Kong Dollar

HRK = Croatian Kuna
Expand Down Expand Up @@ -72,4 +74,3 @@ USD = United States Dollar
USD.symbol = $

ZAR = South African Rand

Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ EUR = Euro

GBP = Britisches Pfund

GBX = Britische Sterling Pence

HKD = Hongkong Dollar

HRK = Kroatische Kuna
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import name.abuchen.portfolio.Messages;
import name.abuchen.portfolio.money.ExchangeRate;
import name.abuchen.portfolio.money.ExchangeRateProvider;
import name.abuchen.portfolio.money.ExchangeRateProviderFactory;
import name.abuchen.portfolio.money.ExchangeRateTimeSeries;
import name.abuchen.portfolio.util.LocalDateConverter;

Expand Down Expand Up @@ -61,6 +62,12 @@ public String getName()
return Messages.LabelEuropeanCentralBank;
}

@Override
public void init(ExchangeRateProviderFactory factory)
{
// nothing to do
}

@Override
public synchronized void load(IProgressMonitor monitor) throws IOException
{
Expand Down Expand Up @@ -126,7 +133,7 @@ public synchronized void save(IProgressMonitor monitor) throws IOException
@Override
public List<ExchangeRateTimeSeries> getAvailableTimeSeries()
{
return new ArrayList<ExchangeRateTimeSeries>(data.getSeries());
return new ArrayList<>(data.getSeries());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
package name.abuchen.portfolio.money.impl;

import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.eclipse.core.runtime.IProgressMonitor;

import name.abuchen.portfolio.money.CurrencyUnit;
import name.abuchen.portfolio.money.ExchangeRate;
import name.abuchen.portfolio.money.ExchangeRateProvider;
import name.abuchen.portfolio.money.ExchangeRateProviderFactory;
import name.abuchen.portfolio.money.ExchangeRateTimeSeries;

public class GBXExchangeRateProvider implements ExchangeRateProvider
{
private static final String GBX = "GBX"; //$NON-NLS-1$
private static final String GBP = "GBP"; //$NON-NLS-1$

private ExchangeRateProviderFactory factory;

private ExchangeRateTimeSeries gbp2gbx = new GBPGBX(this);
private ExchangeRateTimeSeries gbx2gbp = new GBXGBP(this);

@Override
public String getName()
{
return CurrencyUnit.getInstance(GBX).getDisplayName();
}

@Override
public void init(ExchangeRateProviderFactory factory)
{
this.factory = factory;
}

@Override
public void load(IProgressMonitor monitor) throws IOException
{}

@Override
public void update(IProgressMonitor monitor) throws IOException
{}

@Override
public void save(IProgressMonitor monitor) throws IOException
{}

@Override
public List<ExchangeRateTimeSeries> getAvailableTimeSeries()
{
List<ExchangeRateTimeSeries> answer = new ArrayList<>();
answer.add(new GBXGBP(this));
return answer;
}

@Override
public ExchangeRateTimeSeries getTimeSeries(String baseCurrency, String termCurrency)
{
if (GBX.equals(baseCurrency) && GBP.equals(termCurrency))
{
return gbx2gbp;
}
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
{
return null;
}
}

private static class GBXGBP implements ExchangeRateTimeSeries
{
private ExchangeRateProvider provider;
private BigDecimal rate = BigDecimal.valueOf(0.01);

public GBXGBP(ExchangeRateProvider provider)
{
this.provider = provider;
}

@Override
public String getBaseCurrency()
{
return GBX;
}

@Override
public String getTermCurrency()
{
return GBP;
}

@Override
public ExchangeRateProvider getProvider()
{
return provider;
}

@Override
public List<ExchangeRate> getRates()
{
List<ExchangeRate> answer = new ArrayList<>();
answer.add(new ExchangeRate(LocalDate.now(), rate));
return answer;
}

@Override
public Optional<ExchangeRate> lookupRate(LocalDate requestedTime)
{
return Optional.of(new ExchangeRate(requestedTime, rate));
}
}

private static class GBPGBX implements ExchangeRateTimeSeries
{
private ExchangeRateProvider provider;
private BigDecimal rate = BigDecimal.valueOf(100);

public GBPGBX(ExchangeRateProvider provider)
{
this.provider = provider;
}

@Override
public String getBaseCurrency()
{
return GBP;
}

@Override
public String getTermCurrency()
{
return GBX;
}

@Override
public ExchangeRateProvider getProvider()
{
return provider;
}

@Override
public List<ExchangeRate> getRates()
{
List<ExchangeRate> answer = new ArrayList<>();
answer.add(new ExchangeRate(LocalDate.now(), rate));
return answer;
}

@Override
public Optional<ExchangeRate> lookupRate(LocalDate requestedTime)
{
return Optional.of(new ExchangeRate(requestedTime, rate));
}
}
}

0 comments on commit 987fedf

Please sign in to comment.