FileDocCategorySizeDatePackage
Project.javaAPI DocApache Ant 1.7088800Wed Dec 13 06:16:20 GMT 2006org.apache.tools.ant

Project

public class Project extends Object implements org.apache.tools.ant.types.ResourceFactory
Central representation of an Ant project. This class defines an Ant project with all of its targets, tasks and various other properties. It also provides the mechanism to kick off a build using a particular target name.

This class also encapsulates methods which allow files to be referred to using abstract path names which are translated to native system file paths at runtime.

Fields Summary
private static final String
LINE_SEP
public static final int
MSG_ERR
Message priority of "error".
public static final int
MSG_WARN
Message priority of "warning".
public static final int
MSG_INFO
Message priority of "information".
public static final int
MSG_VERBOSE
Message priority of "verbose".
public static final int
MSG_DEBUG
Message priority of "debug".
private static final String
VISITING
Constant for the "visiting" state, used when traversing a DFS of target dependencies.
private static final String
VISITED
Constant for the "visited" state, used when traversing a DFS of target dependencies.
public static final String
JAVA_1_0
Version constant for Java 1.0 .
public static final String
JAVA_1_1
Version constant for Java 1.1 .
public static final String
JAVA_1_2
Version constant for Java 1.2 .
public static final String
JAVA_1_3
Version constant for Java 1.3 .
public static final String
JAVA_1_4
Version constant for Java 1.4 .
public static final String
TOKEN_START
Default filter start token.
public static final String
TOKEN_END
Default filter end token.
private static final org.apache.tools.ant.util.FileUtils
FILE_UTILS
Instance of a utility class to use for file operations.
private String
name
Name of this project.
private String
description
Description for this project (if any).
private Hashtable
references
Map of references within the project (paths etc) (String to Object).
private HashMap
idReferences
Map of id references - used for indicating broken build files
private Project
parentIdProject
the parent project for old id resolution (if inheritreferences is set)
private String
defaultTarget
Name of the project's default target.
private Hashtable
targets
Map from target names to targets (String to Target).
private org.apache.tools.ant.types.FilterSet
globalFilterSet
Set of global filters.
private org.apache.tools.ant.types.FilterSetCollection
globalFilters
Wrapper around globalFilterSet. This collection only ever contains one FilterSet, but the wrapper is needed in order to make it easier to use the FileUtils interface.
private File
baseDir
Project base directory.
private Vector
listeners
List of listeners to notify of build events.
private ClassLoader
coreLoader
The Ant core classloader--may be null if using parent classloader.
private Map
threadTasks
Records the latest task to be executed on a thread.
private Map
threadGroupTasks
Records the latest task to be executed on a thread group.
private org.apache.tools.ant.input.InputHandler
inputHandler
Called to handle any input requests.
private InputStream
defaultInputStream
The default input stream used to read any input.
private boolean
keepGoingMode
Keep going flag.
private boolean
loggingMessage
Flag which catches Listeners which try to use System.out or System.err .
Constructors Summary
public Project()
Create a new Ant project.

        inputHandler = new DefaultInputHandler();
    
Methods Summary
public synchronized voidaddBuildListener(BuildListener listener)
Add a build listener to the list. This listener will be notified of build events for this project.

param
listener The listener to add to the list. Must not be null.

        // If the listeners already has this listener, do nothing
        if (listeners.contains(listener)) {
            return;
        }
        // create a new Vector to avoid ConcurrentModificationExc when
        // the listeners get added/removed while we are in fire
        Vector newListeners = getBuildListeners();
        newListeners.addElement(listener);
        listeners = newListeners;
    
public voidaddDataTypeDefinition(java.lang.String typeName, java.lang.Class typeClass)
Add a new datatype definition. Attempting to override an existing definition with an equivalent one (i.e. with the same classname) results in a verbose log message. Attempting to override an existing definition with a different one results in a warning log message, but the definition is changed.

param
typeName The name of the datatype. Must not be null.
param
typeClass The full name of the class implementing the datatype. Must not be null.

        ComponentHelper.getComponentHelper(this).addDataTypeDefinition(typeName,
                typeClass);
    
public voidaddFilter(java.lang.String token, java.lang.String value)
Add a filter to the set of global filters.

param
token The token to filter. Must not be null.
param
value The replacement value. Must not be null.
deprecated
since 1.4.x. Use getGlobalFilterSet().addFilter(token,value)
see
#getGlobalFilterSet()
see
FilterSet#addFilter(String,String)

        if (token == null) {
            return;
        }
        globalFilterSet.addFilter(new FilterSet.Filter(token, value));
    
public voidaddIdReference(java.lang.String id, java.lang.Object value)
Add an id reference. Used for broken build files.

