diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:16 -0800 |
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:16 -0800 |
| commit | d4aee0c0caa00aa02d4c50ed28151591ac0456b5 (patch) | |
| tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /tools/idegen/src/Configuration.java | |
| parent | d2f2b1d7b77d06bce8cf9340171cf6c25cd720c4 (diff) | |
| download | android_development-d4aee0c0caa00aa02d4c50ed28151591ac0456b5.tar.gz android_development-d4aee0c0caa00aa02d4c50ed28151591ac0456b5.tar.bz2 android_development-d4aee0c0caa00aa02d4c50ed28151591ac0456b5.zip | |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'tools/idegen/src/Configuration.java')
| -rw-r--r-- | tools/idegen/src/Configuration.java | 263 |
1 files changed, 0 insertions, 263 deletions
diff --git a/tools/idegen/src/Configuration.java b/tools/idegen/src/Configuration.java deleted file mode 100644 index 392cb5d26..000000000 --- a/tools/idegen/src/Configuration.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.File; -import java.io.IOException; -import java.io.BufferedReader; -import java.io.FileReader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; -import java.util.SortedSet; -import java.util.regex.Pattern; - -/** - * Immutable representation of an IDE configuration. Assumes that the current - * directory is the project's root directory. - */ -public class Configuration { - - /** Java source tree roots. */ - public final SortedSet<File> sourceRoots; - - /** Found .jar files (that weren't excluded). */ - public final List<File> jarFiles; - - /** Excluded directories which may or may not be under a source root. */ - public final SortedSet<File> excludedDirs; - - /** The root directory for this tool. */ - public final File toolDirectory; - - /** File name used for excluded path files. */ - private static final String EXCLUDED_PATHS = "excluded-paths"; - - /** - * Constructs a Configuration by traversing the directory tree, looking - * for .java and .jar files and identifying source roots. - */ - public Configuration() throws IOException { - this.toolDirectory = new File("development/tools/idegen"); - if (!toolDirectory.isDirectory()) { - // The wrapper script should have already verified this. - throw new AssertionError("Not in root directory."); - } - - Stopwatch stopwatch = new Stopwatch(); - - Excludes excludes = readExcludes(); - - stopwatch.reset("Read excludes"); - - List<File> jarFiles = new ArrayList<File>(500); - SortedSet<File> excludedDirs = new TreeSet<File>(); - SortedSet<File> sourceRoots = new TreeSet<File>(); - - traverse(new File("."), sourceRoots, jarFiles, excludedDirs, excludes); - - stopwatch.reset("Traversed tree"); - - Log.debug(sourceRoots.size() + " source roots"); - Log.debug(jarFiles.size() + " jar files"); - Log.debug(excludedDirs.size() + " excluded dirs"); - - this.sourceRoots = Collections.unmodifiableSortedSet(sourceRoots); - this.jarFiles = Collections.unmodifiableList(jarFiles); - this.excludedDirs = Collections.unmodifiableSortedSet(excludedDirs); - } - - /** - * Reads excluded path files. - */ - private Excludes readExcludes() throws IOException { - List<Pattern> patterns = new ArrayList<Pattern>(); - - File globalExcludes = new File(toolDirectory, EXCLUDED_PATHS); - parseFile(globalExcludes, patterns); - - // Look for Google-specific excludes. - // TODO: Traverse all vendor-specific directories. - File googleExcludes = new File("./vendor/google/" + EXCLUDED_PATHS); - if (googleExcludes.exists()) { - parseFile(googleExcludes, patterns); - } - - // Look for user-specific excluded-paths file in current directory. - File localExcludes = new File(EXCLUDED_PATHS); - if (localExcludes.exists()) { - parseFile(localExcludes, patterns); - } - - return new Excludes(patterns); - } - - /** - * Recursively finds .java source roots, .jar files, and excluded - * directories. - */ - private static void traverse(File directory, Set<File> sourceRoots, - Collection<File> jarFiles, Collection<File> excludedDirs, - Excludes excludes) throws IOException { - /* - * Note it would be faster to stop traversing a source root as soon as - * we encounter the first .java file, but it appears we have nested - * source roots in our generated source directory (specifically, - * R.java files and aidl .java files don't share the same source - * root). - */ - - boolean firstJavaFile = true; - for (File file : directory.listFiles()) { - // Trim preceding "./" from path. - String path = file.getPath().substring(2); - - // Keep track of source roots for .java files. - if (path.endsWith(".java")) { - if (firstJavaFile) { - // Only parse one .java file per directory. - firstJavaFile = false; - - File sourceRoot = rootOf(file); - if (sourceRoot != null) { - sourceRoots.add(sourceRoot); - } - } - - continue; - } - - // Keep track of .jar files. - if (path.endsWith(".jar")) { - if (!excludes.exclude(path)) { - jarFiles.add(file); - } else { - Log.debug("Skipped: " + file); - } - - continue; - } - - // Traverse nested directories. - if (file.isDirectory()) { - if (excludes.exclude(path)) { - // Don't recurse into excluded dirs. - Log.debug("Excluding: " + path); - excludedDirs.add(file); - } else { - traverse(file, sourceRoots, jarFiles, excludedDirs, - excludes); - } - } - } - } - - /** - * Determines the source root for a given .java file. Returns null - * if the file doesn't have a package or if the file isn't in the - * correct directory structure. - */ - private static File rootOf(File javaFile) throws IOException { - String packageName = parsePackageName(javaFile); - if (packageName == null) { - // No package. - // TODO: Treat this as a source root? - return null; - } - - String packagePath = packageName.replace('.', File.separatorChar); - File parent = javaFile.getParentFile(); - String parentPath = parent.getPath(); - if (!parentPath.endsWith(packagePath)) { - // Bad dir structure. - return null; - } - - return new File(parentPath.substring( - 0, parentPath.length() - packagePath.length())); - } - - /** - * Reads a Java file and parses out the package name. Returns null if none - * found. - */ - private static String parsePackageName(File file) throws IOException { - BufferedReader in = new BufferedReader(new FileReader(file)); - try { - String line; - while ((line = in.readLine()) != null) { - String trimmed = line.trim(); - if (trimmed.startsWith("package")) { - // TODO: Make this more robust. - // Assumes there's only once space after "package" and the - // line ends in a ";". - return trimmed.substring(8, trimmed.length() - 1); - } - } - - return null; - } finally { - in.close(); - } - } - - /** - * Picks out excluded directories that are under source roots. - */ - public SortedSet<File> excludesUnderSourceRoots() { - // TODO: Refactor this to share the similar logic in - // Eclipse.constructExcluding(). - SortedSet<File> picked = new TreeSet<File>(); - for (File sourceRoot : sourceRoots) { - String sourcePath = sourceRoot.getPath() + "/"; - SortedSet<File> tailSet = excludedDirs.tailSet(sourceRoot); - for (File file : tailSet) { - if (file.getPath().startsWith(sourcePath)) { - picked.add(file); - } else { - break; - } - } - } - return picked; - } - - /** - * Reads a list of regular expressions from a file, one per line, and adds - * the compiled patterns to the given collection. Ignores lines starting - * with '#'. - * - * @param file containing regular expressions, one per line - * @param patterns collection to add compiled patterns from file to - */ - public static void parseFile(File file, Collection<Pattern> patterns) - throws IOException { - BufferedReader in = new BufferedReader(new FileReader(file)); - try { - String line; - while ((line = in.readLine()) != null) { - String trimmed = line.trim(); - if (trimmed.length() > 0 && !trimmed.startsWith("#")) { - patterns.add(Pattern.compile(trimmed)); - } - } - } finally { - in.close(); - } - } -} |
