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());