param
id the id to set.
param
value the value to set it to (Unknown element in this case.

        idReferences.put(id, value);
    
public voidaddOrReplaceTarget(Target target)
Add a target to the project, or replaces one with the same name.

param
target The target to be added or replaced in the project. Must not be null.

        addOrReplaceTarget(target.getName(), target);
    
public voidaddOrReplaceTarget(java.lang.String targetName, Target target)
Add a target to the project, or replaces one with the same name.

param
targetName The name to use for the target. Must not be null.
param
target The target to be added or replaced in the project. Must not be null.

        String msg = " +Target: " + targetName;
        log(msg, MSG_DEBUG);
        target.setProject(this);
        targets.put(targetName, target);
    
public voidaddReference(java.lang.String referenceName, java.lang.Object value)
Add a reference to the project.

param
referenceName The name of the reference. Must not be null.
param
value The value of the reference.

        synchronized (references) {
            Object old = ((AntRefTable) references).getReal(referenceName);
            if (old == value) {
                // no warning, this is not changing anything
                return;
            }
            if (old != null && !(old instanceof UnknownElement)) {
                log("Overriding previous definition of reference to " + referenceName,
                    MSG_VERBOSE);
            }
            log("Adding reference: " + referenceName, MSG_DEBUG);
            references.put(referenceName, value);
        }
    
public voidaddTarget(Target target)
Add a new target to the project.

param
target The target to be added to the project. Must not be null.
exception
BuildException if the target already exists in the project
see
Project#addOrReplaceTarget(Target)

        addTarget(target.getName(), target);
    
public voidaddTarget(java.lang.String targetName, Target target)
Add a new target to the project.

param
targetName The name to use for the target. Must not be null.
param
target The target to be added to the project. Must not be null.
exception
BuildException if the target already exists in the project.
see
Project#addOrReplaceTarget(String, Target)

         if (targets.get(targetName) != null) {
             throw new BuildException("Duplicate target: `" + targetName + "'");
         }
         addOrReplaceTarget(targetName, target);
     
public voidaddTaskDefinition(java.lang.String taskName, java.lang.Class taskClass)
Add a new task definition to the project. Attempting to override an existing definition with an equivalent one (i.e. with the same classname) results in a verbose log message. Attempting to override an existing definition with a different one results in a warning log message and invalidates any tasks which have already been created with the old definition.

param
taskName The name of the task to add. Must not be null.
param
taskClass The full name of the class implementing the task. Must not be null.
exception
BuildException if the class is unsuitable for being an Ant task. An error level message is logged before this exception is thrown.
see
#checkTaskClass(Class)

        ComponentHelper.getComponentHelper(this).addTaskDefinition(taskName,
                taskClass);
    
public voidcheckTaskClass(java.lang.Class taskClass)
Check whether or not a class is suitable for serving as Ant task. Ant task implementation classes must be public, concrete, and have a no-arg constructor.

param
taskClass The class to be checked. Must not be null.
exception
BuildException if the class is unsuitable for being an Ant task. An error level message is logged before this exception is thrown.

        ComponentHelper.getComponentHelper(this).checkTaskClass(taskClass);

        if (!Modifier.isPublic(taskClass.getModifiers())) {
            final String message = taskClass + " is not public";
            log(message, Project.MSG_ERR);
            throw new BuildException(message);
        }
        if (Modifier.isAbstract(taskClass.getModifiers())) {
            final String message = taskClass + " is abstract";
            log(message, Project.MSG_ERR);
            throw new BuildException(message);
        }
        try {
            taskClass.getConstructor((Class[]) null);
            // don't have to check for public, since
            // getConstructor finds public constructors only.
        } catch (NoSuchMethodException e) {
            final String message = "No public no-arg constructor in "
                + taskClass;
            log(message, Project.MSG_ERR);
            throw new BuildException(message);
        } catch (LinkageError e) {
            String message = "Could not load " + taskClass + ": " + e;
            log(message, Project.MSG_ERR);
            throw new BuildException(message, e);
        }
        if (!Task.class.isAssignableFrom(taskClass)) {
            TaskAdapter.checkTaskClass(taskClass, this);
        }
    
public voidcopyFile(java.lang.String sourceFile, java.lang.String destFile)
Convenience method to copy a file from a source to a destination. No filtering is performed.

param
sourceFile Name of file to copy from. Must not be null.
param
destFile Name of file to copy to. Must not be null.
exception
IOException if the copying fails.
deprecated
since 1.4.x

        FILE_UTILS.copyFile(sourceFile, destFile);
    
public voidcopyFile(java.lang.String sourceFile, java.lang.String destFile, boolean filtering)
Convenience method to copy a file from a source to a destination specifying if token filtering should be used.

param
sourceFile Name of file to copy from. Must not be null.
param
destFile Name of file to copy to. Must not be null.
param
filtering Whether or not token filtering should be used during the copy.
exception
IOException if the copying fails.
deprecated
since 1.4.x

        FILE_UTILS.copyFile(sourceFile, destFile,
            filtering ? globalFilters : null);
    
public voidcopyFile(java.lang.String sourceFile, java.lang.String destFile, boolean filtering, boolean overwrite)
Convenience method to copy a file from a source to a destination specifying if token filtering should be used and if source files may overwrite newer destination files.

param
sourceFile Name of file to copy from. Must not be null.
param
destFile Name of file to copy to. Must not be null.
param
filtering Whether or not token filtering should be used during the copy.
param
overwrite Whether or not the destination file should be overwritten if it already exists.
exception
IOException if the copying fails.
deprecated
since 1.4.x

        FILE_UTILS.copyFile(sourceFile, destFile,
            filtering ? globalFilters : null, overwrite);
    
public voidcopyFile(java.lang.String sourceFile, java.lang.String destFile, boolean filtering, boolean overwrite, boolean preserveLastModified)
Convenience method to copy a file from a source to a destination specifying if token filtering should be used, if source files may overwrite newer destination files, and if the last modified time of the resulting file should be set to that of the source file.

param
sourceFile Name of file to copy from. Must not be null.
param
destFile Name of file to copy to. Must not be null.
param
filtering Whether or not token filtering should be used during the copy.
param
overwrite Whether or not the destination file should be overwritten if it already exists.
param
preserveLastModified Whether or not the last modified time of the resulting file should be set to that of the source file.
exception
IOException if the copying fails.
deprecated
since 1.4.x

        FILE_UTILS.copyFile(sourceFile, destFile,
            filtering ? globalFilters : null, overwrite, preserveLastModified);
    
public voidcopyFile(java.io.File sourceFile, java.io.File destFile)
Convenience method to copy a file from a source to a destination. No filtering is performed.

param
sourceFile File to copy from. Must not be null.
param
destFile File to copy to. Must not be null.
exception
IOException if the copying fails.
deprecated
since 1.4.x

        FILE_UTILS.copyFile(sourceFile, destFile);
    
public voidcopyFile(java.io.File sourceFile, java.io.File destFile, boolean filtering)
Convenience method to copy a file from a source to a destination specifying if token filtering should be used.

param
sourceFile File to copy from. Must not be null.
param
destFile File to copy to. Must not be null.
param
filtering Whether or not token filtering should be used during the copy.
exception
IOException if the copying fails.
deprecated
since 1.4.x

        FILE_UTILS.copyFile(sourceFile, destFile,
            filtering ? globalFilters : null);
    
public voidcopyFile(java.io.File sourceFile, java.io.File destFile, boolean filtering, boolean overwrite)
Convenience method to copy a file from a source to a destination specifying if token filtering should be used and if source files may overwrite newer destination files.

param
sourceFile File to copy from. Must not be null.
param
destFile File to copy to. Must not be null.
param
filtering Whether or not token filtering should be used during the copy.
param
overwrite Whether or not the destination file should be overwritten if it already exists.
exception
IOException if the file cannot be copied.
deprecated
since 1.4.x

        FILE_UTILS.copyFile(sourceFile, destFile,
            filtering ? globalFilters : null, overwrite);
    
public voidcopyFile(java.io.File sourceFile, java.io.File destFile, boolean filtering, boolean overwrite, boolean preserveLastModified)
Convenience method to copy a file from a source to a destination specifying if token filtering should be used, if source files may overwrite newer destination files, and if the last modified time of the resulting file should be set to that of the source file.

param
sourceFile File to copy from. Must not be null.
param
destFile File to copy to. Must not be null.
param
filtering Whether or not token filtering should be used during the copy.
param
overwrite Whether or not the destination file should be overwritten if it already exists.
param
preserveLastModified Whether or not the last modified time of the resulting file should be set to that of the source file.
exception
IOException if the file cannot be copied.
deprecated
since 1.4.x

        FILE_UTILS.copyFile(sourceFile, destFile,
            filtering ? globalFilters : null, overwrite, preserveLastModified);
    
public voidcopyInheritedProperties(org.apache.tools.ant.Project other)
Copy all user properties that have not been set on the command line or a GUI tool from this instance to the Project instance given as the argument.

To copy all "user" properties, you will also have to call {@link #copyUserProperties copyUserProperties}.

param
other the project to copy the properties to. Must not be null.
since
Ant 1.5

        PropertyHelper ph = PropertyHelper.getPropertyHelper(this);
        ph.copyInheritedProperties(other);
    
public voidcopyUserProperties(org.apache.tools.ant.Project other)
Copy all user properties that have been set on the command line or a GUI tool from this instance to the Project instance given as the argument.

To copy all "user" properties, you will also have to call {@link #copyInheritedProperties copyInheritedProperties}.

param
other the project to copy the properties to. Must not be null.
since
Ant 1.5

        PropertyHelper ph = PropertyHelper.getPropertyHelper(this);
        ph.copyUserProperties(other);
    
public AntClassLoadercreateClassLoader(org.apache.tools.ant.types.Path path)
Factory method to create a class loader for loading classes from a given path.

param
path the path from which classes are to be loaded.
return
an appropriate classloader.

        return new AntClassLoader(
            getClass().getClassLoader(), this, path);
    
public AntClassLoadercreateClassLoader(java.lang.ClassLoader parent, org.apache.tools.ant.types.Path path)
Factory method to create a class loader for loading classes from a given path.

param
parent the parent classloader for the new loader.
param
path the path from which classes are to be loaded.
return
an appropriate classloader.

        return new AntClassLoader(parent, this, path);
    
public java.lang.ObjectcreateDataType(java.lang.String typeName)
Create a new instance of a data type.

param
typeName The name of the data type to create an instance of. Must not be null.
return
an instance of the specified data type, or null if the data type name is not recognised.
exception
BuildException if the data type name is recognised but instance creation fails.

        return ComponentHelper.getComponentHelper(this).createDataType(typeName);
    
public org.apache.tools.ant.ProjectcreateSubProject()
Create and initialize a subproject. By default the subproject will be of the same type as its parent. If a no-arg constructor is unavailable, the Project class will be used.

return
a Project instance configured as a subproject of this Project.
since
Ant 1.7

        Project subProject = null;
        try {
            subProject = (Project) (getClass().newInstance());
        } catch (Exception e) {
            subProject = new Project();
        }
        initSubProject(subProject);
        return subProject;
    
public TaskcreateTask(java.lang.String taskType)
Create a new instance of a task, adding it to a list of created tasks for later invalidation. This causes all tasks to be remembered until the containing project is removed

param
taskType The name of the task to create an instance of. Must not be null.
return
an instance of the specified task, or null if the task name is not recognised.
exception
BuildException if the task name is recognised but task creation fails.

        return ComponentHelper.getComponentHelper(this).createTask(taskType);
    
public intdefaultInput(byte[] buffer, int offset, int length)
Read data from the default input stream. If no default has been specified, System.in is used.

param
buffer the buffer into which data is to be read.
param
offset the offset into the buffer at which data is stored.
param
length the amount of data to read.
return
the number of bytes read.
exception
IOException if the data cannot be read.
since
Ant 1.6

        if (defaultInputStream != null) {
            System.out.flush();
            return defaultInputStream.read(buffer, offset, length);
        } else {
            throw new EOFException("No input provided for project");
        }
    
public voiddemuxFlush(java.lang.String output, boolean isError)
Demultiplex flush operations so that each task receives the appropriate messages. If the current thread is not currently executing a task, the message is logged directly.

since
Ant 1.5.2
param
output Message to handle. Should not be null.
param
isError Whether the text represents an error (true) or information (false).

        Task task = getThreadTask(Thread.currentThread());
        if (task == null) {
            fireMessageLogged(this, output, isError ? MSG_ERR : MSG_INFO);
        } else {
            if (isError) {
                task.handleErrorFlush(output);
            } else {
                task.handleFlush(output);
            }
        }
    
public intdemuxInput(byte[] buffer, int offset, int length)
Demux an input request to the correct task.

param
buffer the buffer into which data is to be read.
param
offset the offset into the buffer at which data is stored.
param
length the amount of data to read.
return
the number of bytes read.
exception
IOException if the data cannot be read.
since
Ant 1.6

        Task task = getThreadTask(Thread.currentThread());
        if (task == null) {
            return defaultInput(buffer, offset, length);
        } else {
            return task.handleInput(buffer, offset, length);
        }
    
public voiddemuxOutput(java.lang.String output, boolean isWarning)
Demultiplex output so that each task receives the appropriate messages. If the current thread is not currently executing a task, the message is logged directly.

param
output Message to handle. Should not be null.
param
isWarning Whether the text represents an warning (true) or information (false).

        Task task = getThreadTask(Thread.currentThread());
        if (task == null) {
            log(output, isWarning ? MSG_WARN : MSG_INFO);
        } else {
            if (isWarning) {
                task.handleErrorOutput(output);
            } else {
                task.handleOutput(output);
            }
        }
    
public voidexecuteSortedTargets(java.util.Vector sortedTargets)
Execute a Vector of sorted targets.

param
sortedTargets the aforementioned Vector.
throws
BuildException on error.

        Set succeededTargets = new HashSet();
        BuildException buildException = null; // first build exception
        for (Enumeration iter = sortedTargets.elements();
             iter.hasMoreElements();) {
            Target curtarget = (Target) iter.nextElement();
            boolean canExecute = true;
            for (Enumeration depIter = curtarget.getDependencies();
                 depIter.hasMoreElements();) {
                String dependencyName = ((String) depIter.nextElement());
                if (!succeededTargets.contains(dependencyName)) {
                    canExecute = false;
                    log(curtarget,
                        "Cannot execute '" + curtarget.getName() + "' - '"
                        + dependencyName + "' failed or was not executed.",
                        MSG_ERR);
                    break;
                }
            }
            if (canExecute) {
                Throwable thrownException = null;
                try {
                    curtarget.performTasks();
                    succeededTargets.add(curtarget.getName());
                } catch (RuntimeException ex) {
                    if (!(keepGoingMode)) {
                        throw ex; // throw further
                    }
                    thrownException = ex;
                } catch (Throwable ex) {
                    if (!(keepGoingMode)) {
                        throw new BuildException(ex);
                    }
                    thrownException = ex;
                }
                if (thrownException != null) {
                    if (thrownException instanceof BuildException) {
                        log(curtarget,
                            "Target '" + curtarget.getName()
                            + "' failed with message '"
                            + thrownException.getMessage() + "'.", MSG_ERR);
                        // only the first build exception is reported
                        if (buildException == null) {
                            buildException = (BuildException) thrownException;
                        }
                    } else {
                        log(curtarget,
                            "Target '" + curtarget.getName()
                            + "' failed with message '"
                            + thrownException.getMessage() + "'.", MSG_ERR);
                        thrownException.printStackTrace(System.err);
                        if (buildException == null) {
                            buildException =
                                new BuildException(thrownException);
                        }
                    }
                }
            }
        }
        if (buildException != null) {
            throw buildException;
        }
    
public voidexecuteTarget(java.lang.String targetName)
Execute the specified target and any targets it depends on.

param
targetName The name of the target to execute. Must not be null.
exception
BuildException if the build failed.


        // sanity check ourselves, if we've been asked to build nothing
        // then we should complain

        if (targetName == null) {
            String msg = "No target specified";
            throw new BuildException(msg);
        }

        // Sort and run the dependency tree.
        // Sorting checks if all the targets (and dependencies)
        // exist, and if there is any cycle in the dependency
        // graph.
        executeSortedTargets(topoSort(targetName, targets, false));
    
public voidexecuteTargets(java.util.Vector names)
Execute the specified sequence of targets, and the targets they depend on.

param
names A vector of target name strings to execute. Must not be null.
exception
BuildException if the build failed.

        getExecutor().executeTargets(this,
            (String[]) (names.toArray(new String[names.size()])));
    
public voidfireBuildFinished(java.lang.Throwable exception)
Send a "build finished" event to the build listeners for this project.

param
exception an exception indicating a reason for a build failure. May be null, indicating a successful build.

        BuildEvent event = new BuildEvent(this);
        event.setException(exception);
        Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
            BuildListener listener = (BuildListener) iter.next();
            listener.buildFinished(event);
        }
        // Inform IH to clear the cache
        IntrospectionHelper.clearCache();
    
public voidfireBuildStarted()
Send a "build started" event to the build listeners for this project.

        BuildEvent event = new BuildEvent(this);
        Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
            BuildListener listener = (BuildListener) iter.next();
            listener.buildStarted(event);
        }
    
protected voidfireMessageLogged(org.apache.tools.ant.Project project, java.lang.String message, int priority)
Send a "message logged" project level event to the build listeners for this project.

param
project The project generating the event. Should not be null.
param
message The message to send. Should not be null.
param
priority The priority of the message.

        fireMessageLogged(project, message, null, priority);
    
protected voidfireMessageLogged(org.apache.tools.ant.Project project, java.lang.String message, java.lang.Throwable throwable, int priority)
Send a "message logged" project level event to the build listeners for this project.

param
project The project generating the event. Should not be null.
param
message The message to send. Should not be null.
param
throwable The exception that caused this message. May be null.
param
priority The priority of the message.
since
1.7

        BuildEvent event = new BuildEvent(project);
        event.setException(throwable);
        fireMessageLoggedEvent(event, message, priority);
    
protected voidfireMessageLogged(Target target, java.lang.String message, int priority)
Send a "message logged" target level event to the build listeners for this project.

param
target The target generating the event. Must not be null.
param
message The message to send. Should not be null.
param
priority The priority of the message.

        fireMessageLogged(target, message, null, priority);
    
protected voidfireMessageLogged(Target target, java.lang.String message, java.lang.Throwable throwable, int priority)
Send a "message logged" target level event to the build listeners for this project.

param
target The target generating the event. Must not be null.
param
message The message to send. Should not be null.
param
throwable The exception that caused this message. May be null.
param
priority The priority of the message.
since
1.7

        BuildEvent event = new BuildEvent(target);
        event.setException(throwable);
        fireMessageLoggedEvent(event, message, priority);
    
protected voidfireMessageLogged(Task task, java.lang.String message, int priority)
Send a "message logged" task level event to the build listeners for this project.

param
task The task generating the event. Must not be null.
param
message The message to send. Should not be null.
param
priority The priority of the message.

        fireMessageLogged(task, message, null, priority);
    
protected voidfireMessageLogged(Task task, java.lang.String message, java.lang.Throwable throwable, int priority)
Send a "message logged" task level event to the build listeners for this project.

param
task The task generating the event. Must not be null.
param
message The message to send. Should not be null.
param
throwable The exception that caused this message. May be null.
param
priority The priority of the message.
since
1.7

        BuildEvent event = new BuildEvent(task);
        event.setException(throwable);
        fireMessageLoggedEvent(event, message, priority);
    
private voidfireMessageLoggedEvent(BuildEvent event, java.lang.String message, int priority)
Send a "message logged" event to the build listeners for this project.

param
event The event to send. This should be built up with the appropriate task/target/project by the caller, so that this method can set the message and priority, then send the event. Must not be null.
param
message The message to send. Should not be null.
param
priority The priority of the message.


        if (message.endsWith(StringUtils.LINE_SEP)) {
            int endIndex = message.length() - StringUtils.LINE_SEP.length();
            event.setMessage(message.substring(0, endIndex), priority);
        } else {
            event.setMessage(message, priority);
        }
        synchronized (this) {
            if (loggingMessage) {
                /*
                 * One of the Listeners has attempted to access
                 * System.err or System.out.
                 *
                 * We used to throw an exception in this case, but
                 * sometimes Listeners can't prevent it(like our own
                 * Log4jListener which invokes getLogger() which in
                 * turn wants to write to the console).
                 *
                 * @see http://marc.theaimsgroup.com/?t=110538624200006&r=1&w=2
                 *
                 * We now (Ant 1.7 and 1.6.3) simply swallow the message.
                 */
                return;
            }
            try {
                loggingMessage = true;
                Iterator iter = listeners.iterator();
                while (iter.hasNext()) {
                    BuildListener listener = (BuildListener) iter.next();
                    listener.messageLogged(event);
                }
            } finally {
                loggingMessage = false;
            }
        }
    
public voidfireSubBuildFinished(java.lang.Throwable exception)
Send a "subbuild finished" event to the build listeners for this project.

param
exception an exception indicating a reason for a build failure. May be null, indicating a successful build.
since
Ant 1.6.2

        BuildEvent event = new BuildEvent(this);
        event.setException(exception);
        Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
            Object listener = iter.next();
            if (listener instanceof SubBuildListener) {
                ((SubBuildListener) listener).subBuildFinished(event);
            }
        }
    
