/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.i18n.client; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.i18n.client.impl.CurrencyDataImpl; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; /** * Generated class containing all the CurrencyImpl instances. This is just * the fallback in case the I18N module is not included. */ public class CurrencyList implements Iterable<CurrencyData> { /** * Inner class to avoid CurrencyList.clinit calls and allow this to be * completely removed from the generated code if instance isn't referenced * (such as when all you call is CurrencyList.get().getDefault() ). */ private static class CurrencyListInstance { private static CurrencyList instance = GWT.create(CurrencyList.class); } /** * Return the singleton instance of CurrencyList. */ public static CurrencyList get() { return CurrencyListInstance.instance; } /** * Add all entries in {@code override} to the original map, replacing * any existing entries. This is used by subclasses that need to slightly * alter the data used by the parent locale. */ protected static final native JavaScriptObject overrideMap( JavaScriptObject original, JavaScriptObject override) /*-{ for (var key in override) { if (override.hasOwnProperty(key)) { original[key] = override[key]; } } return original; }-*/; /** * Add currency codes contained in the map to an ArrayList. */ private static native void loadCurrencyValuesNative(JavaScriptObject map, ArrayList<CurrencyData> collection) /*-{ for (var key in map) { if (map.hasOwnProperty(key)) { collection.@java.util.ArrayList::add(Ljava/lang/Object;)(map[key]); } } }-*/; /** * Directly reference an entry in the currency names map JSO. * * @param code ISO4217 currency code * @return currency name, or the currency code if not known */ private static native String lookupNameNative(JavaScriptObject namesMap, String code) /*-{ return namesMap[code] || code; }-*/; /** * Directly reference an entry in the currency map JSO. * * @param code ISO4217 currency code * @return currency data */ private static native CurrencyData lookupNative(JavaScriptObject dataMap, String code) /*-{ return dataMap[code]; }-*/; /** * Map of currency codes to CurrencyData. */ protected HashMap<String, CurrencyData> dataMapJava; /** * JS map of currency codes to CurrencyData objects. Each currency code is * assumed to be a valid JS object key. */ protected JavaScriptObject dataMapNative; /** * Map of currency codes to localized currency names. This is kept separate * from {@link #dataMapJava} above so that the names can be completely removed by * the compiler if they are not used. */ protected HashMap<String, String> namesMapJava; /** * JS map of currency codes to localized currency names. This is kept separate * from {@link #dataMapNative} above so that the names can be completely * removed by the compiler if they are not used. Each currency code is assumed * to be a valid JS object key. */ protected JavaScriptObject namesMapNative; /** * Return the default currency data for this locale. * * Generated implementations override this method. */ public CurrencyData getDefault() { if (GWT.isScript()) { return getDefaultNative(); } else { return getDefaultJava(); } } /** * Returns an iterator for the list of currencies. * * Deprecated currencies will not be included. */ @Override public final Iterator<CurrencyData> iterator() { return iterator(false); } /** * Returns an iterator for the list of currencies, optionally including * deprecated ones. * * @param includeDeprecated true if deprecated currencies should be included */ public final Iterator<CurrencyData> iterator(boolean includeDeprecated) { ensureCurrencyMap(); ArrayList<CurrencyData> collection = new ArrayList<CurrencyData>(); if (GWT.isScript()) { loadCurrencyValuesNative(dataMapNative, collection); } else { for (CurrencyData item : dataMapJava.values()) { collection.add(item); } } if (!includeDeprecated) { ArrayList<CurrencyData> newCollection = new ArrayList<CurrencyData>(); for (CurrencyData value : collection) { if (!value.isDeprecated()) { newCollection.add(value); } } collection = newCollection; } return Collections.unmodifiableList(collection).iterator(); } /** * Lookup a currency based on the ISO4217 currency code. * * @param currencyCode ISO4217 currency code * @return currency data, or null if code not found */ public final CurrencyData lookup(String currencyCode) { ensureCurrencyMap(); if (GWT.isScript()) { return lookupNative(dataMapNative, currencyCode); } else { return dataMapJava.get(currencyCode); } } /** * Lookup a currency name based on the ISO4217 currency code. * * @param currencyCode ISO4217 currency code * @return name of the currency, or null if code not found */ public final String lookupName(String currencyCode) { ensureNamesMap(); if (GWT.isScript()) { return lookupNameNative(namesMapNative, currencyCode); } else { String result = namesMapJava.get(currencyCode); return (result == null) ? currencyCode : result; } } /** * Return the default currency data for this locale. * * Generated implementations override this method. */ protected CurrencyData getDefaultJava() { return new CurrencyDataImpl("USD", "$", 2, "US$", "$"); } /** * Return the default currency data for this locale. * * Generated implementations override this method. */ protected native CurrencyData getDefaultNative() /*-{ return [ "USD", "$", 2, "US$" ]; }-*/; /** * Loads the currency map. * * Generated implementations override this method. */ protected HashMap<String, CurrencyData> loadCurrencyMapJava() { HashMap<String, CurrencyData> result = new HashMap<String, CurrencyData>(); result.put("USD", new CurrencyDataImpl("USD", "$", 2, "US$", "$")); result.put("EUR", new CurrencyDataImpl("EUR", "€", 2, "€", "€")); result.put("GBP", new CurrencyDataImpl("GBP", "UK£", 2, "UK£", "£")); result.put("JPY", new CurrencyDataImpl("JPY", "¥", 0, "JP¥", "¥")); return result; } /** * Loads the currency map from a JS object literal. * * Generated implementations override this method. */ protected native JavaScriptObject loadCurrencyMapNative() /*-{ return { "USD": [ "USD", "$", 2 ], "EUR": [ "EUR", "€", 2 ], "GBP": [ "GBP", "UK£", 2 ], "JPY": [ "JPY", "¥", 0 ], }; }-*/; /** * Loads the currency names map. * * Generated implementations override this method. */ protected HashMap<String, String> loadNamesMapJava() { HashMap<String, String> result = new HashMap<String, String>(); result.put("USD", "US Dollar"); result.put("EUR", "Euro"); result.put("GBP", "British Pound Sterling"); result.put("JPY", "Japanese Yen"); return result; } /** * Loads the currency names map from a JS object literal. * * Generated implementations override this method. */ protected native JavaScriptObject loadNamesMapNative() /*-{ return { "USD": "US Dollar", "EUR": "Euro", "GBP": "British Pound Sterling", "JPY": "Japanese Yen", }; }-*/; /** * Ensure that the map of currency data has been initialized. */ private void ensureCurrencyMap() { if (GWT.isScript()) { if (dataMapNative == null) { dataMapNative = loadCurrencyMapNative(); } } else { if (dataMapJava == null) { dataMapJava = loadCurrencyMapJava(); } } } /** * Ensure that the map of currency data has been initialized. */ private void ensureNamesMap() { if (GWT.isScript()) { if (namesMapNative == null) { namesMapNative = loadNamesMapNative(); } } else { if (namesMapJava == null) { namesMapJava = loadNamesMapJava(); } } } }