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]); | |||||
} | |||||
} |