From 68f6b984a991fd9cbf20bdfe6c1abc5b1a410588 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Thu, 7 Jun 2001 11:42:09 +0000 Subject: [PATCH] New task git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269117 13f79535-47bb-0310-9956-ffa450edef68 --- WHATSNEW | 3 +- docs/manual/CoreTasks/typedef.html | 60 ++++++++ docs/manual/coretasklist.html | 1 + .../apache/tools/ant/taskdefs/Definer.java | 144 ++++++++++++++++++ .../apache/tools/ant/taskdefs/Taskdef.java | 83 +--------- .../apache/tools/ant/taskdefs/Typedef.java | 66 ++++++++ .../tools/ant/taskdefs/defaults.properties | 1 + 7 files changed, 279 insertions(+), 79 deletions(-) create mode 100644 docs/manual/CoreTasks/typedef.html create mode 100644 src/main/org/apache/tools/ant/taskdefs/Definer.java create mode 100644 src/main/org/apache/tools/ant/taskdefs/Typedef.java diff --git a/WHATSNEW b/WHATSNEW index 39abdbd7b..2576c03db 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -21,7 +21,8 @@ Changes that could break older environments: Other changes: -------------- -* New tasks: ear, p4counter, record, cvspass, vsscheckin, vsscheckout +* New tasks: ear, p4counter, record, cvspass, vsscheckin, vsscheckout, + typedef * Ant now uses JAXP 1.1 diff --git a/docs/manual/CoreTasks/typedef.html b/docs/manual/CoreTasks/typedef.html new file mode 100644 index 000000000..00b1d557b --- /dev/null +++ b/docs/manual/CoreTasks/typedef.html @@ -0,0 +1,60 @@ + + + + +Ant User Manual + + + + +

Typedef

+

Description

+

Adds a data type definition to the current project, such that this +new type can be used in the current project. Two attributes are +needed, the name that identifies this data type uniquely, and the full +name of the class (including the packages) that implements this +type.

+

Typedef should be used to add your own types to the system. Data +types are things like paths or filesets that can be defined at +the project level and referenced via their ID attribute.

+

Custom data types usually need custom tasks to put them to good use.

+

Parameters

+ + + + + + + + + + + + + + + + + + + +
AttributeDescriptionRequired
namethe name of the data typeYes
classnamethe full class name implementing the data typeYes
classpath the classpath to + use when looking up classname. No
+

Parameters specified as nested elements

+

classpath

+

Typedef's classpath attribute is a +PATH like structure and can also be set +via a nested classpath element.

+

Examples

+
  <typedef name="urlset" classname="com.mydomain.URLSet"/>
+

makes a data type called urlset available to Ant. The +class com.mydomain.URLSet implements this type.

+
+

Copyright © 2000,2001 Apache Software +Foundation. All rights Reserved.

