stevel 2003/01/17 22:51:21 Modified: src/main/org/apache/tools/ant/types/selectors BaseSelectorContainer.java DependSelector.java Added: src/main/org/apache/tools/ant/types/selectors DifferentSelector.java MappingSelector.java Log: refactoring of the <depends> Selector and a new subclass <different>, which has a more advanced definition of different from just timestamps. Revision Changes Path 1.4 +7 -0 jakarta-ant/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java Index: BaseSelectorContainer.java =================================================================== RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- BaseSelectorContainer.java 25 Jul 2002 15:21:22 -0000 1.3 +++ BaseSelectorContainer.java 18 Jan 2003 06:51:21 -0000 1.4 @@ -284,5 +284,12 @@ appendSelector(selector); } + /** + * adds a different selector to the selector list + */ + public void addDifferent(DifferentSelector selector) { + appendSelector(selector); + } + } 1.6 +9 -85 jakarta-ant/src/main/org/apache/tools/ant/types/selectors/DependSelector.java Index: DependSelector.java =================================================================== RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/types/selectors/DependSelector.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- DependSelector.java 25 Jul 2002 15:21:22 -0000 1.5 +++ DependSelector.java 18 Jan 2003 06:51:21 -0000 1.6 @@ -70,17 +70,10 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Bruce Atherton</a> * @since 1.5 */ -public class DependSelector extends BaseSelector { - - private File targetdir = null; - private Mapper mapperElement = null; - private FileNameMapper map = null; - private int granularity = 0; +public class DependSelector extends MappingSelector { public DependSelector() { - if (Os.isFamily("dos")) { - granularity = 2000; - } + } public String toString() { @@ -105,85 +98,16 @@ return buf.toString(); } - /** - * The name of the file or directory which is checked for out-of-date - * files. - * - * @param targetdir the directory to scan looking for files. - */ - public void setTargetdir(File targetdir) { - this.targetdir = targetdir; - } - - /** - * Sets the number of milliseconds leeway we will give before we consider - * a file out of date. - */ - public void setGranularity(int granularity) { - this.granularity = granularity; - } - - /** - * Defines the FileNameMapper to use (nested mapper element). - */ - public Mapper createMapper() throws BuildException { - if (mapperElement != null) { - throw new BuildException("Cannot define more than one mapper"); - } - mapperElement = new Mapper(getProject()); - return mapperElement; - } - /** - * Checks to make sure all settings are kosher. In this case, it - * means that the dest attribute has been set and we have a mapper. + * this test is our selection test that compared the file with the destfile + * @param srcfile + * @param destfile + * @return */ - public void verifySettings() { - if (targetdir == null) { - setError("The targetdir attribute is required."); - } - if (mapperElement == null) { - map = new IdentityMapper(); - } - else { - map = mapperElement.getImplementation(); - } - if (map == null) { - setError("Could not set <mapper> element."); - } - } - - /** - * The heart of the matter. This is where the selector gets to decide - * on the inclusion of a file in a particular fileset. - * - * @param basedir the base directory the scan is being done from - * @param filename is the name of the file to check - * @param file is a java.io.File object the selector can use - * @return whether the file should be selected or not - */ - public boolean isSelected(File basedir, String filename, File file) { - - // throw BuildException on error - validate(); - - // Determine file whose out-of-dateness is to be checked - String[] destfiles = map.mapFileName(filename); - // If filename does not match the To attribute of the mapper - // then filter it out of the files we are considering - if (destfiles == null) { - return false; - } - // Sanity check - if (destfiles.length != 1 || destfiles[0] == null) { - throw new BuildException("Invalid destination file results for " - + targetdir.getName() + " with filename " + filename); - } - String destname = destfiles[0]; - File destfile = new File(targetdir,destname); - - return SelectorUtils.isOutOfDate(file, destfile, granularity); + public boolean selectionTest(File srcfile, File destfile) { + boolean selected=SelectorUtils.isOutOfDate(srcfile, destfile, granularity); + return selected; } } 1.1 jakarta-ant/src/main/org/apache/tools/ant/types/selectors/DifferentSelector.java Index: DifferentSelector.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Ant", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.types.selectors; import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.BuildException; import java.io.File; import java.io.IOException; /** * This selector selects files against a mapped set of target files, selecting all those * files which are different. A byte-by-byte comparision is performed on equal length files; * files with different lengths are deemed different automatically; files with identical timestamps * are viewed as matching by default, unless you specify otherwise. * <p> * This is a useful selector to work with programs and tasks that don't handle * dependency checking properly; Even if a predecessor task always creates its * output files, followup tasks can be driven off copies made with a different selector, * so their dependencies are driven on the absolute state of the files, not a timestamp. * <p> * Clearly, however, bulk file comparisons is inefficient; anything that can use * timestamps is to be preferred. If this selector must be used, use it over as few files * as possible, perhaps following it with an <uptodate;> to keep the descendent * routines conditional. * */ public class DifferentSelector extends MappingSelector { private FileUtils fileUtils= FileUtils.newFileUtils(); private boolean ignoreFileTimes=false; /** * This flag tells the selector to ignore file times in the comparison * @param ignoreFileTimes */ public void setIgnoreFileTimes(boolean ignoreFileTimes) { this.ignoreFileTimes = ignoreFileTimes; } /** * this test is our selection test that compared the file with the destfile * @param srcfile * @param destfile * @return */ protected boolean selectionTest(File srcfile, File destfile) { //if either of them is missing, they are different if (srcfile.exists() != destfile.exists()) { return true; } if (srcfile.length() != destfile.length()) { // different size =>different files return true; } //same date if dest timestamp is within granularity of the srcfile boolean sameDate; sameDate = destfile.lastModified() >= srcfile.lastModified() - granularity && destfile.lastModified() <= srcfile.lastModified() + granularity; //and when ignoreFileTimes is set we claim the files are now equal if(sameDate && !ignoreFileTimes) { return true; } //here do a bulk comparison try { return !fileUtils.contentEquals(srcfile,destfile); } catch (IOException e) { throw new BuildException("while comparing "+srcfile+" and "+destfile,e); } } } 1.1 jakarta-ant/src/main/org/apache/tools/ant/types/selectors/MappingSelector.java Index: MappingSelector.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Ant", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.types.selectors; import org.apache.tools.ant.types.Mapper; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.taskdefs.condition.Os; import org.apache.tools.ant.util.IdentityMapper; import org.apache.tools.ant.util.FileNameMapper; import java.io.File; /** * A mapping selector is an abstract class adding mapping support to the base * selector */ public abstract class MappingSelector extends BaseSelector { protected File targetdir = null; protected Mapper mapperElement = null; protected FileNameMapper map = null; protected int granularity = 0; public MappingSelector() { if (Os.isFamily("dos")) { granularity = 2000; } } /** * The name of the file or directory which is checked for out-of-date * files. * * @param targetdir the directory to scan looking for files. */ public void setTargetdir(File targetdir) { this.targetdir = targetdir; } /** * Defines the FileNameMapper to use (nested mapper element). */ public Mapper createMapper() throws BuildException { if (mapperElement != null) { throw new BuildException("Cannot define more than one mapper"); } mapperElement = new Mapper(getProject()); return mapperElement; } /** * Checks to make sure all settings are kosher. In this case, it * means that the dest attribute has been set and we have a mapper. */ public void verifySettings() { if (targetdir == null) { setError("The targetdir attribute is required."); } if (mapperElement == null) { map = new IdentityMapper(); } else { map = mapperElement.getImplementation(); } if (map == null) { setError("Could not set <mapper> element."); } } /** * The heart of the matter. This is where the selector gets to decide * on the inclusion of a file in a particular fileset. * * @param basedir the base directory the scan is being done from * @param filename is the name of the file to check * @param file is a java.io.File object the selector can use * @return whether the file should be selected or not */ public boolean isSelected(File basedir, String filename, File file) { // throw BuildException on error validate(); // Determine file whose out-of-dateness is to be checked String[] destfiles = map.mapFileName(filename); // If filename does not match the To attribute of the mapper // then filter it out of the files we are considering if (destfiles == null) { return false; } // Sanity check if (destfiles.length != 1 || destfiles[0] == null) { throw new BuildException("Invalid destination file results for " + targetdir.getName() + " with filename " + filename); } String destname = destfiles[0]; File destfile = new File(targetdir,destname); boolean selected = selectionTest(file, destfile); return selected; } /** * this test is our selection test that compared the file with the destfile * @param srcfile file to test; may be null * @param destfile destination file * @return */ protected abstract boolean selectionTest(File srcfile, File destfile); /** * Sets the number of milliseconds leeway we will give before we consider * a file out of date. Defaults to 2000 on MS-DOS derivatives as the FAT file * system. */ public void setGranularity(int granularity) { this.granularity = granularity; } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>