Home | History | Annotate | Download | only in impl
      1 //  2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html#License
      3 /*
      4  *******************************************************************************
      5  * Copyright (C) 2009-2016, International Business Machines Corporation and
      6  * others. All Rights Reserved.
      7  *******************************************************************************
      8  */
      9 package com.ibm.icu.impl;
     10 
     11 import java.util.Collections;
     12 import java.util.Map;
     13 
     14 import com.ibm.icu.text.CurrencyDisplayNames;
     15 import com.ibm.icu.text.DecimalFormatSymbols;
     16 import com.ibm.icu.util.ULocale;
     17 
     18 public class CurrencyData {
     19     public static final CurrencyDisplayInfoProvider provider;
     20 
     21     private CurrencyData() {}
     22 
     23     public static interface CurrencyDisplayInfoProvider {
     24         CurrencyDisplayInfo getInstance(ULocale locale, boolean withFallback);
     25         boolean hasData();
     26     }
     27 
     28     public static abstract class CurrencyDisplayInfo extends CurrencyDisplayNames {
     29         public abstract Map<String, String> getUnitPatterns();
     30         public abstract CurrencyFormatInfo getFormatInfo(String isoCode);
     31         public abstract CurrencySpacingInfo getSpacingInfo();
     32     }
     33 
     34     public static final class CurrencyFormatInfo {
     35         public final String currencyPattern;
     36         public final String monetarySeparator;
     37         public final String monetaryGroupingSeparator;
     38 
     39         public CurrencyFormatInfo(String currencyPattern, String monetarySeparator,
     40                 String monetaryGroupingSeparator) {
     41             this.currencyPattern = currencyPattern;
     42             this.monetarySeparator = monetarySeparator;
     43             this.monetaryGroupingSeparator = monetaryGroupingSeparator;
     44         }
     45     }
     46 
     47     public static final class CurrencySpacingInfo {
     48         private final String[][] symbols = new String[SpacingType.COUNT.ordinal()][SpacingPattern.COUNT.ordinal()];
     49 
     50         public static enum SpacingType { BEFORE, AFTER, COUNT };
     51         public static enum SpacingPattern {
     52             CURRENCY_MATCH(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH),
     53             SURROUNDING_MATCH(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH),
     54             INSERT_BETWEEN(DecimalFormatSymbols.CURRENCY_SPC_INSERT),
     55             COUNT;
     56 
     57             SpacingPattern() {}
     58             SpacingPattern(int value) { assert value == ordinal(); }
     59         };
     60 
     61         public CurrencySpacingInfo() {}
     62 
     63         public CurrencySpacingInfo(String... strings) {
     64             assert strings.length == 6;
     65 
     66             int k = 0;
     67             for (int i=0; i<SpacingType.COUNT.ordinal(); i++) {
     68                 for (int j=0; j<SpacingPattern.COUNT.ordinal(); j++) {
     69                     symbols[i][j] = strings[k];
     70                     k++;
     71                 }
     72             }
     73         }
     74 
     75         public void setSymbolIfNull(SpacingType type, SpacingPattern pattern, String value) {
     76             int i = type.ordinal();
     77             int j = pattern.ordinal();
     78             if (symbols[i][j] == null) {
     79                 symbols[i][j] = value;
     80             }
     81         }
     82 
     83         public String[] getBeforeSymbols() {
     84             return symbols[SpacingType.BEFORE.ordinal()];
     85         }
     86 
     87         public String[] getAfterSymbols() {
     88             return symbols[SpacingType.AFTER.ordinal()];
     89         }
     90 
     91         private static final String DEFAULT_CUR_MATCH = "[:letter:]";
     92         private static final String DEFAULT_CTX_MATCH = "[:digit:]";
     93         private static final String DEFAULT_INSERT = " ";
     94 
     95         public static final CurrencySpacingInfo DEFAULT = new CurrencySpacingInfo(
     96                 DEFAULT_CUR_MATCH, DEFAULT_CTX_MATCH, DEFAULT_INSERT,
     97                 DEFAULT_CUR_MATCH, DEFAULT_CTX_MATCH, DEFAULT_INSERT);
     98     }
     99 
    100     static {
    101         CurrencyDisplayInfoProvider temp = null;
    102         try {
    103             Class<?> clzz = Class.forName("com.ibm.icu.impl.ICUCurrencyDisplayInfoProvider");
    104             temp = (CurrencyDisplayInfoProvider) clzz.newInstance();
    105         } catch (Throwable t) {
    106             temp = new CurrencyDisplayInfoProvider() {
    107                 @Override
    108                 public CurrencyDisplayInfo getInstance(ULocale locale, boolean withFallback) {
    109                     return DefaultInfo.getWithFallback(withFallback);
    110                 }
    111 
    112                 @Override
    113                 public boolean hasData() {
    114                     return false;
    115                 }
    116             };
    117         }
    118         provider = temp;
    119     }
    120 
    121     public static class DefaultInfo extends CurrencyDisplayInfo {
    122         private final boolean fallback;
    123 
    124         private DefaultInfo(boolean fallback) {
    125             this.fallback = fallback;
    126         }
    127 
    128         public static final CurrencyDisplayInfo getWithFallback(boolean fallback) {
    129             return fallback ? FALLBACK_INSTANCE : NO_FALLBACK_INSTANCE;
    130         }
    131 
    132         @Override
    133         public String getName(String isoCode) {
    134             return fallback ? isoCode : null;
    135         }
    136 
    137         @Override
    138         public String getPluralName(String isoCode, String pluralType) {
    139             return fallback ? isoCode : null;
    140         }
    141 
    142         @Override
    143         public String getSymbol(String isoCode) {
    144             return fallback ? isoCode : null;
    145         }
    146 
    147         @Override
    148         public Map<String, String> symbolMap() {
    149             return Collections.emptyMap();
    150         }
    151 
    152         @Override
    153         public Map<String, String> nameMap() {
    154             return Collections.emptyMap();
    155         }
    156 
    157         @Override
    158         public ULocale getULocale() {
    159             return ULocale.ROOT;
    160         }
    161 
    162         @Override
    163         public Map<String, String> getUnitPatterns() {
    164             if (fallback) {
    165                 return Collections.emptyMap();
    166             }
    167             return null;
    168         }
    169 
    170         @Override
    171         public CurrencyFormatInfo getFormatInfo(String isoCode) {
    172             return null;
    173         }
    174 
    175         @Override
    176         public CurrencySpacingInfo getSpacingInfo() {
    177             return fallback ? CurrencySpacingInfo.DEFAULT : null;
    178         }
    179 
    180         private static final CurrencyDisplayInfo FALLBACK_INSTANCE = new DefaultInfo(true);
    181         private static final CurrencyDisplayInfo NO_FALLBACK_INSTANCE = new DefaultInfo(false);
    182     }
    183 }
    184