This patch fixes issue 3445, allowing apiChecker to run using reference jars.
To reduce the size of reference jars, only .java files in com/google/gwt are
included.  

Patch by: amitmanjhi
Review by: rjrjr (desk review)



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5418 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/build.xml b/build.xml
index 04d233b..77d9860 100755
--- a/build.xml
+++ b/build.xml
@@ -8,8 +8,6 @@
 
   <property name="gwt.apicheck.config" 
     location="tools/api-checker/config/gwt15_16userApi.conf"/>
-  <property name="gwt.apicheck.oldroot" 
-    value="../gwt-1.5"/>
 
   <target name="buildonly" depends="dev, user, servlet, jni" description="Build without docs/samples">
     <gwt.ant dir="distro-source" />
@@ -83,10 +81,6 @@
     <copy tofile="${gwt.build.out}/userApi.conf" filtering="false"
           file="${gwt.apicheck.config}"
           overwrite="true">
-      <filterset>
-        <filter token="OLDROOT" 
-          value="${gwt.apicheck.oldroot}"/>
-      </filterset>
     </copy>
     <java failonerror="true" fork="true"
           classname="com.google.gwt.tools.apichecker.ApiCompatibilityChecker">
@@ -96,10 +90,14 @@
         <pathelement location="${gwt.build.out}/tools/api-checker/bin"/>
         <fileset dir="${gwt.build.lib}" includes="gwt-user.jar,gwt-dev-*.jar" />
         <pathelement path="${java.class.path}"/>
-        <pathelement location="${gwt.tools.lib}/lib/apache/ant-1.6.5.jar" />
+        <pathelement location="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
       </classpath>
+      <arg value="-refJar"/>
+      <arg value="${gwt.root}/tools/api-checker/reference/gwt-dev-modified.jar:${gwt.root}/tools/api-checker/reference/gwt-user-modified.jar"/>
       <arg value="-configFile"/>
       <arg file="${gwt.build.out}/userApi.conf"/>
+      <arg value="-logLevel"/>
+      <arg value="ERROR"/>
     </java>
   </target>
   
diff --git a/tools/api-checker/config/gwt15_16userApi.conf b/tools/api-checker/config/gwt15_16userApi.conf
index 4360a23..b5a7186 100644
--- a/tools/api-checker/config/gwt15_16userApi.conf
+++ b/tools/api-checker/config/gwt15_16userApi.conf
@@ -1,34 +1,49 @@
 #existing API
 
-dirRoot_old @OLDROOT@/
+# dirRoot_old is missing because refJars are being supplied 
 name_old gwt15userApi
-#sourceFiles and excludedFiles are specified as colon-separated list of files
-sourceFiles_old dev/core/super\
-:user/src\
-:user/super\
+#sourceFiles is specified as colon-separated list of files
+sourceFiles_old com/google/gwt
 