+ + + + diff --git a/docs/manual/coretasklist.html b/docs/manual/coretasklist.html index 9bb98b0d2..ace42fa78 100644 --- a/docs/manual/coretasklist.html +++ b/docs/manual/coretasklist.html @@ -61,6 +61,7 @@ Taskdef
Touch
Tstamp
+Typedef
Unjar
Untar
Unwar
diff --git a/src/main/org/apache/tools/ant/taskdefs/Definer.java b/src/main/org/apache/tools/ant/taskdefs/Definer.java new file mode 100644 index 000000000..49a60fd00 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/Definer.java @@ -0,0 +1,144 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2001 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 + * . + */ + +package org.apache.tools.ant.taskdefs; + +import org.apache.tools.ant.*; +import org.apache.tools.ant.types.*; + +/** + * Base class for Taskdef and Typedef - does all the classpath + * handling and and class loading. + * + * @author costin@dnt.ro + * @author Stefan Bodewig + */ +public abstract class Definer extends Task { + private String name; + private String value; + private Path classpath; + + public void setClasspath(Path classpath) { + if (this.classpath == null) { + this.classpath = classpath; + } else { + this.classpath.append(classpath); + } + } + + public Path createClasspath() { + if (this.classpath == null) { + this.classpath = new Path(project); + } + return this.classpath.createPath(); + } + + public void setClasspathRef(Reference r) { + createClasspath().setRefid(r); + } + + public void execute() throws BuildException { + if (name==null || value==null ) { + String msg = "name or classname attributes of " + + getTaskName() + " element " + + "are undefined"; + throw new BuildException(msg); + } + try { + ClassLoader loader = null; + if (classpath != null) { + AntClassLoader al = new AntClassLoader(project, classpath, + false); + // need to load Task via system classloader or the new + // task we want to define will never be a Task but always + // be wrapped into a TaskAdapter. + al.addSystemPackageRoot("org.apache.tools.ant"); + loader = al; + } else { + loader = this.getClass().getClassLoader(); + } + + Class c = null; + if (loader != null) { + c = loader.loadClass(value); + AntClassLoader.initializeClass(c); + } else { + c = Class.forName(value); + } + addDefinition(name, c); + } catch (ClassNotFoundException cnfe) { + String msg = getTaskName()+" class " + value + + " cannot be found"; + throw new BuildException(msg, cnfe, location); + } catch (NoClassDefFoundError ncdfe) { + String msg = getTaskName()+" class " + value + + " cannot be found"; + throw new BuildException(msg, ncdfe, location); + } + } + + public void setName( String name) { + this.name = name; + } + + public String getClassname() { + return value; + } + + public void setClassname(String v) { + value = v; + } + + protected abstract void addDefinition(String name, Class c); +} diff --git a/src/main/org/apache/tools/ant/taskdefs/Taskdef.java b/src/main/org/apache/tools/ant/taskdefs/Taskdef.java index ecc3b4042..f072f3386 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Taskdef.java +++ b/src/main/org/apache/tools/ant/taskdefs/Taskdef.java @@ -54,86 +54,13 @@ package org.apache.tools.ant.taskdefs; -import org.apache.tools.ant.*; -import org.apache.tools.ant.types.*; - /** - * Define a new task - name and class + * Define a new task. * - * @author costin@dnt.ro + * @author Stefan Bodewig */ -public class Taskdef extends Task { - private String name; - private String value; - private Path classpath; - - public void setClasspath(Path classpath) { - if (this.classpath == null) { - this.classpath = classpath; - } else { - this.classpath.append(classpath); - } - } - - public Path createClasspath() { - if (this.classpath == null) { - this.classpath = new Path(project); - } - return this.classpath.createPath(); - } - - public void setClasspathRef(Reference r) { - createClasspath().setRefid(r); - } - - public void execute() throws BuildException { - if (name==null || value==null ) { - String msg = "name or classname attributes of taskdef element " - + "are undefined"; - throw new BuildException(msg); - } - try { - ClassLoader loader = null; - if (classpath != null) { - AntClassLoader al = new AntClassLoader(project, classpath, - false); - // need to load Task via system classloader or the new - // task we want to define will never be a Task but always - // be wrapped into a TaskAdapter. - al.addSystemPackageRoot("org.apache.tools.ant"); - loader = al; - } else { - loader = this.getClass().getClassLoader(); - } - - Class taskClass = null; - if (loader != null) { - taskClass = loader.loadClass(value); - AntClassLoader.initializeClass(taskClass); - } else { - taskClass = Class.forName(value); - } - project.addTaskDefinition(name, taskClass); - } catch (ClassNotFoundException cnfe) { - String msg = "taskdef class " + value + - " cannot be found"; - throw new BuildException(msg, cnfe, location); - } catch (NoClassDefFoundError ncdfe) { - String msg = "taskdef class " + value + - " cannot be found"; - throw new BuildException(msg, ncdfe, location); - } - } - - public void setName( String name) { - this.name = name; - } - - public String getClassname() { - return value; - } - - public void setClassname(String v) { - value = v; +public class Taskdef extends Definer { + protected void addDefinition(String name, Class c) { + project.addTaskDefinition(name, c); } } diff --git a/src/main/org/apache/tools/ant/taskdefs/Typedef.java b/src/main/org/apache/tools/ant/taskdefs/Typedef.java new file mode 100644 index 000000000..8a389d2c7 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/Typedef.java @@ -0,0 +1,66 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 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 + * . + */ + +package org.apache.tools.ant.taskdefs; + +/** + * Define a new data type. + * + * @author Stefan Bodewig + */ +public class Typedef extends Definer { + protected void addDefinition(String name, Class c) { + project.addDataTypeDefinition(name, c); + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties index b2c0751db..a2501d5de 100644 --- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties +++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties @@ -45,6 +45,7 @@ uptodate=org.apache.tools.ant.taskdefs.UpToDate apply=org.apache.tools.ant.taskdefs.Transform record=org.apache.tools.ant.taskdefs.Recorder cvspass=org.apache.tools.ant.taskdefs.CVSPass +typedef=org.apache.tools.ant.taskdefs.Typedef # optional tasks script=org.apache.tools.ant.taskdefs.optional.Script