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

Ant

public class Ant extends org.apache.tools.ant.Task
Build a sub-project.
<target name="foo" depends="init">
<ant antfile="build.xml" target="bar" >
<property name="property1" value="aaaaa" />
<property name="foo" value="baz" />
</ant>
</target>

<target name="bar" depends="init">
<echo message="prop is ${property1} ${foo}" />
</target>
since
Ant 1.1
ant.task
category="control"

Fields Summary
private static final org.apache.tools.ant.util.FileUtils
FILE_UTILS
private File
dir
the basedir where is executed the build file
private String
antFile
the build.xml file (can be absolute) in this case dir will be ignored
private String
output
the output
private boolean
inheritAll
should we inherit properties from the parent ?
private boolean
inheritRefs
should we inherit references from the parent ?
private Vector
properties
the properties to pass to the new project
private Vector
references
the references to pass to the new project
private org.apache.tools.ant.Project
newProject
the temporary project created to run the build file
private PrintStream
out
The stream to which output is to be written.
private Vector
propertySets
the sets of properties to pass to the new project
private Vector
targets
the targets to call on the new project
private boolean
targetAttributeSet
whether the target attribute was specified
Constructors Summary
public Ant()
simple constructor


           
      
        //default
    
public Ant(org.apache.tools.ant.Task owner)
create a task bound to its creator

param
owner owning task

        bindToOwner(owner);
    
Methods Summary
private voidaddAlmostAll(java.util.Hashtable props)
Copies all properties from the given table to the new project - omitting those that have already been set in the new project as well as properties named basedir or ant.file.

param
props properties Hashtable to copy to the new project.
since
Ant 1.6

        Enumeration e = props.keys();
        while (e.hasMoreElements()) {
            String key = e.nextElement().toString();
            if (MagicNames.PROJECT_BASEDIR.equals(key) || MagicNames.ANT_FILE.equals(key)) {
                // basedir and ant.file get special treatment in execute()
                continue;
            }

            String value = props.get(key).toString();
            // don't re-set user properties, avoid the warning message
            if (newProject.getProperty(key) == null) {
                // no user property
                newProject.setNewProperty(key, value);
            }
        }
    
public voidaddConfiguredTarget(org.apache.tools.ant.taskdefs.Ant$TargetElement t)
Add a target to this Ant invocation.

param
t the TargetElement to add.
since
Ant 1.6.3

        if (targetAttributeSet) {
            throw new BuildException(
                "nested target is incompatible with the target attribute");
        }
        String name = t.getName();
        if (name.equals("")) {
            throw new BuildException("target name must not be empty");
        }
        targets.add(name);
    
public voidaddPropertyset(org.apache.tools.ant.types.PropertySet ps)
Add a set of properties to pass to the new project.

param
ps PropertySet to add.
since
Ant 1.6

        propertySets.addElement(ps);
    
public voidaddReference(org.apache.tools.ant.taskdefs.Ant$Reference ref)
Add a Reference element identifying a data type to carry over to the new project.

param
ref Reference to add.

        references.addElement(ref);
    
private voidaddReferences()
Add the references explicitly defined as nested elements to the new project. Also copy over all references that don't override existing references in the new project if inheritrefs has been requested.

throws
BuildException if a reference does not have a refid.

        Hashtable thisReferences
            = (Hashtable) getProject().getReferences().clone();
        Hashtable newReferences = newProject.getReferences();
        Enumeration e;
        if (references.size() > 0) {
            for (e = references.elements(); e.hasMoreElements();) {
                Reference ref = (Reference) e.nextElement();
                String refid = ref.getRefId();
                if (refid == null) {
                    throw new BuildException("the refid attribute is required"
                                             + " for reference elements");
                }
                if (!thisReferences.containsKey(refid)) {
                    log("Parent project doesn't contain any reference '"
                        + refid + "'",
                        Project.MSG_WARN);
                    continue;
                }

                thisReferences.remove(refid);
                String toRefid = ref.getToRefid();
                if (toRefid == null) {
                    toRefid = refid;
                }
                copyReference(refid, toRefid);
            }
        }

        // Now add all references that are not defined in the
        // subproject, if inheritRefs is true
        if (inheritRefs) {
            for (e = thisReferences.keys(); e.hasMoreElements();) {
                String key = (String) e.nextElement();
                if (newReferences.containsKey(key)) {
                    continue;
                }
                copyReference(key, key);
                newProject.inheritIDReferences(getProject());
            }
        }
    
