Support "excludePackages" as a way to logically exclude packages from API checking whose source files must be available to create a consistent TypeOracle. Review by: amitmanjhi (postmortem) git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@3359 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiContainer.java b/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiContainer.java index 603812e..80f65e75 100644 --- a/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiContainer.java +++ b/tools/api-checker/src/com/google/gwt/tools/apichecker/ApiContainer.java
@@ -56,7 +56,8 @@ private Map<JClassType, Boolean> apiClassCache = new HashMap<JClassType, Boolean>(); private Map<String, ApiPackage> apiPackages = new HashMap<String, ApiPackage>(); - private Map<String, String> excludedFiles = null; + private Set<String> excludedFiles = null; + private Set<String> excludedPackages = null; private TreeLogger logger = null; private String name = null; @@ -89,10 +90,14 @@ String apiName = config.getProperty("name" + suffix); String allSourceFiles = config.getProperty("sourceFiles" + suffix); String allExcludedFiles = config.getProperty("excludedFiles" + suffix); - if (allExcludedFiles == null) { allExcludedFiles = ""; } + String allExcludedPackages = config.getProperty("excludedPackages"); + if (allExcludedPackages == null) { + allExcludedPackages = ""; + } + if (apiName == null || allSourceFiles == null) { throw new IllegalArgumentException( "in apiContainer constructor, either name (" + apiName @@ -100,7 +105,8 @@ } logger.log(TreeLogger.DEBUG, "read from config file " + fileName + ", name = " + apiName + ", allSourceFiles = " + allSourceFiles - + ", allExcludedFiles = " + allExcludedFiles, null); + + ", allExcludedFiles = " + allExcludedFiles + + ", allExcludedPackages = " + allExcludedPackages, null); String dirRoot = config.getProperty("dirRoot" + suffix); if (dirRoot == null) { @@ -115,16 +121,16 @@ } logger.log(TreeLogger.DEBUG, "fileCollection " + fileCollection, null); this.sourceTrees = fileCollection; - if (allExcludedFiles.equals("")) { - this.excludedFiles = generateCanonicalHashmap(new String[0], dirRoot); - } else { - String excludedFilesArray[] = allExcludedFiles.split(":"); - for (String excludedFile : excludedFilesArray) { - checkFileExistence("excluded file: ", dirRoot + excludedFile); - } - this.excludedFiles = generateCanonicalHashmap(excludedFilesArray, - dirRoot); + + String excludedFilesArray[] = allExcludedFiles.split(":"); + for (String excludedFile : excludedFilesArray) { + checkFileExistence("excluded file: ", dirRoot + excludedFile); } + this.excludedFiles = generateCanonicalFileSet(excludedFilesArray, dirRoot); + + String excludedPackagesArray[] = allExcludedPackages.split(":"); + this.excludedPackages = new HashSet<String>( + Arrays.asList(excludedPackagesArray)); this.name = apiName; createTypeOracleFromSources(); initializeApiPackages(); @@ -292,6 +298,10 @@ * Notes: -- A class with only private constructors can be an API class. */ private boolean computeIsApiClass(JClassType classType) { + if (excludedPackages.contains(classType.getPackage().getName())) { + return false; + } + // check for outer classes if (isPublicOuterClass(classType)) { return true; @@ -359,19 +369,19 @@ /** * Convert a set into a HashMap for faster lookups. */ - private HashMap<String, String> generateCanonicalHashmap(String strArray[], - String dirRoot) throws IOException { - HashMap<String, String> tempMap = new HashMap<String, String>(); + private Set<String> generateCanonicalFileSet(String strArray[], String dirRoot) + throws IOException { + Set<String> result = new HashSet<String>(); if (strArray == null) { - return tempMap; + return result; } for (String str : strArray) { str = str.trim(); File tempFile = new File(dirRoot + str); str = tempFile.getCanonicalPath(); - tempMap.put(str, str); + result.add(str); } - return tempMap; + return result; } private boolean hasPublicOrProtectedConstructor(JClassType classType) { @@ -452,7 +462,7 @@ if (fileName.indexOf(pattern) == 0) { fileName = fileName.substring(pattern.length()); } - return (excludedFiles.get(fileName) != null); + return excludedFiles.contains(fileName); } /**