git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274491 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -20,8 +20,6 @@ | |||
| <fileset dir='${orig-classes}'> | |||
| <include name='**' /> | |||
| <exclude name='org/apache/tools/ant/Project.class' /> | |||
| <exclude name='org/apache/tools/ant/ProjectHelper.class' /> | |||
| <exclude name='org/apache/tools/ant/IntrospectionHelper.class' /> | |||
| <exclude name='org/apache/tools/ant/TaskAdapter.class' /> | |||
| <exclude name='org/apache/tools/ant/taskdefs/Ant.class' /> | |||
| </fileset> | |||
| @@ -56,6 +56,7 @@ package org.apache.tools.ant; | |||
| import java.io.File; | |||
| import java.io.InputStream; | |||
| import java.io.IOException; | |||
| import java.io.EOFException; | |||
| import java.util.Hashtable; | |||
| import java.util.Vector; | |||
| import java.util.Properties; | |||
| @@ -265,6 +266,16 @@ public class Project { | |||
| this.defaultInputStream = defaultInputStream; | |||
| } | |||
| /** | |||
| * Get this project's input stream | |||
| * | |||
| * @return the InputStream instance in use by this Porject instance to | |||
| * read input | |||
| */ | |||
| public InputStream getDefaultInputStream() { | |||
| return defaultInputStream; | |||
| } | |||
| /** | |||
| * Retrieves the current input handler. | |||
| * | |||
| @@ -277,6 +288,11 @@ public class Project { | |||
| private FileUtils fileUtils; | |||
| /** | |||
| * Flag which catches Listeners which try to use System.out or System.err | |||
| */ | |||
| private boolean loggingMessage = false; | |||
| /** | |||
| * <p> | |||
| @@ -413,6 +429,7 @@ public class Project { | |||
| */ | |||
| public void init() throws BuildException { | |||
| setJavaVersionProperty(); | |||
| setSystemProperties(); | |||
| if (!isRoleDefined(TASK_ROLE)) { | |||
| // Top project, need to load the core definitions | |||
| loadDefinitions(); | |||
| @@ -452,7 +469,6 @@ public class Project { | |||
| throw new BuildException("Can't load default datatype list"); | |||
| } | |||
| setSystemProperties(); | |||
| } | |||
| @@ -564,7 +580,7 @@ public class Project { | |||
| *@return The buildListeners value | |||
| */ | |||
| public Vector getBuildListeners() { | |||
| return listeners; | |||
| return (Vector) listeners.clone(); | |||
| } | |||
| @@ -697,6 +713,23 @@ public class Project { | |||
| properties.put(name, value); | |||
| } | |||
| /** | |||
| * Sets 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 <code>null</code>. | |||
| * @param value The new value of the property. | |||
| * Must not be <code>null</code>. | |||
| * @see #setProperty(String,String) | |||
| */ | |||
| public synchronized void setInheritedProperty(String name, String value) { | |||
| PropertyHelper ph = PropertyHelper.getPropertyHelper(this); | |||
| ph.setInheritedProperty(null, name, value); | |||
| } | |||
| /** | |||
| * Allows Project and subclasses to set a property unless its already | |||
| @@ -796,6 +829,40 @@ public class Project { | |||
| return propertiesCopy; | |||
| } | |||
| /** | |||
| * Copies 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. | |||
| * | |||
| * <p>To copy all "user" properties, you will also have to call | |||
| * {@link #copyInheritedProperties copyInheritedProperties}.</p> | |||
| * | |||
| * @param other the project to copy the properties to. Must not be null. | |||
| * | |||
| * @since Ant 1.5 | |||
| */ | |||
| public void copyUserProperties(Project other) { | |||
| PropertyHelper ph = PropertyHelper.getPropertyHelper(this); | |||
| ph.copyUserProperties(other); | |||
| } | |||
| /** | |||
| * Copies 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. | |||
| * | |||
| * <p>To copy all "user" properties, you will also have to call | |||
| * {@link #copyUserProperties copyUserProperties}.</p> | |||
| * | |||
| * @param other the project to copy the properties to. Must not be null. | |||
| * | |||
| * @since Ant 1.5 | |||
| */ | |||
| public void copyInheritedProperties(Project other) { | |||
| PropertyHelper ph = PropertyHelper.getPropertyHelper(this); | |||
| ph.copyInheritedProperties(other); | |||
| } | |||
| /** | |||
| * set the default target of the project | |||
| @@ -1205,7 +1272,7 @@ public class Project { | |||
| try { | |||
| Object o = f.create(this); | |||
| // Do special book keeping for ProjectComponents | |||
| setProjectReference( o ); | |||
| if (o instanceof ProjectComponent) { | |||
| ((ProjectComponent) o).setProject(this); | |||
| if (o instanceof Task) { | |||
| @@ -1402,10 +1469,11 @@ public class Project { | |||
| if (defaultInputStream != null) { | |||
| return defaultInputStream.read(buffer, offset, length); | |||
| } else { | |||
| return System.in.read(buffer, offset, length); | |||
| throw new EOFException("No input provided for project"); | |||
| } | |||
| } | |||
| /** | |||
| * Demux an input request to the correct task. | |||
| * | |||
| @@ -1949,26 +2017,30 @@ public class Project { | |||
| } | |||
| /** | |||
| * send build started event to the listeners | |||
| * Sends a "build started" event to the build listeners for this project. | |||
| */ | |||
| protected void fireBuildStarted() { | |||
| public void fireBuildStarted() { | |||
| BuildEvent event = new BuildEvent(this); | |||
| for (int i = 0; i < listeners.size(); i++) { | |||
| Vector listeners = getBuildListeners(); | |||
| int size = listeners.size(); | |||
| for (int i = 0; i < size; i++) { | |||
| BuildListener listener = (BuildListener) listeners.elementAt(i); | |||
| listener.buildStarted(event); | |||
| } | |||
| } | |||
| /** | |||
| * send build finished event to the listeners | |||
| * | |||
| *@param exception exception which indicates failure if not null | |||
| * Sends a "build finished" event to the build listeners for this project. | |||
| * @param exception an exception indicating a reason for a build | |||
| * failure. May be <code>null</code>, indicating | |||
| * a successful build. | |||
| */ | |||
| protected void fireBuildFinished(Throwable exception) { | |||
| public void fireBuildFinished(Throwable exception) { | |||
| BuildEvent event = new BuildEvent(this); | |||
| event.setException(exception); | |||
| for (int i = 0; i < listeners.size(); i++) { | |||
| Vector listeners = getBuildListeners(); | |||
| int size = listeners.size(); | |||
| for (int i = 0; i < size; i++) { | |||
| BuildListener listener = (BuildListener) listeners.elementAt(i); | |||
| listener.buildFinished(event); | |||
| } | |||
| @@ -1976,82 +2048,111 @@ public class Project { | |||
| /** | |||
| * send target started event to the listeners | |||
| * Sends a "target started" event to the build listeners for this project. | |||
| * | |||
| *@param target Description of the Parameter | |||
| * @param target The target which is starting to build. | |||
| * Must not be <code>null</code>. | |||
| */ | |||
| protected void fireTargetStarted(Target target) { | |||
| BuildEvent event = new BuildEvent(target); | |||
| for (int i = 0; i < listeners.size(); i++) { | |||
| Vector listeners = getBuildListeners(); | |||
| int size = listeners.size(); | |||
| for (int i = 0; i < size; i++) { | |||
| BuildListener listener = (BuildListener) listeners.elementAt(i); | |||
| listener.targetStarted(event); | |||
| } | |||
| } | |||
| /** | |||
| * send build finished event to the listeners | |||
| * Sends a "target finished" event to the build listeners for this | |||
| * project. | |||
| * | |||
| *@param exception exception which indicates failure if not null | |||
| *@param target Description of the Parameter | |||
| * @param target The target which has finished building. | |||
| * Must not be <code>null</code>. | |||
| * @param exception an exception indicating a reason for a build | |||
| * failure. May be <code>null</code>, indicating | |||
| * a successful build. | |||
| */ | |||
| protected void fireTargetFinished(Target target, Throwable exception) { | |||
| BuildEvent event = new BuildEvent(target); | |||
| event.setException(exception); | |||
| for (int i = 0; i < listeners.size(); i++) { | |||
| Vector listeners = getBuildListeners(); | |||
| int size = listeners.size(); | |||
| for (int i = 0; i < size; i++) { | |||
| BuildListener listener = (BuildListener) listeners.elementAt(i); | |||
| listener.targetFinished(event); | |||
| } | |||
| } | |||
| /** | |||
| * Description of the Method | |||
| * Sends a "task started" event to the build listeners for this project. | |||
| * | |||
| *@param task Description of the Parameter | |||
| * @param task The target which is starting to execute. | |||
| * Must not be <code>null</code>. | |||
| */ | |||
| protected void fireTaskStarted(Task task) { | |||
| // register this as the current task on the current thread. | |||
| threadTasks.put(Thread.currentThread(), task); | |||
| registerThreadTask(Thread.currentThread(), task); | |||
| BuildEvent event = new BuildEvent(task); | |||
| for (int i = 0; i < listeners.size(); i++) { | |||
| Vector listeners = getBuildListeners(); | |||
| int size = listeners.size(); | |||
| for (int i = 0; i < size; i++) { | |||
| BuildListener listener = (BuildListener) listeners.elementAt(i); | |||
| listener.taskStarted(event); | |||
| } | |||
| } | |||
| /** | |||
| * Description of the Method | |||
| * Sends a "task finished" event to the build listeners for this | |||
| * project. | |||
| * | |||
| *@param task Description of the Parameter | |||
| *@param exception Description of the Parameter | |||
| * @param task The task which has finished executing. | |||
| * Must not be <code>null</code>. | |||
| * @param exception an exception indicating a reason for a build | |||
| * failure. May be <code>null</code>, indicating | |||
| * a successful build. | |||
| */ | |||
| protected void fireTaskFinished(Task task, Throwable exception) { | |||
| threadTasks.remove(Thread.currentThread()); | |||
| registerThreadTask(Thread.currentThread(), null); | |||
| System.out.flush(); | |||
| System.err.flush(); | |||
| BuildEvent event = new BuildEvent(task); | |||
| event.setException(exception); | |||
| for (int i = 0; i < listeners.size(); i++) { | |||
| Vector listeners = getBuildListeners(); | |||
| int size = listeners.size(); | |||
| for (int i = 0; i < size; i++) { | |||
| BuildListener listener = (BuildListener) listeners.elementAt(i); | |||
| listener.taskFinished(event); | |||
| } | |||
| } | |||
| /** | |||
| * Description of the Method | |||
| * Sends a "message logged" event to the build listeners for this project. | |||
| * | |||
| *@param event Description of the Parameter | |||
| *@param message Description of the Parameter | |||
| *@param priority Description of the Parameter | |||
| * @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 <code>null</code>. | |||
| * @param message The message to send. Should not be <code>null</code>. | |||
| * @param priority The priority of the message. | |||
| */ | |||
| private void fireMessageLoggedEvent(BuildEvent event, String message, int priority) { | |||
| private void fireMessageLoggedEvent(BuildEvent event, String message, | |||
| int priority) { | |||
| event.setMessage(message, priority); | |||
| for (int i = 0; i < listeners.size(); i++) { | |||
| BuildListener listener = (BuildListener) listeners.elementAt(i); | |||
| listener.messageLogged(event); | |||
| Vector listeners = getBuildListeners(); | |||
| synchronized (this) { | |||
| if (loggingMessage) { | |||
| throw new BuildException("Listener attempted to access " | |||
| + (priority == MSG_ERR ? "System.err" : "System.out") | |||
| + " - infinite loop terminated"); | |||
| } | |||
| loggingMessage = true; | |||
| int size = listeners.size(); | |||
| for (int i = 0; i < size; i++) { | |||
| BuildListener listener = (BuildListener) listeners.elementAt(i); | |||
| listener.messageLogged(event); | |||
| } | |||
| loggingMessage = false; | |||
| } | |||
| } | |||
| @@ -2134,7 +2235,7 @@ public class Project { | |||
| // Should move to a separate public class - and have API to add | |||
| // listeners, etc. | |||
| private static class AntRefTable extends Hashtable { | |||
| Project project; | |||
| private Project project; | |||
| public AntRefTable(Project project) { | |||
| super(); | |||
| this.project = project; | |||
| @@ -2175,9 +2276,9 @@ public class Project { | |||
| } | |||
| private static class AntTaskTable extends LazyHashtable { | |||
| Project project; | |||
| Properties props; | |||
| boolean tasks = false; | |||
| private Project project; | |||
| private Properties props; | |||
| private boolean tasks = false; | |||
| public AntTaskTable(Project p, boolean tasks) { | |||
| this.project = p; | |||
| @@ -2189,46 +2290,56 @@ public class Project { | |||
| } | |||
| protected void initAll() { | |||
| if (initAllDone ) return; | |||
| if (initAllDone) { | |||
| return; | |||
| } | |||
| project.log("InitAll", Project.MSG_DEBUG); | |||
| if (props==null ) return; | |||
| if (props == null) { | |||
| return; | |||
| } | |||
| Enumeration enum = props.propertyNames(); | |||
| while (enum.hasMoreElements()) { | |||
| String key = (String) enum.nextElement(); | |||
| Class taskClass=getTask( key ); | |||
| if (taskClass!=null ) { | |||
| Class taskClass = getTask(key); | |||
| if (taskClass != null) { | |||
| // This will call a get() and a put() | |||
| if (tasks ) | |||
| if (tasks) | |||
| project.addTaskDefinition(key, taskClass); | |||
| else | |||
| project.addDataTypeDefinition(key, taskClass ); | |||
| } | |||
| } | |||
| initAllDone=true; | |||
| initAllDone = true; | |||
| } | |||
| protected Class getTask(String key) { | |||
| if (props==null ) return null; // for tasks loaded before init() | |||
| String value=props.getProperty(key); | |||
| if (value==null) { | |||
| //project.log( "No class name for " + key, Project.MSG_VERBOSE ); | |||
| if (props == null) { | |||
| return null; // for tasks loaded before init() | |||
| } | |||
| String value = props.getProperty(key); | |||
| if (value == null) { | |||
| //project.log( "No class name for " + key, Project.MSG_VERBOSE); | |||
| return null; | |||
| } | |||
| try { | |||
| Class taskClass=null; | |||
| Class taskClass = null; | |||
| if (project.getCoreLoader() != null && | |||
| !("only".equals(project.getProperty("build.sysclasspath")))) { | |||
| try { | |||
| taskClass=project.getCoreLoader().loadClass(value); | |||
| if (taskClass != null ) return taskClass; | |||
| } catch( Exception ex ) { | |||
| taskClass = project.getCoreLoader().loadClass(value); | |||
| if (taskClass != null) { | |||
| return taskClass; | |||
| } | |||
| } catch (Exception ex) { | |||
| // ignore | |||
| } | |||
| } | |||
| taskClass = Class.forName(value); | |||
| return taskClass; | |||
| } catch (NoClassDefFoundError ncdfe) { | |||
| project.log("Could not load a dependent class (" | |||
| + ncdfe.getMessage() + ") for task " + key, Project.MSG_DEBUG); | |||
| + ncdfe.getMessage() + ") for task " | |||
| + key, Project.MSG_DEBUG); | |||
| } catch (ClassNotFoundException cnfe) { | |||
| project.log("Could not load class (" + value | |||
| + ") for task " + key, Project.MSG_DEBUG); | |||
| @@ -2237,14 +2348,20 @@ public class Project { | |||
| } | |||
| // Hashtable implementation | |||
| public Object get( Object key ) { | |||
| Object orig=super.get( key ); | |||
| if (orig!= null ) return orig; | |||
| if (! (key instanceof String) ) return null; | |||
| project.log("Get task " + key, Project.MSG_DEBUG ); | |||
| Object taskClass=getTask( (String) key); | |||
| if (taskClass != null) | |||
| super.put( key, taskClass ); | |||
| public Object get(Object key) { | |||
| Object orig = super.get(key); | |||
| if (orig != null) { | |||
| return orig; | |||
| } | |||
| if (!(key instanceof String)) { | |||
| return null; | |||
| } | |||
| project.log("Get task " + key, Project.MSG_DEBUG); | |||
| Object taskClass = getTask((String) key); | |||
| if (taskClass != null) { | |||
| super.put(key, taskClass); | |||
| } | |||
| return taskClass; | |||
| } | |||
| @@ -2253,5 +2370,28 @@ public class Project { | |||
| } | |||
| } | |||
| /** | |||
| * 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 | |||
| */ | |||
| public final void setProjectReference( final Object obj ) { | |||
| 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. | |||
| } | |||
| } | |||
| } | |||
| @@ -1,833 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000-2002 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.FileNotFoundException; | |||
| import java.io.IOException; | |||
| import java.util.Hashtable; | |||
| import java.util.Vector; | |||
| import java.util.Enumeration; | |||
| import java.util.Locale; | |||
| import org.xml.sax.Locator; | |||
| import org.xml.sax.InputSource; | |||
| import org.xml.sax.HandlerBase; | |||
| import org.xml.sax.SAXParseException; | |||
| import org.xml.sax.SAXException; | |||
| import org.xml.sax.DocumentHandler; | |||
| import org.xml.sax.AttributeList; | |||
| import javax.xml.parsers.SAXParserFactory; | |||
| import javax.xml.parsers.SAXParser; | |||
| import javax.xml.parsers.ParserConfigurationException; | |||
| /** | |||
| * Configures a Project (complete with Targets and Tasks) based on | |||
| * a XML build file. | |||
| * | |||
| * @author duncan@x180.com | |||
| */ | |||
| public class ProjectHelper { | |||
| private static SAXParserFactory parserFactory = null; | |||
| private org.xml.sax.Parser parser; | |||
| private Project project; | |||
| private File buildFile; | |||
| private File buildFileParent; | |||
| private Locator locator; | |||
| /** | |||
| * Configures the Project with the contents of the specified XML file. | |||
| */ | |||
| public static void configureProject(Project project, File buildFile) throws BuildException { | |||
| new ProjectHelper(project, buildFile).parse(); | |||
| } | |||
| /** | |||
| * Constructs a new Ant parser for the specified XML file. | |||
| */ | |||
| private ProjectHelper(Project project, File buildFile) { | |||
| this.project = project; | |||
| this.buildFile = new File(buildFile.getAbsolutePath()); | |||
| buildFileParent = new File(this.buildFile.getParent()); | |||
| } | |||
| /** | |||
| * Parses the project file. | |||
| */ | |||
| private void parse() throws BuildException { | |||
| FileInputStream inputStream = null; | |||
| InputSource inputSource = null; | |||
| try { | |||
| SAXParser saxParser = getParserFactory().newSAXParser(); | |||
| parser = saxParser.getParser(); | |||
| String uri = "file:" + buildFile.getAbsolutePath().replace('\\', '/'); | |||
| for (int index = uri.indexOf('#'); index != -1; index = uri.indexOf('#')) { | |||
| uri = uri.substring(0, index) + "%23" + uri.substring(index+1); | |||
| } | |||
| inputStream = new FileInputStream(buildFile); | |||
| inputSource = new InputSource(inputStream); | |||
| inputSource.setSystemId(uri); | |||
| project.log("parsing buildfile " + buildFile + " with URI = " + uri, Project.MSG_VERBOSE); | |||
| saxParser.parse(inputSource, new RootHandler()); | |||
| } | |||
| catch(ParserConfigurationException exc) { | |||
| throw new BuildException("Parser has not been configured correctly", exc); | |||
| } | |||
| catch(SAXParseException exc) { | |||
| Location location = | |||
| new Location(buildFile.toString(), exc.getLineNumber(), exc.getColumnNumber()); | |||
| Throwable t = exc.getException(); | |||
| if (t instanceof BuildException) { | |||
| BuildException be = (BuildException) t; | |||
| if (be.getLocation() == Location.UNKNOWN_LOCATION) { | |||
| be.setLocation(location); | |||
| } | |||
| throw be; | |||
| } | |||
| throw new BuildException(exc.getMessage(), t, location); | |||
| } | |||
| catch(SAXException exc) { | |||
| Throwable t = exc.getException(); | |||
| if (t instanceof BuildException) { | |||
| throw (BuildException) t; | |||
| } | |||
| throw new BuildException(exc.getMessage(), t); | |||
| } | |||
| catch(FileNotFoundException exc) { | |||
| throw new BuildException(exc); | |||
| } | |||
| catch(IOException exc) { | |||
| throw new BuildException("Error reading project file", exc); | |||
| } | |||
| finally { | |||
| if (inputStream != null) { | |||
| try { | |||
| inputStream.close(); | |||
| } | |||
| catch (IOException ioe) { | |||
| // ignore this | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * The common superclass for all sax event handlers in Ant. Basically | |||
| * throws an exception in each method, so subclasses should override | |||
| * what they can handle. | |||
| * | |||
| * Each type of xml element (task, target, etc) in ant will | |||
| * have its own subclass of AbstractHandler. | |||
| * | |||
| * In the constructor, this class takes over the handling of sax | |||
| * events from the parent handler, and returns | |||
| * control back to the parent in the endElement method. | |||
| */ | |||
| private class AbstractHandler extends HandlerBase { | |||
| protected DocumentHandler parentHandler; | |||
| public AbstractHandler(DocumentHandler parentHandler) { | |||
| this.parentHandler = parentHandler; | |||
| // Start handling SAX events | |||
| parser.setDocumentHandler(this); | |||
| } | |||
| public void startElement(String tag, AttributeList attrs) throws SAXParseException { | |||
| throw new SAXParseException("Unexpected element \"" + tag + "\"", locator); | |||
| } | |||
| public void characters(char[] buf, int start, int end) throws SAXParseException { | |||
| String s = new String(buf, start, end).trim(); | |||
| if (s.length() > 0) { | |||
| throw new SAXParseException("Unexpected text \"" + s + "\"", locator); | |||
| } | |||
| } | |||
| /** | |||
| * Called when this element and all elements nested into it have been | |||
| * handled. | |||
| */ | |||
| protected void finished() {} | |||
| public void endElement(String name) throws SAXException { | |||
| finished(); | |||
| // Let parent resume handling SAX events | |||
| parser.setDocumentHandler(parentHandler); | |||
| } | |||
| } | |||
| /** | |||
| * Handler for the root element. It's only child must be the "project" element. | |||
| */ | |||
| private class RootHandler extends HandlerBase { | |||
| /** | |||
| * resolve file: URIs as relative to the build file. | |||
| */ | |||
| public InputSource resolveEntity(String publicId, | |||
| String systemId) { | |||
| project.log("resolving systemId: " + systemId, Project.MSG_VERBOSE); | |||
| if (systemId.startsWith("file:")) { | |||
| String path = systemId.substring(5); | |||
| int index = path.indexOf("file:"); | |||
| // we only have to handle these for backward compatibility | |||
| // since they are in the FAQ. | |||
| while (index != -1) { | |||
| path = path.substring(0, index) + path.substring(index + 5); | |||
| index = path.indexOf("file:"); | |||
| } | |||
| String entitySystemId = path; | |||
| index = path.indexOf("%23"); | |||
| // convert these to # | |||
| while (index != -1) { | |||
| path = path.substring(0, index) + "#" + path.substring(index + 3); | |||
| index = path.indexOf("%23"); | |||
| } | |||
| File file = new File(path); | |||
| if (!file.isAbsolute()) { | |||
| file = new File(buildFileParent, path); | |||
| } | |||
| try { | |||
| InputSource inputSource = new InputSource(new FileInputStream(file)); | |||
| inputSource.setSystemId("file:" + entitySystemId); | |||
| return inputSource; | |||
| } catch (FileNotFoundException fne) { | |||
| project.log(file.getAbsolutePath()+" could not be found", | |||
| Project.MSG_WARN); | |||
| } | |||
| } | |||
| // use default if not file or file not found | |||
| return null; | |||
| } | |||
| public void startElement(String tag, AttributeList attrs) throws SAXParseException { | |||
| if (tag.equals("project")) { | |||
| new ProjectHandler(this).init(tag, attrs); | |||
| } else { | |||
| throw new SAXParseException("Config file is not of expected XML type", locator); | |||
| } | |||
| } | |||
| public void setDocumentLocator(Locator locator) { | |||
| ProjectHelper.this.locator = locator; | |||
| } | |||
| } | |||
| /** | |||
| * Handler for the top level "project" element. | |||
| */ | |||
| private class ProjectHandler extends AbstractHandler { | |||
| public ProjectHandler(DocumentHandler parentHandler) { | |||
| super(parentHandler); | |||
| } | |||
| public void init(String tag, AttributeList attrs) throws SAXParseException { | |||
| String def = null; | |||
| String name = null; | |||
| String id = null; | |||
| String baseDir = null; | |||
| for (int i = 0; i < attrs.getLength(); i++) { | |||
| String key = attrs.getName(i); | |||
| String value = attrs.getValue(i); | |||
| if (key.equals("default")) { | |||
| def = value; | |||
| } else if (key.equals("name")) { | |||
| name = value; | |||
| } else if (key.equals("id")) { | |||
| id = value; | |||
| } else if (key.equals("basedir")) { | |||
| baseDir = value; | |||
| } else { | |||
| throw new SAXParseException("Unexpected attribute \"" + attrs.getName(i) + "\"", locator); | |||
| } | |||
| } | |||
| if (def == null) { | |||
| throw new SAXParseException("The default attribute of project is required", | |||
| locator); | |||
| } | |||
| project.setDefaultTarget(def); | |||
| if (name != null) { | |||
| project.setName(name); | |||
| project.addReference(name, project); | |||
| } | |||
| if (id != null) { | |||
| project.addReference(id, project); | |||
| } | |||
| if (project.getProperty("basedir") != null) { | |||
| project.setBasedir(project.getProperty("basedir")); | |||
| } else { | |||
| if (baseDir == null) { | |||
| project.setBasedir(buildFileParent.getAbsolutePath()); | |||
| } else { | |||
| // check whether the user has specified an absolute path | |||
| if ((new File(baseDir)).isAbsolute()) { | |||
| project.setBasedir(baseDir); | |||
| } else { | |||
| project.setBaseDir(project.resolveFile(baseDir, buildFileParent)); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| public void startElement(String name, AttributeList attrs) throws SAXParseException { | |||
| if (name.equals("taskdef")) { | |||
| handleTopTask(name, attrs); | |||
| } else if (name.equals("typedef")) { | |||
| handleTopTask(name, attrs); | |||
| } else if (name.equals("antlib")) { | |||
| handleTopTask(name, attrs); | |||
| } else if (name.equals("property")) { | |||
| handleTopTask(name, attrs); | |||
| } else if (name.equals("target")) { | |||
| handleTarget(name, attrs); | |||
| } else if (name.equals("description")) { | |||
| handleDescription(name, attrs); | |||
| } else if (project.isDefinedOnRole(Project.DATATYPE_ROLE, name)) { | |||
| handleTopTask(name, attrs); | |||
| } else { | |||
| throw new SAXParseException("Unexpected element \"" + name + "\"", locator); | |||
| } | |||
| } | |||
| private void handleTopTask(String name, AttributeList attrs) | |||
| throws SAXParseException { | |||
| InmediateTarget target = new InmediateTarget(name); | |||
| (new TaskHandler(this, target, null, target)).init(name, attrs); | |||
| } | |||
| private void handleTarget(String tag, AttributeList attrs) throws SAXParseException { | |||
| new TargetHandler(this).init(tag, attrs); | |||
| } | |||
| private void handleDescription(String tag, AttributeList attrs) throws SAXParseException { | |||
| new DescriptionHandler(this).init(tag, attrs); | |||
| } | |||
| } | |||
| /** | |||
| * Handler for "target" elements. | |||
| */ | |||
| private class TargetHandler extends AbstractHandler { | |||
| private Target target; | |||
| public TargetHandler(DocumentHandler parentHandler) { | |||
| super(parentHandler); | |||
| } | |||
| public void init(String tag, AttributeList attrs) throws SAXParseException { | |||
| String name = null; | |||
| String depends = ""; | |||
| String ifCond = null; | |||
| String unlessCond = null; | |||
| String id = null; | |||
| String description = null; | |||
| for (int i = 0; i < attrs.getLength(); i++) { | |||
| String key = attrs.getName(i); | |||
| String value = attrs.getValue(i); | |||
| if (key.equals("name")) { | |||
| name = value; | |||
| } else if (key.equals("depends")) { | |||
| depends = value; | |||
| } else if (key.equals("if")) { | |||
| ifCond = value; | |||
| } else if (key.equals("unless")) { | |||
| unlessCond = value; | |||
| } else if (key.equals("id")) { | |||
| id = value; | |||
| } else if (key.equals("description")) { | |||
| description = value; | |||
| } else { | |||
| throw new SAXParseException("Unexpected attribute \"" + key + "\"", locator); | |||
| } | |||
| } | |||
| if (name == null) { | |||
| throw new SAXParseException("target element appears without a name attribute", locator); | |||
| } | |||
| target = new Target(); | |||
| target.setName(name); | |||
| target.setIf(ifCond); | |||
| target.setUnless(unlessCond); | |||
| target.setDescription(description); | |||
| project.addTarget(name, target); | |||
| if (id != null && !id.equals("")) { | |||
| project.addReference(id, target); | |||
| } | |||
| // take care of dependencies | |||
| if (depends.length() > 0) { | |||
| target.setDepends(depends); | |||
| } | |||
| } | |||
| public void startElement(String name, AttributeList attrs) throws SAXParseException { | |||
| if (name.equals("description")) { | |||
| new DescriptionHandler(this).init(name, attrs); | |||
| } | |||
| else { | |||
| new TaskHandler(this, target, null, target).init(name, attrs); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Handler for all task elements. | |||
| */ | |||
| private class TaskHandler extends AbstractHandler { | |||
| private Target target; | |||
| private TaskContainer container; | |||
| private Task task; | |||
| private RuntimeConfigurable parentWrapper; | |||
| private RuntimeConfigurable wrapper = null; | |||
| public TaskHandler(DocumentHandler parentHandler, TaskContainer container, RuntimeConfigurable parentWrapper, Target target) { | |||
| super(parentHandler); | |||
| this.container = container; | |||
| this.parentWrapper = parentWrapper; | |||
| this.target = target; | |||
| } | |||
| public void init(String tag, AttributeList attrs) throws SAXParseException { | |||
| try { | |||
| task = (Task)project.createInRole(container, tag); | |||
| } catch (BuildException e) { | |||
| // swallow here, will be thrown again in | |||
| // UnknownElement.maybeConfigure if the problem persists. | |||
| } | |||
| if (task == null) { | |||
| task = new UnknownElement(tag); | |||
| task.setProject(project); | |||
| task.setTaskType(tag); | |||
| task.setTaskName(tag); | |||
| container.addTask(task); | |||
| } | |||
| task.setLocation(new Location(buildFile.toString(), | |||
| locator.getLineNumber(), | |||
| locator.getColumnNumber())); | |||
| configureId(task, attrs); | |||
| task.setOwningTarget(target); | |||
| task.init(); | |||
| wrapper = task.getRuntimeConfigurableWrapper(); | |||
| wrapper.setAttributes(attrs); | |||
| if (parentWrapper != null) { | |||
| parentWrapper.addChild(wrapper); | |||
| } | |||
| } | |||
| protected void finished() { | |||
| if (container instanceof InmediateTarget) { | |||
| ((InmediateTarget)container).execute(); | |||
| } | |||
| } | |||
| public void characters(char[] buf, int start, int end) throws SAXParseException { | |||
| if (wrapper == null) { | |||
| try { | |||
| addText(project, task, buf, start, end); | |||
| } catch (BuildException exc) { | |||
| throw new SAXParseException(exc.getMessage(), locator, exc); | |||
| } | |||
| } else { | |||
| wrapper.addText(buf, start, end); | |||
| } | |||
| } | |||
| public void startElement(String name, AttributeList attrs) throws SAXParseException { | |||
| if (task instanceof TaskContainer) { | |||
| // task can contain other tasks - no other nested elements possible | |||
| new TaskHandler(this, (TaskContainer)task, wrapper, target).init(name, attrs); | |||
| } | |||
| else { | |||
| new NestedElementHandler(this, task, wrapper, target).init(name, attrs); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Handler for all nested properties. | |||
| */ | |||
| private class NestedElementHandler extends AbstractHandler { | |||
| private Object parent; | |||
| private Object child; | |||
| private RuntimeConfigurable parentWrapper; | |||
| private RuntimeConfigurable childWrapper = null; | |||
| private Target target; | |||
| public NestedElementHandler(DocumentHandler parentHandler, | |||
| Object parent, | |||
| RuntimeConfigurable parentWrapper, | |||
| Target target) { | |||
| super(parentHandler); | |||
| if (parent instanceof RoleAdapter) { | |||
| this.parent = ((RoleAdapter) parent).getProxy(); | |||
| } else { | |||
| this.parent = parent; | |||
| } | |||
| this.parentWrapper = parentWrapper; | |||
| this.target = target; | |||
| } | |||
| public void init(String propType, AttributeList attrs) throws SAXParseException { | |||
| Class parentClass = parent.getClass(); | |||
| IntrospectionHelper ih = | |||
| IntrospectionHelper.getHelper(parentClass); | |||
| try { | |||
| String elementName = propType.toLowerCase(Locale.US); | |||
| if (parent instanceof UnknownElement) { | |||
| UnknownElement uc = new UnknownElement(elementName); | |||
| uc.setProject(project); | |||
| ((UnknownElement) parent).addChild(uc); | |||
| // Set this parameters just in case is a Task | |||
| uc.setTaskType(elementName); | |||
| uc.setTaskName(elementName); | |||
| child = uc; | |||
| } else { | |||
| child = ih.createElement(project, parent, elementName); | |||
| } | |||
| configureId(child, attrs); | |||
| if (parentWrapper != null) { | |||
| childWrapper = new RuntimeConfigurable(child, propType); | |||
| childWrapper.setAttributes(attrs); | |||
| parentWrapper.addChild(childWrapper); | |||
| } else { | |||
| configure(child, attrs, project); | |||
| ih.storeElement(project, parent, child, elementName); | |||
| } | |||
| } catch (BuildException exc) { | |||
| throw new SAXParseException(exc.getMessage(), locator, exc); | |||
| } | |||
| } | |||
| public void characters(char[] buf, int start, int end) throws SAXParseException { | |||
| if (parentWrapper == null) { | |||
| try { | |||
| addText(project, child, buf, start, end); | |||
| } catch (BuildException exc) { | |||
| throw new SAXParseException(exc.getMessage(), locator, exc); | |||
| } | |||
| } else { | |||
| childWrapper.addText(buf, start, end); | |||
| } | |||
| } | |||
| public void startElement(String name, AttributeList attrs) throws SAXParseException { | |||
| if (child instanceof TaskContainer) { | |||
| // taskcontainer nested element can contain other tasks - no other | |||
| // nested elements possible | |||
| new TaskHandler(this, (TaskContainer)child, childWrapper, target).init(name, attrs); | |||
| } | |||
| else { | |||
| new NestedElementHandler(this, child, childWrapper, target).init(name, attrs); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Handler to perform appropriate semantics for the special | |||
| * <description> element on tasks. | |||
| */ | |||
| private class DescriptionHandler extends AbstractHandler { | |||
| public DescriptionHandler(DocumentHandler parent) { | |||
| super(parent); | |||
| } | |||
| public void init(String tag, AttributeList attrs) throws SAXParseException { | |||
| if (attrs.getLength() > 0) { | |||
| throw new SAXParseException("No attributes allowed on " + tag, locator); | |||
| } | |||
| } | |||
| public void characters(char[] buf, int start, int end) throws SAXParseException { | |||
| String desc = project.getDescription(); | |||
| if (desc == null) { | |||
| desc = ""; | |||
| } | |||
| project.setDescription(desc + new String(buf, start, end)); | |||
| } | |||
| } | |||
| /** | |||
| * Special target type for top level Tasks and Datatypes. | |||
| * This will allow eliminating special cases. | |||
| */ | |||
| private class InmediateTarget extends Target { | |||
| /** | |||
| * Create a target for a top level task or datatype. | |||
| * @param name the name of the task to be run on this target. | |||
| */ | |||
| InmediateTarget(String name) { | |||
| super(); | |||
| setProject(project); | |||
| setName("Top level " + name); | |||
| } | |||
| } | |||
| public static void configure(Object target, AttributeList attrs, | |||
| Project project) throws BuildException { | |||
| if( target instanceof RoleAdapter ) { | |||
| target=((RoleAdapter)target).getProxy(); | |||
| } | |||
| IntrospectionHelper ih = | |||
| IntrospectionHelper.getHelper(target.getClass()); | |||
| project.addBuildListener(ih); | |||
| for (int i = 0; i < attrs.getLength(); i++) { | |||
| // reflect these into the target | |||
| String value=replaceProperties(project, attrs.getValue(i), | |||
| project.getProperties() ); | |||
| try { | |||
| ih.setAttribute(project, target, | |||
| attrs.getName(i).toLowerCase(Locale.US), value); | |||
| } catch (BuildException be) { | |||
| // id attribute must be set externally | |||
| if (!attrs.getName(i).equals("id")) { | |||
| throw be; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Adds the content of #PCDATA sections to an element. | |||
| */ | |||
| public static void addText(Project project, Object target, char[] buf, int start, int end) | |||
| throws BuildException { | |||
| addText(project, target, new String(buf, start, end)); | |||
| } | |||
| /** | |||
| * Adds the content of #PCDATA sections to an element. | |||
| */ | |||
| public static void addText(Project project, Object target, String text) | |||
| throws BuildException { | |||
| if (text == null ) { | |||
| return; | |||
| } | |||
| if(target instanceof RoleAdapter) { | |||
| target = ((RoleAdapter) target).getProxy(); | |||
| } | |||
| IntrospectionHelper.getHelper(target.getClass()).addText(project, target, text); | |||
| } | |||
| /** | |||
| * Stores a configured child element into its parent object | |||
| */ | |||
| public static void storeChild(Project project, Object parent, Object child, String tag) { | |||
| IntrospectionHelper ih = IntrospectionHelper.getHelper(parent.getClass()); | |||
| ih.storeElement(project, parent, child, tag); | |||
| } | |||
| /** | |||
| * 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. | |||
| * @since 1.5 | |||
| */ | |||
| public static String replaceProperties(Project project, String value) | |||
| throws BuildException { | |||
| return project.replaceProperties(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. | |||
| */ | |||
| public static String replaceProperties(Project project, String value, Hashtable keys) | |||
| throws BuildException { | |||
| if (value == null) { | |||
| return null; | |||
| } | |||
| Vector fragments = new Vector(); | |||
| Vector propertyRefs = new Vector(); | |||
| parsePropertyString(value, fragments, propertyRefs); | |||
| StringBuffer sb = new StringBuffer(); | |||
| Enumeration i = fragments.elements(); | |||
| Enumeration j = propertyRefs.elements(); | |||
| while (i.hasMoreElements()) { | |||
| String fragment = (String)i.nextElement(); | |||
| if (fragment == null) { | |||
| String propertyName = (String)j.nextElement(); | |||
| if (!keys.containsKey(propertyName)) { | |||
| project.log("Property ${" + propertyName + "} has not been set", Project.MSG_VERBOSE); | |||
| } | |||
| fragment = (keys.containsKey(propertyName)) ? (String) keys.get(propertyName) | |||
| : "${" + propertyName + "}"; | |||
| } | |||
| sb.append(fragment); | |||
| } | |||
| return sb.toString(); | |||
| } | |||
| /** | |||
| * This method will parse a string containing ${value} style | |||
| * property values into two lists. The first list is a collection | |||
| * of text fragments, while the other is a set of string property names | |||
| * null entries in the first list indicate a property reference from the | |||
| * second list. | |||
| */ | |||
| public static void parsePropertyString(String value, Vector fragments, Vector propertyRefs) | |||
| throws BuildException { | |||
| int prev = 0; | |||
| int pos; | |||
| while ((pos = value.indexOf("$", prev)) >= 0) { | |||
| if (pos > 0) { | |||
| fragments.addElement(value.substring(prev, pos)); | |||
| } | |||
| if( pos == (value.length() - 1)) { | |||
| fragments.addElement("$"); | |||
| prev = pos + 1; | |||
| } | |||
| else if (value.charAt(pos + 1) != '{' ) { | |||
| fragments.addElement(value.substring(pos + 1, pos + 2)); | |||
| prev = pos + 2; | |||
| } else { | |||
| int endName = value.indexOf('}', pos); | |||
| if (endName < 0) { | |||
| throw new BuildException("Syntax error in property: " | |||
| + value ); | |||
| } | |||
| String propertyName = value.substring(pos + 2, endName); | |||
| fragments.addElement(null); | |||
| propertyRefs.addElement(propertyName); | |||
| prev = endName + 1; | |||
| } | |||
| } | |||
| if (prev < value.length()) { | |||
| fragments.addElement(value.substring(prev)); | |||
| } | |||
| } | |||
| private static SAXParserFactory getParserFactory() { | |||
| if (parserFactory == null) { | |||
| parserFactory = SAXParserFactory.newInstance(); | |||
| } | |||
| return parserFactory; | |||
| } | |||
| /** | |||
| * Scan AttributeList for the id attribute and maybe add a | |||
| * reference to project. | |||
| * | |||
| * <p>Moved out of {@link #configure configure} to make it happen | |||
| * at parser time.</p> | |||
| */ | |||
| private void configureId(Object target, AttributeList attr) { | |||
| String id = attr.getValue("id"); | |||
| if (id != null) { | |||
| if( target instanceof RoleAdapter ) { | |||
| ((RoleAdapter)target).setId(id); | |||
| } | |||
| project.addReference(id, target); | |||
| } | |||
| } | |||
| } | |||
| @@ -62,6 +62,7 @@ | |||
| <task name="jar" class="org.apache.tools.ant.taskdefs.Jar"/> | |||
| <task name="rmic" class="org.apache.tools.ant.taskdefs.Rmic"/> | |||
| <task name="cvs" class="org.apache.tools.ant.taskdefs.Cvs"/> | |||
| <task name="get" class="org.apache.tools.ant.taskdefs.Get"/> | |||
| <task name="unzip" class="org.apache.tools.ant.taskdefs.Expand"/> | |||
| <task name="unjar" class="org.apache.tools.ant.taskdefs.Expand"/> | |||
| <task name="unwar" class="org.apache.tools.ant.taskdefs.Expand"/> | |||
| @@ -74,6 +75,7 @@ | |||
| <task name="java" class="org.apache.tools.ant.taskdefs.Java"/> | |||
| <task name="tstamp" class="org.apache.tools.ant.taskdefs.Tstamp"/> | |||
| <task name="property" class="org.apache.tools.ant.taskdefs.Property"/> | |||
| <task name="xmlproperty" class="org.apache.tools.ant.taskdefs.XmlProperty"/> | |||
| <task name="taskdef" class="org.apache.tools.ant.taskdefs.Taskdef"/> | |||
| <task name="ant" class="org.apache.tools.ant.taskdefs.Ant"/> | |||
| <task name="exec" class="org.apache.tools.ant.taskdefs.ExecTask"/> | |||
| @@ -84,6 +86,7 @@ | |||
| <task name="fixcrlf" class="org.apache.tools.ant.taskdefs.FixCRLF"/> | |||
| <task name="patch" class="org.apache.tools.ant.taskdefs.Patch"/> | |||
| <task name="style" class="org.apache.tools.ant.taskdefs.XSLTProcess"/> | |||
| <task name="xslt" class="org.apache.tools.ant.taskdefs.XSLTProcess"/> | |||
| <task name="touch" class="org.apache.tools.ant.taskdefs.Touch"/> | |||
| <task name="signjar" class="org.apache.tools.ant.taskdefs.SignJar"/> | |||
| <task name="genkey" class="org.apache.tools.ant.taskdefs.GenerateKey"/> | |||
| @@ -112,34 +115,47 @@ | |||
| <task name="waitfor" class="org.apache.tools.ant.taskdefs.WaitFor"/> | |||
| <task name="input" class="org.apache.tools.ant.taskdefs.Input"/> | |||
| <task name="loadfile" class="org.apache.tools.ant.taskdefs.LoadFile"/> | |||
| <task name="manifest" class="org.apache.tools.ant.taskdefs.Manifest"/> | |||
| <task name="manifest" class="org.apache.tools.ant.taskdefs.ManifestTask"/> | |||
| <task name="loadproperties" class="org.apache.tools.ant.taskdefs.LoadProperties"/> | |||
| <task name="basename" class="org.apache.tools.ant.taskdefs.Basename"/> | |||
| <task name="dirname" class="org.apache.tools.ant.taskdefs.Dirname"/> | |||
| <task name="cvschangelog" class="org.apache.tools.ant.taskdefs.cvslib.ChangeLogTask"/> | |||
| <task name="buildnumber" class="org.apache.tools.ant.taskdefs.BuildNumber"/> | |||
| <task name="concat" class="org.apache.tools.ant.taskdefs.Concat"/> | |||
| <task name="cvstagdiff" class="org.apache.tools.ant.taskdefs.cvslib.CvsTagDiff"/> | |||
| <task name="tempfile" class="org.apache.tools.ant.taskdefs.TempFile"/> | |||
| <task name="classloader" class="org.apache.tools.ant.taskdefs.Classloader"/> | |||
| <task name="import" class="org.apache.tools.ant.taskdefs.ImportTask"/> | |||
| <task name="whichresource" class="org.apache.tools.ant.taskdefs.WhichResource"/> | |||
| <task name="subant" class="org.apache.tools.ant.taskdefs.SubAnt"/> | |||
| <task name="sync" class="org.apache.tools.ant.taskdefs.Sync"/> | |||
| <task name="antjar" class="org.apache.tools.ant.taskdefs.Antjar"/> | |||
| <task name="antlib" class="org.apache.tools.ant.taskdefs.Antlib"/> | |||
| <data-type name="path" class="org.apache.tools.ant.types.Path"/> | |||
| <data-type name="fileset" class="org.apache.tools.ant.types.FileSet"/> | |||
| <data-type name="filelist" class="org.apache.tools.ant.types.FileList"/> | |||
| <data-type name="patternset" class="org.apache.tools.ant.types.PatternSet"/> | |||
| <data-type name="mapper" class="org.apache.tools.ant.types.Mapper"/> | |||
| <data-type name="filterset" class="org.apache.tools.ant.types.FilterSet"/> | |||
| <data-type name="filterchain" class="org.apache.tools.ant.types.FilterChain" /> | |||
| <data-type name="filterreader" class="org.apache.tools.ant.types.AntFilterReader" /> | |||
| <data-type name="description" class="org.apache.tools.ant.types.Description"/> | |||
| <data-type name="substitution" class="org.apache.tools.ant.types.Substitution"/> | |||
| <data-type name="regexp" class="org.apache.tools.ant.types.RegularExpression"/> | |||
| <data-type name="selector" class="org.apache.tools.ant.types.selectors.SelectSelector"/> | |||
| <data-type name="zipfileset" class="org.apache.tools.ant.types.ZipFileSet"/> | |||
| <data-type name="xmlcatalog" class="org.apache.tools.ant.types.XMLCatalog" /> | |||
| <data-type name="extensionSet" class="org.apache.tools.ant.taskdefs.optional.extension.ExtensionSet" /> | |||
| <data-type name="extension" class="org.apache.tools.ant.taskdefs.optional.extension.ExtensionAdapter" /> | |||
| <data-type name="libfileset" class="org.apache.tools.ant.taskdefs.optional.extension.LibFileSet" /> | |||
| <!-- deprecated ant tasks (kept for back compatibility) --> | |||
| <task name="javadoc2" class="org.apache.tools.ant.taskdefs.Javadoc"/> | |||
| <task name="copydir" class="org.apache.tools.ant.taskdefs.Copydir"/> | |||
| <task name="copyfile" class="org.apache.tools.ant.taskdefs.Copyfile"/> | |||
| <task name="deltree" class="org.apache.tools.ant.taskdefs.Deltree"/> | |||
| <task name="rename" class="org.apache.tools.ant.taskdefs.Rename"/> | |||
| <data-type name="description" class="org.apache.tools.ant.types.Description"/> | |||
| <data-type name="dirset" class="org.apache.tools.ant.types.DirSet"/> | |||
| <data-type name="filelist" class="org.apache.tools.ant.types.FileList"/> | |||
| <data-type name="fileset" class="org.apache.tools.ant.types.FileSet"/> | |||
| <data-type name="filterchain" class="org.apache.tools.ant.types.FilterChain"/> | |||
| <data-type name="filterreader" class="org.apache.tools.ant.types.AntFilterReader"/> | |||
| <data-type name="filterset" class="org.apache.tools.ant.types.FilterSet"/> | |||
| <data-type name="mapper" class="org.apache.tools.ant.types.Mapper"/> | |||
| <data-type name="path" class="org.apache.tools.ant.types.Path"/> | |||
| <data-type name="patternset" class="org.apache.tools.ant.types.PatternSet"/> | |||
| <data-type name="regexp" class="org.apache.tools.ant.types.RegularExpression"/> | |||
| <data-type name="substitution" class="org.apache.tools.ant.types.Substitution"/> | |||
| <data-type name="xmlcatalog" class="org.apache.tools.ant.types.XMLCatalog"/> | |||
| <data-type name="extensionSet" class="org.apache.tools.ant.taskdefs.optional.extension.ExtensionSet"/> | |||
| <data-type name="extension" class="org.apache.tools.ant.taskdefs.optional.extension.ExtensionAdapter"/> | |||
| <data-type name="libfileset" class="org.apache.tools.ant.taskdefs.optional.extension.LibFileSet"/> | |||
| <data-type name="selector" class="org.apache.tools.ant.types.selectors.SelectSelector"/> | |||
| <data-type name="zipfileset" class="org.apache.tools.ant.types.ZipFileSet"/> | |||
| </antlib> | |||
| @@ -55,6 +55,7 @@ | |||
| <antlib version="1.5" > | |||
| <!-- Declaration of optional tasks --> | |||
| <task name="image" class="org.apache.tools.ant.taskdefs.optional.image.Image"/> | |||
| <task name="script" class="org.apache.tools.ant.taskdefs.optional.Script"/> | |||
| <task name="netrexxc" class="org.apache.tools.ant.taskdefs.optional.NetRexxC"/> | |||
| <task name="renameext" class="org.apache.tools.ant.taskdefs.optional.RenameExtensions"/> | |||
| @@ -62,7 +63,14 @@ | |||
| <task name="ddcreator" class="org.apache.tools.ant.taskdefs.optional.ejb.DDCreator"/> | |||
| <task name="wlrun" class="org.apache.tools.ant.taskdefs.optional.ejb.WLRun"/> | |||
| <task name="wlstop" class="org.apache.tools.ant.taskdefs.optional.ejb.WLStop"/> | |||
| <task name="vssadd" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSADD"/> | |||
| <task name="vsscheckin" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKIN"/> | |||
| <task name="vsscheckout" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKOUT"/> | |||
| <task name="vsscp" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCP"/> | |||
| <task name="vsscreate" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCREATE"/> | |||
| <task name="vssget" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSGET"/> | |||
| <task name="vsshistory" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSHISTORY"/> | |||
| <task name="vsslabel" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABEL"/> | |||
| <task name="ejbjar" class="org.apache.tools.ant.taskdefs.optional.ejb.EjbJar"/> | |||
| <task name="mparse" class="org.apache.tools.ant.taskdefs.optional.metamata.MParse"/> | |||
| <task name="mmetrics" class="org.apache.tools.ant.taskdefs.optional.metamata.MMetrics"/> | |||
| @@ -89,31 +97,42 @@ | |||
| <task name="telnet" class="org.apache.tools.ant.taskdefs.optional.net.TelnetTask"/> | |||
| <task name="csc" class="org.apache.tools.ant.taskdefs.optional.dotnet.CSharp"/> | |||
| <task name="ilasm" class="org.apache.tools.ant.taskdefs.optional.dotnet.Ilasm"/> | |||
| <task name="WsdlToDotnet" class="org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet"/> | |||
| <task name="wsdltodotnet" class="org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet"/> | |||
| <task name="stylebook" class="org.apache.tools.ant.taskdefs.optional.StyleBook"/> | |||
| <task name="test" class="org.apache.tools.ant.taskdefs.optional.Test"/> | |||
| <task name="pvcs" class="org.apache.tools.ant.taskdefs.optional.pvcs.Pvcs"/> | |||
| <task name="p4change" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Change"/> | |||
| <task name="p4delete" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Delete"/> | |||
| <task name="p4label" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Label"/> | |||
| <task name="p4labelsync" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Labelsync"/> | |||
| <task name="p4have" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Have"/> | |||
| <task name="p4sync" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Sync"/> | |||
| <task name="p4edit" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Edit"/> | |||
| <task name="p4integrate" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Integrate"/> | |||
| <task name="p4resolve" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Resolve"/> | |||
| <task name="p4submit" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Submit"/> | |||
| <task name="p4counter" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Counter"/> | |||
| <task name="p4revert" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Revert"/> | |||
| <task name="p4reopen" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Reopen"/> | |||
| <task name="p4fstat" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Fstat"/> | |||
| <task name="javah" class="org.apache.tools.ant.taskdefs.optional.Javah"/> | |||
| <task name="ccupdate" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCUpdate"/> | |||
| <task name="cccheckout" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckout"/> | |||
| <task name="cccheckin" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckin"/> | |||
| <task name="ccuncheckout" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCUnCheckout"/> | |||
| <task name="ccmklbtype" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCMklbtype"/> | |||
| <task name="ccmklabel" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCMklabel"/> | |||
| <task name="ccrmtype" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCRmtype"/> | |||
| <task name="cclock" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCLock"/> | |||
| <task name="ccunlock" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCUnlock"/> | |||
| <task name="ccmkbl" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCMkbl"/> | |||
| <task name="sound" class="org.apache.tools.ant.taskdefs.optional.sound.SoundTask"/> | |||
| <task name="junitreport" class="org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator"/> | |||
| <task name="vsslabel" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABEL"/> | |||
| <task name="vsshistory" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSHISTORY"/> | |||
| <task name="blgenclient" class="org.apache.tools.ant.taskdefs.optional.ejb.BorlandGenerateClient"/> | |||
| <task name="rpm" class="org.apache.tools.ant.taskdefs.optional.Rpm"/> | |||
| <task name="xmlvalidate" class="org.apache.tools.ant.taskdefs.optional.XMLValidateTask"/> | |||
| <task name="vsscheckin" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKIN"/> | |||
| <task name="vsscheckout" class="org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKOUT"/> | |||
| <task name="iplanet" class="ejbc=org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask"/> | |||
| <task name="iplanet-ejbc" class="org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask"/> | |||
| <task name="jdepend" class="org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask"/> | |||
| <task name="mimemail" class="org.apache.tools.ant.taskdefs.optional.net.MimeMail"/> | |||
| <task name="ccmcheckin" class="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin"/> | |||
| @@ -133,12 +152,26 @@ | |||
| <task name="soscheckout" class="org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout"/> | |||
| <task name="soslabel" class="org.apache.tools.ant.taskdefs.optional.sos.SOSLabel"/> | |||
| <task name="echoproperties" class="org.apache.tools.ant.taskdefs.optional.EchoProperties"/> | |||
| <task name="splash" class="org.apache.tools.ant.taskdefs.optional.splash.SplashTask"/> | |||
| <task name="serverdeploy" class="org.apache.tools.ant.taskdefs.optional.j2ee.ServerDeploy"/> | |||
| <task name="jarlib-display" class="org.apache.tools.ant.taskdefs.optional.extension.JarLibDisplayTask"/> | |||
| <task name="jarlib-manifest" class="org.apache.tools.ant.taskdefs.optional.extension.JarLibManifestTask"/> | |||
| <task name="jarlib-available" class="org.apache.tools.ant.taskdefs.optional.extension.JarLibAvailableTask"/> | |||
| <task name="jarlib-resolve" class="org.apache.tools.ant.taskdefs.optional.extension.JarLibResolveTask"/> | |||
| <task name="setproxy" class="org.apache.tools.ant.taskdefs.optional.net.SetProxy"/> | |||
| <task name="vbc" class="org.apache.tools.ant.taskdefs.optional.dotnet.VisualBasicCompile"/> | |||
| <task name="symlink" class="org.apache.tools.ant.taskdefs.optional.unix.Symlink"/> | |||
| <task name="chgrp" class="org.apache.tools.ant.taskdefs.optional.unix.Chgrp"/> | |||
| <task name="chown" class="org.apache.tools.ant.taskdefs.optional.unix.Chown"/> | |||
| <task name="attrib" class="org.apache.tools.ant.taskdefs.optional.windows.Attrib"/> | |||
| <task name="scp" class="org.apache.tools.ant.taskdefs.optional.ssh.Scp"/> | |||
| <task name="sshexec" class="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec"/> | |||
| <task name="jsharpc" class="org.apache.tools.ant.taskdefs.optional.dotnet.JSharp"/> | |||
| <!-- I have no idea why this task is here --> | |||
| <task name="get" class="org.apache.tools.ant.taskdefs.Get"/> | |||
| <!-- datatypes --> | |||
| <data-type name="classfileset" class="org.apache.tools.ant.types.optional.depend.ClassfileSet"/> | |||
| <data-type name="scriptfilter" class="org.apache.tools.ant.types.optional.ScriptFilter"/> | |||
| <!-- deprecated ant tasks (kept for back compatibility) --> | |||