FileDocCategorySizeDatePackage
UpToDate.javaAPI DocApache Ant 1.709458Wed Dec 13 06:16:22 GMT 2006org.apache.tools.ant.taskdefs

UpToDate

public class UpToDate extends org.apache.tools.ant.Task implements org.apache.tools.ant.taskdefs.condition.Condition
Sets the given property if the specified target has a timestamp greater than all of the source files.
since
Ant 1.2
ant.task
category="control"

Fields Summary
private String
property
private String
value
private File
sourceFile
private File
targetFile
private Vector
sourceFileSets
private org.apache.tools.ant.types.resources.Union
sourceResources
protected org.apache.tools.ant.types.Mapper
mapperElement
Constructors Summary
Methods Summary
public voidadd(org.apache.tools.ant.util.FileNameMapper fileNameMapper)
A nested filenamemapper

param
fileNameMapper the mapper to add
since
Ant 1.6.3

        createMapper().add(fileNameMapper);
    
public voidaddSrcfiles(org.apache.tools.ant.types.FileSet fs)
Nested <srcfiles> element.

param
fs the source files

        sourceFileSets.addElement(fs);
    
public org.apache.tools.ant.types.MappercreateMapper()
Defines the FileNameMapper to use (nested mapper element).

return
a mapper to be configured
throws
BuildException if more than one mapper is defined

        if (mapperElement != null) {
            throw new BuildException("Cannot define more than one mapper",
                                     getLocation());
        }
        mapperElement = new Mapper(getProject());
        return mapperElement;
    
public org.apache.tools.ant.types.resources.UnioncreateSrcResources()
Nested resource collections as sources.

return
the source resources to configure.
since
Ant 1.7

        return sourceResources;
    
public booleaneval()
Evaluate (all) target and source file(s) to see if the target(s) is/are up-to-date.

return
true if the target(s) is/are up-to-date

        if (sourceFileSets.size() == 0 && sourceResources.size() == 0
            && sourceFile == null) {
            throw new BuildException("At least one srcfile or a nested "
                                     + "<srcfiles> or <srcresources> element "
                                     + "must be set.");
        }

        if ((sourceFileSets.size() > 0 || sourceResources.size() > 0)
            && sourceFile != null) {
            throw new BuildException("Cannot specify both the srcfile "
                                     + "attribute and a nested <srcfiles> "
                                     + "or <srcresources> element.");
        }

        if (targetFile == null && mapperElement == null) {
            throw new BuildException("The targetfile attribute or a nested "
                                     + "mapper element must be set.");
        }

        // if the target file is not there, then it can't be up-to-date
        if (targetFile != null && !targetFile.exists()) {
            log("The targetfile \"" + targetFile.getAbsolutePath()
                    + "\" does not exist.", Project.MSG_VERBOSE);
            return false;
        }

        // if the source file isn't there, throw an exception
        if (sourceFile != null && !sourceFile.exists()) {
            throw new BuildException(sourceFile.getAbsolutePath()
                                     + " not found.");
        }

        boolean upToDate = true;
        if (sourceFile != null) {
            if (mapperElement == null) {
                upToDate = upToDate
                    && (targetFile.lastModified() >= sourceFile.lastModified());
            } else {
                SourceFileScanner sfs = new SourceFileScanner(this);
                upToDate = upToDate
                    && (sfs.restrict(new String[] {sourceFile.getAbsolutePath()},
                                  null, null,
                                  mapperElement.getImplementation()).length == 0);
            }
        }

        // filesets are separate from the rest for performance
        // reasons.  If we use the code for union below, we'll always
        // scan all filesets, even if we know the target is out of
        // date after the first test.
        Enumeration e = sourceFileSets.elements();
        while (upToDate && e.hasMoreElements()) {
            FileSet fs = (FileSet) e.nextElement();
            DirectoryScanner ds = fs.getDirectoryScanner(getProject());
            upToDate = upToDate && scanDir(fs.getDir(getProject()),
                                           ds.getIncludedFiles());
        }

        if (upToDate) {
            Resource[] r = sourceResources.listResources();
            upToDate = upToDate
                && (ResourceUtils.selectOutOfDateSources(
                        this, r, getMapper(), getProject()).length == 0);
        }

        return upToDate;
    
public voidexecute()
Sets property to true if target file(s) have a more recent timestamp than (each of) the corresponding source file(s).

throws
BuildException on error

        if (property == null) {
            throw new BuildException("property attribute is required.",
                                     getLocation());
        }
        boolean upToDate = eval();
        if (upToDate) {
            getProject().setNewProperty(property, getValue());
            if (mapperElement == null) {
                log("File \"" + targetFile.getAbsolutePath()
                    + "\" is up-to-date.", Project.MSG_VERBOSE);
            } else {
                log("All target files are up-to-date.",
                    Project.MSG_VERBOSE);
            }
        }
    
private org.apache.tools.ant.util.FileNameMappergetMapper()

        FileNameMapper mapper = null;
        if (mapperElement == null) {
            MergingMapper mm = new MergingMapper();
            mm.setTo(targetFile.getAbsolutePath());
            mapper = mm;
        } else {
            mapper = mapperElement.getImplementation();
        }
        return mapper;
    
private java.lang.StringgetValue()
Returns the value, or "true" if a specific value wasn't provided.

        return (value != null) ? value : "true";
    
protected booleanscanDir(java.io.File srcDir, java.lang.String[] files)
Scan a directory for files to check for "up to date"ness

param
srcDir the directory
param
files the files to scan for
return
true if the files are up to date

        SourceFileScanner sfs = new SourceFileScanner(this);
        FileNameMapper mapper = getMapper();
        File dir = srcDir;
        if (mapperElement == null) {
            dir = null;
        }
        return sfs.restrict(files, srcDir, dir, mapper).length == 0;
    
public voidsetProperty(java.lang.String property)
The property to set if the target file is more up-to-date than (each of) the source file(s).

param
property the name of the property to set if Target is up-to-date.

    // CheckStyle:VisibilityModifier ON

                                       
         
        this.property = property;
    
public voidsetSrcfile(java.io.File file)
The file that must be older than the target file if the property is to be set.

param
file the file we are checking against the target file.

        this.sourceFile = file;
    
public voidsetTargetFile(java.io.File file)
The file which must be more up-to-date than (each of) the source file(s) if the property is to be set.

param
file the file we are checking against.

        this.targetFile = file;
    
public voidsetValue(java.lang.String value)
The value to set the named property to if the target file is more up-to-date than (each of) the source file(s). Defaults to 'true'.

param
value the value to set the property to if Target is up-to-date

        this.value = value;