public voidfireSubBuildStarted()
Send a "subbuild started" event to the build listeners for this project.

since
Ant 1.6.2

        BuildEvent event = new BuildEvent(this);
        Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
            Object listener = iter.next();
            if (listener instanceof SubBuildListener) {
                ((SubBuildListener) listener).subBuildStarted(event);
            }
        }
    
protected voidfireTargetFinished(Target target, java.lang.Throwable exception)
Send a "target finished" event to the build listeners for this project.

param
target The target which has finished building. Must not be null.
param
exception an exception indicating a reason for a build failure. May be null, indicating a successful build.

        BuildEvent event = new BuildEvent(target);
        event.setException(exception);
        Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
            BuildListener listener = (BuildListener) iter.next();
            listener.targetFinished(event);
        }
    
protected voidfireTargetStarted(Target target)
Send a "target started" event to the build listeners for this project.

param
target The target which is starting to build. Must not be null.

        BuildEvent event = new BuildEvent(target);
        Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
            BuildListener listener = (BuildListener) iter.next();
            listener.targetStarted(event);
        }
    
protected voidfireTaskFinished(Task task, java.lang.Throwable exception)
Send a "task finished" event to the build listeners for this project.

param
task The task which has finished executing. Must not be null.
param
exception an exception indicating a reason for a build failure. May be null, indicating a successful build.

        registerThreadTask(Thread.currentThread(), null);
        System.out.flush();
        System.err.flush();
        BuildEvent event = new BuildEvent(task);
        event.setException(exception);
        Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
            BuildListener listener = (BuildListener) iter.next();
            listener.taskFinished(event);
        }
    