private voidcopyReference(java.lang.String oldKey, java.lang.String newKey)
Try to clone and reconfigure the object referenced by oldkey in the parent project and add it to the new project with the key newkey.

If we cannot clone it, copy the referenced object itself and keep our fingers crossed.

param
oldKey the reference id in the current project.
param
newKey the reference id in the new project.

        Object orig = getProject().getReference(oldKey);
        if (orig == null) {
            log("No object referenced by " + oldKey + ". Can't copy to "
                + newKey,
                Project.MSG_WARN);
            return;
        }

        Class c = orig.getClass();
        Object copy = orig;
        try {
            Method cloneM = c.getMethod("clone", new Class[0]);
            if (cloneM != null) {
                copy = cloneM.invoke(orig, new Object[0]);
                log("Adding clone of reference " + oldKey, Project.MSG_DEBUG);
            }
        } catch (Exception e) {
            // not Clonable
        }


        if (copy instanceof ProjectComponent) {
            ((ProjectComponent) copy).setProject(newProject);
        } else {
            try {
                Method setProjectM =
                    c.getMethod("setProject", new Class[] {Project.class});
                if (setProjectM != null) {
                    setProjectM.invoke(copy, new Object[] {newProject});
                }
            } catch (NoSuchMethodException e) {
                // ignore this if the class being referenced does not have
                // a set project method.
            } catch (Exception e2) {
                String msg = "Error setting new project instance for "
                    + "reference with id " + oldKey;
                throw new BuildException(msg, e2, getLocation());
            }
        }
        newProject.addReference(newKey, copy);
    
public PropertycreateProperty()
Property to pass to the new project. The property is passed as a 'user property'.

return
the created Property object.

        Property p = new Property(true, getProject());
        p.setProject(getNewProject());
        p.setTaskName("property");
        properties.addElement(p);
        return p;
    
public voidexecute()
Do the execution.

throws
BuildException if a target tries to call itself; probably also if a BuildException is thrown by the new project.

        File savedDir = dir;
        String savedAntFile = antFile;
        Vector locals = new Vector(targets);
        try {
            getNewProject();

            if (dir == null && inheritAll) {
                dir = getProject().getBaseDir();
            }

            initializeProject();

            if (dir != null) {
                newProject.setBaseDir(dir);
                if (savedDir != null) {
                    // has been set explicitly
                    newProject.setInheritedProperty(MagicNames.PROJECT_BASEDIR,
                                                    dir.getAbsolutePath());
                }
            } else {
                dir = getProject().getBaseDir();
            }

            overrideProperties();

            if (antFile == null) {
                antFile = Main.DEFAULT_BUILD_FILENAME;
            }

            File file = FILE_UTILS.resolveFile(dir, antFile);
            antFile = file.getAbsolutePath();

            log("calling target(s) "
                + ((locals.size() > 0) ? locals.toString() : "[default]")
                + " in build file " + antFile, Project.MSG_VERBOSE);
            newProject.setUserProperty(MagicNames.ANT_FILE , antFile);

            String thisAntFile = getProject().getProperty(MagicNames.ANT_FILE);
            // Are we trying to call the target in which we are defined (or
            // the build file if this is a top level task)?
            if (thisAntFile != null
                && file.equals(getProject().resolveFile(thisAntFile))
                && getOwningTarget() != null) {

                if (getOwningTarget().getName().equals("")) {
                    if (getTaskName().equals("antcall")) {
                        throw new BuildException("antcall must not be used at"
                                                 + " the top level.");
                    }
                    throw new BuildException(getTaskName() + " task at the"
                                + " top level must not invoke"
                                + " its own build file.");
                }
            }

            try {
                ProjectHelper.configureProject(newProject, file);
            } catch (BuildException ex) {
                throw ProjectHelper.addLocationToBuildException(
                    ex, getLocation());
            }

            if (locals.size() == 0) {
                String defaultTarget = newProject.getDefaultTarget();
                if (defaultTarget != null) {
                    locals.add(defaultTarget);
                }
            }

            if (newProject.getProperty(MagicNames.ANT_FILE)
                .equals(getProject().getProperty(MagicNames.ANT_FILE))
                && getOwningTarget() != null) {

                String owningTargetName = getOwningTarget().getName();

                if (locals.contains(owningTargetName)) {
                    throw new BuildException(getTaskName() + " task calling "
                                             + "its own parent target.");
                }
                boolean circular = false;
                for (Iterator it = locals.iterator();
                     !circular && it.hasNext();) {
                    Target other =
                        (Target) (getProject().getTargets().get(it.next()));
                    circular |= (other != null
                                 && other.dependsOn(owningTargetName));
                }
                if (circular) {
                    throw new BuildException(getTaskName()
                                             + " task calling a target"
                                             + " that depends on"
                                             + " its parent target \'"
                                             + owningTargetName
                                             + "\'.");
                }
            }

            addReferences();

            if (locals.size() > 0 && !(locals.size() == 1
                                       && "".equals(locals.get(0)))) {
                BuildException be = null;
                try {
                    log("Entering " + antFile + "...", Project.MSG_VERBOSE);
                    newProject.fireSubBuildStarted();
                    newProject.executeTargets(locals);
                } catch (BuildException ex) {
                    be = ProjectHelper
                        .addLocationToBuildException(ex, getLocation());
                    throw be;
                } finally {
                    log("Exiting " + antFile + ".", Project.MSG_VERBOSE);
                    newProject.fireSubBuildFinished(be);
                }
            }
        } finally {
            // help the gc
            newProject = null;
            Enumeration e = properties.elements();
            while (e.hasMoreElements()) {
                Property p = (Property) e.nextElement();
                p.setProject(null);
            }

            if (output != null && out != null) {
                try {
                    out.close();
                } catch (final Exception ex) {
                    //ignore
                }
            }
            dir = savedDir;
            antFile = savedAntFile;
        }
    