-excludedFiles_old user/src/com/google/gwt/benchmarks/BenchmarkReport.java\
-:user/src/com/google/gwt/benchmarks/BenchmarkShell.java\
-:user/src/com/google/gwt/benchmarks/client/Benchmark.java\
-:**/rebind\
-:**/server\
-:**/tools\
-:user/src/com/google/gwt/junit/GWTMockUtilities.java\
-:user/src/com/google/gwt/junit/GWTDummyBridge.java\
-:user/src/com/google/gwt/junit/JUnitMessageQueue.java\
-:user/src/com/google/gwt/junit/JUnitShell.java\
-:user/src/com/google/gwt/junit/RunStyle*.java\
-:user/src/com/google/gwt/junit/client/GWTTestCase.java\
-:user/src/com/google/gwt/junit/client/impl/GWTRunner.java\
-:user/src/com/google/gwt/junit/remote\
-:user/src/com/google/gwt/user/client/rpc/core/java/util/LinkedHashMap_CustomFieldSerializer.java\
+#excludedFiles is specified as colon-separated ant patterns 
+excludedFiles_old com/google/gwt/benchmarks/Benchmark*.java\
+:com/google/gwt/benchmarks/client/Benchmark.java\
+:com/google/gwt/core/ext/**\
+:com/google/gwt/core/linker/**\
+:com/google/gwt/dev/*.java\
+:com/google/gwt/dev/asm/**\
+:com/google/gwt/dev/cfg/**\
+:com/google/gwt/dev/etc/**\
+:com/google/gwt/dev/generator/**\
+:com/google/gwt/dev/javac/**\
+:com/google/gwt/dev/jdt/**\
+:com/google/gwt/dev/jjs/*.java\
+:com/google/gwt/dev/jjs/ast/**\
+:com/google/gwt/dev/jjs/impl/**\
+:com/google/gwt/dev/js/**\
+:com/google/gwt/dev/resource/**\
+:com/google/gwt/dev/shell/**\
+:com/google/gwt/dev/util/**\
+:com/google/gwt/resources/css/**\
+:com/google/gwt/resources/ext/**\
+:com/google/gwt/resources/rg/**\
+:com/google/gwt/user/linker/**\
+:com/google/gwt/util/**\
+:**/rebind/**\
+:**/remote/**\
+:**/server/**\
+:**/tools/**\
+:com/google/gwt/junit/*.java\
+:com/google/gwt/junit/client/GWTTestCase.java\
+:com/google/gwt/junit/client/impl/GWTRunner.java\
+:com/google/gwt/user/client/rpc/core/java/util/LinkedHashMap_CustomFieldSerializer.java\
 
 ##############################################
 #new Api
 
 dirRoot_new ./
 name_new gwt16userApi
-#sourceFiles and excludedFiles are specified as colon-separated list of files
+#sourceFiles is specified as colon-separated list of files
 sourceFiles_new dev/core/super\
 :user/src\
 :user/super\
@@ -36,14 +51,10 @@
 excludedFiles_new user/src/com/google/gwt/benchmarks/BenchmarkReport.java\
 :user/src/com/google/gwt/benchmarks/BenchmarkShell.java\
 :user/src/com/google/gwt/benchmarks/client/Benchmark.java\
-:**/rebind\
-:**/server\
-:**/tools\
-:user/src/com/google/gwt/junit/GWTMockUtilities.java\
-:user/src/com/google/gwt/junit/GWTDummyBridge.java\
-:user/src/com/google/gwt/junit/JUnitMessageQueue.java\
-:user/src/com/google/gwt/junit/JUnitShell.java\
-:user/src/com/google/gwt/junit/RunStyle*.java\
+:**/rebind/**\
+:**/server/**\
+:**/tools/**\
+:user/src/com/google/gwt/junit/*.java\
 :user/src/com/google/gwt/junit/client/GWTTestCase.java\
 :user/src/com/google/gwt/junit/client/impl/GWTRunner.java\
 :user/src/com/google/gwt/junit/remote\
diff --git a/tools/api-checker/reference/README b/tools/api-checker/reference/README
new file mode 100644
index 0000000..2e511ae
--- /dev/null
+++ b/tools/api-checker/reference/README
@@ -0,0 +1,2 @@
+gwt-dev-linux.jar and gwt-user.jar were extracted from http://google-web-toolkit.googlecode.com/files/gwt-linux-1.5.3.tar.bz2
+run ./createApiCheckerReferenceJars.sh
diff --git a/tools/api-checker/reference/createApiCheckerReferenceJars.sh b/tools/api-checker/reference/createApiCheckerReferenceJars.sh
new file mode 100644
index 0000000..275f19a
--- /dev/null
+++ b/tools/api-checker/reference/createApiCheckerReferenceJars.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+showhelp() {
+  echo >&2 "usage: ./createModifiedJars.sh"
+  echo >&2 "(1) checks for the existence of gwt-dev-*.jar and gwt-user.jar"
+  echo >&2 "(2) creates gwt-dev-modified.jar and gwt-user-modified.jar (to be used by api-checker) by only including .java files in com/google/gwt"
+  exit 1
+}
+
+for file in gwt-dev-*.jar gwt-user.jar
+do 
+  if [ ! -f $file ]
+  then
+    echo "[$file] not found - Aborting"
+    showhelp
+  fi
+done
+
+# unpack files in a temporary dir, create a new jar file with only .java files in com/google/gwt
+for file in gwt-dev-*.jar gwt-user.jar
+do
+  TEMP_DIR=tmp 
+  rm -rf ${TEMP_DIR}
+  mkdir ${TEMP_DIR}
+  cd ${TEMP_DIR} 
+  jar -xf ../${file}
+  MODIFIED_FILE=gwt-user-modified.jar
+  if [ $file != gwt-user.jar ] 
+  then 
+    MODIFIED_FILE=gwt-dev-modified.jar
+  fi 
+  jar -cf ../${MODIFIED_FILE} `find com/google/gwt -name *.java`
+  cd ..
+  rm -rf ${TEMP_DIR} 
+done
diff --git a/tools/api-checker/reference/gwt-dev-modified.jar b/tools/api-checker/reference/gwt-dev-modified.jar
new file mode 100644
index 0000000..a03958a
--- /dev/null
+++ b/tools/api-checker/reference/gwt-dev-modified.jar
Binary files differ
diff --git a/tools/api-checker/reference/gwt-user-modified.jar b/tools/api-checker/reference/gwt-user-modified.jar
new file mode 100644
index 0000000..b49d27e
--- /dev/null
+++ b/tools/api-checker/reference/gwt-user-modified.jar
Binary files differ
diff --git a/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java b/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java
index 655f6c1..fac9892 100644
--- a/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java
+++ b/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiCompatibilityChecker.java
@@ -198,17 +198,24 @@
    * Class that specifies a set of {@link CompilationUnit} read from jar files.
    */
   private static class JarFileCompilationUnits extends CompilationUnits {
-    private final Set<String> excludedPaths;
     private final Set<String> includedPaths;
     private final JarFile jarFiles[];
     private Set<CompilationUnit> units = null;
+    private final ZipScanner excludeScanner;
 
     JarFileCompilationUnits(JarFile[] jarFiles, Set<String> includedPaths,
         Set<String> excludedPaths, TreeLogger logger) {
       super(logger);
       this.jarFiles = jarFiles;
       this.includedPaths = includedPaths;
-      this.excludedPaths = excludedPaths;
+
+      // initialize the ant scanner
+      excludeScanner = new ZipScanner();
+      List<String> list = new ArrayList<String>(excludedPaths);
+      excludeScanner.setIncludes(list.toArray(new String[0]));
+      excludeScanner.addDefaultExcludes();
+      excludeScanner.setCaseSensitive(true);
+      excludeScanner.init();
     }
 
     @Override
@@ -276,17 +283,14 @@
     }
 
     private boolean isIncluded(String fileName) {
-      int index = fileName.length();
-      do {
-        fileName = fileName.substring(0, index);
-        if (includedPaths.contains(fileName)) {
+      if (excludeScanner.match(fileName)) {
+        return false;
+      }
+      for (String includedPath : includedPaths) {
+        if (fileName.startsWith(includedPath)) {
           return true;
         }
-        if (excludedPaths.contains(fileName)) {
-          return false;
-        }
-        index = fileName.lastIndexOf("/");
-      } while (index != -1);
+      }
       return false;
     }
   }