protected voidfireTaskStarted(Task task)
Send a "task started" event to the build listeners for this project.

param
task The target which is starting to execute. Must not be null.

        // register this as the current task on the current thread.
        registerThreadTask(Thread.currentThread(), task);
        BuildEvent event = new BuildEvent(task);
        Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
            BuildListener listener = (BuildListener) iter.next();
            listener.taskStarted(event);
        }
    
public java.io.FilegetBaseDir()
Return the base directory of the project as a file object.

return
the project base directory, or null if the base directory has not been successfully set to a valid value.

        if (baseDir == null) {
            try {
                setBasedir(".");
            } catch (BuildException ex) {
                ex.printStackTrace();
            }
        }
        return baseDir;
    
public java.util.VectorgetBuildListeners()
Return a copy of the list of build listeners for the project.

return
a list of build listeners for the project

        return (Vector) listeners.clone();
    
public java.lang.ClassLoadergetCoreLoader()
Return the core classloader to use for this project. This may be null, indicating that the parent classloader should be used.

return
the core classloader to use for this project.

        return coreLoader;
    
public java.util.HashtablegetDataTypeDefinitions()
Return the current datatype definition hashtable. The returned hashtable is "live" and so should not be modified.

return
a map of from datatype name to implementing class (String to Class).

        return ComponentHelper.getComponentHelper(this).getDataTypeDefinitions();
    
