Add JREIndex optimization to JdtCompiler. http://gwt-code-reviews.appspot.com/1318802/show Review by: tobyr@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9629 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java b/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java index d3b0bc5..fb752ef 100644 --- a/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java +++ b/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
@@ -16,6 +16,7 @@ package com.google.gwt.dev.javac; import com.google.gwt.dev.jdt.TypeRefVisitor; +import com.google.gwt.dev.jjs.InternalCompilerException; import com.google.gwt.dev.util.Name.BinaryName; import com.google.gwt.dev.util.collect.Lists; import com.google.gwt.dev.util.log.speedtracer.CompilerEventType; @@ -60,10 +61,12 @@ import java.io.IOException; import java.io.InputStream; +import java.net.JarURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -71,6 +74,8 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; /** * Manages the process of compiling {@link CompilationUnit}s. @@ -130,6 +135,51 @@ void process(CompilationUnitBuilder builder, CompilationUnitDeclaration cud, List<CompiledClass> compiledClasses); } + + /** + * Static cache of all the JRE package names. + */ + public static class JreIndex { + private static Set<String> packages = readPackages(); + + public static boolean contains(String name) { + return packages.contains(name); + } + + private static void addPackageRecursively(Set<String> packages, String pkg) { + if (!packages.add(pkg)) { + return; + } + + int i = pkg.lastIndexOf('/'); + if (i != -1) { + addPackageRecursively(packages, pkg.substring(0, i)); + } + } + + private static Set<String> readPackages() { + HashSet<String> pkgs = new HashSet<String>(); + String klass = "java/lang/Object.class"; + URL url = ClassLoader.getSystemClassLoader().getResource(klass); + try { + JarURLConnection connection = (JarURLConnection) url.openConnection(); + JarFile f = connection.getJarFile(); + Enumeration<JarEntry> entries = f.entries(); + while (entries.hasMoreElements()) { + JarEntry e = entries.nextElement(); + String name = e.getName(); + if (name.endsWith(".class")) { + String pkg = Shared.getSlashedPackageFrom(name); + addPackageRecursively(pkgs, pkg); + } + } + return pkgs; + } catch (IOException e) { + throw new InternalCompilerException("Unable to find JRE", e); + } + } + } + /** * Adapts a {@link CompilationUnit} for a JDT compile. */ @@ -282,7 +332,10 @@ } private boolean isPackage(String slashedPackageName) { - // Include class loader check for binary-only annotations. + // Test the JRE explicitly, because the classloader trick doesn't work. + if (JreIndex.contains(slashedPackageName)) { + return true; + } if (packages.contains(slashedPackageName)) { return true; } @@ -294,6 +347,7 @@ addPackages(slashedPackageName); return true; } + // Include class loader check for binary-only annotations. if (getClassLoader().getResource(resourceName) != null) { addPackages(slashedPackageName); return true;
diff --git a/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java b/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java index 4ff010b..fce859f 100644 --- a/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java +++ b/dev/core/src/com/google/gwt/dev/jdt/AbstractCompiler.java
@@ -22,7 +22,6 @@ import com.google.gwt.dev.javac.GWTProblem; import com.google.gwt.dev.javac.JdtCompiler; import com.google.gwt.dev.javac.Shared; -import com.google.gwt.dev.jjs.InternalCompilerException; import com.google.gwt.dev.util.CharArrayComparator; import com.google.gwt.dev.util.Empty; import com.google.gwt.dev.util.Util; @@ -52,19 +51,14 @@ import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; import org.eclipse.jdt.internal.compiler.util.Messages; -import java.io.IOException; -import java.net.JarURLConnection; import java.net.URL; import java.util.Comparator; -import java.util.Enumeration; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeSet; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; /** * A facade around the JDT compiler to manage on-demand compilation, caching @@ -338,47 +332,6 @@ } } - static class JreIndex { - private static Set<String> packages = readPackages(); - - private static void addPackageRecursively(Set<String> packages, String pkg) { - if (!packages.add(pkg)) { - return; - } - - int i = pkg.lastIndexOf('.'); - if (i != -1) { - addPackageRecursively(packages, pkg.substring(0, i)); - } - } - - public static boolean contains(String name) { - return packages.contains(name); - } - - private static Set<String> readPackages() { - HashSet<String> pkgs = new HashSet<String>(); - String klass = "java/lang/Object.class"; - URL url = ClassLoader.getSystemClassLoader().getResource(klass); - try { - JarURLConnection connection = (JarURLConnection) url.openConnection(); - JarFile f = connection.getJarFile(); - Enumeration<JarEntry> entries = f.entries(); - while (entries.hasMoreElements()) { - JarEntry e = entries.nextElement(); - String name = e.getName(); - if (name.endsWith(".class")) { - String pkg = Shared.getPackageNameFromBinary(name); - addPackageRecursively(pkgs, pkg); - } - } - return pkgs; - } catch (IOException e) { - throw new InternalCompilerException("Unable to find JRE", e); - } - } - } - private class INameEnvironmentImpl implements INameEnvironment { public INameEnvironmentImpl() { @@ -483,9 +436,8 @@ private boolean isPackage(ClassLoader classLoader, String packageName) { String packageAsPath = packageName.replace('.', '/'); - // Test the JRE explicitly first, because the following method does - // not work for JRE classes. - if (JreIndex.contains(packageName)) { + // Test the JRE explicitly, because the classloader trick doesn't work. + if (JdtCompiler.JreIndex.contains(packageAsPath)) { return true; }