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.Project; | |||
import org.apache.tools.ant.types.*; | |||
import org.apache.tools.ant.util.*; | |||
import java.lang.reflect.Method; | |||
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 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 { | |||
@@ -114,7 +116,7 @@ public class Javac extends MatchingTask { | |||
private Path extdirs; | |||
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 | |||
@@ -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" | |||
+ (compileList.size() == 1 ? "" : "s") | |||
+ (compileList.length == 1 ? "" : "s") | |||
+ (destDir != null ? " to " + destDir : "")); | |||
if (compiler.equalsIgnoreCase("classic")) { | |||
@@ -347,7 +349,7 @@ public class Javac extends MatchingTask { | |||
* Clear the list of files to be compiled and copied.. | |||
*/ | |||
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[]) { | |||
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 | |||
@@ -619,16 +599,15 @@ public class Javac extends MatchingTask { | |||
Project.MSG_VERBOSE); | |||
StringBuffer niceSourceList = new StringBuffer("File"); | |||
if (compileList.size() != 1) { | |||
if (compileList.length != 1) { | |||
niceSourceList.append("s"); | |||
} | |||
niceSourceList.append(" to be compiled:"); | |||
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); | |||
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). | |||
*/ | |||
public File[] restrictAsFiles(String[] files, File srcDir, File destDir, | |||
FileNameMapper mapper) { | |||
FileNameMapper mapper) { | |||
String[] res = restrict(files, srcDir, destDir, mapper); | |||
File[] result = new File[res.length]; | |||
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. | |||
* | |||
* @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 { | |||
@@ -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]); | |||
} | |||
} |