public java.io.InputStreamgetDefaultInputStream()
Get this project's input stream.

return
the InputStream instance in use by this Project instance to read input.

        return defaultInputStream;
    
public java.lang.StringgetDefaultTarget()
Return the name of the default target of the project.

return
name of the default target or null if no default has been set.

        return defaultTarget;
    
public java.lang.StringgetDescription()
Return the project description, if one has been set.

return
the project description, or null if it hasn't been set.

        if (description == null) {
            description = Description.getDescription(this);
        }
        return description;
    
public java.lang.StringgetElementName(java.lang.Object element)
Return a description of the type of the given element, with special handling for instances of tasks and data types.

This is useful for logging purposes.

param
element The element to describe. Must not be null.
return
a description of the element type.
since
1.95, Ant 1.5

        return ComponentHelper.getComponentHelper(this).getElementName(element);
    
public ExecutorgetExecutor()
Get this Project's Executor (setting it if necessary).

return
an Executor instance.

        Object o = getReference(MagicNames.ANT_EXECUTOR_REFERENCE);
        if (o == null) {
            String classname = getProperty(MagicNames.ANT_EXECUTOR_CLASSNAME);
            if (classname == null) {
                classname = DefaultExecutor.class.getName();
            }
            log("Attempting to create object of type " + classname, MSG_DEBUG);
            try {
                o = Class.forName(classname, true, coreLoader).newInstance();
            } catch (ClassNotFoundException seaEnEfEx) {
                //try the current classloader
                try {
                    o = Class.forName(classname).newInstance();
                } catch (Exception ex) {
                    log(ex.toString(), MSG_ERR);
                }
            } catch (Exception ex) {
                log(ex.toString(), MSG_ERR);
            }
            if (o == null) {
                throw new BuildException(
                    "Unable to obtain a Target Executor instance.");
            }
            setExecutor((Executor) o);
        }
        return (Executor) o;
    
public java.util.HashtablegetFilters()
Return a hashtable of global filters, mapping tokens to values.

return
a hashtable of global filters, mapping tokens to values (String to String).
deprecated
since 1.4.x Use getGlobalFilterSet().getFilterHash().
see
#getGlobalFilterSet()
see
FilterSet#getFilterHash()

        // we need to build the hashtable dynamically
        return globalFilterSet.getFilterHash();
    
public org.apache.tools.ant.types.FilterSetgetGlobalFilterSet()
Return the set of global filters.

return
the set of global filters.

        return globalFilterSet;
    
public org.apache.tools.ant.input.InputHandlergetInputHandler()
Retrieve the current input handler.

return
the InputHandler instance currently in place for the project instance.

        return inputHandler;
    
public static java.lang.StringgetJavaVersion()
Return the version of Java this class is running under.

return
the version of Java as a String, e.g. "1.1" .
see
org.apache.tools.ant.util.JavaEnvUtils#getJavaVersion
deprecated
since 1.5.x. Use org.apache.tools.ant.util.JavaEnvUtils instead.

        return JavaEnvUtils.getJavaVersion();
    
public java.lang.StringgetName()
Return the project name, if one has been set.

return
the project name, or null if it hasn't been set.

        return name;
    
public java.util.HashtablegetProperties()
Return a copy of the properties table.

return
a hashtable containing all properties (including user properties).

        PropertyHelper ph = PropertyHelper.getPropertyHelper(this);
        return ph.getProperties();
    
public java.lang.StringgetProperty(java.lang.String propertyName)
Return the value of a property, if it is set.

param
propertyName The name of the property. May be null, in which case the return value is also null.
return
the property value, or null for no match or if a null name is provided.

        PropertyHelper ph = PropertyHelper.getPropertyHelper(this);
        return (String) ph.getProperty(null, propertyName);
    
public java.lang.ObjectgetReference(java.lang.String key)
Look up a reference by its key (ID).

param
key The key for the desired reference. Must not be null.
return
the reference with the specified ID, or null if there is no such reference in the project.

        Object ret = references.get(key);
        if (ret != null) {
            return ret;
        }
        // Check for old id behaviour
        ret = resolveIdReference(key, this);
        if (ret == null && !key.equals(MagicNames.REFID_PROPERTY_HELPER)) {
            Vector p = new Vector();
            PropertyHelper.getPropertyHelper(this).parsePropertyString(
                key, new Vector(), p);
            if (p.size() == 1) {
                log("Unresolvable reference " + key
                    + " might be a misuse of property expansion syntax.",
                    MSG_WARN);
            }
        }
        return ret;
    
public java.util.HashtablegetReferences()
Return a map of the references in the project (String to Object). The returned hashtable is "live" and so must not be modified.

return
a map of the references in the project (String to Object).

        return references;
    
public org.apache.tools.ant.types.ResourcegetResource(java.lang.String name)
Resolve the file relative to the project's basedir and return it as a FileResource.

param
name the name of the file to resolve.
return
the file resource.
since
Ant 1.7

        return new FileResource(getBaseDir(), name);
    
public java.util.HashtablegetTargets()
Return the hashtable of targets. The returned hashtable is "live" and so should not be modified.

return
a map from name to target (String to Target).

        return targets;
    
public java.util.HashtablegetTaskDefinitions()
Return the current task definition hashtable. The returned hashtable is "live" and so should not be modified.

return
a map of from task name to implementing class (String to Class).

        return ComponentHelper.getComponentHelper(this).getTaskDefinitions();
    
public TaskgetThreadTask(java.lang.Thread thread)
Get the current task associated with a thread, if any.

param
thread the thread for which the task is required.
return
the task which is currently registered for the given thread or null if no task is registered.

        Task task = (Task) threadTasks.get(thread);
        if (task == null) {
            ThreadGroup group = thread.getThreadGroup();
            while (task == null && group != null) {
                task = (Task) threadGroupTasks.get(group);
                group = group.getParent();
            }
        }
        return task;
    
public java.util.HashtablegetUserProperties()
Return a copy of the user property hashtable.

return
a hashtable containing just the user properties.

        PropertyHelper ph = PropertyHelper.getPropertyHelper(this);
        return ph.getUserProperties();
    
public java.lang.StringgetUserProperty(java.lang.String propertyName)
Return the value of a user property, if it is set.

param
propertyName The name of the property. May be null, in which case the return value is also null.
return
the property value, or null for no match or if a null name is provided.

        PropertyHelper ph = PropertyHelper.getPropertyHelper(this);
        return (String) ph.getUserProperty(null, propertyName);
    
