| /* | |
| * 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(); | |
| } | |
| } | |
| } | |
| } |