http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/f954e6f6/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/DirectoryScanner.as ---------------------------------------------------------------------- diff --git a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/DirectoryScanner.as b/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/DirectoryScanner.as deleted file mode 100644 index c28ebae..0000000 --- a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/DirectoryScanner.as +++ /dev/null @@ -1,1773 +0,0 @@ -/* -* Licensed to the Apache Software Foundation (ASF) under one or more -* contributor license agreements. See the NOTICE file distributed with -* this work for additional information regarding copyright ownership. -* The ASF licenses this file to You 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. -* -*/ - -package org.apache.flex.ant.tags.filesetClasses -{ - import flash.filesystem.File; - import flash.utils.Dictionary; - - import org.apache.flex.ant.Ant; - import org.apache.flex.ant.tags.filesetClasses.Resource; - import org.apache.flex.ant.tags.filesetClasses.SelectorUtils; - import org.apache.flex.ant.tags.filesetClasses.exceptions.BuildException; - import org.apache.flex.ant.tags.filesetClasses.exceptions.IOException; - import org.apache.flex.ant.tags.filesetClasses.exceptions.IllegalStateException; - - /** - * Ported from org.apache.tools.ant.DirectoryScanner.java on 12/3/13. - * Class for scanning a directory for files/directories which match certain - * criteria. - * <p> - * These criteria consist of selectors and patterns which have been specified. - * With the selectors you can select which files you want to have included. - * Files which are not selected are excluded. With patterns you can include - * or exclude files based on their filename. - * <p> - * The idea is simple. A given directory is recursively scanned for all files - * and directories. Each file/directory is matched against a set of selectors, - * including special support for matching against filenames with include and - * and exclude patterns. Only files/directories which match at least one - * pattern of the include pattern list or other file selector, and don't match - * any pattern of the exclude pattern list or fail to match against a required - * selector will be placed in the list of files/directories found. - * <p> - * When no list of include patterns is supplied, "**" will be used, which - * means that everything will be matched. When no list of exclude patterns is - * supplied, an empty list is used, such that nothing will be excluded. When - * no selectors are supplied, none are applied. - * <p> - * The filename pattern matching is done as follows: - * The name to be matched is split up in path segments. A path segment is the - * name of a directory or file, which is bounded by - * <code>File.separator</code> ('/' under UNIX, '\' under Windows). - * For example, "abc/def/ghi/xyz.java" is split up in the segments "abc", - * "def","ghi" and "xyz.java". - * The same is done for the pattern against which should be matched. - * <p> - * The segments of the name and the pattern are then matched against each - * other. When '**' is used for a path segment in the pattern, it matches - * zero or more path segments of the name. - * <p> - * There is a special case regarding the use of <code>File.separator</code>s - * at the beginning of the pattern and the string to match:<br> - * When a pattern starts with a <code>File.separator</code>, the string - * to match must also start with a <code>File.separator</code>. - * When a pattern does not start with a <code>File.separator</code>, the - * string to match may not start with a <code>File.separator</code>. - * When one of these rules is not obeyed, the string will not - * match. - * <p> - * When a name path segment is matched against a pattern path segment, the - * following special characters can be used:<br> - * '*' matches zero or more characters<br> - * '?' matches one character. - * <p> - * Examples: - * <p> - * "**\*.class" matches all .class files/dirs in a directory tree. - * <p> - * "test\a??.java" matches all files/dirs which start with an 'a', then two - * more characters and then ".java", in a directory called test. - * <p> - * "**" matches everything in a directory tree. - * <p> - * "**\test\**\XYZ*" matches all files/dirs which start with "XYZ" and where - * there is a parent directory called test (e.g. "abc\test\def\ghi\XYZ123"). - * <p> - * Case sensitivity may be turned off if necessary. By default, it is - * turned on. - * <p> - * Example of usage: - * <pre> - * String[] includes = {"**\\*.class"}; - * String[] excludes = {"modules\\*\\**"}; - * ds.setIncludes(includes); - * ds.setExcludes(excludes); - * ds.setBasedir(new File("test")); - * ds.setCaseSensitive(true); - * ds.scan(); - * - * System.out.println("FILES:"); - * String[] files = ds.getIncludedFiles(); - * for (int i = 0; i < files.length; i++) { - * System.out.println(files[i]); - * } - * </pre> - * This will scan a directory called test for .class files, but excludes all - * files in all proper subdirectories of a directory called "modules" - * - */ - public class DirectoryScanner - /* implements FileScanner, SelectorScanner, ResourceFactory*/ { - - /** - * Patterns which should be excluded by default. - * - * <p>Note that you can now add patterns to the list of default - * excludes. Added patterns will not become part of this array - * that has only been kept around for backwards compatibility - * reasons.</p> - * - * @deprecated since 1.6.x. - * Use the {@link #getDefaultExcludes getDefaultExcludes} - * method instead. - */ - protected static const DEFAULTEXCLUDES:Vector.<String> = Vector.<String>([ - // Miscellaneous typical temporary files - SelectorUtils.DEEP_TREE_MATCH + "/*~", - SelectorUtils.DEEP_TREE_MATCH + "/#*#", - SelectorUtils.DEEP_TREE_MATCH + "/.#*", - SelectorUtils.DEEP_TREE_MATCH + "/%*%", - SelectorUtils.DEEP_TREE_MATCH + "/._*", - - // CVS - SelectorUtils.DEEP_TREE_MATCH + "/CVS", - SelectorUtils.DEEP_TREE_MATCH + "/CVS/" + SelectorUtils.DEEP_TREE_MATCH, - SelectorUtils.DEEP_TREE_MATCH + "/.cvsignore", - - // SCCS - SelectorUtils.DEEP_TREE_MATCH + "/SCCS", - SelectorUtils.DEEP_TREE_MATCH + "/SCCS/" + SelectorUtils.DEEP_TREE_MATCH, - - // Visual SourceSafe - SelectorUtils.DEEP_TREE_MATCH + "/vssver.scc", - - // Subversion - SelectorUtils.DEEP_TREE_MATCH + "/.svn", - SelectorUtils.DEEP_TREE_MATCH + "/.svn/" + SelectorUtils.DEEP_TREE_MATCH, - - // Git - SelectorUtils.DEEP_TREE_MATCH + "/.git", - SelectorUtils.DEEP_TREE_MATCH + "/.git/" + SelectorUtils.DEEP_TREE_MATCH, - SelectorUtils.DEEP_TREE_MATCH + "/.gitattributes", - SelectorUtils.DEEP_TREE_MATCH + "/.gitignore", - SelectorUtils.DEEP_TREE_MATCH + "/.gitmodules", - - // Mercurial - SelectorUtils.DEEP_TREE_MATCH + "/.hg", - SelectorUtils.DEEP_TREE_MATCH + "/.hg/" + SelectorUtils.DEEP_TREE_MATCH, - SelectorUtils.DEEP_TREE_MATCH + "/.hgignore", - SelectorUtils.DEEP_TREE_MATCH + "/.hgsub", - SelectorUtils.DEEP_TREE_MATCH + "/.hgsubstate", - SelectorUtils.DEEP_TREE_MATCH + "/.hgtags", - - // Bazaar - SelectorUtils.DEEP_TREE_MATCH + "/.bzr", - SelectorUtils.DEEP_TREE_MATCH + "/.bzr/" + SelectorUtils.DEEP_TREE_MATCH, - SelectorUtils.DEEP_TREE_MATCH + "/.bzrignore", - - // Mac - SelectorUtils.DEEP_TREE_MATCH + "/.DS_Store" - ]); - - /** - * default value for {@link #maxLevelsOfSymlinks maxLevelsOfSymlinks} - * @since Ant 1.8.0 - */ - public static const MAX_LEVELS_OF_SYMLINKS:int = 5; - /** - * The end of the exception message if something that should be - * there doesn't exist. - */ - public static const DOES_NOT_EXIST_POSTFIX:String = " does not exist."; - - /** Helper. */ - private static const FILE_UTILS:FileUtils = FileUtils.getFileUtils(); - - /** - * Patterns which should be excluded by default. - * - * @see #addDefaultExcludes() - */ - private static const defaultExcludes:Vector.<String> = resetDefaultExcludes(); - - // CheckStyle:VisibilityModifier OFF - bc - - /** The base directory to be scanned. */ - protected var basedir:File; - - /** The patterns for the files to be included. */ - protected var includes:Vector.<String>; - - /** The patterns for the files to be excluded. */ - protected var excludes:Vector.<String>; - - /** Selectors that will filter which files are in our candidate list. */ - protected var selectors:Vector.<FileSelector> = null; - - /** - * The files which matched at least one include and no excludes - * and were selected. - */ - protected var filesIncluded:Vector.<String>; - - /** The files which did not match any includes or selectors. */ - protected var filesNotIncluded:Vector.<String>; - - /** - * The files which matched at least one include and at least - * one exclude. - */ - protected var filesExcluded:Vector.<String>; - - /** - * The directories which matched at least one include and no excludes - * and were selected. - */ - protected var dirsIncluded:Vector.<String>; - - /** The directories which were found and did not match any includes. */ - protected var dirsNotIncluded:Vector.<String>; - - /** - * The directories which matched at least one include and at least one - * exclude. - */ - protected var dirsExcluded:Vector.<String>; - - /** - * The files which matched at least one include and no excludes and - * which a selector discarded. - */ - protected var filesDeselected:Vector.<String>; - - /** - * The directories which matched at least one include and no excludes - * but which a selector discarded. - */ - protected var dirsDeselected:Vector.<String>; - - /** Whether or not our results were built by a slow scan. */ - protected var haveSlowResults:Boolean = false; - - /** - * Whether or not the file system should be treated as a case sensitive - * one. - */ - protected var _isCaseSensitive:Boolean = true; - - /** - * Whether a missing base directory is an error. - * @since Ant 1.7.1 - */ - protected var errorOnMissingDir:Boolean = true; - - /** - * Whether or not symbolic links should be followed. - * - * @since Ant 1.5 - */ - private var followSymlinks:Boolean = true; - - /** Whether or not everything tested so far has been included. */ - protected var everythingIncluded:Boolean = true; - - // CheckStyle:VisibilityModifier ON - - /** - * List of all scanned directories. - * - * @since Ant 1.6 - */ - private var scannedDirs:Vector.<String> = new Vector.<String>(); - - /** - * Map of all include patterns that are full file names and don't - * contain any wildcards. - * - * <p>Maps pattern string to TokenizedPath.</p> - * - * <p>If this instance is not case sensitive, the file names get - * turned to upper case.</p> - * - * <p>Gets lazily initialized on the first invocation of - * isIncluded or isExcluded and cleared at the end of the scan - * method (cleared in clearCaches, actually).</p> - * - * @since Ant 1.8.0 - */ - private var includeNonPatterns:Object = {}; //new HashMap<String, TokenizedPath>(); - - /** - * Map of all exclude patterns that are full file names and don't - * contain any wildcards. - * - * <p>Maps pattern string to TokenizedPath.</p> - * - * <p>If this instance is not case sensitive, the file names get - * turned to upper case.</p> - * - * <p>Gets lazily initialized on the first invocation of - * isIncluded or isExcluded and cleared at the end of the scan - * method (cleared in clearCaches, actually).</p> - * - * @since Ant 1.8.0 - */ - private var excludeNonPatterns:Object = {}; //new HashMap<String, TokenizedPath>(); - - /** - * Array of all include patterns that contain wildcards. - * - * <p>Gets lazily initialized on the first invocation of - * isIncluded or isExcluded and cleared at the end of the scan - * method (cleared in clearCaches, actually).</p> - */ - private var includePatterns:Vector.<TokenizedPattern>; - - /** - * Array of all exclude patterns that contain wildcards. - * - * <p>Gets lazily initialized on the first invocation of - * isIncluded or isExcluded and cleared at the end of the scan - * method (cleared in clearCaches, actually).</p> - */ - private var excludePatterns:Vector.<TokenizedPattern>; - - /** - * Have the non-pattern sets and pattern arrays for in- and - * excludes been initialized? - * - * @since Ant 1.6.3 - */ - private var areNonPatternSetsReady:Boolean = false; - - /** - * Scanning flag. - * - * @since Ant 1.6.3 - */ - private var scanning:Boolean = false; - - /** - * Scanning lock. - * - * @since Ant 1.6.3 - */ - private var scanLock:Object = new Object(); - - /** - * Slow scanning flag. - * - * @since Ant 1.6.3 - */ - private var slowScanning:Boolean = false; - - /** - * Slow scanning lock. - * - * @since Ant 1.6.3 - */ - private var slowScanLock:Object = new Object(); - - /** - * Exception thrown during scan. - * - * @since Ant 1.6.3 - */ - private var illegal:IllegalStateException = null; - - /** - * The maximum number of times a symbolic link may be followed - * during a scan. - * - * @since Ant 1.8.0 - */ - private var maxLevelsOfSymlinks:int = MAX_LEVELS_OF_SYMLINKS; - - - /** - * Absolute paths of all symlinks that haven't been followed but - * would have been if followsymlinks had been true or - * maxLevelsOfSymlinks had been higher. - * - * @since Ant 1.8.0 - */ - private var notFollowedSymlinks:Vector.<String> = new Vector.<String>(); - - /** - * Sole constructor. - */ - public function DirectoryScanner() { - } - - /** - * Test whether or not a given path matches the start of a given - * pattern up to the first "**". - * <p> - * This is not a general purpose test and should only be used if you - * can live with false positives. For example, <code>pattern=**\a</code> - * and <code>str=b</code> will yield <code>true</code>. - * - * @param pattern The pattern to match against. Must not be - * <code>null</code>. - * @param str The path to match, as a String. Must not be - * <code>null</code>. - * @param isCaseSensitive Whether or not matching should be performed - * case sensitively. - * - * @return whether or not a given path matches the start of a given - * pattern up to the first "**". - */ - protected static function matchPatternStart(pattern:String, str:String, - isCaseSensitive:Boolean = true):Boolean { - return SelectorUtils.matchPatternStart(pattern, str, isCaseSensitive); - } - - /** - * Test whether or not a given path matches a given pattern. - * - * @param pattern The pattern to match against. Must not be - * <code>null</code>. - * @param str The path to match, as a String. Must not be - * <code>null</code>. - * @param isCaseSensitive Whether or not matching should be performed - * case sensitively. - * - * @return <code>true</code> if the pattern matches against the string, - * or <code>false</code> otherwise. - */ - protected static function matchPath(pattern:String, str:String, - isCaseSensitive:Boolean = true):Boolean { - return SelectorUtils.matchPath(pattern, str, isCaseSensitive); - } - - /** - * Test whether or not a string matches against a pattern. - * The pattern may contain two special characters:<br> - * '*' means zero or more characters<br> - * '?' means one and only one character - * - * @param pattern The pattern to match against. - * Must not be <code>null</code>. - * @param str The string which must be matched against the pattern. - * Must not be <code>null</code>. - * @param isCaseSensitive Whether or not matching should be performed - * case sensitively. - * - * - * @return <code>true</code> if the string matches against the pattern, - * or <code>false</code> otherwise. - */ - protected static function match(pattern:String, str:String, - isCaseSensitive:Boolean = true):Boolean{ - return SelectorUtils.match(pattern, str, isCaseSensitive); - } - - - /** - * Get the list of patterns that should be excluded by default. - * - * @return An array of <code>String</code> based on the current - * contents of the <code>defaultExcludes</code> - * <code>Set</code>. - * - * @since Ant 1.6 - */ - public static function getDefaultExcludes():Vector.<String> { - return defaultExcludes.slice(); - } - - /** - * Add a pattern to the default excludes unless it is already a - * default exclude. - * - * @param s A string to add as an exclude pattern. - * @return <code>true</code> if the string was added; - * <code>false</code> if it already existed. - * - * @since Ant 1.6 - */ - public static function addDefaultExclude(s:String):Boolean { - if (defaultExcludes.indexOf(s) == -1) - { - defaultExcludes.push(s); - return true; - } - return false; - } - - /** - * Remove a string if it is a default exclude. - * - * @param s The string to attempt to remove. - * @return <code>true</code> if <code>s</code> was a default - * exclude (and thus was removed); - * <code>false</code> if <code>s</code> was not - * in the default excludes list to begin with. - * - * @since Ant 1.6 - */ - public static function removeDefaultExclude(s:String):Boolean { - var index:int = defaultExcludes.indexOf(s); - if (index == -1) - return false; - defaultExcludes.splice(index, 1); - return true; - } - - /** - * Go back to the hardwired default exclude patterns. - * - * @since Ant 1.6 - */ - public static function resetDefaultExcludes():Vector.<String> { - var arr:Vector.<String> = defaultExcludes; - if (!arr) - arr = new Vector.<String>(); - arr.length = 0; - for (var i:int = 0; i < DEFAULTEXCLUDES.length; i++) { - arr.push(DEFAULTEXCLUDES[i]); - } - return arr; - } - - /** - * Set the base directory to be scanned. This is the directory which is - * scanned recursively. All '/' and '\' characters are replaced by - * <code>File.separatorChar</code>, so the separator used need not match - * <code>File.separatorChar</code>. - * - * @param basedir The base directory to scan. - */ - public function setBasedir(basedir:Object):void { - if (basedir is File) - setBasedirFile(basedir as File); - else - setBasedirFile(basedir == null ? null - : new File(basedir.replace('/', File.separator).replace( - '\\', File.separator))); - } - - /** - * Set the base directory to be scanned. This is the directory which is - * scanned recursively. - * - * @param basedir The base directory for scanning. - */ - public function setBasedirFile(basedir:File):void { - this.basedir = basedir; - } - - /** - * Return the base directory to be scanned. - * This is the directory which is scanned recursively. - * - * @return the base directory to be scanned. - */ - public function getBasedir():File { - return basedir; - } - - /** - * Find out whether include exclude patterns are matched in a - * case sensitive way. - * @return whether or not the scanning is case sensitive. - * @since Ant 1.6 - */ - public function isCaseSensitive():Boolean { - return _isCaseSensitive; - } - - /** - * Set whether or not include and exclude patterns are matched - * in a case sensitive way. - * - * @param isCaseSensitive whether or not the file system should be - * regarded as a case sensitive one. - */ - public function setCaseSensitive(isCaseSensitive:Boolean):void { - _isCaseSensitive = isCaseSensitive; - } - - /** - * Sets whether or not a missing base directory is an error - * - * @param errorOnMissingDir whether or not a missing base directory - * is an error - * @since Ant 1.7.1 - */ - public function setErrorOnMissingDir(errorOnMissingDir:Boolean):void { - this.errorOnMissingDir = errorOnMissingDir; - } - - /** - * Get whether or not a DirectoryScanner follows symbolic links. - * - * @return flag indicating whether symbolic links should be followed. - * - * @since Ant 1.6 - */ - public function isFollowSymlinks():Boolean { - return followSymlinks; - } - - /** - * Set whether or not symbolic links should be followed. - * - * @param followSymlinks whether or not symbolic links should be followed. - */ - public function setFollowSymlinks(followSymlinks:Boolean):void { - this.followSymlinks = followSymlinks; - } - - /** - * The maximum number of times a symbolic link may be followed - * during a scan. - * - * @since Ant 1.8.0 - */ - public function setMaxLevelsOfSymlinks(max:int):void { - maxLevelsOfSymlinks = max; - } - - /** - * Set the list of include patterns to use. All '/' and '\' characters - * are replaced by <code>File.separator</code>, so the separator used - * need not match <code>File.separator</code>. - * <p> - * When a pattern ends with a '/' or '\', "**" is appended. - * - * @param includes A list of include patterns. - * May be <code>null</code>, indicating that all files - * should be included. If a non-<code>null</code> - * list is given, all elements must be - * non-<code>null</code>. - */ - public function setIncludes(includes:Vector.<String>):void { - if (includes == null) { - this.includes = null; - } else { - this.includes = new Vector.<String>(includes.length); - for (var i:int = 0; i < includes.length; i++) { - this.includes[i] = normalizePattern(includes[i]); - } - } - } - - /** - * Set the list of exclude patterns to use. All '/' and '\' characters - * are replaced by <code>File.separator</code>, so the separator used - * need not match <code>File.separator</code>. - * <p> - * When a pattern ends with a '/' or '\', "**" is appended. - * - * @param excludes A list of exclude patterns. - * May be <code>null</code>, indicating that no files - * should be excluded. If a non-<code>null</code> list is - * given, all elements must be non-<code>null</code>. - */ - public function setExcludes(excludes:Vector.<String>):void { - if (excludes == null) { - this.excludes = null; - } else { - this.excludes = new Vector.<String>(excludes.length); - for (var i:int = 0; i < excludes.length; i++) { - this.excludes[i] = normalizePattern(excludes[i]); - } - } - } - - /** - * Add to the list of exclude patterns to use. All '/' and '\' - * characters are replaced by <code>File.separator</code>, so - * the separator used need not match <code>File.separator</code>. - * <p> - * When a pattern ends with a '/' or '\', "**" is appended. - * - * @param excludes A list of exclude patterns. - * May be <code>null</code>, in which case the - * exclude patterns don't get changed at all. - * - * @since Ant 1.6.3 - */ - public function addExcludes(excludes:Vector.<String>):void { - if (excludes != null && excludes.length > 0) { - if (this.excludes != null && this.excludes.length > 0) { - var tmp:Vector.<String> = this.excludes.slice(); - for (var i:int = 0; i < excludes.length; i++) { - tmp.push( - normalizePattern(excludes[i])); - } - this.excludes = tmp; - } else { - setExcludes(excludes); - } - } - } - - /** - * All '/' and '\' characters are replaced by - * <code>File.separator</code>, so the separator used need not - * match <code>File.separator</code>. - * - * <p> When a pattern ends with a '/' or '\', "**" is appended. - * - * @since Ant 1.6.3 - */ - private function normalizePattern(p:String):String { - var pattern:String = p.replace(/\//g, File.separator) - .replace(/\\/g, File.separator); - if (pattern.charAt(pattern.length - 1) == File.separator) { - pattern += SelectorUtils.DEEP_TREE_MATCH; - } - return pattern; - } - - /** - * Set the selectors that will select the filelist. - * - * @param selectors specifies the selectors to be invoked on a scan. - */ - public function setSelectors(selectors:Vector.<FileSelector>):void { - this.selectors = selectors; - } - - /** - * Return whether or not the scanner has included all the files or - * directories it has come across so far. - * - * @return <code>true</code> if all files and directories which have - * been found so far have been included. - */ - public function isEverythingIncluded():Boolean { - return everythingIncluded; - } - - /** - * Scan for files which match at least one include pattern and don't match - * any exclude patterns. If there are selectors then the files must pass - * muster there, as well. Scans under basedir, if set; otherwise the - * include patterns without leading wildcards specify the absolute paths of - * the files that may be included. - * - * @exception IllegalStateException if the base directory was set - * incorrectly (i.e. if it doesn't exist or isn't a directory). - */ - public function scan():void - { - var savedBase:File = basedir; - try { - illegal = null; - clearResults(); - - // set in/excludes to reasonable defaults if needed: - var nullIncludes:Boolean = (includes == null); - includes = nullIncludes - ? Vector.<String>([SelectorUtils.DEEP_TREE_MATCH]) : includes; - var nullExcludes:Boolean = (excludes == null); - excludes = nullExcludes ? new Vector.<String>(0) : excludes; - - if (basedir != null && !followSymlinks - && basedir.isSymbolicLink) { - notFollowedSymlinks.push(basedir.nativePath); - basedir = null; - } - - if (basedir == null) { - // if no basedir and no includes, nothing to do: - if (nullIncludes) { - return; - } - } else { - if (!basedir.exists) { - if (errorOnMissingDir) { - illegal = new IllegalStateException("basedir " - + basedir - + DOES_NOT_EXIST_POSTFIX); - } else { - // Nothing to do - basedir does not exist - return; - } - } else if (!basedir.isDirectory) { - illegal = new IllegalStateException("basedir " - + basedir - + " is not a" - + " directory."); - } - if (illegal != null) { - throw illegal; - } - } - if (isIncludedPath(TokenizedPath.EMPTY_PATH)) { - if (!isExcludedPath(TokenizedPath.EMPTY_PATH)) { - if (isSelected("", basedir)) { - dirsIncluded.push(""); - } else { - dirsDeselected.push(""); - } - } else { - dirsExcluded.push(""); - } - } else { - dirsNotIncluded.push(""); - } - checkIncludePatterns(); - clearCaches(); - includes = nullIncludes ? null : includes; - excludes = nullExcludes ? null : excludes; - } catch (ex:IOException) { - throw new BuildException(ex.message); - } catch (e:Error) { - throw new BuildException(e.message); - } finally { - basedir = savedBase; - } - } - - /** - * This routine is actually checking all the include patterns in - * order to avoid scanning everything under base dir. - * @since Ant 1.6 - */ - private function checkIncludePatterns():void - { - ensureNonPatternSetsReady(); - var newroots:Dictionary = new Dictionary(); - - // put in the newroots map the include patterns without - // wildcard tokens - for (var i:int = 0; i < includePatterns.length; i++) { - var pattern:String = includePatterns[i].toString(); - if (!shouldSkipPattern(pattern)) { - newroots[includePatterns[i].rtrimWildcardTokens()] = - pattern; - } - } - for (var p:String in includeNonPatterns) { - pattern = p; - if (!shouldSkipPattern(pattern)) { - newroots[includeNonPatterns[pattern]] = pattern; - } - } - - if (newroots.hasOwnProperty(TokenizedPath.EMPTY_PATH) - && basedir != null) { - // we are going to scan everything anyway - scandir(basedir, "", true); - } else { - var canonBase:File = null; - if (basedir != null) { - try { - canonBase = new File(basedir.nativePath); - canonBase.canonicalize(); - } catch (ex:IOException) { - throw new BuildException(ex.message); - } - } - // only scan directories that can include matched files or - // directories - for (var entry:Object in newroots) { - var currentPath:TokenizedPath; - currentPath = entry as TokenizedPath; - var currentelement:String = currentPath.toString(); - if (basedir == null - && !FileUtils.isAbsolutePath(currentelement)) { - continue; - } - var myfile:File = new File(basedir.nativePath + File.separator + currentelement); - - if (myfile.exists) { - // may be on a case insensitive file system. We want - // the results to show what's really on the disk, so - // we need to double check. - try { - var myCanonFile:File = new File(myfile.nativePath); - myCanonFile.canonicalize(); - var path:String = (basedir == null) - ? myCanonFile.nativePath - : FILE_UTILS.removeLeadingPath(canonBase, - myCanonFile); - if (path != currentelement) { - myfile = currentPath.findFile(basedir, true); - if (myfile != null && basedir != null) { - currentelement = FILE_UTILS.removeLeadingPath( - basedir, myfile); - if (!currentPath.toString() - == currentelement) { - currentPath = - new TokenizedPath(currentelement); - } - } - } - } catch (ex:IOException) { - throw new BuildException(ex.message); - } - } - - if ((myfile == null || !myfile.exists) && !isCaseSensitive()) { - var f:File = currentPath.findFile(basedir, false); - if (f != null && f.exists) { - // adapt currentelement to the case we've - // actually found - currentelement = (basedir == null) - ? f.nativePath - : FILE_UTILS.removeLeadingPath(basedir, f); - myfile = f; - currentPath = new TokenizedPath(currentelement); - } - } - - if (myfile != null && myfile.exists) { - if (!followSymlinks && currentPath.isSymlink(basedir)) { - if (!isExcludedPath(currentPath)) { - notFollowedSymlinks.push(myfile.nativePath); - } - continue; - } - if (myfile.isDirectory) { - if (isIncludedPath(currentPath) - && currentelement.length > 0) { - accountForIncludedDir(currentPath, myfile, true); - } else { - scandirTokenizedPath(myfile, currentPath, true); - } - } else { - var originalpattern:String; - originalpattern = newroots[entry] as String; - var included:Boolean = isCaseSensitive() - ? originalpattern == currentelement - : originalpattern.toUpperCase() == currentelement.toUpperCase(); - if (included) { - accountForIncludedFile(currentPath, myfile); - } - } - } - } - } - } - - /** - * true if the pattern specifies a relative path without basedir - * or an absolute path not inside basedir. - * - * @since Ant 1.8.0 - */ - private function shouldSkipPattern(pattern:String):Boolean { - if (FileUtils.isAbsolutePath(pattern)) { - //skip abs. paths not under basedir, if set: - if (basedir != null - && !SelectorUtils.matchPatternStart(pattern, - basedir.nativePath, - isCaseSensitive())) { - return true; - } - } else if (basedir == null) { - //skip non-abs. paths if basedir == null: - return true; - } - return false; - } - - /** - * Clear the result caches for a scan. - */ - protected function clearResults():void { - filesIncluded = new Vector.<String>(); - filesNotIncluded = new Vector.<String>(); - filesExcluded = new Vector.<String>(); - filesDeselected = new Vector.<String>(); - dirsIncluded = new Vector.<String>(); - dirsNotIncluded = new Vector.<String>(); - dirsExcluded = new Vector.<String>(); - dirsDeselected = new Vector.<String>(); - everythingIncluded = (basedir != null); - scannedDirs.length = 0; - notFollowedSymlinks.length = 0; - } - - /** - * Top level invocation for a slow scan. A slow scan builds up a full - * list of excluded/included files/directories, whereas a fast scan - * will only have full results for included files, as it ignores - * directories which can't possibly hold any included files/directories. - * <p> - * Returns immediately if a slow scan has already been completed. - */ - protected function slowScan():void - { - try { - // set in/excludes to reasonable defaults if needed: - var nullIncludes:Boolean = (includes == null); - includes = nullIncludes - ? Vector.<String>([SelectorUtils.DEEP_TREE_MATCH]) : includes; - var nullExcludes:Boolean = (excludes == null); - excludes = nullExcludes ? new Vector.<String>(0) : excludes; - - var excl:Vector.<String> = dirsExcluded.slice(); - - var notIncl:Vector.<String> = dirsNotIncluded.slice(); - - ensureNonPatternSetsReady(); - - processSlowScan(excl); - processSlowScan(notIncl); - clearCaches(); - includes = nullIncludes ? null : includes; - excludes = nullExcludes ? null : excludes; - } finally { - haveSlowResults = true; - slowScanning = false; - slowScanLock.notifyAll(); - } - } - - private function processSlowScan(arr:Vector.<String>):void { - for (var i:int = 0; i < arr.length; i++) { - var path:TokenizedPath = new TokenizedPath(arr[i]); - if (!couldHoldIncludedPath(path) || contentsExcluded(path)) { - scandirTokenizedPath(new File(basedir.nativePath + File.separator + arr[i]), path, false); - } - } - } - - /** - * Scan the given directory for files and directories. Found files and - * directories are placed in their respective collections, based on the - * matching of includes, excludes, and the selectors. When a directory - * is found, it is scanned recursively. - * - * @param dir The directory to scan. Must not be <code>null</code>. - * @param vpath The path relative to the base directory (needed to - * prevent problems with an absolute path when using - * dir). Must not be <code>null</code>. - * @param fast Whether or not this call is part of a fast scan. - * - * @see #filesIncluded - * @see #filesNotIncluded - * @see #filesExcluded - * @see #dirsIncluded - * @see #dirsNotIncluded - * @see #dirsExcluded - * @see #slowScan - */ - protected function scandir(dir:File, vpath:String, fast:Boolean):void { - scandirTokenizedPath(dir, new TokenizedPath(vpath), fast); - } - - /** - * Scan the given directory for files and directories. Found files and - * directories are placed in their respective collections, based on the - * matching of includes, excludes, and the selectors. When a directory - * is found, it is scanned recursively. - * - * @param dir The directory to scan. Must not be <code>null</code>. - * @param path The path relative to the base directory (needed to - * prevent problems with an absolute path when using - * dir). Must not be <code>null</code>. - * @param fast Whether or not this call is part of a fast scan. - * - * @see #filesIncluded - * @see #filesNotIncluded - * @see #filesExcluded - * @see #dirsIncluded - * @see #dirsNotIncluded - * @see #dirsExcluded - * @see #slowScan - */ - private function scandirTokenizedPath(dir:File, path:TokenizedPath, fast:Boolean):void { - if (dir == null) { - throw new BuildException("dir must not be null."); - } - else if (!dir.exists) { - throw new BuildException(dir + DOES_NOT_EXIST_POSTFIX); - } else if (!dir.isDirectory) { - throw new BuildException(dir + " is not a directory."); - } - try { - var arr:Array = dir.getDirectoryListing(); - } catch (e:Error) { - throw new BuildException("IO error scanning directory '" - + dir.nativePath + "'"); - } - var arr2:Array = []; - for each (var f:File in arr) - arr2.push(f.name); - var newfiles:Vector.<String> = Vector.<String>(arr2); - _scandir(dir, path, fast, newfiles, new Vector.<String>()); - } - - private function _scandir(dir:File, path:TokenizedPath, fast:Boolean, - newfiles:Vector.<String>, directoryNamesFollowed:Vector.<String>):void { - var vpath:String = path.toString(); - if (vpath.length > 0 && vpath.charAt(vpath.length - 1) != File.separator) { - vpath += File.separator; - } - - // avoid double scanning of directories, can only happen in fast mode - if (fast && hasBeenScanned(vpath)) { - return; - } - if (!followSymlinks) { - var noLinks:Vector.<String> = new Vector.<String>(); - for (i = 0; i < newfiles.length; i++) { - try { - if (new File(dir + File.separator + newfiles[i]).isSymbolicLink) { - var name:String = vpath + newfiles[i]; - var file:File = new File(dir.nativePath + File.separator + newfiles[i]); - (file.isDirectory - ? dirsExcluded : filesExcluded).push(name); - if (!isExcluded(name)) { - notFollowedSymlinks.push(file.nativePath); - } - } else { - noLinks.push(newfiles[i]); - } - } catch (ioe:IOException) { - var msg:String = "IOException caught while checking " - + "for links, couldn't get canonical path!"; - // will be caught and redirected to Ant's logging system - Ant.currentAnt.output(msg); - noLinks.push(newfiles[i]); - } - } - newfiles = noLinks.slice(); - } else { - directoryNamesFollowed.unshift(dir.nativePath); - } - - for (var i:int = 0; i < newfiles.length; i++) { - name = vpath + newfiles[i]; - var newPath:TokenizedPath = new TokenizedPath("").initAsChild(path, newfiles[i]); - file = new File(dir.nativePath + File.separator + newfiles[i]); - var arr:Array = null; - var arr2:Array = []; - var children:Vector.<String> = null; - if (file.isDirectory) - { - arr = file.getDirectoryListing(); - for each (var f:File in arr) - arr2.push(f.name); - children = Vector.<String>(arr2); - } - if (children == null || (children.length == 0 && !file.isDirectory)) { - if (isIncludedPath(newPath)) { - accountForIncludedFile(newPath, file); - } else { - everythingIncluded = false; - filesNotIncluded.push(name); - } - } else { // dir - - if (followSymlinks - && causesIllegalSymlinkLoop(newfiles[i], dir, - directoryNamesFollowed)) { - // will be caught and redirected to Ant's logging system - Ant.currentAnt.output("skipping symbolic link " - + file.nativePath - + " -- too many levels of symbolic" - + " links."); - notFollowedSymlinks.push(file.nativePath); - continue; - } - - if (isIncludedPath(newPath)) { - accountForIncludedDir(newPath, file, fast, children, - directoryNamesFollowed); - } else { - everythingIncluded = false; - dirsNotIncluded.push(name); - if (fast && couldHoldIncludedPath(newPath) - && !contentsExcluded(newPath)) { - _scandir(file, newPath, fast, children, - directoryNamesFollowed); - } - } - if (!fast) { - _scandir(file, newPath, fast, children, directoryNamesFollowed); - } - } - } - - if (followSymlinks) { - directoryNamesFollowed.shift(); - } - } - - /** - * Process included file. - * @param name path of the file relative to the directory of the FileSet. - * @param file included File. - */ - private function accountForIncludedFile(name:TokenizedPath, file:File):void { - processIncluded(name, file, filesIncluded, filesExcluded, - filesDeselected); - } - - /** - * Process included directory. - * @param name path of the directory relative to the directory of - * the FileSet. - * @param file directory as File. - * @param fast whether to perform fast scans. - */ - private function accountForIncludedDir(name:TokenizedPath, - file:File, fast:Boolean, - children:Vector.<String> = null, - directoryNamesFollowed:Vector.<String> = null):void { - processIncluded(name, file, dirsIncluded, dirsExcluded, dirsDeselected); - if (fast && couldHoldIncludedPath(name) && !contentsExcluded(name)) { - if (directoryNamesFollowed == null) - directoryNamesFollowed = new Vector.<String>(); - if (children == null) - { - var listing:Array = file.getDirectoryListing(); - var nameList:Array = []; - for each (var f:File in listing) - nameList.push(f.name); - children = Vector.<String>(nameList); - } - _scandir(file, name, fast, children, directoryNamesFollowed); - } - } - - private function processIncluded(path:TokenizedPath, - file:File, inc:Vector.<String>, exc:Vector.<String>, - des:Vector.<String>):void { - var name:String = path.toString(); - if (inc.indexOf(name) != -1 || - exc.indexOf(name) != -1 || - des.indexOf(name) != -1) { - return; - } - - var included:Boolean = false; - if (isExcludedPath(path)) { - exc.push(name); - } else if (isSelected(name, file)) { - included = true; - inc.push(name); - } else { - des.push(name); - } - everythingIncluded = everythingIncluded || included; - } - - /** - * Test whether or not a name matches against at least one include - * pattern. - * - * @param name The name to match. Must not be <code>null</code>. - * @return <code>true</code> when the name matches against at least one - * include pattern, or <code>false</code> otherwise. - */ - protected function isIncluded(name:String):Boolean { - return isIncludedPath(new TokenizedPath(name)); - } - - /** - * Test whether or not a name matches against at least one include - * pattern. - * - * @param name The name to match. Must not be <code>null</code>. - * @return <code>true</code> when the name matches against at least one - * include pattern, or <code>false</code> otherwise. - */ - private function isIncludedPath(path:TokenizedPath):Boolean { - ensureNonPatternSetsReady(); - - if (isCaseSensitive() - ? includeNonPatterns.hasOwnProperty(path.toString()) - : includeNonPatterns.hasOwnProperty(path.toString().toUpperCase())) { - return true; - } - for (var i:int = 0; i < includePatterns.length; i++) { - if (includePatterns[i].matchPath(path, isCaseSensitive())) { - return true; - } - } - return false; - } - - /** - * Test whether or not a name matches the start of at least one include - * pattern. - * - * @param name The name to match. Must not be <code>null</code>. - * @return <code>true</code> when the name matches against the start of at - * least one include pattern, or <code>false</code> otherwise. - */ - protected function couldHoldIncluded(name:String):Boolean { - return couldHoldIncludedPath(new TokenizedPath(name)); - } - - /** - * Test whether or not a name matches the start of at least one include - * pattern. - * - * @param tokenizedName The name to match. Must not be <code>null</code>. - * @return <code>true</code> when the name matches against the start of at - * least one include pattern, or <code>false</code> otherwise. - */ - private function couldHoldIncludedPath(tokenizedName:TokenizedPath):Boolean { - for (var i:int = 0; i < includePatterns.length; i++) { - if (couldHoldIncludedWithIncludes(tokenizedName, includePatterns[i])) { - return true; - } - } - for each (var iter:TokenizedPath in includeNonPatterns) { - if (couldHoldIncludedWithIncludes(tokenizedName, - iter.toPattern())) { - return true; - } - } - return false; - } - - /** - * Test whether or not a name matches the start of the given - * include pattern. - * - * @param tokenizedName The name to match. Must not be <code>null</code>. - * @return <code>true</code> when the name matches against the start of the - * include pattern, or <code>false</code> otherwise. - */ - private function couldHoldIncludedWithIncludes(tokenizedName:TokenizedPath, - tokenizedInclude:TokenizedPattern):Boolean { - return tokenizedInclude.matchStartOf(tokenizedName, isCaseSensitive()) - && isMorePowerfulThanExcludes(tokenizedName.toString()) - && isDeeper(tokenizedInclude, tokenizedName); - } - - /** - * Verify that a pattern specifies files deeper - * than the level of the specified file. - * @param pattern the pattern to check. - * @param name the name to check. - * @return whether the pattern is deeper than the name. - * @since Ant 1.6.3 - */ - private function isDeeper(pattern:TokenizedPattern, name:TokenizedPath):Boolean { - return pattern.containsPattern(SelectorUtils.DEEP_TREE_MATCH) - || pattern.depth() > name.depth(); - } - - /** - * Find out whether one particular include pattern is more powerful - * than all the excludes. - * Note: the power comparison is based on the length of the include pattern - * and of the exclude patterns without the wildcards. - * Ideally the comparison should be done based on the depth - * of the match; that is to say how many file separators have been matched - * before the first ** or the end of the pattern. - * - * IMPORTANT : this function should return false "with care". - * - * @param name the relative path to test. - * @return true if there is no exclude pattern more powerful than - * this include pattern. - * @since Ant 1.6 - */ - private function isMorePowerfulThanExcludes(name:String):Boolean { - const soughtexclude:String = - name + File.separator + SelectorUtils.DEEP_TREE_MATCH; - for (var counter:int = 0; counter < excludePatterns.length; counter++) { - if (excludePatterns[counter].toString() == soughtexclude) { - return false; - } - } - return true; - } - - /** - * Test whether all contents of the specified directory must be excluded. - * @param path the path to check. - * @return whether all the specified directory's contents are excluded. - */ - /* package */ private function contentsExcluded(path:TokenizedPath):Boolean { - for (var i:int = 0; i < excludePatterns.length; i++) { - if (excludePatterns[i].endsWith(SelectorUtils.DEEP_TREE_MATCH) - && excludePatterns[i].withoutLastToken() - .matchPath(path, isCaseSensitive())) { - return true; - } - } - return false; - } - - /** - * Test whether or not a name matches against at least one exclude - * pattern. - * - * @param name The name to match. Must not be <code>null</code>. - * @return <code>true</code> when the name matches against at least one - * exclude pattern, or <code>false</code> otherwise. - */ - protected function isExcluded(name:String):Boolean { - return isExcludedPath(new TokenizedPath(name)); - } - - /** - * Test whether or not a name matches against at least one exclude - * pattern. - * - * @param name The name to match. Must not be <code>null</code>. - * @return <code>true</code> when the name matches against at least one - * exclude pattern, or <code>false</code> otherwise. - */ - private function isExcludedPath(name:TokenizedPath):Boolean { - ensureNonPatternSetsReady(); - - if (isCaseSensitive() - ? excludeNonPatterns.hasOwnProperty(name.toString()) - : excludeNonPatterns.hasOwnProperty(name.toString().toUpperCase())) { - return true; - } - for (var i:int = 0; i < excludePatterns.length; i++) { - if (excludePatterns[i].matchPath(name, isCaseSensitive())) { - return true; - } - } - return false; - } - - /** - * Test whether a file should be selected. - * - * @param name the filename to check for selecting. - * @param file the java.io.File object for this filename. - * @return <code>false</code> when the selectors says that the file - * should not be selected, <code>true</code> otherwise. - */ - protected function isSelected(name:String, file:File):Boolean { - if (selectors != null) { - for (var i:int = 0; i < selectors.length; i++) { - if (!selectors[i].isSelected(basedir, name, file)) { - return false; - } - } - } - return true; - } - - /** - * Return the names of the files which matched at least one of the - * include patterns and none of the exclude patterns. - * The names are relative to the base directory. - * - * @return the names of the files which matched at least one of the - * include patterns and none of the exclude patterns. - */ - public function getIncludedFiles():Vector.<String> { - var files:Vector.<String>; - files = filesIncluded.slice(); - files.sort(0); - return files; - } - - /** - * Return the count of included files. - * @return <code>int</code>. - * @since Ant 1.6.3 - */ - public function getIncludedFilesCount():int { - if (filesIncluded == null) { - throw new IllegalStateException("Must call scan() first"); - } - return filesIncluded.length; - } - - /** - * Return the names of the files which matched none of the include - * patterns. The names are relative to the base directory. This involves - * performing a slow scan if one has not already been completed. - * - * @return the names of the files which matched none of the include - * patterns. - * - * @see #slowScan - */ - public function getNotIncludedFiles():Vector.<String> { - slowScan(); - var files:Vector.<String> = filesNotIncluded.slice(); - return files; - } - - /** - * Return the names of the files which matched at least one of the - * include patterns and at least one of the exclude patterns. - * The names are relative to the base directory. This involves - * performing a slow scan if one has not already been completed. - * - * @return the names of the files which matched at least one of the - * include patterns and at least one of the exclude patterns. - * - * @see #slowScan - */ - public function getExcludedFiles():Vector.<String> { - slowScan(); - var files:Vector.<String> = filesExcluded.slice(); - return files; - } - - /** - * <p>Return the names of the files which were selected out and - * therefore not ultimately included.</p> - * - * <p>The names are relative to the base directory. This involves - * performing a slow scan if one has not already been completed.</p> - * - * @return the names of the files which were deselected. - * - * @see #slowScan - */ - public function getDeselectedFiles():Vector.<String> { - slowScan(); - var files:Vector.<String> = filesDeselected.slice(); - return files; - } - - /** - * Return the names of the directories which matched at least one of the - * include patterns and none of the exclude patterns. - * The names are relative to the base directory. - * - * @return the names of the directories which matched at least one of the - * include patterns and none of the exclude patterns. - */ - public function getIncludedDirectories():Vector.<String> { - var directories:Vector.<String>; - directories = dirsIncluded.slice(); - directories.sort(0); - return directories; - } - - /** - * Return the count of included directories. - * @return <code>int</code>. - * @since Ant 1.6.3 - */ - public function getIncludedDirsCount():int { - if (dirsIncluded == null) { - throw new IllegalStateException("Must call scan() first"); - } - return dirsIncluded.length; - } - - /** - * Return the names of the directories which matched none of the include - * patterns. The names are relative to the base directory. This involves - * performing a slow scan if one has not already been completed. - * - * @return the names of the directories which matched none of the include - * patterns. - * - * @see #slowScan - */ - public function getNotIncludedDirectories():Vector.<String> { - slowScan(); - var directories:Vector.<String> = dirsNotIncluded.slice(); - return directories; - } - - /** - * Return the names of the directories which matched at least one of the - * include patterns and at least one of the exclude patterns. - * The names are relative to the base directory. This involves - * performing a slow scan if one has not already been completed. - * - * @return the names of the directories which matched at least one of the - * include patterns and at least one of the exclude patterns. - * - * @see #slowScan - */ - public function getExcludedDirectories():Vector.<String> { - slowScan(); - var directories:Vector.<String> = dirsExcluded.slice(); - return directories; - } - - /** - * <p>Return the names of the directories which were selected out and - * therefore not ultimately included.</p> - * - * <p>The names are relative to the base directory. This involves - * performing a slow scan if one has not already been completed.</p> - * - * @return the names of the directories which were deselected. - * - * @see #slowScan - */ - public function getDeselectedDirectories():Vector.<String> { - slowScan(); - var directories:Vector.<String> = dirsDeselected.slice(); - return directories; - } - - /** - * Absolute paths of all symbolic links that haven't been followed - * but would have been followed had followsymlinks been true or - * maxLevelsOfSymlinks been bigger. - * - * @since Ant 1.8.0 - */ - public function getNotFollowedSymlinks():Vector.<String> { - var links:Vector.<String>; - links = notFollowedSymlinks.slice(); - links.sort(0); - return links; - } - - /** - * Add default exclusions to the current exclusions set. - */ - public function addDefaultExcludes():void - { - var excludesLength:int = excludes == null ? 0 : excludes.length; - var newExcludes:Vector.<String>; - var defaultExcludesTemp:Vector.<String> = getDefaultExcludes(); - newExcludes = defaultExcludesTemp.slice(); - for (var i:int = 0; i < defaultExcludesTemp.length; i++) { - newExcludes.push( - defaultExcludesTemp[i].replace(/\//g, File.separator) - .replace(/\\/g, File.separator)); - } - excludes = newExcludes; - } - - /** - * Get the named resource. - * @param name path name of the file relative to the dir attribute. - * - * @return the resource with the given name. - * @since Ant 1.5.2 - */ - public function getResource(name:String):Resource { - return new FileResource(basedir, name); - } - - /** - * Has the directory with the given path relative to the base - * directory already been scanned? - * - * <p>Registers the given directory as scanned as a side effect.</p> - * - * @since Ant 1.6 - */ - private function hasBeenScanned(vpath:String):Boolean { - return !scannedDirs.push(vpath); - } - - /** - * This method is of interest for testing purposes. The returned - * Set is live and should not be modified. - * @return the Set of relative directory names that have been scanned. - */ - /* package-private */private function getScannedDirs():Vector.<String> { - return scannedDirs; - } - - /** - * Clear internal caches. - * - * @since Ant 1.6 - */ - private function clearCaches():void { - includeNonPatterns = {}; - excludeNonPatterns = {}; - includePatterns = null; - excludePatterns = null; - areNonPatternSetsReady = false; - } - - /** - * Ensure that the in|exclude "patterns" - * have been properly divided up. - * - * @since Ant 1.6.3 - */ - /* package */private function ensureNonPatternSetsReady():void { - if (!areNonPatternSetsReady) { - includePatterns = fillNonPatternSet(includeNonPatterns, includes); - excludePatterns = fillNonPatternSet(excludeNonPatterns, excludes); - areNonPatternSetsReady = true; - } - } - - /** - * Add all patterns that are not real patterns (do not contain - * wildcards) to the set and returns the real patterns. - * - * @param map Map to populate. - * @param patterns String[] of patterns. - * @since Ant 1.8.0 - */ - private function fillNonPatternSet(map:Object, patterns:Vector.<String>):Vector.<TokenizedPattern> { - var al:Vector.<TokenizedPattern> = new Vector.<TokenizedPattern>(); - for (var i:int = 0; i < patterns.length; i++) { - if (!SelectorUtils.hasWildcards(patterns[i])) { - var s:String = isCaseSensitive() - ? patterns[i] : patterns[i].toUpperCase(); - map[s] = new TokenizedPath(s); - } else { - al.push(new TokenizedPattern(patterns[i])); - } - } - return al; - } - - /** - * Would following the given directory cause a loop of symbolic - * links deeper than allowed? - * - * <p>Can only happen if the given directory has been seen at - * least more often than allowed during the current scan and it is - * a symbolic link and enough other occurences of the same name - * higher up are symbolic links that point to the same place.</p> - * - * @since Ant 1.8.0 - */ - private function causesIllegalSymlinkLoop(dirName:String, parent:File, - directoryNamesFollowed:Vector.<String>):Boolean { - try { - if (directoryNamesFollowed.length >= maxLevelsOfSymlinks - && CollectionUtils.frequency(directoryNamesFollowed, dirName) - >= maxLevelsOfSymlinks - && new File(parent.nativePath + File.separator + dirName).isSymbolicLink) { - - var files:Vector.<String> = new Vector.<String>(); - var f:File = FILE_UTILS.resolveFile(parent, dirName); - f.canonicalize(); - var target:String = f.nativePath; - files.push(target); - - var relPath:String = ""; - for each (var dir:String in directoryNamesFollowed) { - relPath += "../"; - if (dirName == dir) { - f = FILE_UTILS.resolveFile(parent, relPath + dir); - f.canonicalize(); - files.push(f.nativePath); - if (files.length > maxLevelsOfSymlinks - && CollectionUtils.frequency(files, target) - > maxLevelsOfSymlinks) { - return true; - } - } - } - - } - return false; - } catch (ex:IOException) { - throw new BuildException("Caught error while checking for" - + " symbolic links" + ex.message); - } - return false; - } - - } -} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/f954e6f6/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileProvider.as ---------------------------------------------------------------------- diff --git a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileProvider.as b/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileProvider.as deleted file mode 100644 index e8a4773..0000000 --- a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileProvider.as +++ /dev/null @@ -1,27 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You 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. -// -//////////////////////////////////////////////////////////////////////////////// -package org.apache.flex.ant.tags.filesetClasses -{ - import flash.filesystem.File; - - public interface FileProvider - { - function getFile():File; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/f954e6f6/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileResource.as ---------------------------------------------------------------------- diff --git a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileResource.as b/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileResource.as deleted file mode 100644 index 3d00d27..0000000 --- a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileResource.as +++ /dev/null @@ -1,146 +0,0 @@ -/* -* Licensed to the Apache Software Foundation (ASF) under one or more -* contributor license agreements. See the NOTICE file distributed with -* this work for additional information regarding copyright ownership. -* The ASF licenses this file to You 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. -* -*/ -package org.apache.flex.ant.tags.filesetClasses -{ - import flash.filesystem.File; - import org.apache.flex.ant.tags.filesetClasses.exceptions.BuildException; - - /** - * Ported from org.apache.tools.ant.types.Resource.java on 12/3/13. - * Describes a "File-like" resource (File, ZipEntry, etc.). - * - * This class is meant to be used by classes needing to record path - * and date/time information about a file, a zip entry or some similar - * resource (URL, archive in a version control repository, ...). - * - * @since Ant 1.5.2 - * @see org.apache.tools.ant.types.resources.Touchable - */ - public class FileResource extends Resource implements FileProvider - { - private static const FILE_UTILS:FileUtils = FileUtils.getFileUtils(); - - private var file:File; - private var baseDir:File; - - /** - * Construct a new FileResource using the specified basedir and relative name. - * @param b the basedir as File. - * @param name the relative filename. - */ - public function FileResource(b:File, name:String) { - super(name); - this.baseDir = b; - this.file = FILE_UTILS.resolveFile(b, name); - } - - /** - * Set the File for this FileResource. - * @param f the File to be represented. - */ - public function setFile(f:File):void { - checkAttributesAllowed(); - file = f; - if (f != null && (getBaseDir() == null || !FILE_UTILS.isLeadingPath(getBaseDir(), f))) { - setBaseDir(f.parent); - } - } - - /** - * Get the file represented by this FileResource. - * @return the File. - */ - public function getFile():File { - if (isReference()) { - return FileResource(getCheckedRef()).getFile(); - } - dieOnCircularReference(); - if (file == null) { - //try to resolve file set via basedir/name property setters: - var d:File = getBaseDir(); - var n:String = super.getName(); - if (n != null) { - setFile(FILE_UTILS.resolveFile(d, n)); - } - } - return file; - } - - /** - * Set the basedir for this FileResource. - * @param b the basedir as File. - */ - public function setBaseDir(b:File):void { - checkAttributesAllowed(); - baseDir = b; - } - - /** - * Return the basedir to which the name is relative. - * @return the basedir as File. - */ - public function getBaseDir():File { - if (isReference()) { - return FileResource(getCheckedRef()).getBaseDir(); - } - dieOnCircularReference(); - return baseDir; - } - - /** - * Overrides the super version. - * @param r the Reference to set. - */ - override public function setRefid(r:Reference):void { - if (file != null || baseDir != null) { - throw tooManyAttributes(); - } - super.setRefid(r); - } - - /** - * Get the name of this FileResource. If the basedir is set, - * the name will be relative to that. Otherwise the basename - * only will be returned. - * @return the name of this resource. - */ - override public function getName():String { - if (isReference()) { - return Resource(getCheckedRef()).getName(); - } - var b:File = getBaseDir(); - return b == null ? getNotNullFile().name - : FILE_UTILS.removeLeadingPath(b, getNotNullFile()); - } - - /** - * Get the file represented by this FileResource, ensuring it is not null. - * @return the not-null File. - * @throws BuildException if file is null. - */ - protected function getNotNullFile():File { - if (getFile() == null) { - throw new BuildException("file attribute is null!"); - } - dieOnCircularReference(); - return getFile(); - } - - - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/f954e6f6/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileSelector.as ---------------------------------------------------------------------- diff --git a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileSelector.as b/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileSelector.as deleted file mode 100644 index 92c9376..0000000 --- a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/FileSelector.as +++ /dev/null @@ -1,27 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You 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. -// -//////////////////////////////////////////////////////////////////////////////// -package org.apache.flex.ant.tags.filesetClasses -{ - import flash.filesystem.File; - - public interface FileSelector - { - function isSelected(base:File, name:String, file:File):Boolean; - } -} \ No newline at end of file