public voidinheritIDReferences(org.apache.tools.ant.Project parent)
Inherit the id references.

param
parent the parent project of this project.

        parentIdProject = parent;
    
public voidinit()
Initialise the project. This involves setting the default task definitions and loading the system properties.

exception
BuildException if the default task list cannot be loaded.

        initProperties();

        ComponentHelper.getComponentHelper(this).initDefaultDefinitions();
    
public voidinitProperties()
Initializes the properties.

exception
BuildException if an vital property could not be set.
since
Ant 1.7

        setJavaVersionProperty();
        setSystemProperties();
        setPropertyInternal(MagicNames.ANT_VERSION, Main.getAntVersion());
        setAntLib();
    
public voidinitSubProject(org.apache.tools.ant.Project subProject)
Initialize a subproject.

param
subProject the subproject to initialize.

        ComponentHelper.getComponentHelper(subProject)
            .initSubProject(ComponentHelper.getComponentHelper(this));
        subProject.setDefaultInputStream(getDefaultInputStream());
        subProject.setKeepGoingMode(this.isKeepGoingMode());
        subProject.setExecutor(getExecutor().getSubProjectExecutor());
    
public booleanisKeepGoingMode()
Return the keep-going mode. If the keepGoing settor/getter methods are used in conjunction with the ant.executor.class property, they will have no effect.

return
"keep-going" mode
since
Ant 1.6

        return this.keepGoingMode;
    
public voidlog(java.lang.String message)
Write a message to the log with the default log level of MSG_INFO .

param
message The text to log. Should not be null.

        log(message, MSG_INFO);
    
public voidlog(java.lang.String message, int msgLevel)
Write a project level message to the log with the given log level.

param
message The text to log. Should not be null.
param
msgLevel The log priority level to use.

        log(message, null, msgLevel);
    
public voidlog(java.lang.String message, java.lang.Throwable throwable, int msgLevel)
Write a project level message to the log with the given log level.

param
message The text to log. Should not be null.
param
throwable The exception causing this log, may be null.
param
msgLevel The log priority level to use.
since
1.7

        fireMessageLogged(this, message, throwable, msgLevel);
    
public voidlog(Task task, java.lang.String message, int msgLevel)
Write a task level message to the log with the given log level.

param
task The task to use in the log. Must not be null.
param
message The text to log. Should not be null.
param
msgLevel The log priority level to use.

        fireMessageLogged(task, message, null, msgLevel);
    
public voidlog(Task task, java.lang.String message, java.lang.Throwable throwable, int msgLevel)
Write a task level message to the log with the given log level.

param
task The task to use in the log. Must not be null.
param
message The text to log. Should not be null.
param
throwable The exception causing this log, may be null.
param
msgLevel The log priority level to use.
since
1.7

        fireMessageLogged(task, message, throwable, msgLevel);
    
public voidlog(Target target, java.lang.String message, int msgLevel)
Write a target level message to the log with the given log level.

param
target The target to use in the log. Must not be null.
param
message The text to log. Should not be null.
param
msgLevel The log priority level to use.

        log(target, message, null, msgLevel);
    
public voidlog(Target target, java.lang.String message, java.lang.Throwable throwable, int msgLevel)
Write a target level message to the log with the given log level.

param
target The target to use in the log. Must not be null.
param
message The text to log. Should not be null.
param
throwable The exception causing this log, may be null.
param
msgLevel The log priority level to use.
since
1.7

        fireMessageLogged(target, message, throwable, msgLevel);
    
private static BuildExceptionmakeCircularException(java.lang.String end, java.util.Stack stk)
Build an appropriate exception detailing a specified circular dependency.

param
end The dependency to stop at. Must not be null.
param
stk A stack of dependencies. Must not be null.
return
a BuildException detailing the specified circular dependency.

        StringBuffer sb = new StringBuffer("Circular dependency: ");
        sb.append(end);
        String c;
        do {
            c = (String) stk.pop();
            sb.append(" <- ");
            sb.append(c);
        } while (!c.equals(end));
        return new BuildException(new String(sb));
    
public synchronized voidregisterThreadTask(java.lang.Thread thread, Task task)
Register a task as the current task for a thread. If the task is null, the thread's entry is removed.

param
thread the thread on which the task is registered.
param
task the task to be registered.
since
Ant 1.5

        if (task != null) {
            threadTasks.put(thread, task);
            threadGroupTasks.put(thread.getThreadGroup(), task);
        } else {
            threadTasks.remove(thread);
            threadGroupTasks.remove(thread.getThreadGroup());
        }
    
public synchronized voidremoveBuildListener(BuildListener listener)
Remove a build listener from the list. This listener will no longer be notified of build events for this project.

param
listener The listener to remove from the list. Should not be null.

        // create a new Vector to avoid ConcurrentModificationExc when
        // the listeners get added/removed while we are in fire
        Vector newListeners = getBuildListeners();
        newListeners.removeElement(listener);
        listeners = newListeners;
    
public java.lang.StringreplaceProperties(java.lang.String value)
Replace ${} style constructions in the given value with the string value of the corresponding data types.

