Make i18n use ResourceOracle to improve speed.

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5629 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/i18n/rebind/AbstractLocalizableImplCreator.java b/user/src/com/google/gwt/i18n/rebind/AbstractLocalizableImplCreator.java
index 74460f6..396cf2f 100644
--- a/user/src/com/google/gwt/i18n/rebind/AbstractLocalizableImplCreator.java
+++ b/user/src/com/google/gwt/i18n/rebind/AbstractLocalizableImplCreator.java
@@ -95,7 +95,7 @@
     ResourceList resourceList = null;
     try {
       resourceList = ResourceFactory.getBundle(logger, targetClass, locale,
-          assignableToConstants);
+          assignableToConstants, context.getResourcesOracle().getResourceMap());
     } catch (MissingResourceException e) {
       throw error(logger,
           "Localization failed; there must be at least one resource accessible through"
diff --git a/user/src/com/google/gwt/i18n/rebind/ResourceFactory.java b/user/src/com/google/gwt/i18n/rebind/ResourceFactory.java
index f95c0fa..a43ae7d 100644
--- a/user/src/com/google/gwt/i18n/rebind/ResourceFactory.java
+++ b/user/src/com/google/gwt/i18n/rebind/ResourceFactory.java
@@ -19,6 +19,7 @@
 
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.dev.resource.Resource;
 import com.google.gwt.dev.util.collect.IdentityHashSet;
 import com.google.gwt.i18n.client.LocalizableResource.DefaultLocale;
 import com.google.gwt.i18n.rebind.AbstractResource.ResourceList;
@@ -42,10 +43,10 @@
    * Pair of JClassType and GwtLocale.
    */
   private static class ClassLocale {
-    
+
     private final JClassType clazz;
     private final GwtLocale locale;
-    
+
     public ClassLocale(JClassType clazz, GwtLocale locale) {
       assert clazz != null;
       assert locale != null;
@@ -62,7 +63,7 @@
         return false;
       }
       ClassLocale other = (ClassLocale) obj;
-      return clazz.equals(other.clazz) && locale.equals(other.locale); 
+      return clazz.equals(other.clazz) && locale.equals(other.locale);
     }
 
     public JClassType getJClass() {
@@ -77,7 +78,7 @@
     public int hashCode() {
       return clazz.hashCode() + locale.hashCode() * 53;
     }
-    
+
     @Override
     public String toString() {
       return clazz.getQualifiedSourceName() + "/" + locale.toString();
@@ -85,13 +86,12 @@
   }
 
   /**
-   * Separator between class name and locale in resource files.  Should not
+   * Separator between class name and locale in resource files. Should not
    * appear in valid localizable class names.
    */
   public static final char LOCALE_SEPARATOR = '_';
 
-  private static Map<ClassLocale, ResourceList> cache = new HashMap<
-      ClassLocale, ResourceList>();
+  private static Map<ClassLocale, ResourceList> cache = new HashMap<ClassLocale, ResourceList>();
   private static List<ResourceFactory> loaders = new ArrayList<ResourceFactory>();
 
   static {
@@ -114,18 +114,18 @@
    * @return resource list
    */
   public static ResourceList getBundle(TreeLogger logger, JClassType topClass,
-      GwtLocale bundleLocale, boolean isConstants) {
+      GwtLocale bundleLocale, boolean isConstants,
+      Map<String, Resource> resourceMap) {
     List<GwtLocale> locales = bundleLocale.getCompleteSearchList();
     List<JClassType> classes = new ArrayList<JClassType>();
     Set<JClassType> seenClasses = new IdentityHashSet<JClassType>();
-    Map<ClassLocale, AnnotationsResource> annotations = new HashMap<ClassLocale,
-        AnnotationsResource>();
+    Map<ClassLocale, AnnotationsResource> annotations = new HashMap<ClassLocale, AnnotationsResource>();
     GwtLocaleFactory factory = LocaleUtils.getLocaleFactory();
     GwtLocale defaultLocale = factory.getDefault();
     walkInheritanceTree(logger, topClass, factory, defaultLocale, classes,
         annotations, seenClasses, isConstants);
     // TODO(jat): handle explicit subinterface with other locales -- ie:
-    //   public interface Foo_es_MX extends Foo { ... }
+    // public interface Foo_es_MX extends Foo { ... }
     ResourceList allResources = new ResourceList();
     for (GwtLocale locale : locales) {
       for (JClassType clazz : classes) {
@@ -136,7 +136,7 @@
         } else {
           cache.put(key, null);
           resources = new ResourceList();
-          addFileResources(clazz, locale, resources);
+          addFileResources(clazz, locale, resourceMap, resources);
           AnnotationsResource annotationsResource = annotations.get(key);
           if (annotationsResource != null) {
             resources.add(annotationsResource);
@@ -166,7 +166,7 @@
   }
 
   private static void addFileResources(JClassType clazz, GwtLocale locale,
-      ResourceList resources) {
+      Map<String, Resource> resourceMap, ResourceList resources) {
     // TODO: handle classes in the default package?
     String targetPath = clazz.getPackage().getName() + '.'
         + getResourceName(clazz);
@@ -175,21 +175,20 @@
       localizedPath = targetPath + LOCALE_SEPARATOR + locale.getAsString();
     }
     // Check for file-based resources.
-    ClassLoader loader = ResourceFactory.class.getClassLoader();
     String partialPath = localizedPath.replace('.', '/');
     for (int i = 0; i < loaders.size(); i++) {
       ResourceFactory element = loaders.get(i);
       String ext = "." + element.getExt();
       String path = partialPath + ext;
-      InputStream m = loader.getResourceAsStream(path);
-      if (m == null && partialPath.contains("$")) {
+      Resource resource = resourceMap.get(path);
+      if (resource == null && partialPath.contains("$")) {
         // Also look for A_B for inner classes, as $ in path names
         // can cause issues for some build tools.
         path = partialPath.replace('$', '_') + ext;
-        m = loader.getResourceAsStream(path);
+        resource = resourceMap.get(path);
       }
-      if (m != null) {
-        AbstractResource found = element.load(m, locale);
+      if (resource != null) {
+        AbstractResource found = element.load(resource.openContents(), locale);
         found.setPath(path);
         resources.add(found);
       }
@@ -215,14 +214,14 @@
         ClassLocale key = new ClassLocale(clazz, defaultLocale);
         annotations.put(key, resource);
         String defLocaleValue = null;
-        
+
         // If the class has an embedded locale in it, use that for the default
         String className = clazz.getSimpleSourceName();
         int underscore = className.indexOf('_');
         if (underscore >= 0) {
           defLocaleValue = className.substring(underscore + 1);
         }
-        
+
         // If there is an annotation declaring the default locale, use that
         DefaultLocale defLocaleAnnot = getClassAnnotation(clazz,
             DefaultLocale.class);
@@ -240,13 +239,13 @@
       logger.log(TreeLogger.ERROR, e.getMessage(), e);
     }
     if (clazz.getSuperclass() != null) {
-      walkInheritanceTree(logger, clazz.getSuperclass(), factory, defaultLocale,
-          classes, annotations, seenClasses, isConstants);
+      walkInheritanceTree(logger, clazz.getSuperclass(), factory,
+          defaultLocale, classes, annotations, seenClasses, isConstants);
     }
     for (JClassType intf : clazz.getImplementedInterfaces()) {
       walkInheritanceTree(logger, intf, factory, defaultLocale, classes,
           annotations, seenClasses, isConstants);
-    }   
+    }
   }
 
   abstract String getExt();