Browse Source

Make sure the class passed into Project.addTaskDefinition is suitable

for a task, that is it is public, non-abstract, has a no-arg
constructor and a public no-arg execute method.

PR: 4163
Submitted by:	Ralf Wiebicke <ralf@rw7.de>


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269857 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 23 years ago
parent
commit
5f93102e17
19 changed files with 852 additions and 8 deletions
  1. +4
    -0
      src/etc/testcases/taskdefs/taskdef.xml
  2. +31
    -0
      src/main/org/apache/tools/ant/Project.java
  3. +34
    -2
      src/main/org/apache/tools/ant/TaskAdapter.java
  4. +2
    -1
      src/main/org/apache/tools/ant/taskdefs/Definer.java
  5. +3
    -1
      src/main/org/apache/tools/ant/taskdefs/Taskdef.java
  6. +3
    -1
      src/main/org/apache/tools/ant/taskdefs/Typedef.java
  7. +2
    -2
      src/main/org/apache/tools/ant/types/Path.java
  8. +68
    -0
      src/testcases/org/apache/tools/ant/DummyTaskAbstract.java
  9. +61
    -0
      src/testcases/org/apache/tools/ant/DummyTaskInterface.java
  10. +67
    -0
      src/testcases/org/apache/tools/ant/DummyTaskOk.java
  11. +65
    -0
      src/testcases/org/apache/tools/ant/DummyTaskOkNonTask.java
  12. +65
    -0
      src/testcases/org/apache/tools/ant/DummyTaskWithNonPublicExecute.java
  13. +66
    -0
      src/testcases/org/apache/tools/ant/DummyTaskWithNonVoidExecute.java
  14. +67
    -0
      src/testcases/org/apache/tools/ant/DummyTaskWithoutDefaultConstructor.java
  15. +65
    -0
      src/testcases/org/apache/tools/ant/DummyTaskWithoutExecute.java
  16. +67
    -0
      src/testcases/org/apache/tools/ant/DummyTaskWithoutPublicConstructor.java
  17. +99
    -0
      src/testcases/org/apache/tools/ant/MockBuildListener.java
  18. +76
    -0
      src/testcases/org/apache/tools/ant/ProjectTest.java
  19. +7
    -1
      src/testcases/org/apache/tools/ant/taskdefs/TaskdefTest.java

+ 4
- 0
src/etc/testcases/taskdefs/taskdef.xml View File

@@ -22,6 +22,10 @@
<taskdef name="test" classname="org.apache.tools.ant.Project" />
</target>

<target name="test5a">
<taskdef name="test" classname="org.apache.tools.ant.taskdefs.Copy" />
</target>

<target name="test6">
<echo message="${build.test}" />
<taskdef name="test6"


+ 31
- 0
src/main/org/apache/tools/ant/Project.java View File

@@ -62,6 +62,7 @@ import java.util.Vector;
import java.util.Properties;
import java.util.Enumeration;
import java.util.Stack;
import java.lang.reflect.Modifier;


import org.apache.tools.ant.types.FilterSet;
@@ -414,9 +415,39 @@ public class Project {

String msg = " +User task: " + taskName + " " + taskClass.getName();
log(msg, MSG_DEBUG);
checkTaskClass(taskClass);
taskClassDefinitions.put(taskName, taskClass);
}

/**
* Checks a class, whether it is suitable for serving as ant task.
* Throws a BuildException and logs as Project.MSG_ERR for
* conditions, that will cause the task execution to fail.
*/
public void checkTaskClass(final Class taskClass) {
if(!Modifier.isPublic(taskClass.getModifiers())) {
final String message = taskClass + " is not public";
log(message, Project.MSG_ERR);
throw new BuildException(message);
}
if(Modifier.isAbstract(taskClass.getModifiers())) {
final String message = taskClass + " is abstract";
log(message, Project.MSG_ERR);
throw new BuildException(message);
}
try {
taskClass.getConstructor( null );
// don't have to check for public, since
// getConstructor finds public constructors only.
} catch(NoSuchMethodException e) {
final String message = "No public default constructor in " + taskClass;
log(message, Project.MSG_ERR);
throw new BuildException(message);
}
if( !Task.class.isAssignableFrom(taskClass) )
TaskAdapter.checkTaskClass(taskClass, this);
}

public Hashtable getTaskDefinitions() {
return taskClassDefinitions;
}


