Rollback 5174 until I can figure out why it fails in ant but not from Eclipse.



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5182 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/i18n/client/impl/CurrencyList.java b/user/src/com/google/gwt/i18n/client/impl/CurrencyList.java
index 9be96b7..25af062 100644
--- a/user/src/com/google/gwt/i18n/client/impl/CurrencyList.java
+++ b/user/src/com/google/gwt/i18n/client/impl/CurrencyList.java
@@ -133,7 +133,7 @@
       loadNamesMap();
     }
   }
-  
+
   /**
    * Directly reference an entry in the currency map JSO.
    * 
@@ -141,14 +141,14 @@
    * @return currency data
    */
   protected final native CurrencyData getEntry(String code) /*-{
-    return this.@com.google.gwt.i18n.client.impl.CurrencyList::dataMap[code];
+    return this.@com.google.gwt.i18n.client.impl.CurrencyList::dataMap[':' + code];
   }-*/;
 
   /**
    * 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
+   * @return currency name
    */
   protected final native String getNamesEntry(String code) /*-{
     return this.@com.google.gwt.i18n.client.impl.CurrencyList::namesMap[code] || code;
@@ -161,10 +161,10 @@
    */
   protected native void loadCurrencyMap() /*-{
     this.@com.google.gwt.i18n.client.impl.CurrencyList::dataMap = {
-        "USD": [ "USD", "$", 2 ],
-        "EUR": [ "EUR", "€", 2 ],
-        "GBP": [ "GBP", "UK£", 2 ],
-        "JPY": [ "JPY", "¥", 0 ],
+        ":USD": [ "USD", "$", 2 ],
+        ":EUR": [ "EUR", "€", 2 ],
+        ":GBP": [ "GBP", "UK£", 2 ],
+        ":JPY": [ "JPY", "¥", 0 ],
      };
   }-*/;
 
@@ -183,45 +183,13 @@
   }-*/;
 
   /**
-   * Add all entries in {@code override} to the currency data map, replacing
-   * any existing entries.  This is used by subclasses that need to slightly
-   * alter the data used by the parent locale.
-   * 
-   * @param override JS object with currency code -> CurrencyData pairs
-   */
-  protected final native void overrideCurrencyMap(JavaScriptObject override) /*-{
-    var map = this.@com.google.gwt.i18n.client.impl.CurrencyList::dataMap;
-    for (var key in override) {
-      if (override.hasOwnProperty(key)) {
-        map[key] = override[key];
-      }
-    }
-  }-*/;
-
-  /**
-   * Add all entries in {@code override} to the currency name map, replacing
-   * any existing entries.  This is used by subclasses that need to slightly
-   * alter the data used by the parent locale.
-   * 
-   * @param override JS object with currency code -> name pairs
-   */
-  protected final native void overrideNamesMap(JavaScriptObject override) /*-{
-    var map = this.@com.google.gwt.i18n.client.impl.CurrencyList::namesMap;
-    for (var key in override) {
-      if (override.hasOwnProperty(key)) {
-        map[key] = override[key];
-      }
-    }
-  }-*/;
-
-  /**
    * Add currency codes contained in the map to an ArrayList.
    */
   private native void loadCurrencyKeys(ArrayList<String> keys) /*-{
     var map = this.@com.google.gwt.i18n.client.impl.CurrencyList::dataMap;
     for (var key in map) {
-      if (map.hasOwnProperty(key)) {
-        keys.@java.util.ArrayList::add(Ljava/lang/Object;)(key);
+      if (key.charCodeAt(0) == 58) {
+        keys.@java.util.ArrayList::add(Ljava/lang/Object;)(key.substring(1));
       }
     }
   }-*/;