param
value The string to be scanned for property references. May be null.
return
the given string with embedded property names replaced by values, or null if the given string is null.
exception
BuildException if the given value has an unclosed property name, e.g. ${xxx.

        PropertyHelper ph = PropertyHelper.getPropertyHelper(this);
        return ph.replaceProperties(null, value, null);
    
public java.io.FileresolveFile(java.lang.String fileName, java.io.File rootDir)
Return the canonical form of a filename.

If the specified file name is relative it is resolved with respect to the given root directory.

param
fileName The name of the file to resolve. Must not be null.
param
rootDir The directory respective to which relative file names are resolved. May be null, in which case the current directory is used.
return
the resolved File.
deprecated
since 1.4.x

        return FILE_UTILS.resolveFile(rootDir, fileName);
    
public java.io.FileresolveFile(java.lang.String fileName)
Return the canonical form of a filename.

If the specified file name is relative it is resolved with respect to the project's base directory.

param
fileName The name of the file to resolve. Must not be null.
return
the resolved File.

        return FILE_UTILS.resolveFile(baseDir, fileName);
    
private java.lang.ObjectresolveIdReference(java.lang.String key, org.apache.tools.ant.Project callerProject)
Attempt to resolve an Unknown Reference using the parsed id's - for BC.

        UnknownElement origUE = (UnknownElement) idReferences.get(key);
        if (origUE == null) {
            return parentIdProject == null
                ? null
                : parentIdProject.resolveIdReference(key, callerProject);
        }
        callerProject.log(
            "Warning: Reference " + key + " has not been set at runtime,"
            + " but was found during" + LINE_SEP
            + "build file parsing, attempting to resolve."
            + " Future versions of Ant may support" + LINE_SEP
            + " referencing ids defined in non-executed targets.", MSG_WARN);
        UnknownElement copyUE = origUE.copy(callerProject);
        copyUE.maybeConfigure();
        return copyUE.getRealThing();
    
private voidsetAntLib()

        File antlib = org.apache.tools.ant.launch.Locator.getClassSource(
            Project.class);
        if (antlib != null) {
            setPropertyInternal(MagicNames.ANT_LIB, antlib.getAbsolutePath());
        }
    
public voidsetBaseDir(java.io.File baseDir)
Set the base directory for the project, checking that the given file exists and is a directory.

param
baseDir The project base directory. Must not be null.
exception
BuildException if the specified file doesn't exist or isn't a directory.

        baseDir = FILE_UTILS.normalize(baseDir.getAbsolutePath());
        if (!baseDir.exists()) {
            throw new BuildException("Basedir " + baseDir.getAbsolutePath()
                + " does not exist");
        }
        if (!baseDir.isDirectory()) {
            throw new BuildException("Basedir " + baseDir.getAbsolutePath()
                + " is not a directory");
        }
        this.baseDir = baseDir;
        setPropertyInternal(MagicNames.PROJECT_BASEDIR, this.baseDir.getPath());
        String msg = "Project base dir set to: " + this.baseDir;
         log(msg, MSG_VERBOSE);
    
public voidsetBasedir(java.lang.String baseD)
Set the base directory for the project, checking that the given filename exists and is a directory.

param
baseD The project base directory. Must not be null.
exception
BuildException if the directory if invalid.

        setBaseDir(new File(baseD));
    
public voidsetCoreLoader(java.lang.ClassLoader coreLoader)
Set the core classloader for the project. If a null classloader is specified, the parent classloader should be used.

param
coreLoader The classloader to use for the project. May be null.

        this.coreLoader = coreLoader;
    
public voidsetDefault(java.lang.String defaultTarget)
Set the default target of the project.

param
defaultTarget The name of the default target for this project. May be null, indicating that there is no default target.

        this.defaultTarget = defaultTarget;
    
public voidsetDefaultInputStream(java.io.InputStream defaultInputStream)
Set the default System input stream. Normally this stream is set to System.in. This inputStream is used when no task input redirection is being performed.

param
defaultInputStream the default input stream to use when input is requested.
since
Ant 1.6

        this.defaultInputStream = defaultInputStream;
    
public voidsetDefaultTarget(java.lang.String defaultTarget)
Set the default target of the project.

param
defaultTarget The name of the default target for this project. May be null, indicating that there is no default target.
deprecated
since 1.5.x. Use setDefault.
see
#setDefault(String)

        this.defaultTarget = defaultTarget;
    
public voidsetDescription(java.lang.String description)
Set the project description.

param
description The description of the project. May be null.

        this.description = description;
    
public voidsetExecutor(Executor e)
Set the Executor instance for this Project.

param
e the Executor to use.

        addReference(MagicNames.ANT_EXECUTOR_REFERENCE, e);
    
public voidsetFileLastModified(java.io.File file, long time)
Call File.setLastModified(long time) on Java above 1.1, and logs a warning on Java 1.1.

param
file The file to set the last modified time on. Must not be null.
param
time the required modification time.
deprecated
since 1.4.x
exception
BuildException if the last modified time cannot be set despite running on a platform with a version above 1.1.

        FILE_UTILS.setFileLastModified(file, time);
        log("Setting modification time for " + file, MSG_VERBOSE);
    
public voidsetInheritedProperty(java.lang.String name, java.lang.String value)
Set a user property, which cannot be overwritten by set/unset property calls. Any previous value is overwritten. Also marks these properties as properties that have not come from the command line.

param
name The name of property to set. Must not be null.
param
value The new value of the property. Must not be null.
see
#setProperty(String,String)

        PropertyHelper ph = PropertyHelper.getPropertyHelper(this);
        ph.setInheritedProperty(null, name, value);
    
public voidsetInputHandler(org.apache.tools.ant.input.InputHandler handler)
Set the input handler.

param
handler the InputHandler instance to use for gathering input.


                       
        
        inputHandler = handler;
    
public voidsetJavaVersionProperty()
Set the ant.java.version property and tests for unsupported JVM versions. If the version is supported, verbose log messages are generated to record the Java version and operating system name.

exception
BuildException if this Java version is not supported.
see
org.apache.tools.ant.util.JavaEnvUtils#getJavaVersion

        String javaVersion = JavaEnvUtils.getJavaVersion();
        setPropertyInternal(MagicNames.ANT_JAVA_VERSION, javaVersion);

        // sanity check
        if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_0)
                || JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1))  {
            throw new BuildException("Ant cannot work on Java 1.0 / 1.1");
        }
        log("Detected Java version: " + javaVersion + " in: "
            + System.getProperty("java.home"), MSG_VERBOSE);

        log("Detected OS: " + System.getProperty("os.name"), MSG_VERBOSE);
    
public voidsetKeepGoingMode(boolean keepGoingMode)
Set "keep-going" mode. In this mode Ant will try to execute as many targets as possible. All targets that do not depend on failed target(s) will be executed. If the keepGoing settor/getter methods are used in conjunction with the ant.executor.class property, they will have no effect.

param
keepGoingMode "keep-going" mode
since
Ant 1.6

        this.keepGoingMode = keepGoingMode;
    
public voidsetName(java.lang.String name)
Set the name of the project, also setting the user property ant.project.name.

param
name The name of the project. Must not be null.

        setUserProperty("ant.project.name",  name);
        this.name = name;
    
public voidsetNewProperty(java.lang.String name, java.lang.String value)
Set a property if no value currently exists. If the property exists already, a message is logged and the method returns with no other effect.

param
name The name of property to set. Must not be null.
param
value The new value of the property. Must not be null.
since
1.5

        PropertyHelper.getPropertyHelper(this).setNewProperty(null, name,
                                                              value);
    
public final voidsetProjectReference(java.lang.Object obj)
Set a reference to this Project on the parameterized object. Need to set the project before other set/add elements are called.

param
obj the object to invoke setProject(this) on.

        if (obj instanceof ProjectComponent) {
            ((ProjectComponent) obj).setProject(this);
            return;
        }
        try {
            Method method =
                obj.getClass().getMethod(
                    "setProject", new Class[] {Project.class});
            if (method != null) {
                method.invoke(obj, new Object[] {this});
            }
        } catch (Throwable e) {
            // ignore this if the object does not have
            // a set project method or the method
            // is private/protected.
        }
    
public voidsetProperty(java.lang.String name, java.lang.String value)
Set a property. Any existing property of the same name is overwritten, unless it is a user property.

param
name The name of property to set. Must not be null.
param
value The new value of the property. Must not be null.

        PropertyHelper.getPropertyHelper(this).
                setProperty(null, name, value, true);
    
private voidsetPropertyInternal(java.lang.String name, java.lang.String value)
Set a property unless it is already defined as a user property (in which case the method returns silently).

param
name The name of the property. Must not be null.
param
value The property value. Must not be null.

        PropertyHelper ph = PropertyHelper.getPropertyHelper(this);
        ph.setProperty(null, name, value, false);
    
public voidsetSystemProperties()
Add all system properties which aren't already defined as user properties to the project properties.

        Properties systemP = System.getProperties();
        Enumeration e = systemP.propertyNames();
        while (e.hasMoreElements()) {
            String propertyName = (String) e.nextElement();
            String value = systemP.getProperty(propertyName);
            this.setPropertyInternal(propertyName, value);
        }
    
