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}'> | <fileset dir='${orig-classes}'> | ||||
<include name='**' /> | <include name='**' /> | ||||
<exclude name='org/apache/tools/ant/Project.class' /> | <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/TaskAdapter.class' /> | ||||
<exclude name='org/apache/tools/ant/taskdefs/Ant.class' /> | <exclude name='org/apache/tools/ant/taskdefs/Ant.class' /> | ||||
</fileset> | </fileset> | ||||
@@ -56,6 +56,7 @@ package org.apache.tools.ant; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.EOFException; | |||||
import java.util.Hashtable; | import java.util.Hashtable; | ||||
import java.util.Vector; | import java.util.Vector; | ||||
import java.util.Properties; | import java.util.Properties; | ||||
@@ -265,6 +266,16 @@ public class Project { | |||||
this.defaultInputStream = defaultInputStream; | 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. | * Retrieves the current input handler. | ||||
* | * | ||||
@@ -277,6 +288,11 @@ public class Project { | |||||
private FileUtils fileUtils; | private FileUtils fileUtils; | ||||
/** | |||||
* Flag which catches Listeners which try to use System.out or System.err | |||||
*/ | |||||
private boolean loggingMessage = false; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -413,6 +429,7 @@ public class Project { | |||||
*/ | */ | ||||
public void init() throws BuildException { | public void init() throws BuildException { | ||||
setJavaVersionProperty(); | setJavaVersionProperty(); | ||||
setSystemProperties(); | |||||
if (!isRoleDefined(TASK_ROLE)) { | if (!isRoleDefined(TASK_ROLE)) { | ||||
// Top project, need to load the core definitions | // Top project, need to load the core definitions | ||||
loadDefinitions(); | loadDefinitions(); | ||||
@@ -452,7 +469,6 @@ public class Project { | |||||
throw new BuildException("Can't load default datatype list"); | throw new BuildException("Can't load default datatype list"); | ||||
} | } | ||||
setSystemProperties(); | |||||
} | } | ||||
@@ -564,7 +580,7 @@ public class Project { | |||||
*@return The buildListeners value | *@return The buildListeners value | ||||
*/ | */ | ||||
public Vector getBuildListeners() { | public Vector getBuildListeners() { | ||||
return listeners; | |||||
return (Vector) listeners.clone(); | |||||
} | } | ||||
@@ -697,6 +713,23 @@ public class Project { | |||||
properties.put(name, value); | 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 | * Allows Project and subclasses to set a property unless its already | ||||
@@ -796,6 +829,40 @@ public class Project { | |||||
return propertiesCopy; | 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 | * set the default target of the project | ||||
@@ -1205,7 +1272,7 @@ public class Project { | |||||
try { | try { | ||||
Object o = f.create(this); | Object o = f.create(this); | ||||
// Do special book keeping for ProjectComponents | |||||
setProjectReference( o ); | |||||
if (o instanceof ProjectComponent) { | if (o instanceof ProjectComponent) { | ||||
((ProjectComponent) o).setProject(this); | ((ProjectComponent) o).setProject(this); | ||||
if (o instanceof Task) { | if (o instanceof Task) { | ||||
@@ -1402,10 +1469,11 @@ public class Project { | |||||
if (defaultInputStream != null) { | if (defaultInputStream != null) { | ||||
return defaultInputStream.read(buffer, offset, length); | return defaultInputStream.read(buffer, offset, length); | ||||
} else { | } else { | ||||
return System.in.read(buffer, offset, length); | |||||
throw new EOFException("No input provided for project"); | |||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Demux an input request to the correct task. | * 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); | 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); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.buildStarted(event); | 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); | BuildEvent event = new BuildEvent(this); | ||||
event.setException(exception); | 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); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.buildFinished(event); | 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) { | protected void fireTargetStarted(Target target) { | ||||
BuildEvent event = new BuildEvent(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); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.targetStarted(event); | 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) { | protected void fireTargetFinished(Target target, Throwable exception) { | ||||
BuildEvent event = new BuildEvent(target); | BuildEvent event = new BuildEvent(target); | ||||
event.setException(exception); | 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); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.targetFinished(event); | 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) { | protected void fireTaskStarted(Task task) { | ||||
// register this as the current task on the current thread. | // register this as the current task on the current thread. | ||||
threadTasks.put(Thread.currentThread(), task); | |||||
registerThreadTask(Thread.currentThread(), task); | |||||
BuildEvent event = new BuildEvent(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); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.taskStarted(event); | 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) { | protected void fireTaskFinished(Task task, Throwable exception) { | ||||
threadTasks.remove(Thread.currentThread()); | |||||
registerThreadTask(Thread.currentThread(), null); | |||||
System.out.flush(); | System.out.flush(); | ||||
System.err.flush(); | System.err.flush(); | ||||
BuildEvent event = new BuildEvent(task); | BuildEvent event = new BuildEvent(task); | ||||
event.setException(exception); | 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); | BuildListener listener = (BuildListener) listeners.elementAt(i); | ||||
listener.taskFinished(event); | 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); | 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 | // Should move to a separate public class - and have API to add | ||||
// listeners, etc. | // listeners, etc. | ||||
private static class AntRefTable extends Hashtable { | private static class AntRefTable extends Hashtable { | ||||
Project project; | |||||
private Project project; | |||||
public AntRefTable(Project project) { | public AntRefTable(Project project) { | ||||
super(); | super(); | ||||
this.project = project; | this.project = project; | ||||
@@ -2175,9 +2276,9 @@ public class Project { | |||||
} | } | ||||
private static class AntTaskTable extends LazyHashtable { | 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) { | public AntTaskTable(Project p, boolean tasks) { | ||||
this.project = p; | this.project = p; | ||||
@@ -2189,46 +2290,56 @@ public class Project { | |||||
} | } | ||||
protected void initAll() { | protected void initAll() { | ||||
if (initAllDone ) return; | |||||
if (initAllDone) { | |||||
return; | |||||
} | |||||
project.log("InitAll", Project.MSG_DEBUG); | project.log("InitAll", Project.MSG_DEBUG); | ||||
if (props==null ) return; | |||||
if (props == null) { | |||||
return; | |||||
} | |||||
Enumeration enum = props.propertyNames(); | Enumeration enum = props.propertyNames(); | ||||
while (enum.hasMoreElements()) { | while (enum.hasMoreElements()) { | ||||
String key = (String) enum.nextElement(); | 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() | // This will call a get() and a put() | ||||
if (tasks ) | |||||
if (tasks) | |||||
project.addTaskDefinition(key, taskClass); | project.addTaskDefinition(key, taskClass); | ||||
else | else | ||||
project.addDataTypeDefinition(key, taskClass ); | project.addDataTypeDefinition(key, taskClass ); | ||||
} | } | ||||
} | } | ||||
initAllDone=true; | |||||
initAllDone = true; | |||||
} | } | ||||
protected Class getTask(String key) { | 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; | return null; | ||||
} | } | ||||
try { | try { | ||||
Class taskClass=null; | |||||
Class taskClass = null; | |||||
if (project.getCoreLoader() != null && | if (project.getCoreLoader() != null && | ||||
!("only".equals(project.getProperty("build.sysclasspath")))) { | !("only".equals(project.getProperty("build.sysclasspath")))) { | ||||
try { | 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); | taskClass = Class.forName(value); | ||||
return taskClass; | return taskClass; | ||||
} catch (NoClassDefFoundError ncdfe) { | } catch (NoClassDefFoundError ncdfe) { | ||||
project.log("Could not load a dependent class (" | 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) { | } catch (ClassNotFoundException cnfe) { | ||||
project.log("Could not load class (" + value | project.log("Could not load class (" + value | ||||
+ ") for task " + key, Project.MSG_DEBUG); | + ") for task " + key, Project.MSG_DEBUG); | ||||
@@ -2237,14 +2348,20 @@ public class Project { | |||||
} | } | ||||
// Hashtable implementation | // 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; | 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="jar" class="org.apache.tools.ant.taskdefs.Jar"/> | ||||
<task name="rmic" class="org.apache.tools.ant.taskdefs.Rmic"/> | <task name="rmic" class="org.apache.tools.ant.taskdefs.Rmic"/> | ||||
<task name="cvs" class="org.apache.tools.ant.taskdefs.Cvs"/> | <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="unzip" class="org.apache.tools.ant.taskdefs.Expand"/> | ||||
<task name="unjar" 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"/> | <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="java" class="org.apache.tools.ant.taskdefs.Java"/> | ||||
<task name="tstamp" class="org.apache.tools.ant.taskdefs.Tstamp"/> | <task name="tstamp" class="org.apache.tools.ant.taskdefs.Tstamp"/> | ||||
<task name="property" class="org.apache.tools.ant.taskdefs.Property"/> | <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="taskdef" class="org.apache.tools.ant.taskdefs.Taskdef"/> | ||||
<task name="ant" class="org.apache.tools.ant.taskdefs.Ant"/> | <task name="ant" class="org.apache.tools.ant.taskdefs.Ant"/> | ||||
<task name="exec" class="org.apache.tools.ant.taskdefs.ExecTask"/> | <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="fixcrlf" class="org.apache.tools.ant.taskdefs.FixCRLF"/> | ||||
<task name="patch" class="org.apache.tools.ant.taskdefs.Patch"/> | <task name="patch" class="org.apache.tools.ant.taskdefs.Patch"/> | ||||
<task name="style" class="org.apache.tools.ant.taskdefs.XSLTProcess"/> | <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="touch" class="org.apache.tools.ant.taskdefs.Touch"/> | ||||
<task name="signjar" class="org.apache.tools.ant.taskdefs.SignJar"/> | <task name="signjar" class="org.apache.tools.ant.taskdefs.SignJar"/> | ||||
<task name="genkey" class="org.apache.tools.ant.taskdefs.GenerateKey"/> | <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="waitfor" class="org.apache.tools.ant.taskdefs.WaitFor"/> | ||||
<task name="input" class="org.apache.tools.ant.taskdefs.Input"/> | <task name="input" class="org.apache.tools.ant.taskdefs.Input"/> | ||||
<task name="loadfile" class="org.apache.tools.ant.taskdefs.LoadFile"/> | <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="antjar" class="org.apache.tools.ant.taskdefs.Antjar"/> | ||||
<task name="antlib" class="org.apache.tools.ant.taskdefs.Antlib"/> | <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) --> | <!-- deprecated ant tasks (kept for back compatibility) --> | ||||
<task name="javadoc2" class="org.apache.tools.ant.taskdefs.Javadoc"/> | <task name="javadoc2" class="org.apache.tools.ant.taskdefs.Javadoc"/> | ||||
<task name="copydir" class="org.apache.tools.ant.taskdefs.Copydir"/> | <task name="copydir" class="org.apache.tools.ant.taskdefs.Copydir"/> | ||||
<task name="copyfile" class="org.apache.tools.ant.taskdefs.Copyfile"/> | <task name="copyfile" class="org.apache.tools.ant.taskdefs.Copyfile"/> | ||||
<task name="deltree" class="org.apache.tools.ant.taskdefs.Deltree"/> | <task name="deltree" class="org.apache.tools.ant.taskdefs.Deltree"/> | ||||
<task name="rename" class="org.apache.tools.ant.taskdefs.Rename"/> | <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> | </antlib> |
@@ -55,6 +55,7 @@ | |||||
<antlib version="1.5" > | <antlib version="1.5" > | ||||
<!-- Declaration of optional tasks --> | <!-- 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="script" class="org.apache.tools.ant.taskdefs.optional.Script"/> | ||||
<task name="netrexxc" class="org.apache.tools.ant.taskdefs.optional.NetRexxC"/> | <task name="netrexxc" class="org.apache.tools.ant.taskdefs.optional.NetRexxC"/> | ||||
<task name="renameext" class="org.apache.tools.ant.taskdefs.optional.RenameExtensions"/> | <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="ddcreator" class="org.apache.tools.ant.taskdefs.optional.ejb.DDCreator"/> | ||||
<task name="wlrun" class="org.apache.tools.ant.taskdefs.optional.ejb.WLRun"/> | <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="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="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="ejbjar" class="org.apache.tools.ant.taskdefs.optional.ejb.EjbJar"/> | ||||
<task name="mparse" class="org.apache.tools.ant.taskdefs.optional.metamata.MParse"/> | <task name="mparse" class="org.apache.tools.ant.taskdefs.optional.metamata.MParse"/> | ||||
<task name="mmetrics" class="org.apache.tools.ant.taskdefs.optional.metamata.MMetrics"/> | <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="telnet" class="org.apache.tools.ant.taskdefs.optional.net.TelnetTask"/> | ||||
<task name="csc" class="org.apache.tools.ant.taskdefs.optional.dotnet.CSharp"/> | <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="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="stylebook" class="org.apache.tools.ant.taskdefs.optional.StyleBook"/> | ||||
<task name="test" class="org.apache.tools.ant.taskdefs.optional.Test"/> | <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="pvcs" class="org.apache.tools.ant.taskdefs.optional.pvcs.Pvcs"/> | ||||
<task name="p4change" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Change"/> | <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="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="p4have" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Have"/> | ||||
<task name="p4sync" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Sync"/> | <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="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="p4submit" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Submit"/> | ||||
<task name="p4counter" class="org.apache.tools.ant.taskdefs.optional.perforce.P4Counter"/> | <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="javah" class="org.apache.tools.ant.taskdefs.optional.Javah"/> | ||||
<task name="ccupdate" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCUpdate"/> | <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="cccheckout" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckout"/> | ||||
<task name="cccheckin" class="org.apache.tools.ant.taskdefs.optional.clearcase.CCCheckin"/> | <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="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="sound" class="org.apache.tools.ant.taskdefs.optional.sound.SoundTask"/> | ||||
<task name="junitreport" class="org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator"/> | <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="blgenclient" class="org.apache.tools.ant.taskdefs.optional.ejb.BorlandGenerateClient"/> | ||||
<task name="rpm" class="org.apache.tools.ant.taskdefs.optional.Rpm"/> | <task name="rpm" class="org.apache.tools.ant.taskdefs.optional.Rpm"/> | ||||
<task name="xmlvalidate" class="org.apache.tools.ant.taskdefs.optional.XMLValidateTask"/> | <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="jdepend" class="org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask"/> | ||||
<task name="mimemail" class="org.apache.tools.ant.taskdefs.optional.net.MimeMail"/> | <task name="mimemail" class="org.apache.tools.ant.taskdefs.optional.net.MimeMail"/> | ||||
<task name="ccmcheckin" class="org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin"/> | <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="soscheckout" class="org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout"/> | ||||
<task name="soslabel" class="org.apache.tools.ant.taskdefs.optional.sos.SOSLabel"/> | <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="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="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) --> | <!-- deprecated ant tasks (kept for back compatibility) --> | ||||