diff --git a/user/src/com/google/gwt/i18n/rebind/CurrencyListGenerator.java b/user/src/com/google/gwt/i18n/rebind/CurrencyListGenerator.java
index 3b61416..64fc211 100644
--- a/user/src/com/google/gwt/i18n/rebind/CurrencyListGenerator.java
+++ b/user/src/com/google/gwt/i18n/rebind/CurrencyListGenerator.java
@@ -36,7 +36,6 @@
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -44,7 +43,6 @@
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.Map.Entry;
-import java.util.regex.Pattern;
 
 /**
  * Generator used to generate a localized version of CurrencyList, which
@@ -53,161 +51,10 @@
  */
 public class CurrencyListGenerator extends Generator {
 
-  /**
-   * Immutable collection of data about a currency in a locale, built from the
-   * CurrencyData and CurrencyExtra properties files.
-   */
-  private static class CurrencyInfo {
-
-    private static final Pattern SPLIT_VERTICALBAR = Pattern.compile("\\|");
-
-    private final String code;
-
-    private final String displayName;
-
-    private final int flags;
-
-    private final boolean obsolete;
-
-    private final String portableSymbol;
-
-    private final String symbol;
-
-    /**
-     * Create an instance.
-     * 
-     * currencyData format:
-     * 
-     * <pre>
-     *       display name|symbol|decimal digits|not-used-flag
-     * </pre>
-     * 
-     * <ul>
-     * <li>If a symbol is not supplied, the currency code will be used
-     * <li>If # of decimal digits is omitted, 2 is used
-     * <li>If a currency is not generally used, not-used-flag=1
-     * <li>Trailing empty fields can be omitted
-     * <li>If null, use currencyCode as the display name
-     * </ul>
-     * 
-     * extraData format:
-     * 
-     * <pre>
-     *       portable symbol|flags|currency symbol override
-     *     flags are space separated list of:
-     *       At most one of the following:
-     *         SymPrefix     The currency symbol goes before the number,
-     *                       regardless of the normal position for this locale.
-     *         SymSuffix     The currency symbol goes after the number,
-     *                       regardless of the normal position for this locale.
-     *
-     *       At most one of the following:
-     *         ForceSpace    Always add a space between the currency symbol
-     *                       and the number.
-     *         ForceNoSpace  Never add a space between the currency symbol
-     *                       and the number.
-     * </pre>
-     * 
-     * @param currencyCode ISO4217 currency code
-     * @param currencyData entry from a CurrencyData properties file
-     * @param extraData entry from a CurrencyExtra properties file
-     * @throws NumberFormatException
-     */
-    public CurrencyInfo(String currencyCode, String currencyData,
-        String extraData) throws NumberFormatException {
-      code = currencyCode;
-      if (currencyData == null) {
-        currencyData = currencyCode;
-      }
-      String[] currencySplit = SPLIT_VERTICALBAR.split(currencyData);
-      String currencyDisplay = currencySplit[0];
-      String currencySymbol = null;
-      if (currencySplit.length > 1 && currencySplit[1].length() > 0) {
-        currencySymbol = currencySplit[1];
-      }
-      int currencyFractionDigits = 2;
-      if (currencySplit.length > 2 && currencySplit[2].length() > 0) {
-        currencyFractionDigits = Integer.valueOf(currencySplit[2]);
-      }
-      boolean currencyObsolete = false;
-      if (currencySplit.length > 3 && currencySplit[3].length() > 0) {
-        currencyObsolete = Integer.valueOf(currencySplit[3]) != 0;
-      }
-      int currencyFlags = currencyFractionDigits;
-      String currencyPortableSymbol = "";
-      if (extraData != null) {
-        // CurrencyExtra contains up to 3 fields separated by |
-        // 0 - portable currency symbol
-        // 1 - space-separated flags regarding currency symbol
-        // positioning/spacing
-        // 2 - override of CLDR-derived currency symbol
-        String[] extraSplit = SPLIT_VERTICALBAR.split(extraData);
-        currencyPortableSymbol = extraSplit[0];
-        if (extraSplit.length > 1) {
-          if (extraSplit[1].contains("SymPrefix")) {
-            currencyFlags |= CurrencyData.POS_FIXED_FLAG;
-          } else if (extraSplit[1].contains("SymSuffix")) {
-            currencyFlags |= CurrencyData.POS_FIXED_FLAG
-                | CurrencyData.POS_SUFFIX_FLAG;
-          }
-          if (extraSplit[1].contains("ForceSpace")) {
-            currencyFlags |= CurrencyData.SPACING_FIXED_FLAG
-                | CurrencyData.SPACE_FORCED_FLAG;
-          } else if (extraSplit[1].contains("ForceNoSpace")) {
-            currencyFlags |= CurrencyData.SPACING_FIXED_FLAG;
-          }
-        }
-        // If a non-empty override is supplied, use it for the currency
-        // symbol.
-        if (extraSplit.length > 2 && extraSplit[2].length() > 0) {
-          currencySymbol = extraSplit[2];
-        }
-        // If we don't have a currency symbol yet, use the portable symbol if
-        // supplied.
-        if (currencySymbol == null && currencyPortableSymbol.length() > 0) {
-          currencySymbol = currencyPortableSymbol;
-        }
-      }
-      // If all else fails, use the currency code as the symbol.
-      if (currencySymbol == null) {
-        currencySymbol = currencyCode;
-      }
-      displayName = currencyDisplay;
-      symbol = currencySymbol;
-      flags = currencyFlags;
-      portableSymbol = currencyPortableSymbol;
-      obsolete = currencyObsolete;
-    }
-
-    public String getDisplayName() {
-      return displayName;
-    }
-
-    public int getFlags() {
-      return flags;
-    }
-
-    public String getJson() {
-      StringBuilder buf = new StringBuilder();
-      buf.append("[ \"").append(quote(code)).append("\", \"");
-      buf.append(quote(symbol)).append("\", ").append(flags);
-      if (portableSymbol.length() > 0) {
-        buf.append(", \"").append(quote(portableSymbol)).append('\"');
-      }
-      return buf.append(']').toString();
-    }
-
-    public String getSymbol() {
-      return symbol;
-    }
-
-    public boolean isObsolete() {
-      return obsolete;
-    }
-  }
-
   private static final String CURRENCY_DATA = CurrencyData.class.getCanonicalName();
 
+  private static final String CURRENCY_LIST = CurrencyList.class.getCanonicalName();
+
   /**
    * Prefix for properties files containing CLDR-derived currency data for each
    * locale.
@@ -220,8 +67,6 @@
    */
   private static final String CURRENCY_EXTRA_PREFIX = "com/google/gwt/i18n/client/constants/CurrencyExtra";
 
-  private static final String CURRENCY_LIST = CurrencyList.class.getCanonicalName();
-
   /**
    * Prefix for properties files containing number formatting constants for each
    * locale. We use this only to get the default currency for our current
@@ -230,16 +75,6 @@
   private static final String NUMBER_CONSTANTS_PREFIX = "com/google/gwt/i18n/client/constants/NumberConstantsImpl";
 
   /**
-   * Backslash-escape any double quotes in the supplied string.
-   * 
-   * @param str string to quote
-   * @return string with double quotes backslash-escaped.
-   */
-  private static String quote(String str) {
-    return str.replace("\"", "\\\"");
-  }
-
-  /**
    * Generate an implementation for the given type.
    * 
    * @param logger error logger
@@ -267,147 +102,179 @@
       throw new UnableToCompleteException();
     }
     if (runtimeLocales.isEmpty()) {
-      return generateLocaleTree(logger, context, targetClass, locale);
+      return generateOne(logger, context, targetClass, locale);
     }
     CachedGeneratorContext cachedContext = new CachedGeneratorContext(context);
     return generateRuntimeSelection(logger, cachedContext, targetClass, locale,
         runtimeLocales);
   }
-
-  /**
-   * Generate an implementation class for the requested locale, including all
-   * parent classes along the inheritance chain. The data will be kept at the
-   * location in the inheritance chain where it was defined in properties files.
-   * 
-   * @param logger
-   * @param context
-   * @param targetClass
-   * @param locale
-   * @return generated class name for the requested locale
-   */
-  private String generateLocaleTree(TreeLogger logger,
-      GeneratorContext context, JClassType targetClass, GwtLocale locale) {
-    String superClassName = CURRENCY_LIST;
-    List<GwtLocale> searchList = locale.getCompleteSearchList();
-
-    /**
-     * Map of currency code -> CurrencyInfo for that code.
-     */
-    Map<String, CurrencyInfo> allCurrencyData = new HashMap<String, CurrencyInfo>();
-
-    LocalizedProperties currencyExtra = null;
-    /*
-     * The searchList is guaranteed to be ordered such that subclasses always
-     * precede superclasses. Therefore, we iterate backwards to ensure that
-     * superclasses are always generated first.
-     */
-    String lastDefaultCurrencyCode = null;
-    for (int i = searchList.size(); i-- > 0;) {
-      GwtLocale search = searchList.get(i);
-      LocalizedProperties newExtra = getProperties(CURRENCY_EXTRA_PREFIX,
-          search);
-      if (newExtra != null) {
-        currencyExtra = newExtra;
-      }
-      Map<String, String> currencyData = getCurrencyData(search);
-      Set<String> keySet = currencyData.keySet();
-      String[] currencies = new String[keySet.size()];
-      keySet.toArray(currencies);
-      Arrays.sort(currencies);
-
-      // Go ahead and populate the data map.
-      for (String currencyCode : currencies) {
-        String extraData = currencyExtra == null ? null
-            : currencyExtra.getProperty(currencyCode);
-        allCurrencyData.put(currencyCode, new CurrencyInfo(currencyCode,
-            currencyData.get(currencyCode), extraData));
-      }
-
-      String defCurrencyCode = getDefaultCurrency(search);
-      // If this locale specifies a particular locale, or the one that is
-      // inherited has been changed in this locale, re-specify the default
-      // currency so the method will be generated.
-      if (defCurrencyCode == null && keySet.contains(lastDefaultCurrencyCode)) {
-        defCurrencyCode = lastDefaultCurrencyCode;
-      }
-      if (!currencyData.isEmpty() || defCurrencyCode != null) {
-        String newClass = generateOneLocale(logger, context, targetClass,
-            search, superClassName, currencies, allCurrencyData,
-            defCurrencyCode);
-        superClassName = newClass;
-        lastDefaultCurrencyCode = defCurrencyCode;
-      }
-    }
-    return superClassName;
-  }
-
-  /**
-   * Generate the implementation for a single locale, overriding from its parent
-   * only data that has changed in this locale.
-   * 
-   * @param logger
-   * @param context
-   * @param targetClass
-   * @param locale
-   * @param superClassName
-   * @param currencies the set of currencies defined in this locale
-   * @param allCurrencyData map of currency code -> unparsed CurrencyInfo for
-   *          that code
-   * @param defCurrencyCode default currency code for this locale
-   * @return fully-qualified class name generated
-   */
-  private String generateOneLocale(TreeLogger logger, GeneratorContext context,
-      JClassType targetClass, GwtLocale locale, String superClassName,
-      String[] currencies, Map<String, CurrencyInfo> allCurrencyData,
-      String defCurrencyCode) {
-
+  
+  private String generateOne(TreeLogger logger, GeneratorContext context,
+      JClassType targetClass, GwtLocale locale)
+      throws UnableToCompleteException {
     String packageName = targetClass.getPackage().getName();
     String className = targetClass.getName().replace('.', '_') + "_"
-        + locale.getCanonicalForm().getAsString();
+        + locale.getAsString();
     PrintWriter pw = context.tryCreate(logger, packageName, className);
     if (pw != null) {
       ClassSourceFileComposerFactory factory = new ClassSourceFileComposerFactory(
           packageName, className);
-      factory.setSuperclass(superClassName);
+      factory.setSuperclass(targetClass.getQualifiedSourceName());
       factory.addImport(CURRENCY_LIST);
       factory.addImport(CURRENCY_DATA);
       SourceWriter writer = factory.createSourceWriter(context, pw);
-      if (currencies.length > 0) {
-        writeCurrencyMethod(className, writer, currencies, allCurrencyData);
-        writeNamesMethod(className, writer, currencies, allCurrencyData);
+
+      // Load property files for this locale, handling inheritance properly.
+      GwtLocale[] currencyLocale = new GwtLocale[1];
+      LocalizedProperties currencyData = readProperties(logger,
+          CURRENCY_DATA_PREFIX, locale, currencyLocale);
+      GwtLocale[] extraLocale = new GwtLocale[1];
+      LocalizedProperties currencyExtra = readProperties(logger,
+          CURRENCY_EXTRA_PREFIX, locale, extraLocale);
+      GwtLocale[] numberLocale = new GwtLocale[1];
+      LocalizedProperties numberConstants = readProperties(logger,
+          NUMBER_CONSTANTS_PREFIX, locale, numberLocale);
+
+      // Get default currency code, set defaults in case it isn't found.
+      String defCurrencyCode = numberConstants.getProperty("defCurrencyCode");
+      if (defCurrencyCode == null) {
+        defCurrencyCode = "USD";
       }
-      if (defCurrencyCode != null) {
-        CurrencyInfo currencyInfo = allCurrencyData.get(defCurrencyCode);
-        if (currencyInfo == null) {
-          // Synthesize a null info if the specified default wasn't found.
-          currencyInfo = new CurrencyInfo(defCurrencyCode, null, null);
-          allCurrencyData.put(defCurrencyCode, currencyInfo);
+
+      // Sort for deterministic output.
+      Set<?> keySet = currencyData.getPropertyMap().keySet();
+      String[] currencies = new String[keySet.size()];
+      keySet.toArray(currencies);
+      Arrays.sort(currencies);
+      Map<String, String> nameMap = new HashMap<String, String>();
+
+      writer.println("@Override");
+      writer.println("protected native void loadCurrencyMap() /*-{");
+      writer.indent();
+      writer.println("this.@com.google.gwt.i18n.client.impl.CurrencyList::dataMap = {");
+      writer.indent();
+      String defCurrencyObject = "[ \"" + quote(defCurrencyCode) + "\", \""
+          + quote(defCurrencyCode) + "\", 2 ]";
+      for (String currencyCode : currencies) {
+        String currencyEntry = currencyData.getProperty(currencyCode);
+        String[] currencySplit = currencyEntry.split("\\|");
+        String currencyDisplay = currencySplit[0];
+        String currencySymbol = null;
+        if (currencySplit.length > 1 && currencySplit[1].length() > 0) {
+          currencySymbol = currencySplit[1];
         }
-        writer.println();
-        writer.println("@Override");
-        writer.println("public native CurrencyData getDefault() /*-{");
-        writer.println("  return " + currencyInfo.getJson() + ";");
-        writer.println("}-*/;");
+        int currencyFractionDigits = 2;
+        if (currencySplit.length > 2 && currencySplit[2].length() > 0) {
+          try {
+            currencyFractionDigits = Integer.valueOf(currencySplit[2]);
+          } catch (NumberFormatException e) {
+            // Ignore bad values
+            logger.log(TreeLogger.WARN, "Parse of \"" + currencySplit[2]
+                + "\" failed", e);
+          }
+        }
+        boolean currencyObsolete = false;
+        if (currencySplit.length > 3 && currencySplit[3].length() > 0) {
+          try {
+            currencyObsolete = Integer.valueOf(currencySplit[3]) != 0;
+          } catch (NumberFormatException e) {
+            // Ignore bad values
+            logger.log(TreeLogger.WARN, "Parse of \"" + currencySplit[3]
+                + "\" failed", e);
+          }
+        }
+        int currencyFlags = currencyFractionDigits;
+        String extraData = currencyExtra.getProperty(currencyCode);
+        String portableSymbol = "";
+        if (extraData != null) {
+          // CurrencyExtra contains up to 3 fields separated by |
+          // 0 - portable currency symbol
+          // 1 - space-separated flags regarding currency symbol
+          // positioning/spacing
+          // 2 - override of CLDR-derived currency symbol
+          String[] extraSplit = extraData.split("\\|");
+          portableSymbol = extraSplit[0];
+          if (extraSplit.length > 1) {
+            if (extraSplit[1].contains("SymPrefix")) {
+              currencyFlags |= CurrencyData.POS_FIXED_FLAG;
+            } else if (extraSplit[1].contains("SymSuffix")) {
+              currencyFlags |= CurrencyData.POS_FIXED_FLAG
+                  | CurrencyData.POS_SUFFIX_FLAG;
+            }
+            if (extraSplit[1].contains("ForceSpace")) {
+              currencyFlags |= CurrencyData.SPACING_FIXED_FLAG
+                  | CurrencyData.SPACE_FORCED_FLAG;
+            } else if (extraSplit[1].contains("ForceNoSpace")) {
+              currencyFlags |= CurrencyData.SPACING_FIXED_FLAG;
+            }
+          }
+          // If a non-empty override is supplied, use it for the currency
+          // symbol.
+          if (extraSplit.length > 2 && extraSplit[2].length() > 0) {
+            currencySymbol = extraSplit[2];
+          }
+          // If we don't have a currency symbol yet, use the portable symbol if
+          // supplied.
+          if (currencySymbol == null && portableSymbol.length() > 0) {
+            currencySymbol = portableSymbol;
+          }
+        }
+        // If all else fails, use the currency code as the symbol.
+        if (currencySymbol == null) {
+          currencySymbol = currencyCode;
+        }
+        String currencyObject = "[ \"" + quote(currencyCode) + "\", \""
+            + quote(currencySymbol) + "\", " + currencyFlags;
+        if (portableSymbol.length() > 0) {
+          currencyObject += ", \"" + quote(portableSymbol) + "\"";
+        }
+        currencyObject += "]";
+        if (!currencyObsolete) {
+          nameMap.put(currencyCode, currencyDisplay);
+          writer.println("// " + currencyDisplay);
+          writer.println("\":" + quote(currencyCode) + "\": " + currencyObject
+              + ",");
+        }
+        if (currencyCode.equals(defCurrencyCode)) {
+          defCurrencyObject = currencyObject;
+        }
       }
+      writer.outdent();
+      writer.println("};");
+      writer.outdent();
+      writer.println("}-*/;");
+      writer.println();
+      writer.println("@Override");
+      writer.println("protected native void loadNamesMap() /*-{");
+      writer.indent();
+      writer.println("this.@com.google.gwt.i18n.client.impl.CurrencyList::namesMap = {");
+      writer.indent();
+      for (String currencyCode : currencies) {
+        String displayName = nameMap.get(currencyCode);
+        if (displayName != null && !currencyCode.equals(displayName)) {
+          writer.println("\"" + quote(currencyCode) + "\": \""
+              + quote(displayName) + "\",");
+        }
+      }
+      writer.outdent();
+      writer.println("};");
+      writer.outdent();
+      writer.println("}-*/;");
+      writer.println();
+      writer.println("@Override");
+      writer.println("public native CurrencyData getDefault() /*-{");
+      writer.println("  return " + defCurrencyObject + ";");
+      writer.println("}-*/;");
       writer.commit(logger);
     }
     return packageName + "." + className;
   }
 
-  /**
-   * Generate a class which can select between alternate implementations at
-   * runtime based on the runtime locale.
-   * 
-   * @param logger TreeLogger instance for log messages
-   * @param context GeneratorContext for generating source files
-   * @param targetClass class to generate
-   * @param compileLocale the compile-time locale we are generating for
-   * @param locales set of all locales to generate
-   * @return fully-qualified class name that was generated
-   */
+  
   private String generateRuntimeSelection(TreeLogger logger,
       GeneratorContext context, JClassType targetClass,
-      GwtLocale compileLocale, Set<GwtLocale> locales) {
+      GwtLocale compileLocale, Set<GwtLocale> locales)
+      throws UnableToCompleteException {
     String packageName = targetClass.getPackage().getName();
     String className = targetClass.getName().replace('.', '_') + "_"
         + compileLocale.getAsString() + "_runtimeSelection";
@@ -448,7 +315,8 @@
       writer.println("  return;");
       writer.println("}");
       boolean fetchedLocale = false;
-      Map<String, Set<GwtLocale>> localeMap = new TreeMap<String, Set<GwtLocale>>();
+      Map<String, Set<GwtLocale>> localeMap = new TreeMap<String,
+          Set<GwtLocale>>();
       String compileLocaleClass = processChildLocale(logger, context,
           targetClass, localeMap, compileLocale);
       if (compileLocaleClass == null) {
@@ -478,7 +346,8 @@
             writer.println();
             writer.print("    || ");
           }
-          writer.print("\"" + locale.toString() + "\".equals(runtimeLocale)");
+          writer.print("\"" + locale.toString()
+              + "\".equals(runtimeLocale)");
         }
         writer.println(") {");
         writer.println("  instance = new " + generatedClass + "();");
@@ -493,108 +362,11 @@
     return packageName + "." + className;
   }
 
-  /**
-   * Return a map of currency data for the requested locale, or null if there is
-   * not one (not that inheritance is not handled here).
-   * 
-   * The keys are ISO4217 currency codes. The format of the map values is:
-   * 
-   * <pre>
-   * display name|symbol|decimal digits|not-used-flag
-   * </pre>
-   * 
-   * If a symbol is not supplied, the currency code will be used If # of decimal
-   * digits is omitted, 2 is used If a currency is not generally used,
-   * not-used-flag=1 Trailing empty fields can be omitted
-   * 
-   * @param locale
-   * @return currency data map
-   */
-  @SuppressWarnings("unchecked")
-  private Map<String, String> getCurrencyData(GwtLocale locale) {
-    LocalizedProperties currencyData = getProperties(CURRENCY_DATA_PREFIX,
-        locale);
-    if (currencyData == null) {
-      return Collections.emptyMap();
-    }
-    return currencyData.getPropertyMap();
-  }
-
-  /**
-   * Returns the default currency code for the requested locale.
-   * 
-   * @param locale
-   * @return ISO4217 currency code
-   */
-  private String getDefaultCurrency(GwtLocale locale) {
-    String defCurrencyCode = null;
-    LocalizedProperties numberConstants = getProperties(
-        NUMBER_CONSTANTS_PREFIX, locale);
-    if (numberConstants != null) {
-      defCurrencyCode = numberConstants.getProperty("defCurrencyCode");
-    }
-    if (defCurrencyCode == null && locale.isDefault()) {
-      defCurrencyCode = "USD";
-    }
-    return defCurrencyCode;
-  }
-
-  /**
-   * Load a properties file for a given locale. Note that locale inheritance is
-   * the responsibility of the caller.
-   * 
-   * @param prefix classpath prefix of properties file
-   * @param locale locale to load
-   * @return LocalizedProperties instance containing properties file or null if
-   *         not found.
-   */
-  private LocalizedProperties getProperties(String prefix, GwtLocale locale) {
-    String propFile = prefix;
-    if (!locale.isDefault()) {
-      propFile += "_" + locale.getAsString();
-    }
-    propFile += ".properties";
-    InputStream str = null;
-    ClassLoader classLoader = getClass().getClassLoader();
-    LocalizedProperties props = new LocalizedProperties();
-    try {
-      str = classLoader.getResourceAsStream(propFile);
-      if (str != null) {
-        props.load(str, "UTF-8");
-        return props;
-      }
-    } catch (UnsupportedEncodingException e) {
-      // UTF-8 should always be defined
-      return null;
-    } catch (IOException e) {
-      return null;
-    } finally {
-      if (str != null) {
-        try {
-          str.close();
-        } catch (IOException e) {
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Generate an implementation for a runtime locale, to be referenced from the
-   * generated runtime selection code.
-   * 
-   * @param logger
-   * @param context
-   * @param targetClass
-   * @param localeMap
-   * @param locale
-   * @return class name of the generated class, or null if failed
-   */
-  private String processChildLocale(TreeLogger logger,
-      GeneratorContext context, JClassType targetClass,
-      Map<String, Set<GwtLocale>> localeMap, GwtLocale locale) {
-    String generatedClass = generateLocaleTree(logger, context, targetClass,
-        locale);
+  private String processChildLocale(TreeLogger logger, GeneratorContext context,
+      JClassType targetClass, Map<String, Set<GwtLocale>> localeMap,
+      GwtLocale locale) throws UnableToCompleteException {
+    String generatedClass = generateOne(logger, context,
+        targetClass, locale);
     if (generatedClass == null) {
       logger.log(TreeLogger.ERROR, "Failed to generate "
           + targetClass.getQualifiedSourceName() + " in locale "
@@ -612,105 +384,84 @@
   }
 
   /**
-   * Writes a loadCurrencyMap method for the current locale, based on its
-   * currency data and its superclass (if any). As currencies are included in
-   * this method, their names are added to {@code nameMap} for later use.
+   * Backslash-escape any double quotes in the supplied string.
    * 
-   * If no new currency data is added for this locale over its superclass, the
-   * method is omitted entirely.
-   * 
-   * @param allCurrencyData map of currency codes to currency data for the
-   *          current locale, including all inherited currencies data
-   * @param className name of the class we are generating
-   * @param writer SourceWriter instance to use for writing the class
-   * @param currencies array of valid currency names in the order they should be
-   *          listed
+   * @param str string to quote
+   * @return string with double quotes backslash-escaped.
    */
-  private void writeCurrencyMethod(String className, SourceWriter writer,
-      String[] currencies, Map<String, CurrencyInfo> allCurrencyData) {
-    boolean needHeader = true;
-    for (String currencyCode : currencies) {
-      CurrencyInfo currencyInfo = allCurrencyData.get(currencyCode);
-      if (currencyInfo.isObsolete()) {
-        continue;
-      }
-      if (needHeader) {
-        needHeader = false;
-        writer.println();
-        writer.println("private void loadSuperCurrencyMap() {");
-        writer.println("  super.loadCurrencyMap();");
-        writer.println("}");
-        writer.println();
-        writer.println("@Override");
-        writer.println("protected native void loadCurrencyMap() /*-{");
-        writer.indent();
-        writer.println("this.@com.google.gwt.i18n.client.impl." + className
-            + "::loadSuperCurrencyMap()();");
-        writer.println("this.@com.google.gwt.i18n.client.impl." + className
-            + "::overrideCurrencyMap(Lcom/google/gwt/core/client/"
-            + "JavaScriptObject;)({");
-        writer.indent();
-      }
-      writer.println("// " + currencyInfo.getDisplayName());
-      writer.println("\"" + quote(currencyCode) + "\": "
-          + currencyInfo.getJson() + ",");
-    }
-    if (!needHeader) {
-      writer.outdent();
-      writer.println("});");
-      writer.outdent();
-      writer.println("}-*/;");
-    }
+  private String quote(String str) {
+    return str.replace("\"", "\\\"");
   }
 
   /**
-   * Writes a loadNamesMap method for the current locale, based on its the
-   * supplied names map and its superclass (if any).
+   * Load a single localized properties file, adding to an existing
+   * LocalizedProperties object.
    * 
-   * If no new names are added for this locale over its superclass, the method
-   * is omitted entirely.
-   * 
-   * @param className name of the class we are generating
-   * @param writer SourceWriter instance to use for writing the class
-   * @param currencies array of valid currency names in the order they should be
-   *          listed
+   * @param logger TreeLogger instance
+   * @param classLoader class loader to use to find property file
+   * @param propFile property file name
+   * @param props existing LocalizedProperties object to add to
+   * @return true if the properties were successfully read
+   * @throws UnableToCompleteException if an error occurs reading the file
    */
-  private void writeNamesMethod(String className, SourceWriter writer,
-      String[] currencies, Map<String, CurrencyInfo> allCurrencyData) {
-    boolean needHeader = true;
-    for (String currencyCode : currencies) {
-      CurrencyInfo currencyInfo = allCurrencyData.get(currencyCode);
-      if (currencyInfo.isObsolete()) {
-        continue;
+  private boolean readProperties(TreeLogger logger, ClassLoader classLoader,
+      String propFile, LocalizedProperties props)
+      throws UnableToCompleteException {
+    propFile += ".properties";
+    InputStream str = null;
+    try {
+      str = classLoader.getResourceAsStream(propFile);
+      if (str != null) {
+        props.load(str, "UTF-8");
+        return true;
       }
-      String displayName = currencyInfo.getDisplayName();
-      if (displayName != null && !currencyCode.equals(displayName)) {
-        if (needHeader) {
-          needHeader = false;
-          writer.println();
-          writer.println("private void loadSuperNamesMap() {");
-          writer.println("  super.loadNamesMap();");
-          writer.println("}");
-          writer.println();
-          writer.println("@Override");
-          writer.println("protected native void loadNamesMap() /*-{");
-          writer.indent();
-          writer.println("this.@com.google.gwt.i18n.client.impl." + className
-              + "::loadSuperNamesMap()();");
-          writer.println("this.@com.google.gwt.i18n.client.impl." + className
-              + "::overrideNamesMap(Lcom/google/gwt/core/"
-              + "client/JavaScriptObject;)({");
-          writer.indent();
+    } catch (UnsupportedEncodingException e) {
+      // UTF-8 should always be defined
+      logger.log(TreeLogger.ERROR, "UTF-8 encoding is not defined", e);
+      throw new UnableToCompleteException();
+    } catch (IOException e) {
+      logger.log(TreeLogger.ERROR, "Exception reading " + propFile, e);
+      throw new UnableToCompleteException();
+    } finally {
+      if (str != null) {
+        try {
+          str.close();
+        } catch (IOException e) {
+          logger.log(TreeLogger.ERROR, "Exception closing " + propFile, e);
+          throw new UnableToCompleteException();
         }
-        writer.println("\"" + quote(currencyCode) + "\": \""
-            + quote(displayName) + "\",");
       }
     }
-    if (!needHeader) {
-      writer.outdent();
-      writer.println("});");
-      writer.outdent();
-      writer.println("}-*/;");
+    return false;
+  }
+
+  /**
+   * Load a chain of localized properties files, starting with the default and
+   * adding locale components so inheritance is properly recognized.
+   * 
+   * @param logger TreeLogger instance
+   * @param propFilePrefix property file name prefix; locale is added to it
+   * @return a LocalizedProperties object containing all properties
+   * @throws UnableToCompleteException if an error occurs reading the file
+   */
+  private LocalizedProperties readProperties(TreeLogger logger,
+      String propFilePrefix, GwtLocale locale, GwtLocale[] foundLocale)
+      throws UnableToCompleteException {
+    LocalizedProperties props = new LocalizedProperties();
+    ClassLoader classLoader = getClass().getClassLoader();
+    List<GwtLocale> searchList = locale.getCompleteSearchList();
+    GwtLocale lastFound = LocaleUtils.getLocaleFactory().fromString(null);
+    for (int i = searchList.size(); i-- > 0; ) {
+      GwtLocale search = searchList.get(i);
+      String propFile = propFilePrefix;
+      if (!search.isDefault()) {
+        propFile += "_" + search.getAsString();
+      }
+      if (readProperties(logger, classLoader, propFile, props)) {
+        lastFound = search;
+      }
     }
+    foundLocale[0] = lastFound;
+    return props;
   }
 }
diff --git a/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java b/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java
index 01a89ca..448512b 100644
--- a/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java
+++ b/user/src/com/google/gwt/i18n/server/GwtLocaleImpl.java
@@ -37,42 +37,6 @@
   // the property provider to handle inheritance there.
 
   /**
-   * Maps deprecated language codes to the canonical code.  Strings are always
-   * in pairs, with the first being the canonical code and the second being
-   * a deprecated code which maps to it.
-   * 
-   * Source: http://www.loc.gov/standards/iso639-2/php/code_changes.php
-   * 
-   * TODO: consider building maps if this list grows much.
-   */
-  private static final String[] deprecatedLanguages = new String[] {
-    "he", "iw",   // Hebrew
-    "id", "in",   // Indonesian 
-    "jv", "jw",   // Javanese, typo in original publication 
-    "ro", "mo",   // Moldovian
-    "yi", "ji",   // Yiddish
-  };
-
-  /**
-   * Maps deprecated region codes to the canonical code.  Strings are always
-   * in pairs, with the first being the canonical code and the second being
-   * a deprecated code which maps to it.
-   * 
-   * Note that any mappings which split an old code into multiple new codes
-   * cannot be done automatically (such as cs -> rs/me) -- perhaps we could
-   * have a way of flagging region codes which are no longer valid and allow
-   * an appropriate warning message.
-   * 
-   * Source: http://en.wikipedia.org/wiki/ISO_3166-1
-   * 
-   * TODO: consider building maps if this list grows much.
-   */
-  private static final String[] deprecatedRegions = new String[] {
-    // East Timor - http://www.iso.org/iso/newsletter_v-5_east_timor.pdf
-    "TL", "TP",
-  };
-
-  /**
    * Add in the missing locale of a deprecated pair.
    * 
    * @param factory GwtLocaleFactory to create new instances with
@@ -81,18 +45,36 @@
    */
   private static void addDeprecatedPairs(GwtLocaleFactory factory,
       GwtLocale locale, List<GwtLocale> aliases) {
-    int n = deprecatedLanguages.length;
-    for (int i = 0; i < n; i += 2) {
-      if (deprecatedLanguages[i].equals(locale.getLanguage())) {
-        aliases.add(factory.fromComponents(deprecatedLanguages[i + 1],
-            locale.getScript(), locale.getRegion(), locale.getVariant()));
-        break;
-      }
-      if (deprecatedLanguages[i + 1].equals(locale.getLanguage())) {
-        aliases.add(factory.fromComponents(deprecatedLanguages[i],
-            locale.getScript(), locale.getRegion(), locale.getVariant()));
-        break;
-      }
+    if ("he".equals(locale.getLanguage())) {
+      aliases.add(factory.fromComponents("iw", locale.getScript(),
+          locale.getRegion(), locale.getVariant()));
+    } else if ("iw".equals(locale.getLanguage())) {
+      aliases.add(factory.fromComponents("he", locale.getScript(),
+          locale.getRegion(), locale.getVariant()));
+    } else if ("id".equals(locale.getLanguage())) {
+      aliases.add(factory.fromComponents("in", locale.getScript(),
+          locale.getRegion(), locale.getVariant()));
+    } else if ("in".equals(locale.getLanguage())) {
+      aliases.add(factory.fromComponents("id", locale.getScript(),
+          locale.getRegion(), locale.getVariant()));
+    } else if ("mo".equals(locale.getLanguage())) {
+      aliases.add(factory.fromComponents("ro", locale.getScript(),
+          locale.getRegion(), locale.getVariant()));
+    } else if ("ro".equals(locale.getLanguage())) {
+      aliases.add(factory.fromComponents("mo", locale.getScript(),
+          locale.getRegion(), locale.getVariant()));
+    } else if ("jv".equals(locale.getLanguage())) {
+      aliases.add(factory.fromComponents("jw", locale.getScript(),
+          locale.getRegion(), locale.getVariant()));
+    } else if ("jw".equals(locale.getLanguage())) {
+      aliases.add(factory.fromComponents("jv", locale.getScript(),
+          locale.getRegion(), locale.getVariant()));
+    } else if ("ji".equals(locale.getLanguage())) {
+      aliases.add(factory.fromComponents("yi", locale.getScript(),
+          locale.getRegion(), locale.getVariant()));
+    } else if ("yi".equals(locale.getLanguage())) {
+      aliases.add(factory.fromComponents("ji", locale.getScript(),
+          locale.getRegion(), locale.getVariant()));
     }
   }
 
@@ -177,12 +159,10 @@
         }
       }
     } else if ("no".equals(language)) {
-      if (variant == null || "BOKMAL".equals(variant)) {
+      if ("BOKMAL".equals(variant)) {
         aliases.add(factory.fromComponents("nb", script, region, null));
-        aliases.add(factory.fromComponents("no-bok", script, region, null));
       } else if ("NYNORSK".equals(variant)) {
         aliases.add(factory.fromComponents("nn", script, region, null));
-        aliases.add(factory.fromComponents("no-nyn", script, region, null));
       }
     } else if ("nb".equals(language)) {
       aliases.add(factory.fromComponents("no", script, region, "BOKMAL"));
@@ -282,9 +262,7 @@
     // TODO(jat): more locale aliases? better way to encode them?
     if (cachedAliases == null) {
       cachedAliases = new ArrayList<GwtLocale>();
-      GwtLocale canonicalForm = getCanonicalForm();
       Set<GwtLocale> seen = new HashSet<GwtLocale>();
-      cachedAliases.add(canonicalForm);
       ArrayList<GwtLocale> nextGroup = new ArrayList<GwtLocale>();
       nextGroup.add(this);
       // Account for default script
@@ -305,9 +283,7 @@
             continue;
           }
           seen.add(locale);
-          if (!locale.equals(canonicalForm)) {
-            cachedAliases.add(locale);
-          }
+          cachedAliases.add(locale);
           addDeprecatedPairs(factory, locale, nextGroup);
           addSpecialAliases(factory, locale, nextGroup);
         }
@@ -336,77 +312,6 @@
     return buf.toString();
   }
 
-  /**
-   * Returns this locale in canonical form:
-   * <ul>
-   *  <li>Deprecated language/region tags are replaced with official versions
-   *  <li>
-   * </ul>
-   * 
-   * @return GwtLocale instance 
-   */
-  public GwtLocale getCanonicalForm() {
-    String canonLanguage = language;
-    String canonScript = script;
-    String canonRegion = region;
-    String canonVariant = variant;
-    // Handle deprecated language codes
-    int n = deprecatedLanguages.length;
-    for (int i = 0; i < n; i += 2) {
-      if (deprecatedLanguages[i + 1].equals(canonLanguage)) {
-        canonLanguage = deprecatedLanguages[i];
-        break;
-      }
-    }
-    // Handle deprecated region codes
-    n = deprecatedRegions.length;
-    for (int i = 0; i < n; i += 2) {
-      if (deprecatedRegions[i + 1].equals(canonRegion)) {
-        canonRegion = deprecatedRegions[i];
-        break;
-      }
-    }
-    // Special-case Chinese default scripts
-    if ("zh".equals(canonLanguage)) {
-      if (canonRegion != null) {
-        if ("CN".equals(canonRegion) && "Hans".equals(canonScript)) {
-          canonScript = null;
-        } else if ("TW".equals(canonRegion) && "Hant".equals(canonScript)) {
-          canonScript = null;
-        }
-      } else if ("Hans".equals(canonScript)) {
-        canonRegion = "CN";
-        canonScript = null;
-      } else if ("Hant".equals(canonScript)) {
-        canonRegion = "TW";
-        canonScript = null;
-      }
-    }
-    // Special-case no->nb/nn split
-    if ("no-bok".equals(canonLanguage)) {
-      canonLanguage = "nb";
-      canonVariant = null;
-    } else if ("no-nyn".equals(canonLanguage)) {
-      canonLanguage = "nn";
-      canonVariant = null;
-    } else if ("no".equals(canonLanguage)) {
-      if (canonVariant == null || "BOKMAL".equals(canonVariant)) {
-        canonLanguage = "nb";
-        canonVariant = null;
-      } else if ("NYNORSK".equals(canonVariant)) {
-        canonLanguage = "nn";
-        canonVariant = null;
-      }
-    }
-    // Remove any default script for the language
-    if (canonScript != null && canonScript.equals(
-        DefaultLanguageScripts.getDefaultScript(canonLanguage))) {
-      canonScript = null;
-    }
-    return factory.fromComponents(canonLanguage, canonScript, canonRegion,
-        canonVariant);
-  }
-
   public List<GwtLocale> getCompleteSearchList() {
     // TODO(jat): get zh_Hant to come before zh in search list for zh_TW
     if (cachedSearchList == null) {
diff --git a/user/src/com/google/gwt/i18n/shared/GwtLocale.java b/user/src/com/google/gwt/i18n/shared/GwtLocale.java
index 8dd7bb4..35ca036 100644
--- a/user/src/com/google/gwt/i18n/shared/GwtLocale.java
+++ b/user/src/com/google/gwt/i18n/shared/GwtLocale.java
@@ -32,8 +32,8 @@
   int compareTo(GwtLocale o);
 
   /**
-   * Return the list of aliases for this locale.  The canonical form of the
-   * current locale is always first on the list.
+   * Return the list of aliases for this locale.  The current locale is always
+   * first on the list.
    * 
    * Language/region codes have changed over time, so some systems continue to
    * use the older codes.  Aliases allow GWT to use the official Unicode CLDR
@@ -43,41 +43,8 @@
    */
   List<GwtLocale> getAliases();
   
-  /**
-   * Return the locale as a fixed-format string suitable for use in searching
-   * for localized resources.  The format is language_Script_REGION_VARIANT,
-   * where language is a 2-8 letter code (possibly with 3-letter extensions),
-   * script is a 4-letter code with an initial capital letter, region is a
-   * 2-character country code or a 3-digit region code, and variant is a 5-8
-   * character (may be 4 if the first character is numeric) code.  If a
-   * component is missing, its preceding _ is also omitted.  If this is the
-   * default locale, the empty string will be returned.
-   * 
-   * @return String representing locale
-   */
   String getAsString();
 
-  /**
-   * Returns this locale in canonical form.
-   * <ul>
-   *  <li>Deprecated language/region tags are replaced with official versions
-   *  <li>Default scripts are removed (including region-specific defaults for
-   *      Chinese)
-   *  <li>no/nb/nn are normalized
-   *  <li>Default region for zh_Hans and zh_Hant if none specified
-   * </ul>
-   * 
-   * @return GwtLocale instance 
-   */
-  GwtLocale getCanonicalForm();
-
-  /**
-   * Return the complete list of locales to search for the current locale.
-   * This list will always start with the canonical form of this locale, and
-   * end with "default", and include all appropriate aliases along the way.
-   * 
-   * @return search list
-   */
   List<GwtLocale> getCompleteSearchList();
   
   /**
@@ -89,44 +56,20 @@
    */
   List<GwtLocale> getInheritanceChain();
   
-  /**
-   * @return the language portion of the locale, or null if none.
-   */
   String getLanguage();
 
-  /**
-   * @return the language portion of the locale, or the empty string if none.
-   */
   String getLanguageNotNull();
 
-  /**
-   * @return the region portion of the locale, or null if none.
-   */
   String getRegion();
   
-  /**
-   * @return the region portion of the locale, or the empty string if none.
-   */
   String getRegionNotNull();
 
-  /**
-   * @return the script portion of the locale, or null if none.
-   */
   String getScript();
   
-  /**
-   * @return the script portion of the locale, or the empty string if none.
-   */
   String getScriptNotNull();
   
-  /**
-   * @return the variant portion of the locale, or null if none.
-   */
   String getVariant();
   
-  /**
-   * @return the variant portion of the locale, or the empty string if none.
-   */
   String getVariantNotNull();
 
   /**
@@ -139,14 +82,8 @@
    */
   boolean inheritsFrom(GwtLocale parent);
 
-  /**
-   * @return true if this is the default or root locale.
-   */
   boolean isDefault();
 
-  /**
-   * @return a human readable string -- "default" or the same as getAsString().
-   */
   String toString();
 
   /**
diff --git a/user/test/com/google/gwt/i18n/I18NTest_es_AR_runtime.gwt.xml b/user/test/com/google/gwt/i18n/I18NTest_es_AR_runtime.gwt.xml
deleted file mode 100644
index 9cddf0b..0000000
--- a/user/test/com/google/gwt/i18n/I18NTest_es_AR_runtime.gwt.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--                                                                        -->
-<!-- Copyright 2009 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   -->
-<!-- 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. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-
-<module>
-	<!-- Inherit the JUnit support -->
-	<inherits name='com.google.gwt.junit.JUnit'/>
-	<inherits name = 'com.google.gwt.i18n.I18N'/>
-	<!-- Include client-side source for the test cases -->
-	<source path="client"/>
-	<extend-property name="locale" values="es_419"/>
-	<set-property name = "locale" value = "es_419"/>
-	<set-configuration-property name="runtime.locales" value="es_AR,es_MX"/>
-	<public path="public_es_AR"/>
-</module>
diff --git a/user/test/com/google/gwt/i18n/client/I18N_es_AR_RuntimeTest.java b/user/test/com/google/gwt/i18n/client/I18N_es_AR_RuntimeTest.java
deleted file mode 100644
index f3dfe62..0000000
--- a/user/test/com/google/gwt/i18n/client/I18N_es_AR_RuntimeTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2007 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.i18n.client.I18N_es_MX_Test.MyConstants;
-import com.google.gwt.i18n.client.I18N_es_MX_Test.MyMessages;
-import com.google.gwt.i18n.client.impl.CurrencyData;
-import com.google.gwt.i18n.client.impl.CurrencyList;
-import com.google.gwt.junit.client.GWTTestCase;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Tests regional inheritance for es_AR.
- */
-public class I18N_es_AR_RuntimeTest extends GWTTestCase {
-
-  @Override
-  public String getModuleName() {
-    return "com.google.gwt.i18n.I18NTest_es_AR_runtime";
-  }
-  
-  public void testAvailableLocales() {
-    String[] locales = LocaleInfo.getAvailableLocaleNames();
-    Set<String> localeSet = new HashSet<String>();
-    List<String> localeList = Arrays.asList(locales);
-    localeSet.addAll(localeList);
-    List<String> expectedList = Arrays.asList("default", "es_419", "es_AR",
-        "es_MX");
-    assertEquals(expectedList.size(), localeSet.size());
-    localeSet.removeAll(expectedList);
-    assertEquals(0, localeSet.size());
-  }
-
-  public void testCurrencyNames() {
-    assertEquals("Peso Argentino", CurrencyList.get().lookupName("ARS"));
-    assertEquals("peso mexicano", CurrencyList.get().lookupName("MXN"));
-    assertEquals("dólar estadounidense", CurrencyList.get().lookupName("USD"));
-  }
-
-  public void testDefaultCurrency() {
-    CurrencyData data = CurrencyList.get().getDefault();
-    assertEquals("ARS", data.getCurrencyCode());
-    assertEquals("$", data.getCurrencySymbol());
-    assertEquals(2, data.getDefaultFractionDigits());
-  }
-  
-  public void testOtherCurrency() {
-    CurrencyData ars = CurrencyList.get().lookup("ARS");
-    assertEquals("ARS", ars.getCurrencyCode());
-    assertEquals("$", ars.getCurrencySymbol());
-    assertEquals(2, ars.getDefaultFractionDigits());
-    CurrencyData data = CurrencyList.get().lookup("MXN");
-    assertEquals("MXN", data.getCurrencyCode());
-    assertEquals("MEX$", data.getCurrencySymbol());
-    assertEquals(2, data.getDefaultFractionDigits());
-    CurrencyData usd = CurrencyList.get().lookup("USD");
-    assertEquals("USD", usd.getCurrencyCode());
-    assertEquals("US$", usd.getCurrencySymbol());
-    assertEquals(2, usd.getDefaultFractionDigits());
-    boolean found = false;
-    for (CurrencyData it : CurrencyList.get()) {
-      if ("USD".equals(it.getCurrencyCode())) {
-        assertEquals("US$", it.getCurrencySymbol());
-        assertEquals(2, it.getDefaultFractionDigits());
-        found = true;
-        break;
-      }
-    }
-    assertTrue("Did not find USD in iterator", found);
-  }
-
-  public void testRegionalInheritance() {
-    MyMessages msg = GWT.create(MyMessages.class);
-    assertEquals("es_419", msg.getSourceLocale());
-    MyConstants cst = GWT.create(MyConstants.class);
-    // Since our copile-time locale is es_419 (Latin America), we do
-    // not get es_019 (Central America) in the inheritance chain for
-    // es_AR as only the compile-time locales are used for translation
-    // inheritance.
-    assertEquals("default", cst.getSourceLocale());
-  }
-  
-  public void testRuntimeLocale() {
-    assertEquals("es_AR", LocaleInfo.getCurrentLocale().getLocaleName());
-  }
-}
diff --git a/user/test/com/google/gwt/i18n/client/I18N_es_MX_RuntimeTest.java b/user/test/com/google/gwt/i18n/client/I18N_es_MX_RuntimeTest.java
index 2cba95f..18079e1 100644
--- a/user/test/com/google/gwt/i18n/client/I18N_es_MX_RuntimeTest.java
+++ b/user/test/com/google/gwt/i18n/client/I18N_es_MX_RuntimeTest.java
@@ -49,43 +49,12 @@
     assertEquals(0, localeSet.size());
   }
 
-  public void testCurrencyNames() {
-    assertEquals("peso argentino", CurrencyList.get().lookupName("ARS"));
-    assertEquals("peso mexicano", CurrencyList.get().lookupName("MXN"));
-    assertEquals("dólar estadounidense", CurrencyList.get().lookupName("USD"));
-  }
-
   public void testDefaultCurrency() {
     CurrencyData data = CurrencyList.get().getDefault();
     assertEquals("MXN", data.getCurrencyCode());
     assertEquals("$", data.getCurrencySymbol());
     assertEquals(2, data.getDefaultFractionDigits());
   }
-  
-  public void testOtherCurrency() {
-    CurrencyData ars = CurrencyList.get().lookup("ARS");
-    assertEquals("ARS", ars.getCurrencyCode());
-    assertEquals("Arg$", ars.getCurrencySymbol());
-    assertEquals(2, ars.getDefaultFractionDigits());
-    CurrencyData data = CurrencyList.get().lookup("MXN");
-    assertEquals("MXN", data.getCurrencyCode());
-    assertEquals("$", data.getCurrencySymbol());
-    assertEquals(2, data.getDefaultFractionDigits());
-    CurrencyData usd = CurrencyList.get().lookup("USD");
-    assertEquals("USD", usd.getCurrencyCode());
-    assertEquals("US$", usd.getCurrencySymbol());
-    assertEquals(2, usd.getDefaultFractionDigits());
-    boolean found = false;
-    for (CurrencyData it : CurrencyList.get()) {
-      if ("USD".equals(it.getCurrencyCode())) {
-        assertEquals("US$", it.getCurrencySymbol());
-        assertEquals(2, it.getDefaultFractionDigits());
-        found = true;
-        break;
-      }
-    }
-    assertTrue("Did not find USD in iterator", found);
-  }
 
   public void testRegionalInheritance() {
     MyMessages msg = GWT.create(MyMessages.class);
diff --git a/user/test/com/google/gwt/i18n/public_es_AR/junit.html b/user/test/com/google/gwt/i18n/public_es_AR/junit.html
deleted file mode 100644
index b316a47..0000000
--- a/user/test/com/google/gwt/i18n/public_es_AR/junit.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!--
-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.
--->
-<html>
-<head>
-<meta name='gwt:onLoadErrorFn' content='junitOnLoadErrorFn'>
-<meta name='gwt:onPropertyErrorFn' content='junitOnPropertyErrorFn'>
-</head>
-<body>
-<script language='javascript'>
-<!--
-// -- BEGIN CHANGE FROM junit/public/junit.html
-// Set the runtime locale for this test
-// TODO(jat): find a better way to do this that doesn't require duplcating
-//     junit.html for each different runtime locale.
-window['__gwt_Locale'] = 'es_AR';
-// -- END CHANGE FROM junit/public/junit.html
-
-function junitOnLoadErrorFn(moduleName) {
-  junitError('Failed to load module "' + moduleName +
-    '".\nPlease see the log for details.');
-}
-
-function junitOnPropertyErrorFn(propName, allowedValues, badValue) {
-  var msg = 'While attempting to load the module, property "' + propName;
-  if (badValue != null) {
-    msg += '" was set to the unexpected value "' + badValue + '"';
-  } else {
-    msg += '" was not specified';
-  }
-  msg += 'Allowed values: ' + allowedValues;
-  junitError(msg);
-}
-
-function junitError(msg) {
-  var xmlHttpRequest = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
-  xmlHttpRequest.open('POST', 'junithost/loadError', true);
-  xmlHttpRequest.setRequestHeader('Content-Type', 'text/x-gwt-rpc; charset=utf-8');
-  xmlHttpRequest.send(msg);
-}
-
-function loadSelectionScript() {
-  var moduleName = document.location.href;
-  var pos = moduleName.lastIndexOf('/');
-  moduleName = moduleName.substr(0, pos);
-  pos = moduleName.lastIndexOf('/');
-  moduleName = moduleName.substr(pos + 1);
-  document.write("<script language='javascript' src='" + moduleName + ".nocache.js'></script>");
-}
-loadSelectionScript();
--->
-</script>
-<iframe src="javascript:''" id='__gwt_historyFrame' style='position:absolute;width:0;height:0;border:0'></iframe>
-</body>
-</html>
diff --git a/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java b/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java
index ee2eaec..3bf1298 100644
--- a/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java
+++ b/user/test/com/google/gwt/i18n/server/GwtLocaleTest.java
@@ -38,13 +38,12 @@
     assertContainsAndGetPosition(aliases, factory.fromString("zh_Hans_CN"));
     GwtLocale zhHant = factory.fromString("zh_Hant");
     aliases = zhHant.getAliases();
-    assertEquals(aliases.get(0), factory.fromString("zh_TW"));
+    assertEquals(aliases.get(0), zhHant);
     assertContainsAndGetPosition(aliases, factory.fromString("zh_Hant_TW"));
     GwtLocale zhHans = factory.fromString("zh_Hans");
     aliases = zhHans.getAliases();
-    assertEquals(aliases.get(0), zhCN);
+    assertEquals(aliases.get(0), zhHans);
     assertContainsAndGetPosition(aliases, factory.fromString("zh_Hans_CN"));
-    assertContainsAndGetPosition(aliases, zhHans);
     GwtLocale en = factory.fromString("en");
     aliases = en.getAliases();
     assertEquals(aliases.get(0), en);
@@ -57,11 +56,7 @@
     GwtLocale pt = factory.fromString("pt");
     aliases = pt.getAliases();
     assertContainsAndGetPosition(aliases, factory.fromString("pt_BR"));
-    GwtLocale iw = factory.fromString("iw");
-    aliases = iw.getAliases();
     GwtLocale he = factory.fromString("he");
-    assertEquals(aliases.get(0), he);
-    assertContainsAndGetPosition(aliases, factory.fromString("iw_Hebr"));
     aliases = he.getAliases();
     assertContainsAndGetPosition(aliases, factory.fromString("iw_Hebr"));
     GwtLocale id = factory.fromString("id");