public voidsetUserProperty(java.lang.String name, java.lang.String value)
Set a user property, which cannot be overwritten by set/unset property calls. Any previous value is overwritten.

param
name The name of property to set. Must not be null.
param
value The new value of the property. Must not be null.
see
#setProperty(String,String)

        PropertyHelper.getPropertyHelper(this).setUserProperty(null, name,
                                                               value);
    
public static booleantoBoolean(java.lang.String s)
Return the boolean equivalent of a string, which is considered true if either "on", "true", or "yes" is found, ignoring case.

param
s The string to convert to a boolean value.
return
true if the given string is "on", "true" or "yes", or false otherwise.

        return ("on".equalsIgnoreCase(s)
                || "true".equalsIgnoreCase(s)
                || "yes".equalsIgnoreCase(s));
    
public final java.util.VectortopoSort(java.lang.String root, java.util.Hashtable targetTable)
Topologically sort a set of targets. Equivalent to calling topoSort(new String[] {root}, targets, true).

param
root The name of the root target. The sort is created in such a way that the sequence of Targets up to the root target is the minimum possible such sequence. Must not be null.
param
targetTable A Hashtable mapping names to Targets. Must not be null.
return
a Vector of ALL Target objects in sorted order.
exception
BuildException if there is a cyclic dependency among the targets, or if a named target does not exist.

        return topoSort(new String[] {root}, targetTable, true);
    
public final java.util.VectortopoSort(java.lang.String root, java.util.Hashtable targetTable, boolean returnAll)
Topologically sort a set of targets. Equivalent to calling topoSort(new String[] {root}, targets, returnAll).

param
root The name of the root target. The sort is created in such a way that the sequence of Targets up to the root target is the minimum possible such sequence. Must not be null.
param
targetTable A Hashtable mapping names to Targets. Must not be null.
param
returnAll boolean indicating whether to return all targets, or the execution sequence only.
return
a Vector of Target objects in sorted order.
exception
BuildException if there is a cyclic dependency among the targets, or if a named target does not exist.
since
Ant 1.6.3

        return topoSort(new String[] {root}, targetTable, returnAll);
    
public final java.util.VectortopoSort(java.lang.String[] root, java.util.Hashtable targetTable, boolean returnAll)
Topologically sort a set of targets.

param
root String[] containing the names of the root targets. The sort is created in such a way that the ordered sequence of Targets is the minimum possible such sequence to the specified root targets. Must not be null.
param
targetTable A map of names to targets (String to Target). Must not be null.
param
returnAll boolean indicating whether to return all targets, or the execution sequence only.
return
a Vector of Target objects in sorted order.
exception
BuildException if there is a cyclic dependency among the targets, or if a named target does not exist.
since
Ant 1.6.3

        Vector ret = new Vector();
        Hashtable state = new Hashtable();
        Stack visiting = new Stack();

        // We first run a DFS based sort using each root as a starting node.
        // This creates the minimum sequence of Targets to the root node(s).
        // We then do a sort on any remaining unVISITED targets.
        // This is unnecessary for doing our build, but it catches
        // circular dependencies or missing Targets on the entire
        // dependency tree, not just on the Targets that depend on the
        // build Target.

        for (int i = 0; i < root.length; i++) {
            String st = (String) (state.get(root[i]));
            if (st == null) {
                tsort(root[i], targetTable, state, visiting, ret);
            } else if (st == VISITING) {
                throw new RuntimeException("Unexpected node in visiting state: "
                    + root[i]);
            }
        }
        StringBuffer buf = new StringBuffer("Build sequence for target(s)");

        for (int j = 0; j < root.length; j++) {
            buf.append((j == 0) ? " `" : ", `").append(root[j]).append('\'");
        }
        buf.append(" is " + ret);
        log(buf.toString(), MSG_VERBOSE);

        Vector complete = (returnAll) ? ret : new Vector(ret);
        for (Enumeration en = targetTable.keys(); en.hasMoreElements();) {
            String curTarget = (String) en.nextElement();
            String st = (String) state.get(curTarget);
            if (st == null) {
                tsort(curTarget, targetTable, state, visiting, complete);
            } else if (st == VISITING) {
                throw new RuntimeException("Unexpected node in visiting state: "
                    + curTarget);
            }
        }
        log("Complete build sequence is " + complete, MSG_VERBOSE);
        return ret;
    
public static java.lang.StringtranslatePath(java.lang.String toProcess)
Translate a path into its native (platform specific) format.

This method uses PathTokenizer to separate the input path into its components. This handles DOS style paths in a relatively sensible way. The file separators are then converted to their platform specific versions.

param
toProcess The path to be translated. May be null.
return
the native version of the specified path or an empty string if the path is null or empty.
deprecated
since 1.7 Use FileUtils.translatePath instead.
see
PathTokenizer

        return FileUtils.translatePath(toProcess);
    
private voidtsort(java.lang.String root, java.util.Hashtable targetTable, java.util.Hashtable state, java.util.Stack visiting, java.util.Vector ret)
Perform a single step in a recursive depth-first-search traversal of the target dependency tree.

The current target is first set to the "visiting" state, and pushed onto the "visiting" stack.

An exception is then thrown if any child of the current node is in the visiting state, as that implies a circular dependency. The exception contains details of the cycle, using elements of the "visiting" stack.

If any child has not already been "visited", this method is called recursively on it.

The current target is then added to the ordered list of targets. Note that this is performed after the children have been visited in order to get the correct order. The current target is set to the "visited" state.

By the time this method returns, the ordered list contains the sequence of targets up to and including the current target.

param
root The current target to inspect. Must not be null.
param
targetTable A mapping from names to targets (String to Target). Must not be null.
param
state A mapping from target names to states (String to String). The states in question are "VISITING" and "VISITED". Must not be null.
param
visiting A stack of targets which are currently being visited. Must not be null.
param
ret The list to add target names to. This will end up containing the complete list of dependencies in dependency order. Must not be null.
exception
BuildException if a non-existent target is specified or if a circular dependency is detected.

        state.put(root, VISITING);
        visiting.push(root);

        Target target = (Target) targetTable.get(root);

        // Make sure we exist
        if (target == null) {
            StringBuffer sb = new StringBuffer("Target \"");
            sb.append(root);
            sb.append("\" does not exist in the project \"");
            sb.append(name);
            sb.append("\". ");
            visiting.pop();
            if (!visiting.empty()) {
                String parent = (String) visiting.peek();
                sb.append("It is used from target \"");
                sb.append(parent);
                sb.append("\".");
            }
            throw new BuildException(new String(sb));
        }
        for (Enumeration en = target.getDependencies(); en.hasMoreElements();) {
            String cur = (String) en.nextElement();
            String m = (String) state.get(cur);
            if (m == null) {
                // Not been visited
                tsort(cur, targetTable, state, visiting, ret);
            } else if (m == VISITING) {
                // Currently visiting this node, so have a cycle
                throw makeCircularException(cur, visiting);
            }
        }
        String p = (String) visiting.pop();
        if (root != p) {
            throw new RuntimeException("Unexpected internal error: expected to "
                + "pop " + root + " but got " + p);
        }
        state.put(root, VISITED);
        ret.addElement(target);