git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271760 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -155,7 +155,7 @@ | |||
| <javac destdir="${bin.dir}/antlibs/${libset}" srcdir="${java.dir}/antlibs/${libset}" debug="${debug}"> | |||
| <classpath refid="classpath.antlibs"/> | |||
| </javac> | |||
| <jar basedir="${bin.dir}/antlibs/${libset}" jarfile="${distlib.dir}/antlibs/${libset}.tsk"> | |||
| <jar basedir="${bin.dir}/antlibs/${libset}" jarfile="${distlib.dir}/antlibs/${libset}.jar"> | |||
| <metainf dir="${java.dir}/antlibs/${libset}" | |||
| includes="antlib.xml"/> | |||
| </jar> | |||
| @@ -66,7 +66,7 @@ | |||
| <fileset dir="${lib.dir}/parser" includes="*.jar"/> | |||
| <fileset dir="${lib.dir}/ant1compat" includes="*.jar"/> | |||
| <pathelement location="${distlib.dir}/common/common.jar"/> | |||
| <pathelement location="${distlib.dir}/antlibs/system.tsk"/> | |||
| <pathelement location="${distlib.dir}/antlibs/system.jar"/> | |||
| </path> | |||
| <target name="check_for_optional_packages"> | |||
| @@ -69,7 +69,7 @@ public class CoreFileService implements FileService { | |||
| private Frame frame; | |||
| /** General file utilities */ | |||
| private FileUtils fileUtils = new FileUtils(); | |||
| private FileUtils fileUtils = FileUtils.newFileUtils(); | |||
| /** | |||
| * Constructor | |||
| @@ -744,7 +744,7 @@ public class Frame implements DemuxOutputReceiver { | |||
| if (base == null) { | |||
| baseDir = projectFileParent; | |||
| } else { | |||
| FileUtils fileUtils = new FileUtils(); | |||
| FileUtils fileUtils = FileUtils.newFileUtils(); | |||
| baseDir = fileUtils.resolveFile(projectFileParent, base); | |||
| } | |||
| } else { | |||
| @@ -64,11 +64,11 @@ import java.util.Stack; | |||
| import java.util.Vector; | |||
| import org.apache.ant.common.antlib.AntContext; | |||
| import org.apache.ant.common.antlib.AntLibFactory; | |||
| import org.apache.ant.common.event.MessageLevel; | |||
| import org.apache.ant.common.service.ComponentService; | |||
| import org.apache.ant.common.service.DataService; | |||
| import org.apache.ant.common.service.FileService; | |||
| import org.apache.ant.common.util.ExecutionException; | |||
| import org.apache.ant.common.event.MessageLevel; | |||
| import org.apache.ant.common.util.PropertyUtils; | |||
| import org.apache.tools.ant.types.FilterSet; | |||
| import org.apache.tools.ant.types.FilterSetCollection; | |||
| @@ -83,42 +83,44 @@ import org.apache.tools.ant.util.FileUtils; | |||
| public class Project implements org.apache.ant.common.event.BuildListener { | |||
| /** String which indicates Java version 1.0 */ | |||
| public static final String JAVA_1_0 = "1.0"; | |||
| public final static String JAVA_1_0 = "1.0"; | |||
| /** String which indicates Java version 1.1 */ | |||
| public static final String JAVA_1_1 = "1.1"; | |||
| public final static String JAVA_1_1 = "1.1"; | |||
| /** String which indicates Java version 1.2 */ | |||
| public static final String JAVA_1_2 = "1.2"; | |||
| public final static String JAVA_1_2 = "1.2"; | |||
| /** String which indicates Java version 1.3 */ | |||
| public static final String JAVA_1_3 = "1.3"; | |||
| public final static String JAVA_1_3 = "1.3"; | |||
| /** String which indicates Java version 1.4 */ | |||
| public static final String JAVA_1_4 = "1.4"; | |||
| public final static String JAVA_1_4 = "1.4"; | |||
| /** | |||
| * @see MessageLevel.MSG_ERR | |||
| */ | |||
| public static final int MSG_ERR = MessageLevel.MSG_ERR; | |||
| public final static int MSG_ERR = MessageLevel.MSG_ERR; | |||
| /** | |||
| * @see MessageLevel.MSG_WARN | |||
| */ | |||
| public static final int MSG_WARN = MessageLevel.MSG_WARN; | |||
| public final static int MSG_WARN = MessageLevel.MSG_WARN; | |||
| /** | |||
| * @see MessageLevel.MSG_INFO | |||
| */ | |||
| public static final int MSG_INFO = MessageLevel.MSG_INFO; | |||
| public final static int MSG_INFO = MessageLevel.MSG_INFO; | |||
| /** | |||
| * @see MessageLevel.MSG_VERBOSE | |||
| */ | |||
| public static final int MSG_VERBOSE = MessageLevel.MSG_VERBOSE; | |||
| public final static int MSG_VERBOSE = MessageLevel.MSG_VERBOSE; | |||
| /** | |||
| * @see MessageLevel.MSG_DEBUG | |||
| */ | |||
| public static final int MSG_DEBUG = MessageLevel.MSG_DEBUG; | |||
| public final static int MSG_DEBUG = MessageLevel.MSG_DEBUG; | |||
| /** The java version detected that Ant is running on */ | |||
| private static String javaVersion; | |||
| /** the factory which created this project instance. This is used to | |||
| define new types and tasks */ | |||
| /** | |||
| * the factory which created this project instance. This is used to | |||
| * define new types and tasks | |||
| */ | |||
| private AntLibFactory factory; | |||
| /** Collection of Ant1 type definitions */ | |||
| @@ -199,14 +201,6 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||
| return javaVersion; | |||
| } | |||
| /** | |||
| * get the target hashtable | |||
| * @return hashtable, the contents of which can be cast to Target | |||
| */ | |||
| public Hashtable getTargets() { | |||
| return new Hashtable(); // XXX can't get targets | |||
| } | |||
| /** | |||
| * returns the boolean equivalent of a string, which is considered true | |||
| * if either "on", "true", or "yes" is found, ignoring case. | |||
| @@ -302,6 +296,24 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||
| } | |||
| } | |||
| /** | |||
| * Gets the Antlib factory of the Project | |||
| * | |||
| * @return The project's associated factory object | |||
| */ | |||
| public AntLibFactory getFactory() { | |||
| return factory; | |||
| } | |||
| /** | |||
| * get the target hashtable | |||
| * | |||
| * @return hashtable, the contents of which can be cast to Target | |||
| */ | |||
| public Hashtable getTargets() { | |||
| return new Hashtable();// XXX can't get targets | |||
| } | |||
| /** | |||
| * Gets the buildListeners of the Project | |||
| * | |||
| @@ -878,7 +890,7 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||
| } | |||
| try { | |||
| Object taskObject = componentService.createComponent(factory, | |||
| Object taskObject = componentService.createComponent(factory, | |||
| context.getClassLoader(), taskClass, false, taskType); | |||
| if (taskObject instanceof Task) { | |||
| task = (Task)taskObject; | |||
| @@ -897,15 +909,13 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||
| /** | |||
| * Creates a new instance of a data type. | |||
| * | |||
| * | |||
| * @param typeName The name of the data type to create an instance of. | |||
| * Must not be <code>null</code>. | |||
| * | |||
| * @return an instance of the specified data type, or <code>null</code> if | |||
| * the data type name is not recognised. | |||
| * | |||
| * @exception BuildException if the data type name is recognised but | |||
| * instance creation fails. | |||
| * Must not be <code>null</code>. | |||
| * @return an instance of the specified data type, or <code>null</code> | |||
| * if the data type name is not recognised. | |||
| * @exception BuildException if the data type name is recognised but | |||
| * instance creation fails. | |||
| */ | |||
| public Object createDataType(String typeName) throws BuildException { | |||
| Class typeClass = (Class)dataClassDefinitions.get(typeName); | |||
| @@ -915,14 +925,14 @@ public class Project implements org.apache.ant.common.event.BuildListener { | |||
| } | |||
| try { | |||
| Object dataInstance = componentService.createComponent(factory, | |||
| Object dataInstance = componentService.createComponent(factory, | |||
| context.getClassLoader(), typeClass, false, typeName); | |||
| return dataInstance; | |||
| } catch (Throwable e) { | |||
| throw new BuildException(e); | |||
| } | |||
| } | |||
| /** send build started event to the listeners */ | |||
| protected void fireBuildStarted() { | |||
| BuildEvent event = new BuildEvent(this); | |||
| @@ -170,6 +170,7 @@ public abstract class Task extends ProjectComponent | |||
| taskType = componentType; | |||
| taskName = componentType; | |||
| init(); | |||
| } | |||
| @@ -52,6 +52,17 @@ | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.List; | |||
| import org.apache.ant.antlib.system.AntBase; | |||
| import org.apache.ant.common.antlib.AntContext; | |||
| import org.apache.ant.common.antlib.AntLibFactory; | |||
| import org.apache.ant.common.service.ComponentService; | |||
| import org.apache.ant.common.util.ExecutionException; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Task; | |||
| /** | |||
| * Ant facade over system version of Ant | |||
| @@ -59,6 +70,146 @@ package org.apache.tools.ant.taskdefs; | |||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
| * @created 31 January 2002 | |||
| */ | |||
| public class Ant extends org.apache.ant.antlib.system.Ant { | |||
| public class Ant extends Task { | |||
| /** The core Ant implementation to actually use */ | |||
| private org.apache.ant.antlib.system.Ant realAnt = null; | |||
| /** The properties created by this task */ | |||
| private List properties = new ArrayList(); | |||
| /** | |||
| * If true, inherit all properties from parent Project If false, inherit | |||
| * only userProperties and those defined inside the ant call itself | |||
| * | |||
| * @param value true if the sub-build should receive all properties from | |||
| * this build | |||
| */ | |||
| public void setInheritAll(boolean value) { | |||
| realAnt.setInheritAll(value); | |||
| } | |||
| /** | |||
| * If true, inherit all references from parent Project If false, inherit | |||
| * only those defined inside the ant call itself | |||
| * | |||
| * @param value true if the subbuild should receive all references from | |||
| * the current build. | |||
| */ | |||
| public void setInheritRefs(boolean value) { | |||
| realAnt.setInheritRefs(value); | |||
| } | |||
| /** | |||
| * The directory which will be the base directory for the build | |||
| * | |||
| * @param d the base directory for the new build | |||
| */ | |||
| public void setDir(File d) { | |||
| realAnt.setDir(d); | |||
| } | |||
| /** | |||
| * set the build file, it can be either absolute or relative. If it is | |||
| * absolute, <tt>dir</tt> will be ignored, if it is relative it will be | |||
| * resolved relative to <tt>dir</tt> . | |||
| * | |||
| * @param s the name of the ant file either absolute or relative to the | |||
| * sub-build's basedir | |||
| */ | |||
| public void setAntfile(String s) { | |||
| realAnt.setAntFile(s); | |||
| } | |||
| /** | |||
| * set the target to execute. If none is defined it will execute the | |||
| * default target of the build file | |||
| * | |||
| * @param s the target to eb executed in the sub-build | |||
| */ | |||
| public void setTarget(String s) { | |||
| realAnt.setTarget(s); | |||
| } | |||
| /** | |||
| * XXX Sets the output of the Ant | |||
| * | |||
| * @param s name of the file to store output. | |||
| */ | |||
| public void setOutput(String s) { | |||
| // realAnt.setOutput(s); | |||
| } | |||
| /** Initialize the task */ | |||
| public void init() { | |||
| AntContext context = getAntContext(); | |||
| try { | |||
| ComponentService componentService = getComponentService(); | |||
| AntLibFactory factory = getProject().getFactory(); | |||
| realAnt = (org.apache.ant.antlib.system.Ant) | |||
| componentService.createComponent(factory, | |||
| context.getClassLoader(), | |||
| org.apache.ant.antlib.system.Ant.class, false, "antcall"); | |||
| } catch (ExecutionException e) { | |||
| throw new BuildException(e); | |||
| } | |||
| } | |||
| /** | |||
| * Do the execution. | |||
| * | |||
| * @exception BuildException XXX Description of Exception | |||
| */ | |||
| public void execute() throws BuildException { | |||
| for (Iterator i = properties.iterator(); i.hasNext(); ) { | |||
| Property property = (Property)i.next(); | |||
| AntBase.Property newProperty = new AntBase.Property(); | |||
| newProperty.setName(property.getName()); | |||
| newProperty.setValue(property.getValue()); | |||
| realAnt.addProperty(newProperty); | |||
| } | |||
| try { | |||
| realAnt.execute(); | |||
| } catch (ExecutionException e) { | |||
| throw new BuildException(e); | |||
| } | |||
| } | |||
| /** | |||
| * Create a nested property element. | |||
| * | |||
| * @return the Property object to be configured. | |||
| */ | |||
| public Property createProperty() { | |||
| Property property = new Property(); | |||
| properties.add(property); | |||
| return property; | |||
| } | |||
| /** | |||
| * create a reference element that identifies a data type that should be | |||
| * carried over to the new project. | |||
| * | |||
| * @param r the reference to be added to the call | |||
| */ | |||
| public void addReference(AntBase.Reference r) { | |||
| try { | |||
| realAnt.addReference(r); | |||
| } catch (ExecutionException e) { | |||
| throw new BuildException(e); | |||
| } | |||
| } | |||
| /** | |||
| * Gets the componentService | |||
| * | |||
| * @return the componentService instance provided by the core | |||
| * @exception ExecutionException if the service is not available. | |||
| */ | |||
| private ComponentService getComponentService() throws ExecutionException { | |||
| AntContext context = getAntContext(); | |||
| return (ComponentService)context.getCoreService(ComponentService.class); | |||
| } | |||
| } | |||
| @@ -52,8 +52,17 @@ | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.List; | |||
| import org.apache.ant.antlib.system.AntBase; | |||
| import org.apache.ant.antlib.system.AntCall; | |||
| import org.apache.ant.common.antlib.AntContext; | |||
| import org.apache.ant.common.antlib.AntLibFactory; | |||
| import org.apache.ant.common.service.ComponentService; | |||
| import org.apache.ant.common.util.ExecutionException; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Task; | |||
| /** | |||
| * CallTarget facade over AntCall | |||
| @@ -61,6 +70,95 @@ import org.apache.ant.antlib.system.AntCall; | |||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
| * @created 31 January 2002 | |||
| */ | |||
| public class CallTarget extends AntCall { | |||
| public class CallTarget extends Task { | |||
| /** The core AntCall implementation to actually use */ | |||
| private AntCall antCall = null; | |||
| /** The properties created by this task */ | |||
| private List properties = new ArrayList(); | |||
| /** | |||
| * If true, inherit all properties from parent Project If false, inherit | |||
| * only userProperties and those defined inside the antcall call itself | |||
| * | |||
| * @param inherit the new inheritAll value | |||
| */ | |||
| public void setInheritAll(boolean inherit) { | |||
| antCall.setInheritAll(inherit); | |||
| } | |||
| /** | |||
| * Sets the target of the CallTarget | |||
| * | |||
| * @param target the new target value | |||
| */ | |||
| public void setTarget(String target) { | |||
| antCall.setTarget(target); | |||
| } | |||
| /** Initialize the task */ | |||
| public void init() { | |||
| AntContext context = getAntContext(); | |||
| try { | |||
| ComponentService componentService = getComponentService(); | |||
| AntLibFactory factory = getProject().getFactory(); | |||
| antCall = (AntCall)componentService.createComponent(factory, | |||
| context.getClassLoader(), AntCall.class, false, "antcall"); | |||
| } catch (ExecutionException e) { | |||
| throw new BuildException(e); | |||
| } | |||
| } | |||
| /** execute the call */ | |||
| public void execute() { | |||
| for (Iterator i = properties.iterator(); i.hasNext(); ) { | |||
| Property property = (Property)i.next(); | |||
| AntBase.Property newProperty = new AntBase.Property(); | |||
| newProperty.setName(property.getName()); | |||
| newProperty.setValue(property.getValue()); | |||
| antCall.addProperty(newProperty); | |||
| } | |||
| try { | |||
| antCall.execute(); | |||
| } catch (ExecutionException e) { | |||
| throw new BuildException(e); | |||
| } | |||
| } | |||
| /** | |||
| * Create a nested param element. | |||
| * | |||
| * @return the Property object to be configured. | |||
| */ | |||
| public Property createParam() { | |||
| Property property = new Property(); | |||
| properties.add(property); | |||
| return property; | |||
| } | |||
| /** | |||
| * create a reference element that identifies a data type that should be | |||
| * carried over to the new project. | |||
| * | |||
| * @param r the reference to be added to the call | |||
| */ | |||
| public void addReference(AntBase.Reference r) { | |||
| try { | |||
| antCall.addReference(r); | |||
| } catch (ExecutionException e) { | |||
| throw new BuildException(e); | |||
| } | |||
| } | |||
| /** | |||
| * Gets the componentService | |||
| * | |||
| * @return the componentService instance provided by the core | |||
| * @exception ExecutionException if the service is not available. | |||
| */ | |||
| private ComponentService getComponentService() throws ExecutionException { | |||
| AntContext context = getAntContext(); | |||
| return (ComponentService)context.getCoreService(ComponentService.class); | |||
| } | |||
| } | |||
| @@ -56,6 +56,7 @@ import java.io.File; | |||
| import org.apache.ant.common.service.ExecService; | |||
| import org.apache.ant.common.util.ExecutionException; | |||
| import org.apache.ant.common.service.MagicProperties; | |||
| import org.apache.ant.common.util.FileUtils; | |||
| /** | |||
| * The Ant task - used to execute a different build file | |||
| @@ -65,7 +66,7 @@ import org.apache.ant.common.service.MagicProperties; | |||
| */ | |||
| public class Ant extends AntBase { | |||
| /** The ant file to be run */ | |||
| private File antFile; | |||
| private String antFileName; | |||
| /** the base directory to use for the run */ | |||
| private File baseDir; | |||
| /** File to capture any output */ | |||
| @@ -74,10 +75,10 @@ public class Ant extends AntBase { | |||
| /** | |||
| * sets the file containing the XML representation model to build | |||
| * | |||
| * @param antFile the file to build | |||
| * @param antFileName the file to build | |||
| */ | |||
| public void setAntFile(File antFile) { | |||
| this.antFile = antFile; | |||
| public void setAntFile(String antFileName) { | |||
| this.antFileName = antFileName; | |||
| } | |||
| /** | |||
| @@ -107,12 +108,18 @@ public class Ant extends AntBase { | |||
| if (baseDir == null) { | |||
| baseDir = getAntContext().getBaseDir(); | |||
| } | |||
| if (antFile == null) { | |||
| File antFile = null; | |||
| if (antFileName == null) { | |||
| antFile = new File(baseDir, "build.ant"); | |||
| if (!antFile.exists()) { | |||
| antFile = new File(baseDir, "build.xml"); | |||
| } | |||
| } else { | |||
| antFile | |||
| = FileUtils.newFileUtils().resolveFile(baseDir, antFileName); | |||
| } | |||
| setProperty(MagicProperties.BASEDIR, baseDir.getAbsolutePath()); | |||
| ExecService execService | |||
| @@ -21,7 +21,7 @@ public class Ant1CompatBuilder { | |||
| "${lib.dir}/ant1compat", "*.jar"); | |||
| helper.addPathElementToPath("classpath", "${distlib.dir}/init.jar"); | |||
| helper.addPathElementToPath("classpath", "${distlib.dir}/common/common.jar"); | |||
| helper.addPathElementToPath("classpath", "${distlib.dir}/antlibs/system.tsk"); | |||
| helper.addPathElementToPath("classpath", "${distlib.dir}/antlibs/system.jar"); | |||
| } | |||
| protected void check_for_optional_packages(BuildHelper helper) { | |||
| } | |||
| @@ -83,7 +83,7 @@ public class MutantBuilder { | |||
| helper.addPathElementToPath("classpath.antlibs", "${distlib.dir}/common/common.jar"); | |||
| helper.addPathToPath("classpath.antlibs", "classpath.common"); | |||
| helper.javac("${java.dir}/antlibs/${libset}", "${bin.dir}/antlibs/${libset}", "classpath.antlibs"); | |||
| helper.jar("${bin.dir}/antlibs/${libset}", "${distlib.dir}/antlibs/${libset}.tsk", | |||
| helper.jar("${bin.dir}/antlibs/${libset}", "${distlib.dir}/antlibs/${libset}.jar", | |||
| "${java.dir}/antlibs/${libset}", "antlib.xml"); | |||
| } | |||
| protected void main(BuildHelper helper) { | |||
| @@ -68,6 +68,21 @@ import java.util.StringTokenizer; | |||
| * @created 21 January 2002 | |||
| */ | |||
| public class FileUtils { | |||
| /** Empty constructor. */ | |||
| protected FileUtils() { | |||
| } | |||
| /** | |||
| * Factory method. | |||
| * | |||
| * @return The FileUtils instance to actually use. May be a subclass of | |||
| * this class. | |||
| */ | |||
| public static FileUtils newFileUtils() { | |||
| return new FileUtils(); | |||
| } | |||
| /** | |||
| * Interpret the filename as a file relative to the given file - unless | |||
| * the filename already represents an absolute filename. | |||
| @@ -76,8 +91,7 @@ public class FileUtils { | |||
| * must be an absolute file and must not contain "./" or | |||
| * "../" sequences (same for \ instead of /). If it is | |||
| * null, this call is equivalent to | |||
| * <code>new java.io.File(filename)</code> | |||
| * . | |||
| * <code>new java.io.File(filename)</code>. | |||
| * @param filename the filename to be resolved | |||
| * @return an absolute file that doesn't contain "./" or | |||
| * "../" sequences and uses the correct separator for the | |||
| @@ -102,8 +116,8 @@ public class FileUtils { | |||
| } | |||
| File helpFile = new File(file.getAbsolutePath()); | |||
| StringTokenizer tok | |||
| = new StringTokenizer(platformFilename, File.separator); | |||
| StringTokenizer tok | |||
| = new StringTokenizer(platformFilename, File.separator); | |||
| while (tok.hasMoreTokens()) { | |||
| String part = tok.nextToken(); | |||
| if (part.equals("..")) { | |||