private java.util.IteratorgetBuildListeners()

since
Ant 1.6.2

        return getProject().getBuildListeners().iterator();
    
protected org.apache.tools.ant.ProjectgetNewProject()

        if (newProject == null) {
            reinit();
        }
        return newProject;
    
public voidhandleErrorFlush(java.lang.String errorOutputToFlush)
Handle error output. Send it the the new project if is present, otherwise call the super class.

param
errorOutputToFlush The string to output.
see
Task#handleErrorFlush(String)
since
Ant 1.5.2

        if (newProject != null) {
            newProject.demuxFlush(errorOutputToFlush, true);
        } else {
            super.handleErrorFlush(errorOutputToFlush);
        }
    
public voidhandleErrorOutput(java.lang.String errorOutputToHandle)
Handle error output. Send it the the new project if is present, otherwise call the super class.

param
errorOutputToHandle The string to output.
see
Task#handleErrorOutput(String)
since
Ant 1.5

        if (newProject != null) {
            newProject.demuxOutput(errorOutputToHandle, true);
        } else {
            super.handleErrorOutput(errorOutputToHandle);
        }
    
public voidhandleFlush(java.lang.String toFlush)
Handles output. Send it the the new project if is present, otherwise call the super class.

param
toFlush The string to output.
see
Task#handleFlush(String)
since
Ant 1.5.2

        if (newProject != null) {
            newProject.demuxFlush(toFlush, false);
        } else {
            super.handleFlush(toFlush);
        }
    
public inthandleInput(byte[] buffer, int offset, int length)
Handles input. Deleate to the created project, if present, otherwise call the super class.

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.
see
Task#handleInput(byte[], int, int)
since
Ant 1.6

        if (newProject != null) {
            return newProject.demuxInput(buffer, offset, length);
        }
        return super.handleInput(buffer, offset, length);
    
public voidhandleOutput(java.lang.String outputToHandle)
Handles output. Send it the the new project if is present, otherwise call the super class.

param
outputToHandle The string output to output.
see
Task#handleOutput(String)
since
Ant 1.5

        if (newProject != null) {
            newProject.demuxOutput(outputToHandle, false);
        } else {
            super.handleOutput(outputToHandle);
        }
    