@@ -769,7 +773,7 @@
     sb.append("name             specifies how the api should be refered to in the output\n");
     sb.append("dirRoot          optional argument that specifies the base directory of all other file/directory names\n");
     sb.append("sourceFiles      a colon-separated list of files/directories that specify the roots of the the filesystem trees to be included.\n");
-    sb.append("excludeFiles     a colon-separated lists of files/directories that specify the roots of the filesystem trees to be excluded");
+    sb.append("excludeFiles     a colon-separated lists of ant patterns to exclude");
 
     sb.append("\n\n");
     sb.append("Example api.conf file:\n");
@@ -779,7 +783,7 @@
     sb.append("\n");
     sb.append("sourceFiles_old  dev/core/super:user/super:user/src");
     sb.append("\n");
-    sb.append("excludeFiles_old user/super/com/google/gwt/junit");
+    sb.append("excludeFiles_old user/super/com/google/gwt/junit/*.java");
     sb.append("\n\n");
 
     sb.append("name_new         gwtEmulatorCopy");
@@ -788,7 +792,7 @@
     sb.append("\n");
     sb.append("sourceFiles_new  dev/core:user/super:user/src");
     sb.append("\n");
-    sb.append("excludeFiles_new user/super/com/google/gwt/junit");
+    sb.append("excludeFiles_new user/super/com/google/gwt/junit/*.java");
     sb.append("\n\n");
 
     System.err.println(sb.toString());