ren *.foo *.bar. Use it in javac (more to come). git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268194 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -58,6 +58,7 @@ import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.DirectoryScanner; | import org.apache.tools.ant.DirectoryScanner; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.types.*; | import org.apache.tools.ant.types.*; | ||||
| import org.apache.tools.ant.util.*; | |||||
| import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||
| import java.lang.reflect.Constructor; | import java.lang.reflect.Constructor; | ||||
| @@ -89,6 +90,7 @@ import java.util.*; | |||||
| * | * | ||||
| * @author James Davidson <a href="mailto:duncan@x180.com">duncan@x180.com</a> | * @author James Davidson <a href="mailto:duncan@x180.com">duncan@x180.com</a> | ||||
| * @author Robin Green <a href="mailto:greenrd@hotmail.com">greenrd@hotmail.com</a> | * @author Robin Green <a href="mailto:greenrd@hotmail.com">greenrd@hotmail.com</a> | ||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
| */ | */ | ||||
| public class Javac extends MatchingTask { | public class Javac extends MatchingTask { | ||||
| @@ -114,7 +116,7 @@ public class Javac extends MatchingTask { | |||||
| private Path extdirs; | private Path extdirs; | ||||
| private static String lSep = System.getProperty("line.separator"); | private static String lSep = System.getProperty("line.separator"); | ||||
| protected Vector compileList = new Vector(); | |||||
| protected File[] compileList = new File[0]; | |||||
| /** | /** | ||||
| * Create a nested <src ...> element for multiple source path | * Create a nested <src ...> element for multiple source path | ||||
| @@ -322,10 +324,10 @@ public class Javac extends MatchingTask { | |||||
| } | } | ||||
| } | } | ||||
| if (compileList.size() > 0) { | |||||
| log("Compiling " + compileList.size() + | |||||
| if (compileList.length > 0) { | |||||
| log("Compiling " + compileList.length + | |||||
| " source file" | " source file" | ||||
| + (compileList.size() == 1 ? "" : "s") | |||||
| + (compileList.length == 1 ? "" : "s") | |||||
| + (destDir != null ? " to " + destDir : "")); | + (destDir != null ? " to " + destDir : "")); | ||||
| if (compiler.equalsIgnoreCase("classic")) { | if (compiler.equalsIgnoreCase("classic")) { | ||||
| @@ -347,7 +349,7 @@ public class Javac extends MatchingTask { | |||||
| * Clear the list of files to be compiled and copied.. | * Clear the list of files to be compiled and copied.. | ||||
| */ | */ | ||||
| protected void resetFileLists() { | protected void resetFileLists() { | ||||
| compileList.removeAllElements(); | |||||
| compileList = new File[0]; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -356,33 +358,11 @@ public class Javac extends MatchingTask { | |||||
| */ | */ | ||||
| protected void scanDir(File srcDir, File destDir, String files[]) { | protected void scanDir(File srcDir, File destDir, String files[]) { | ||||
| long now = (new Date()).getTime(); | |||||
| for (int i = 0; i < files.length; i++) { | |||||
| File srcFile = new File(srcDir, files[i]); | |||||
| if (files[i].endsWith(".java")) { | |||||
| File classFile = new File(destDir, files[i].substring(0, | |||||
| files[i].indexOf(".java")) + ".class"); | |||||
| if (srcFile.lastModified() > now) { | |||||
| log("Warning: file modified in the future: " + | |||||
| files[i], Project.MSG_WARN); | |||||
| } | |||||
| if (!classFile.exists() || srcFile.lastModified() > classFile.lastModified()) { | |||||
| if (!classFile.exists()) { | |||||
| log("Compiling " + srcFile.getPath() + " because class file " | |||||
| + classFile.getPath() + " does not exist", Project.MSG_DEBUG); | |||||
| } | |||||
| else { | |||||
| log("Compiling " + srcFile.getPath() + " because it is out of date with respect to " | |||||
| + classFile.getPath(), Project.MSG_DEBUG); | |||||
| } | |||||
| compileList.addElement(srcFile.getAbsolutePath()); | |||||
| } | |||||
| } | |||||
| } | |||||
| GlobPatternMapper m = new GlobPatternMapper(); | |||||
| m.setFrom("*.java"); | |||||
| m.setTo("*.class"); | |||||
| SourceFileScanner sfs = new SourceFileScanner(this); | |||||
| compileList = sfs.restrictAsFiles(files, srcDir, destDir, m); | |||||
| } | } | ||||
| // XXX | // XXX | ||||
| @@ -619,16 +599,15 @@ public class Javac extends MatchingTask { | |||||
| Project.MSG_VERBOSE); | Project.MSG_VERBOSE); | ||||
| StringBuffer niceSourceList = new StringBuffer("File"); | StringBuffer niceSourceList = new StringBuffer("File"); | ||||
| if (compileList.size() != 1) { | |||||
| if (compileList.length != 1) { | |||||
| niceSourceList.append("s"); | niceSourceList.append("s"); | ||||
| } | } | ||||
| niceSourceList.append(" to be compiled:"); | niceSourceList.append(" to be compiled:"); | ||||
| niceSourceList.append(lSep); | niceSourceList.append(lSep); | ||||
| Enumeration enum = compileList.elements(); | |||||
| while (enum.hasMoreElements()) { | |||||
| String arg = (String)enum.nextElement(); | |||||
| for (int i=0; i < compileList.length; i++) { | |||||
| String arg = compileList[i].getAbsolutePath(); | |||||
| cmd.createArgument().setValue(arg); | cmd.createArgument().setValue(arg); | ||||
| niceSourceList.append(" " + arg + lSep); | niceSourceList.append(" " + arg + lSep); | ||||
| } | } | ||||
| @@ -0,0 +1,156 @@ | |||||
| /* | |||||
| * 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", "Tomcat", 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.util; | |||||
| /** | |||||
| * Implementation of FileNameMapper that does simple wildcard pattern | |||||
| * replacements. | |||||
| * | |||||
| * <p>This does simple translations like *.foo -> *.bar where the | |||||
| * prefix to .foo will be left unchanged. It only handles a single * | |||||
| * character, use regular expressions for more complicated | |||||
| * situations.</p> | |||||
| * | |||||
| * <p>This is one of the more useful Mappers, it is used by javac for | |||||
| * example.</p> | |||||
| * | |||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
| */ | |||||
| public class GlobPatternMapper implements FileNameMapper { | |||||
| /** | |||||
| * Part of "from" pattern before the *. | |||||
| */ | |||||
| protected String fromPrefix = null; | |||||
| /** | |||||
| * Part of "from" pattern after the *. | |||||
| */ | |||||
| protected String fromPostfix = null; | |||||
| /** | |||||
| * Length of the prefix ("from" pattern). | |||||
| */ | |||||
| protected int prefixLength; | |||||
| /** | |||||
| * Length of the postfix ("from" pattern). | |||||
| */ | |||||
| protected int postfixLength; | |||||
| /** | |||||
| * Part of "to" pattern before the *. | |||||
| */ | |||||
| protected String toPrefix = null; | |||||
| /** | |||||
| * Part of "to" pattern after the *. | |||||
| */ | |||||
| protected String toPostfix = null; | |||||
| /** | |||||
| * Sets the "from" pattern. Required. | |||||
| */ | |||||
| public void setFrom(String from) { | |||||
| int index = from.lastIndexOf("*"); | |||||
| if (index == -1) { | |||||
| fromPrefix = from; | |||||
| fromPostfix = ""; | |||||
| } else { | |||||
| fromPrefix = from.substring(0, index); | |||||
| fromPostfix = from.substring(index+1); | |||||
| } | |||||
| prefixLength = fromPrefix.length(); | |||||
| postfixLength = fromPostfix.length(); | |||||
| } | |||||
| /** | |||||
| * Sets the "to" pattern. Required. | |||||
| */ | |||||
| public void setTo(String to) { | |||||
| int index = to.lastIndexOf("*"); | |||||
| if (index == -1) { | |||||
| toPrefix = to; | |||||
| toPostfix = ""; | |||||
| } else { | |||||
| toPrefix = to.substring(0, index); | |||||
| toPostfix = to.substring(index+1); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Returns null if the source file name doesn't match the | |||||
| * "from" pattern, an one-element array containing the | |||||
| * translated file otherwise. | |||||
| */ | |||||
| public String[] mapFileName(String sourceFileName) { | |||||
| if (fromPrefix == null | |||||
| || !sourceFileName.startsWith(fromPrefix) | |||||
| || !sourceFileName.endsWith(fromPostfix)) { | |||||
| return null; | |||||
| } | |||||
| return new String[] {toPrefix | |||||
| + extractVariablePart(sourceFileName) | |||||
| + toPostfix}; | |||||
| } | |||||
| /** | |||||
| * Returns the part of the given string that matches the * in the | |||||
| * "from" pattern. | |||||
| */ | |||||
| protected String extractVariablePart(String name) { | |||||
| return name.substring(prefixLength, | |||||
| name.length() - postfixLength); | |||||
| } | |||||
| } | |||||
| @@ -160,7 +160,7 @@ public class SourceFileScanner { | |||||
| * absolute). | * absolute). | ||||
| */ | */ | ||||
| public File[] restrictAsFiles(String[] files, File srcDir, File destDir, | public File[] restrictAsFiles(String[] files, File srcDir, File destDir, | ||||
| FileNameMapper mapper) { | |||||
| FileNameMapper mapper) { | |||||
| String[] res = restrict(files, srcDir, destDir, mapper); | String[] res = restrict(files, srcDir, destDir, mapper); | ||||
| File[] result = new File[res.length]; | File[] result = new File[res.length]; | ||||
| for (int i=0; i<res.length; i++) { | for (int i=0; i<res.length; i++) { | ||||
| @@ -63,7 +63,7 @@ import junit.framework.TestSuite; | |||||
| /** | /** | ||||
| * Very limited test class for Project. Waiting to be extended. | * Very limited test class for Project. Waiting to be extended. | ||||
| * | * | ||||
| * @author Stefan Bodewig <a href="mailto:stefan.bodewig@megabit.net">stefan.bodewig@megabit.net</a> | |||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
| */ | */ | ||||
| public class ProjectTest extends TestCase { | public class ProjectTest extends TestCase { | ||||
| @@ -0,0 +1,137 @@ | |||||
| /* | |||||
| * 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", "Tomcat", 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.util; | |||||
| import junit.framework.Test; | |||||
| import junit.framework.TestCase; | |||||
| import junit.framework.TestSuite; | |||||
| /** | |||||
| * Tests for org.apache.tools.ant.util;GlobPatternMapper. | |||||
| * | |||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
| */ | |||||
| public class GlobPatternMapperTest extends TestCase { | |||||
| public GlobPatternMapperTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void testNoPatternAtAll() { | |||||
| GlobPatternMapper m = new GlobPatternMapper(); | |||||
| m.setFrom("foobar"); | |||||
| m.setTo("baz"); | |||||
| assertNull("Shouldn\'t match foobar", m.mapFileName("plonk")); | |||||
| String[] result = m.mapFileName("foobar"); | |||||
| assertNotNull("Should match foobar", result); | |||||
| assertEquals("only one result for foobar", 1, result.length); | |||||
| assertEquals("baz", result[0]); | |||||
| } | |||||
| public void testPostfixOnly() { | |||||
| GlobPatternMapper m = new GlobPatternMapper(); | |||||
| m.setFrom("*foo"); | |||||
| m.setTo("*plonk"); | |||||
| assertNull("Shouldn\'t match *foo", m.mapFileName("bar.baz")); | |||||
| String[] result = m.mapFileName("bar.foo"); | |||||
| assertNotNull("Should match *.foo", result); | |||||
| assertEquals("only one result for bar.foo", 1, result.length); | |||||
| assertEquals("bar.plonk", result[0]); | |||||
| // Try a silly case | |||||
| m.setTo("foo*"); | |||||
| result = m.mapFileName("bar.foo"); | |||||
| assertEquals("foobar.", result[0]); | |||||
| } | |||||
| public void testPrefixOnly() { | |||||
| GlobPatternMapper m = new GlobPatternMapper(); | |||||
| m.setFrom("foo*"); | |||||
| m.setTo("plonk*"); | |||||
| assertNull("Shouldn\'t match foo*", m.mapFileName("bar.baz")); | |||||
| String[] result = m.mapFileName("foo.bar"); | |||||
| assertNotNull("Should match foo*", result); | |||||
| assertEquals("only one result for foo.bar", 1, result.length); | |||||
| assertEquals("plonk.bar", result[0]); | |||||
| // Try a silly case | |||||
| m.setTo("*foo"); | |||||
| result = m.mapFileName("foo.bar"); | |||||
| assertEquals(".barfoo", result[0]); | |||||
| } | |||||
| public void testPreAndPostfix() { | |||||
| GlobPatternMapper m = new GlobPatternMapper(); | |||||
| m.setFrom("foo*bar"); | |||||
| m.setTo("plonk*pling"); | |||||
| assertNull("Shouldn\'t match foo*bar", m.mapFileName("bar.baz")); | |||||
| String[] result = m.mapFileName("foo.bar"); | |||||
| assertNotNull("Should match foo*bar", result); | |||||
| assertEquals("only one result for foo.bar", 1, result.length); | |||||
| assertEquals("plonk.pling", result[0]); | |||||
| // and a little longer | |||||
| result = m.mapFileName("foo.baz.bar"); | |||||
| assertNotNull("Should match foo*bar", result); | |||||
| assertEquals("only one result for foo.baz.bar", 1, result.length); | |||||
| assertEquals("plonk.baz.pling", result[0]); | |||||
| // and a little shorter | |||||
| result = m.mapFileName("foobar"); | |||||
| assertNotNull("Should match foo*bar", result); | |||||
| assertEquals("only one result for foobar", 1, result.length); | |||||
| assertEquals("plonkpling", result[0]); | |||||
| } | |||||
| } | |||||