+ 34
- 2
src/main/org/apache/tools/ant/TaskAdapter.java View File

@@ -55,6 +55,7 @@
package org.apache.tools.ant;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;


/**
@@ -67,6 +68,37 @@ public class TaskAdapter extends Task {

Object proxy;
/**
* Checks a class, whether it is suitable to be adapted by TaskAdapter.
*
* Checks conditions only, which are additionally required for a tasks
* adapted by TaskAdapter. Thus, this method should be called by
* {@link Project.checkTaskClass}.
*
* Throws a BuildException and logs as Project.MSG_ERR for
* conditions, that will cause the task execution to fail.
* Logs other suspicious conditions with Project.MSG_WARN.
*/
public static void checkTaskClass(final Class taskClass, final Project project) {
// don't have to check for interface, since then
// taskClass would be abstract too.
try {
final Method executeM = taskClass.getMethod( "execute", null );
// don't have to check for public, since
// getMethod finds public method only.
// don't have to check for abstract, since then
// taskClass would be abstract too.
if(!Void.TYPE.equals(executeM.getReturnType())) {
final String message = "return type of execute() should be void but was \""+executeM.getReturnType()+"\" in " + taskClass;
project.log(message, Project.MSG_WARN);
}
} catch(NoSuchMethodException e) {
final String message = "No public execute() in " + taskClass;
project.log(message, Project.MSG_ERR);
throw new BuildException(message);
}
}
/**
* Do the execution.
*/
@@ -94,8 +126,8 @@ public class TaskAdapter extends Task {
Class c=proxy.getClass();
executeM=c.getMethod( "execute", new Class[0] );
if( executeM == null ) {
log("No execute in " + proxy.getClass(), Project.MSG_ERR);
throw new BuildException("No execute in " + proxy.getClass());
log("No public execute() in " + proxy.getClass(), Project.MSG_ERR);
throw new BuildException("No public execute() in " + proxy.getClass());
}
executeM.invoke(proxy, null);
return;


+ 2
- 1
src/main/org/apache/tools/ant/taskdefs/Definer.java View File

@@ -173,7 +173,8 @@ public abstract class Definer extends Task {
}
}
private void addDefinition( ClassLoader al, String name, String value ) {
private void addDefinition( ClassLoader al, String name, String value )
throws BuildException {
try {
Class c = al.loadClass(value);
AntClassLoader.initializeClass(c);


+ 3
- 1
src/main/org/apache/tools/ant/taskdefs/Taskdef.java View File

@@ -54,13 +54,15 @@

package org.apache.tools.ant.taskdefs;

import org.apache.tools.ant.BuildException;

/**
* Define a new task.
*
* @author <a href="stefan.bodewig@epost.de">Stefan Bodewig</a>
*/
public class Taskdef extends Definer {
protected void addDefinition(String name, Class c) {
protected void addDefinition(String name, Class c) throws BuildException {
project.addTaskDefinition(name, c);
}
}

+ 3
- 1
src/main/org/apache/tools/ant/taskdefs/Typedef.java View File

@@ -54,13 +54,15 @@

package org.apache.tools.ant.taskdefs;

import org.apache.tools.ant.BuildException;

/**
* Define a new data type.
*
* @author <a href="stefan.bodewig@epost.de">Stefan Bodewig</a>
*/
public class Typedef extends Definer {
protected void addDefinition(String name, Class c) {
protected void addDefinition(String name, Class c) throws BuildException {
project.addDataTypeDefinition(name, c);
}
}

+ 2
- 2
src/main/org/apache/tools/ant/types/Path.java View File

@@ -528,7 +528,7 @@ public class Path extends DataType implements Cloneable {
msZipFiles.setDir(new File(System.getProperty("java.home") + File.separator + "Packages"));
msZipFiles.setIncludes("*.ZIP");
addFileset(msZipFiles);
} else if(System.getProperty("java.vm.name").equals("Kaffe")) {
} else if("Kaffe".equals(System.getProperty("java.vm.name"))) {
FileSet kaffeJarFiles = new FileSet();
kaffeJarFiles.setDir(new File(System.getProperty("java.home")
+ File.separator + "share"
@@ -549,7 +549,7 @@ public class Path extends DataType implements Cloneable {
System.getProperty("java.home")
+ File.separator + "lib"
+ File.separator + "rt.jar"));
// Just keep the old version as well and let addExistingToPath
// Just keep the old version as well and let addExisting
// sort it out.
addExisting(new Path(null,
System.getProperty("java.home")


+ 68
- 0
src/testcases/org/apache/tools/ant/DummyTaskAbstract.java View File

@@ -0,0 +1,68 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 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 org.apache.tools.ant.Task;

public abstract class DummyTaskAbstract extends Task {

public DummyTaskAbstract() {
}

public void execute() {
}
public abstract void abstractDummy();
}

+ 61
- 0
src/testcases/org/apache/tools/ant/DummyTaskInterface.java View File

@@ -0,0 +1,61 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 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;

public interface DummyTaskInterface {

public void execute();

}

+ 67
- 0
src/testcases/org/apache/tools/ant/DummyTaskOk.java View File

@@ -0,0 +1,67 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 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 org.apache.tools.ant.Task;

public class DummyTaskOk extends Task {

public DummyTaskOk() {
}

public void execute() {
}
}

+ 65
- 0
src/testcases/org/apache/tools/ant/DummyTaskOkNonTask.java View File

@@ -0,0 +1,65 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 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;

public class DummyTaskOkNonTask {

public DummyTaskOkNonTask() {
}

public void execute() {
}
}

+ 65
- 0
src/testcases/org/apache/tools/ant/DummyTaskWithNonPublicExecute.java View File

@@ -0,0 +1,65 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 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;

public class DummyTaskWithNonPublicExecute {

public DummyTaskWithNonPublicExecute() {
}

void execute() {
}
}

+ 66
- 0
src/testcases/org/apache/tools/ant/DummyTaskWithNonVoidExecute.java View File

@@ -0,0 +1,66 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 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;

public class DummyTaskWithNonVoidExecute {

public DummyTaskWithNonVoidExecute() {
}

public int execute() {
return 0;
}
}

+ 67
- 0
src/testcases/org/apache/tools/ant/DummyTaskWithoutDefaultConstructor.java View File

@@ -0,0 +1,67 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 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 org.apache.tools.ant.Task;

public class DummyTaskWithoutDefaultConstructor extends Task {

public DummyTaskWithoutDefaultConstructor(int dummy) {
}

public void execute() {
}
}

+ 65
- 0
src/testcases/org/apache/tools/ant/DummyTaskWithoutExecute.java View File

@@ -0,0 +1,65 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 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;

public class DummyTaskWithoutExecute {

public DummyTaskWithoutExecute() {
}

public void execute(String dummy) {
}
}

+ 67
- 0
src/testcases/org/apache/tools/ant/DummyTaskWithoutPublicConstructor.java View File

@@ -0,0 +1,67 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 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 org.apache.tools.ant.Task;

public class DummyTaskWithoutPublicConstructor extends Task {

DummyTaskWithoutPublicConstructor() {
}

public void execute() {
}
}

+ 99
- 0
src/testcases/org/apache/tools/ant/MockBuildListener.java View File

@@ -0,0 +1,99 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 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.util.Vector;

import junit.framework.Assert;

public class MockBuildListener extends Assert implements BuildListener {
private final Vector buffer = new Vector();
private final Project project;
public MockBuildListener(final Project project) {
this.project = project;
}
public void buildStarted(BuildEvent event) {}
public void buildFinished(BuildEvent event) {}
public void targetStarted(BuildEvent event) {}
public void targetFinished(BuildEvent event) {}
public void taskStarted(BuildEvent event) {}
public void taskFinished(BuildEvent event) {}
public void messageLogged(final BuildEvent actual) {
if(actual.getPriority()==Project.MSG_DEBUG)
return;
assertTrue("unexpected messageLogged: "+actual.getMessage(), !buffer.isEmpty());
assertEquals("unexpected project ", project, actual.getProject());

BuildEvent expected = (BuildEvent) buffer.elementAt(0);
buffer.removeElementAt(0);
assertEquals("unexpected messageLogged ", expected.getMessage(), actual.getMessage());
assertEquals("unexpected priority ", expected.getPriority(), actual.getPriority());
}
public void assertEmpty() {
assertTrue("MockBuilListener is not empty", buffer.isEmpty());
}
public void addBuildEvent(final String message, final int priority) {
final BuildEvent be = new BuildEvent(project);
be.setMessage(message, priority);
buffer.addElement(be);
}
}

+ 76
- 0
src/testcases/org/apache/tools/ant/ProjectTest.java View File

@@ -71,6 +71,7 @@ public class ProjectTest extends TestCase {

private Project p;
private String root;
private MockBuildListener mbl;

public ProjectTest(String name) {
super(name);
@@ -80,6 +81,7 @@ public class ProjectTest extends TestCase {
p = new Project();
p.init();
root = new File(File.separator).getAbsolutePath();
mbl = new MockBuildListener(p);
}

public void testDataTypes() throws BuildException {
@@ -155,4 +157,78 @@ public class ProjectTest extends TestCase {
path = root + path.substring(1);
return path.replace('\\', File.separatorChar).replace('/', File.separatorChar);
}

private void assertTaskDefFails(final Class taskClass,
final String message) {
final String dummyName = "testTaskDefinitionDummy";
try {
mbl.addBuildEvent(message, Project.MSG_ERR);
p.addTaskDefinition(dummyName, taskClass);
fail("expected BuildException(\""+message+"\", Project.MSG_ERR) when adding task " + taskClass);
}
catch(BuildException e) {
assertEquals(message, e.getMessage());
mbl.assertEmpty();
assertTrue(!p.getTaskDefinitions().containsKey(dummyName));
}
}
public void testAddTaskDefinition() {
p.addBuildListener(mbl);

p.addTaskDefinition("Ok", DummyTaskOk.class);
assertEquals(DummyTaskOk.class, p.getTaskDefinitions().get("Ok"));
p.addTaskDefinition("OkNonTask", DummyTaskOkNonTask.class);
assertEquals(DummyTaskOkNonTask.class, p.getTaskDefinitions().get("OkNonTask"));
mbl.assertEmpty();

assertTaskDefFails(DummyTaskPrivate.class, DummyTaskPrivate.class + " is not public");

if (p.getJavaVersion() != Project.JAVA_1_1) {
assertTaskDefFails(DummyTaskProtected.class,
DummyTaskProtected.class + " is not public");
} else {
/*
* I don't understand this, but this is what happens with
* > java -fullversion
* java full version "Linux_JDK_1.1.8_v3_green_threads"
*/
assertTaskDefFails(DummyTaskProtected.class,
"No public default constructor in "
+ DummyTaskProtected.class);
}
assertTaskDefFails(DummyTaskPackage.class, DummyTaskPackage.class + " is not public");

assertTaskDefFails(DummyTaskAbstract.class, DummyTaskAbstract.class + " is abstract");
assertTaskDefFails(DummyTaskInterface.class, DummyTaskInterface.class + " is abstract");

assertTaskDefFails(DummyTaskWithoutDefaultConstructor.class, "No public default constructor in " + DummyTaskWithoutDefaultConstructor.class);
assertTaskDefFails(DummyTaskWithoutPublicConstructor.class, "No public default constructor in " + DummyTaskWithoutPublicConstructor.class);
assertTaskDefFails(DummyTaskWithoutExecute.class, "No public execute() in " + DummyTaskWithoutExecute.class);
assertTaskDefFails(DummyTaskWithNonPublicExecute.class, "No public execute() in " + DummyTaskWithNonPublicExecute.class);
mbl.addBuildEvent("return type of execute() should be void but was \"int\" in " + DummyTaskWithNonVoidExecute.class, Project.MSG_WARN);
p.addTaskDefinition("NonVoidExecute", DummyTaskWithNonVoidExecute.class);
mbl.assertEmpty();
assertEquals(DummyTaskWithNonVoidExecute.class, p.getTaskDefinitions().get("NonVoidExecute"));
}
private class DummyTaskPrivate extends Task {
public DummyTaskPrivate() {}
public void execute() {}
}

protected class DummyTaskProtected extends Task {
public DummyTaskProtected() {}
public void execute() {}
}

}

class DummyTaskPackage extends Task {
public DummyTaskPackage() {}
public void execute() {}
}

+ 7
- 1
src/testcases/org/apache/tools/ant/taskdefs/TaskdefTest.java View File

@@ -54,6 +54,8 @@

package org.apache.tools.ant.taskdefs;

import org.apache.tools.ant.Project;

/**
* @author Nico Seessle <nico@seessle.de>
*/
@@ -84,7 +86,11 @@ public class TaskdefTest extends TaskdefsTest {
}

public void test5() {
executeTarget("test5");
expectBuildException("test5", "No public execute() in " + Project.class);
}

public void test5a() {
executeTarget("test5a");
}

/* disabled until I know why they fail when run via the junit task --SB


Loading…
Cancel
Save