public voidinit()
Creates a Project instance for the project to call.

        newProject = getProject().createSubProject();
        newProject.setJavaVersionProperty();
    
private voidinitializeProject()
Attaches the build listeners of the current project to the new project, configures a possible logfile, transfers task and data-type definitions, transfers properties (either all or just the ones specified as user properties to the current project, depending on inheritall), transfers the input handler.

        newProject.setInputHandler(getProject().getInputHandler());

        Iterator iter = getBuildListeners();
        while (iter.hasNext()) {
            newProject.addBuildListener((BuildListener) iter.next());
        }

        if (output != null) {
            File outfile = null;
            if (dir != null) {
                outfile = FILE_UTILS.resolveFile(dir, output);
            } else {
                outfile = getProject().resolveFile(output);
            }
            try {
                out = new PrintStream(new FileOutputStream(outfile));
                DefaultLogger logger = new DefaultLogger();
                logger.setMessageOutputLevel(Project.MSG_INFO);
                logger.setOutputPrintStream(out);
                logger.setErrorPrintStream(out);
                newProject.addBuildListener(logger);
            } catch (IOException ex) {
                log("Ant: Can't set output to " + output);
            }
        }
        // set user-defined properties
        getProject().copyUserProperties(newProject);

        if (!inheritAll) {
           // set Java built-in properties separately,
           // b/c we won't inherit them.
           newProject.setSystemProperties();

        } else {
            // set all properties from calling project
            addAlmostAll(getProject().getProperties());
        }

        Enumeration e = propertySets.elements();
        while (e.hasMoreElements()) {
            PropertySet ps = (PropertySet) e.nextElement();
            addAlmostAll(ps.getProperties());
        }
    
private voidoverrideProperties()
Override the properties in the new project with the one explicitly defined as nested elements here.

throws
BuildException under unknown circumstances.

        // remove duplicate properties - last property wins
        // Needed for backward compatibility
        Set set = new HashSet();
        for (int i = properties.size() - 1; i >= 0; --i) {
            Property p = (Property) properties.get(i);
            if (p.getName() != null && !p.getName().equals("")) {
                if (set.contains(p.getName())) {
                    properties.remove(i);
                } else {
                    set.add(p.getName());
                }
            }
        }
        Enumeration e = properties.elements();
        while (e.hasMoreElements()) {
            Property p = (Property) e.nextElement();
            p.setProject(newProject);
            p.execute();
        }
        getProject().copyInheritedProperties(newProject);
    
private voidreinit()
Called in execute or createProperty (via getNewProject()) if newProject is null.

This can happen if the same instance of this task is run twice as newProject is set to null at the end of execute (to save memory and help the GC).

calls init() again

        init();
    
public voidsetAntfile(java.lang.String antFile)
The build file to use. Defaults to "build.xml". This file is expected to be a filename relative to the dir attribute given.

param
antFile the String build file name.

        // @note: it is a string and not a file to handle relative/absolute
        // otherwise a relative file will be resolved based on the current
        // basedir.
        this.antFile = antFile;
    
public voidsetDir(java.io.File dir)
The directory to use as a base directory for the new Ant project. Defaults to the current project's basedir, unless inheritall has been set to false, in which case it doesn't have a default value. This will override the basedir setting of the called project.

param
dir new directory as File.

        this.dir = dir;
    
public voidsetInheritAll(boolean value)
If true, pass all properties to the new Ant project. Defaults to true.

param
value if true pass all properties to the new Ant project.

        inheritAll = value;
    
public voidsetInheritRefs(boolean value)
If true, pass all references to the new Ant project. Defaults to false.

param
value if true, pass all references to the new Ant project

        inheritRefs = value;
    
public voidsetOutput(java.lang.String outputFile)
Set the filename to write the output to. This is relative to the value of the dir attribute if it has been set or to the base directory of the current project otherwise.

param
outputFile the name of the file to which the output should go.

        this.output = outputFile;
    
public voidsetTarget(java.lang.String targetToAdd)
The target of the new Ant project to execute. Defaults to the new project's default target.

param
targetToAdd the name of the target to invoke.

        if (targetToAdd.equals("")) {
            throw new BuildException("target attribute must not be empty");
        }
        targets.add(targetToAdd);
        targetAttributeSet = true;