Skip to content

Commit

Permalink
further work
Browse files Browse the repository at this point in the history
Signed-off-by: Jan N. Klug <github@klug.nrw>
  • Loading branch information
J-N-K committed May 13, 2023
1 parent a6c4d37 commit bef2173
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -448,7 +448,13 @@ private static <T extends Quantity<T>> void addDefaultUnit(

@Override
public Unit<Currency> getSystemCurrency() {
return new CurrencyUnit("@", "Default Currency");
if (locale != null) {
String symbol = java.util.Currency.getInstance(locale).getSymbol();
String currencyCode = java.util.Currency.getInstance(locale).getCurrencyCode();
return new CurrencyUnit(currencyCode, symbol);
} else {
return new CurrencyUnit("DEF", null);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ private synchronized void enableProvider(CurrencyProvider currencyProvider) {
((CurrencyUnit) SYSTEM_CURRENCY).setSymbol(currencyProvider.getSystemCurrency().getSymbol());
((CurrencyUnit) SYSTEM_CURRENCY).setName(currencyProvider.getSystemCurrency().getName());
SimpleUnitFormat.getInstance().label(SYSTEM_CURRENCY, currencyProvider.getSystemCurrency().getSymbol());
currencyProvider.getCurrencies().forEach(currencyUnits::addUnit);
currencyProvider.getCurrencies().forEach(CurrencyUnits::addUnit);
}

public static @Nullable BigDecimal getConversionFactor(Unit<Currency> unit) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,19 @@ public final class CurrencyUnit implements Unit<Currency>, Comparable<Unit<Curre
private static final long serialVersionUID = -1L;
private static final Dimension DIMENSION = UnitDimension.parse('$');
private String name;
private String symbol;

public CurrencyUnit(String symbol, String name) {
private @Nullable String symbol;

/**
* Create a new <code>Currency</code>
*
* @param name 3-letter ISO-Code
* @param symbol an (optional) symbol
* @throws IllegalArgumentException if name is not valid
*/
public CurrencyUnit(String name, @Nullable String symbol) throws IllegalArgumentException {
if (name.length() != 3) {
throw new IllegalArgumentException("Only three characters allowed for currency name");
}
this.symbol = symbol;
this.name = name;
}
Expand Down Expand Up @@ -119,11 +129,11 @@ public String getName() {
return name;
}

public String getSymbol() {
public @Nullable String getSymbol() {
return symbol;
}

public void setSymbol(String s) {
public void setSymbol(@Nullable String s) {
this.symbol = s;
}

Expand All @@ -132,7 +142,7 @@ public final UnitConverter getConverterTo(@NonNullByDefault({}) Unit<Currency> t
return internalGetConverterTo(that);
}

@SuppressWarnings({ "rawtypes", "unchecked" })
@SuppressWarnings("unchecked")
@Override
public final @NonNullByDefault({}) UnitConverter getConverterToAny(@NonNullByDefault({}) Unit<?> that)
throws IncommensurableException, UnconvertibleException {
Expand Down Expand Up @@ -200,7 +210,7 @@ private UnitConverter internalGetConverterTo(Unit<Currency> that) throws Unconve
}
}
throw new UnconvertibleException(
"Could not get factor for converting " + this.getSymbol() + " to " + that.getSymbol());
"Could not get factor for converting " + this.getName() + " to " + that.getName());
}

public final Unit<?> multiply(@NonNullByDefault({}) Unit<?> that) {
Expand Down Expand Up @@ -257,8 +267,20 @@ public Unit<Currency> prefix(@NonNullByDefault({}) Prefix prefix) {

@Override
public int compareTo(Unit<Currency> that) {
int symbolComparison = getSymbol().compareTo(that.getSymbol());
return symbolComparison == 0 ? name.compareTo(that.getName()) : symbolComparison;
int nameCompare = getName().compareTo(that.getName());
if (nameCompare != 0) {
return nameCompare;
}
String thatSymbol = that.getSymbol();
if (symbol != null && thatSymbol != null) {
return symbol.compareTo(thatSymbol);
} else if (symbol != null) {
return 1;
} else if (thatSymbol != null) {
return -1;
}

return 0;
}

@Override
Expand All @@ -268,8 +290,8 @@ public boolean isEquivalentTo(@NonNullByDefault({}) Unit<Currency> that) {

@Override
public boolean equals(@Nullable Object obj) {
if (obj instanceof CurrencyUnit currencyUnit) {
return (getSymbol().equals(currencyUnit.symbol) && getName().equals(currencyUnit.name));
if (obj instanceof CurrencyUnit that) {
return (name.equals(that.name) && Objects.equals(symbol, that.symbol));
}
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,29 +33,31 @@ public final class CurrencyUnits extends AbstractSystemOfUnits {

private static CurrencyUnits INSTANCE = new CurrencyUnits();

public static final Unit<Currency> SYSTEM_CURRENCY = new CurrencyUnit("@", "NotSet");
public static final Unit<Currency> SYSTEM_CURRENCY = new CurrencyUnit("DEF", null);

static {
INSTANCE.units.add(SYSTEM_CURRENCY);
SimpleUnitFormat.getInstance().label(SYSTEM_CURRENCY, SYSTEM_CURRENCY.getSymbol());
addUnit(SYSTEM_CURRENCY);
}

@Override
public String getName() {
return CurrencyUnits.class.getSimpleName();
}

public void addUnit(Unit<Currency> unit) {
public static void addUnit(Unit<Currency> unit) {
if (!(unit instanceof CurrencyUnit)) {
throw new IllegalArgumentException("Not an instance of CurrencyUnit");
}
INSTANCE.units.add(unit);
SimpleUnitFormat.getInstance().label(unit, unit.getSymbol());
SimpleUnitFormat.getInstance().label(unit, unit.getName());
String symbol = unit.getSymbol();
if (symbol != null && !symbol.isBlank()) {
SimpleUnitFormat.getInstance().alias(unit, symbol);
}
}

public void removeUnit(Unit<Currency> unit) {
INSTANCE.units.remove(unit);
SimpleUnitFormat.getInstance().label(unit, null);
}

public static SystemOfUnits getInstance() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/**
* Copyright (c) 2010-2023 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.core.library.unit;

import org.eclipse.jdt.annotation.NonNullByDefault;

/**
* The {@link OpenHABUnitFormat} is a
*
* @author Jan N. Klug - Initial contribution
*/
@NonNullByDefault
public class OpenHABUnitFormat {
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.openhab.core.library.types.PointType;
import org.openhab.core.library.unit.CurrencyUnit;
import org.openhab.core.library.unit.CurrencyUnits;
import org.openhab.core.library.unit.ImperialUnits;
import org.openhab.core.library.unit.SIUnits;
Expand Down Expand Up @@ -109,6 +110,7 @@ public void assertThatConfigurationWasSet() {
assertThat(setLocale.getCountry(), is(initialConfig.get(REGION)));
assertThat(setLocale.getVariant(), is(initialConfig.get(VARIANT)));
assertThat(i18nProviderImpl.getTimeZone(), is(ZoneId.of(TIMEZONE_GMT9)));
assertThat(i18nProviderImpl.getSystemCurrency(), is(new CurrencyUnit("EUR", "€")));
}

@Test
Expand Down Expand Up @@ -171,6 +173,7 @@ public void assertThatConfigurationChangeWorks() {
assertThat(setLocale.getScript(), is(SCRIPT_RU));
assertThat(setLocale.getCountry(), is(REGION_RU));
assertThat(setLocale.getVariant(), is(VARIANT_RU));
assertThat(i18nProviderImpl.getSystemCurrency(), is(new CurrencyUnit("RUB", "RUB")));
}

@ParameterizedTest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public void testSimpleConversion() {
QuantityType<Currency> convertedAmount = amount.toUnit("€");

assertThat(convertedAmount, is(notNullValue()));
assertThat(convertedAmount.getUnit().getSymbol(), is("€"));
assertThat(convertedAmount.getUnit(), is(TestCurrencyProvider.EUR));
assertThat(convertedAmount.doubleValue(), closeTo(1, 1e-4));
}

Expand All @@ -58,7 +58,7 @@ public void testInverseConversion() {
QuantityType<Currency> convertedAmount = amount.toUnit("DKK");

assertThat(convertedAmount, is(notNullValue()));
assertThat(convertedAmount.getUnit().getSymbol(), is("DKK"));
assertThat(convertedAmount.getUnit(), is(TestCurrencyProvider.DKK));
assertThat(convertedAmount.doubleValue(), closeTo(7.45, 1e-4));
}

Expand All @@ -68,7 +68,7 @@ public void testComplexConversion() {
QuantityType<Currency> convertedAmount = amount.toUnit("$");

assertThat(convertedAmount, is(notNullValue()));
assertThat(convertedAmount.getUnit().getSymbol(), is("$"));
assertThat(convertedAmount.getUnit(), is(TestCurrencyProvider.USD));
assertThat(convertedAmount.doubleValue(), closeTo(1.8845, 1e-4));
}

Expand All @@ -79,21 +79,21 @@ public void testPriceCalculation() {
QuantityType<?> price = amount.multiply(unitPrice);

assertThat(price, is(notNullValue()));
assertThat(price.getUnit(), is(TestCurrencyProvider.EURO));
assertThat(price.getUnit(), is(TestCurrencyProvider.EUR));
assertThat(price.doubleValue(), closeTo(1.25, 1E-4));
}

private static class TestCurrencyProvider implements CurrencyProvider {
public static final Unit<Currency> EURO = new CurrencyUnit("", "Euro");
public static final Unit<Currency> DKK = new CurrencyUnit("DKK", "Danske Kroner");
public static final Unit<Currency> USD = new CurrencyUnit("$", "US Dollar");
public static final Unit<Currency> EUR = new CurrencyUnit("EUR", "");
public static final Unit<Currency> DKK = new CurrencyUnit("DKK", null);
public static final Unit<Currency> USD = new CurrencyUnit("USD", "$");

private static final Map<Unit<Currency>, BigDecimal> FACTORS = Map.of(DKK, new BigDecimal("7.45"), USD,
new BigDecimal("1.08"));

@Override
public Unit<Currency> getSystemCurrency() {
return EURO;
return EUR;
}

@Override
Expand Down

0 comments on commit bef2173

Please sign in to comment.