12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
52d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * Copyright (C) 2009-2016, International Business Machines Corporation and
62d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * others. All Rights Reserved.
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.impl;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Collections;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Map;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CurrencyDisplayNames;
15e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class CurrencyData {
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final CurrencyDisplayInfoProvider provider;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    private CurrencyData() {}
222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static interface CurrencyDisplayInfoProvider {
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyDisplayInfo getInstance(ULocale locale, boolean withFallback);
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean hasData();
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static abstract class CurrencyDisplayInfo extends CurrencyDisplayNames {
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public abstract Map<String, String> getUnitPatterns();
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public abstract CurrencyFormatInfo getFormatInfo(String isoCode);
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public abstract CurrencySpacingInfo getSpacingInfo();
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final class CurrencyFormatInfo {
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final String currencyPattern;
362d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public final String monetarySeparator;
372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public final String monetaryGroupingSeparator;
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public CurrencyFormatInfo(String currencyPattern, String monetarySeparator,
402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                String monetaryGroupingSeparator) {
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.currencyPattern = currencyPattern;
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.monetarySeparator = monetarySeparator;
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.monetaryGroupingSeparator = monetaryGroupingSeparator;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final class CurrencySpacingInfo {
482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        private final String[][] symbols = new String[SpacingType.COUNT.ordinal()][SpacingPattern.COUNT.ordinal()];
492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public static enum SpacingType { BEFORE, AFTER, COUNT };
51e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert        public static enum SpacingPattern {
52e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert            CURRENCY_MATCH(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH),
53e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert            SURROUNDING_MATCH(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH),
54e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert            INSERT_BETWEEN(DecimalFormatSymbols.CURRENCY_SPC_INSERT),
55e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert            COUNT;
56e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert
57e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert            SpacingPattern() {}
58e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert            SpacingPattern(int value) { assert value == ordinal(); }
59e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert        };
602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public CurrencySpacingInfo() {}
622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public CurrencySpacingInfo(String... strings) {
642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            assert strings.length == 6;
652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            int k = 0;
672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            for (int i=0; i<SpacingType.COUNT.ordinal(); i++) {
682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                for (int j=0; j<SpacingPattern.COUNT.ordinal(); j++) {
692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    symbols[i][j] = strings[k];
702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    k++;
712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                }
722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            }
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public void setSymbolIfNull(SpacingType type, SpacingPattern pattern, String value) {
762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            int i = type.ordinal();
772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            int j = pattern.ordinal();
782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            if (symbols[i][j] == null) {
792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                symbols[i][j] = value;
802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            }
812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public String[] getBeforeSymbols() {
842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            return symbols[SpacingType.BEFORE.ordinal()];
852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        public String[] getAfterSymbols() {
882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            return symbols[SpacingType.AFTER.ordinal()];
892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private static final String DEFAULT_CUR_MATCH = "[:letter:]";
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private static final String DEFAULT_CTX_MATCH = "[:digit:]";
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private static final String DEFAULT_INSERT = " ";
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public static final CurrencySpacingInfo DEFAULT = new CurrencySpacingInfo(
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                DEFAULT_CUR_MATCH, DEFAULT_CTX_MATCH, DEFAULT_INSERT,
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                DEFAULT_CUR_MATCH, DEFAULT_CTX_MATCH, DEFAULT_INSERT);
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static {
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CurrencyDisplayInfoProvider temp = null;
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Class<?> clzz = Class.forName("com.ibm.icu.impl.ICUCurrencyDisplayInfoProvider");
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            temp = (CurrencyDisplayInfoProvider) clzz.newInstance();
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Throwable t) {
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            temp = new CurrencyDisplayInfoProvider() {
1072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                @Override
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                public CurrencyDisplayInfo getInstance(ULocale locale, boolean withFallback) {
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return DefaultInfo.getWithFallback(withFallback);
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                @Override
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                public boolean hasData() {
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return false;
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            };
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        provider = temp;
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static class DefaultInfo extends CurrencyDisplayInfo {
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private final boolean fallback;
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private DefaultInfo(boolean fallback) {
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.fallback = fallback;
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public static final CurrencyDisplayInfo getWithFallback(boolean fallback) {
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return fallback ? FALLBACK_INSTANCE : NO_FALLBACK_INSTANCE;
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public String getName(String isoCode) {
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return fallback ? isoCode : null;
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public String getPluralName(String isoCode, String pluralType) {
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return fallback ? isoCode : null;
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public String getSymbol(String isoCode) {
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return fallback ? isoCode : null;
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public Map<String, String> symbolMap() {
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return Collections.emptyMap();
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public Map<String, String> nameMap() {
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return Collections.emptyMap();
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public ULocale getULocale() {
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return ULocale.ROOT;
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public Map<String, String> getUnitPatterns() {
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (fallback) {
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return Collections.emptyMap();
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return null;
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public CurrencyFormatInfo getFormatInfo(String isoCode) {
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return null;
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        @Override
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public CurrencySpacingInfo getSpacingInfo() {
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return fallback ? CurrencySpacingInfo.DEFAULT : null;
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private static final CurrencyDisplayInfo FALLBACK_INSTANCE = new DefaultInfo(true);
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private static final CurrencyDisplayInfo NO_FALLBACK_INSTANCE = new DefaultInfo(false);
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
184