diff --git a/src/main/org/apache/tools/ant/Project.java b/src/main/org/apache/tools/ant/Project.java index d6d2ed1cb..2212b3a09 100644 --- a/src/main/org/apache/tools/ant/Project.java +++ b/src/main/org/apache/tools/ant/Project.java @@ -278,6 +278,16 @@ public class Project { properties.put(name, value); } + public void unsetProperty(String name) { + // command line properties take precedence + if (null != userProperties.get(name)) { + log("Won\'t unset user property " + name, MSG_VERBOSE); + return; + } + log("Unsetting project property: " + name, MSG_DEBUG); + properties.remove(name); + } + public void setUserProperty(String name, String value) { log("Setting ro project property: " + name + " -> " + value, MSG_DEBUG); diff --git a/src/main/org/apache/tools/ant/taskdefs/Javac.java b/src/main/org/apache/tools/ant/taskdefs/Javac.java index d258070f3..8f706b6c6 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Javac.java +++ b/src/main/org/apache/tools/ant/taskdefs/Javac.java @@ -472,6 +472,7 @@ public class Javac extends MatchingTask { || f.equalsIgnoreCase("false") || f.equalsIgnoreCase("no")) { fork = "false"; + forkedExecutable = null; } else { fork = "true"; forkedExecutable = f; @@ -490,6 +491,11 @@ public class Javac extends MatchingTask { * The name of the javac executable to use in fork-mode. */ public String getJavacExecutable() { + if (forkedExecutable == null && isForkedJavac()) { + forkedExecutable = getSystemJavac(); + } else if (forkedExecutable != null && !isForkedJavac()) { + forkedExecutable = null; + } return forkedExecutable; } diff --git a/src/testcases/org/apache/tools/ant/MockBuildListener.java b/src/testcases/org/apache/tools/ant/MockBuildListener.java index e71f1c46f..0033794e4 100644 --- a/src/testcases/org/apache/tools/ant/MockBuildListener.java +++ b/src/testcases/org/apache/tools/ant/MockBuildListener.java @@ -87,7 +87,7 @@ public class MockBuildListener extends Assert implements BuildListener { } public void assertEmpty() { - assertTrue("MockBuilListener is not empty", buffer.isEmpty()); + assertTrue("MockBuildListener is not empty", buffer.isEmpty()); } public void addBuildEvent(final String message, final int priority) { diff --git a/src/testcases/org/apache/tools/ant/taskdefs/JavacTest.java b/src/testcases/org/apache/tools/ant/taskdefs/JavacTest.java new file mode 100644 index 000000000..6897d5362 --- /dev/null +++ b/src/testcases/org/apache/tools/ant/taskdefs/JavacTest.java @@ -0,0 +1,160 @@ +/* + * 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; + +import org.apache.tools.ant.Project; + +import junit.framework.TestCase; + +/** + * Testcase for . + * + * @author Stefan Bodewig + * @version $Revision$ $Date$ + */ +public class JavacTest extends TestCase { + + private Project project; + private Javac javac; + + public JavacTest(String name) { + super(name); + } + + public void setUp() { + project = new Project(); + project.init(); + javac = new Javac(); + javac.setProject(project); + } + + /** + * Test setting the name of the javac executable. + */ + public void testForkedExecutableName() { + assertNull("no fork means no executable", javac.getJavacExecutable()); + + project.setProperty("build.compiler", "modern"); + assertNull("no fork means no executable", javac.getJavacExecutable()); + + javac.setFork("true"); + assertNotNull("normal fork", javac.getJavacExecutable()); + assertTrue("name should contain \"javac\"", + javac.getJavacExecutable().indexOf("javac") > -1); + + project.setProperty("build.compiler", "extJavac"); + javac.setFork("false"); + assertNotNull("fork via property", javac.getJavacExecutable()); + assertTrue("name should contain \"javac\"", + javac.getJavacExecutable().indexOf("javac") > -1); + + project.setProperty("build.compiler", "whatever"); + assertNull("no fork and not extJavac means no executable", + javac.getJavacExecutable()); + + String myJavac = "Slartibartfast"; + javac.setFork(myJavac); + assertEquals(myJavac, javac.getJavacExecutable()); + } + + /** + * Test nested compiler args. + */ + public void testCompilerArg() { + String[] args = javac.getCurrentCompilerArgs(); + assertNotNull(args); + assertEquals("no args", 0, args.length); + + Javac.ImplementationSpecificArgument arg = javac.createCompilerArg(); + String ford = "Ford"; + String prefect = "Prefect"; + String testArg = ford + " " + prefect; + arg.setValue(testArg); + args = javac.getCurrentCompilerArgs(); + assertEquals("unconditional single arg", 1, args.length); + assertEquals(testArg, args[0]); + + arg.setImplementation("jikes"); + args = javac.getCurrentCompilerArgs(); + assertNotNull(args); + assertEquals("implementation is jikes but build.compiler is null", + 0, args.length); + + project.setProperty("build.compiler", "classic"); + args = javac.getCurrentCompilerArgs(); + assertNotNull(args); + assertEquals("implementation is jikes but build.compiler is classic", + 0, args.length); + + project.setProperty("build.compiler", "jikes"); + args = javac.getCurrentCompilerArgs(); + assertEquals("both are jikes", 1, args.length); + assertEquals(testArg, args[0]); + + project.unsetProperty("build.compiler"); + arg.setImplementation("extJavac"); + javac.setFork("true"); + args = javac.getCurrentCompilerArgs(); + assertEquals("both are forked javac", 1, args.length); + assertEquals(testArg, args[0]); + + arg.setLine(testArg); + args = javac.getCurrentCompilerArgs(); + assertEquals("split at space", 2, args.length); + assertEquals(ford, args[0]); + assertEquals(prefect, args[1]); + } + +}