stevel 2004/04/22 07:03:47 Modified: src/testcases/org/apache/tools/ant/util FileUtilsTest.java src/main/org/apache/tools/ant/util FileUtils.java src/main/org/apache/tools/ant/taskdefs SignJar.java src/main/org/apache/tools/ant Project.java Log: A new uptodate test that includes granularity. the intent is to move all date tests to this single place, to eliminate inconsistencies. The only place I use it is signjar, which, by virtue of the fact there is no signjar test, means I know it wont break the tests. Also, cleaned up the reflection hacks for 1.1. Revision Changes Path 1.27 +19 -21 ant/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java Index: FileUtilsTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/util/FileUtilsTest.java,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- FileUtilsTest.java 9 Mar 2004 16:49:07 -0000 1.26 +++ FileUtilsTest.java 22 Apr 2004 14:03:46 -0000 1.27 @@ -50,6 +50,16 @@ } } + /** + * test modification. + * Since Ant1.7, the method being tested no longer uses + * reflection to provide backwards support to Java1.1, so this + * test is not so critical. But it does explore file system + * behaviour and will help catch any regression in Java itself, + * so is worth retaining. + * @see FileUtils#setFileLastModified(java.io.File, long) + * @throws IOException + */ public void testSetLastModified() throws IOException { removeThis = new File("dummy"); FileOutputStream fos = new FileOutputStream(removeThis); @@ -64,20 +74,14 @@ * granularity (should be > 2s to account for Windows FAT). */ try { - Thread.currentThread().sleep(5000); + Thread.sleep(5000); } catch (InterruptedException ie) { fail(ie.getMessage()); } fu.setFileLastModified(removeThis, -1); long secondModTime = removeThis.lastModified(); - try { - Class.forName("java.lang.ThreadLocal"); - assertTrue(secondModTime > modTime); - } catch (ClassNotFoundException e) { - // JDK 1.1 - assertEquals(modTime, secondModTime); - } + assertTrue(secondModTime > modTime); // number of milliseconds in a day @@ -87,19 +91,13 @@ // it did not work on a computer running JDK 1.4.1_02 + Windows 2000 fu.setFileLastModified(removeThis, secondModTime + millisperday); long thirdModTime = removeThis.lastModified(); - try { - Class.forName("java.lang.ThreadLocal"); - /* - * I would love to compare this with 123456, but depending on - * the filesystems granularity it can take an arbitrary value. - * - * Just assert the time has changed. - */ - assertTrue(thirdModTime != secondModTime); - } catch (ClassNotFoundException e) { - // JDK 1.1 - assertEquals(modTime, thirdModTime); - } + /* + * I would love to compare this with 123456, but depending on + * the filesystems granularity it can take an arbitrary value. + * + * Just assert the time has changed. + */ + assertTrue(thirdModTime != secondModTime); } public void testResolveFile() { 1.68 +46 -48 ant/src/main/org/apache/tools/ant/util/FileUtils.java Index: FileUtils.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/FileUtils.java,v retrieving revision 1.67 retrieving revision 1.68 diff -u -r1.67 -r1.68 --- FileUtils.java 21 Apr 2004 07:12:29 -0000 1.67 +++ FileUtils.java 22 Apr 2004 14:03:46 -0000 1.68 @@ -57,9 +57,9 @@ */ public class FileUtils { - private static Random rand = new Random(System.currentTimeMillis()); - private static Object lockReflection = new Object(); - private static java.lang.reflect.Method setLastModified = null; + //get some non-crypto-grade randomness from various places. + private static Random rand = new Random(System.currentTimeMillis() + +Runtime.getRuntime().freeMemory()); private boolean onNetWare = Os.isFamily("netware"); @@ -78,6 +78,7 @@ */ public static final long UNIX_FILE_TIMESTAMP_GRANULARITY = 1000; + // stolen from FilePathToURI of the Xerces-J team static { for (int i = 0; i <= 0x20; i++) { @@ -648,65 +649,27 @@ } if (preserveLastModified) { - setFileLastModified(destFile, sourceFile.lastModified()); + destFile.setLastModified(sourceFile.lastModified()); } } } - /** - * see whether we have a setLastModified method in File and return it. - * - * @return a method to setLastModified. - */ - protected final Method getSetLastModified() { - if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) { - return null; - } - synchronized (lockReflection) { - if (setLastModified == null) { - try { - setLastModified = - java.io.File.class.getMethod("setLastModified", - new Class[] {Long.TYPE}); - } catch (NoSuchMethodException nse) { - throw new BuildException("File.setlastModified not in JDK > 1.1?", - nse); - } - } - } - return setLastModified; - } /** - * Calls File.setLastModified(long time) in a Java 1.1 compatible way. + * Calls File.setLastModified(long time). Originally written to + * to dynamically bind to that call on Java1.2+. * * @param file the file whose modified time is to be set * @param time the time to which the last modified time is to be set. - * + * if this is -1, the current time is used. * @throws BuildException if the time cannot be set. */ public void setFileLastModified(File file, long time) throws BuildException { - if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) { - return; - } - Long[] times = new Long[1]; if (time < 0) { - times[0] = new Long(System.currentTimeMillis()); - } else { - times[0] = new Long(time); - } - - try { - getSetLastModified().invoke(file, times); - } catch (java.lang.reflect.InvocationTargetException ite) { - Throwable nested = ite.getTargetException(); - throw new BuildException("Exception setting the modification time " - + "of " + file, nested); - } catch (Throwable other) { - throw new BuildException("Exception setting the modification time " - + "of " + file, other); + time=System.currentTimeMillis(); } + file.setLastModified(time); } /** @@ -1357,5 +1320,40 @@ return UNIX_FILE_TIMESTAMP_GRANULARITY; } } + + /** + * Returns true if the source is older than the dest. + * If the dest file does not exist, then the test returns false; it is + * implicitly not up do date. + * @param source source file (should be the older) + * @param dest dest file (should be the newer) + * @param granularity: an offset added to the source time. + * @return true if the source is older than the dest, taking the + * granularity into account + * @since Ant1.7 + */ + public boolean isUpToDate(File source,File dest,long granularity) { + //do a check for the destination file existing + if(!dest.exists()) { + //if it does not, then the file is not up to date. + return false; + } + long sourceTime=source.lastModified(); + long destTime=dest.lastModified(); + return destTime>=sourceTime+granularity; + } + + /** + * returns true if the source is older than the dest + * @param source source file (should be the older) + * @param dest dest file (should be the newer) + * @return true if the source is older than the dest, taking the granularity into account + * @since Ant1.7 + */ + public boolean isUpToDate(File source, File dest) { + return isUpToDate(source, dest, getFileTimestampGranularity()); + } + + } 1.36 +8 -1 ant/src/main/org/apache/tools/ant/taskdefs/SignJar.java Index: SignJar.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/SignJar.java,v retrieving revision 1.35 retrieving revision 1.36 diff -u -r1.35 -r1.36 --- SignJar.java 9 Mar 2004 16:48:06 -0000 1.35 +++ SignJar.java 22 Apr 2004 14:03:47 -0000 1.36 @@ -28,6 +28,7 @@ import org.apache.tools.ant.Task; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.util.JavaEnvUtils; +import org.apache.tools.ant.util.FileUtils; /** * Signs jar or zip files with the javasign command line tool. The @@ -321,7 +322,7 @@ if (jarFile.equals(signedjarFile)) { return false; } - if (signedjarFile.lastModified() > jarFile.lastModified()) { + if (FileUtils.newFileUtils().isUpToDate(jarFile,signedjarFile)) { return true; } } else { @@ -333,6 +334,12 @@ return false; } + /** + * test for a file being signed, by looking for a signature in the META-INF + * directory + * @param file + * @return + */ protected boolean isSigned(File file) { final String SIG_START = "META-INF/"; final String SIG_END = ".SF"; 1.166 +1 -6 ant/src/main/org/apache/tools/ant/Project.java Index: Project.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Project.java,v retrieving revision 1.165 retrieving revision 1.166 diff -u -r1.165 -r1.166 --- Project.java 22 Mar 2004 15:54:52 -0000 1.165 +++ Project.java 22 Apr 2004 14:03:47 -0000 1.166 @@ -1531,11 +1531,6 @@ */ public void setFileLastModified(File file, long time) throws BuildException { - if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) { - log("Cannot change the modification time of " + file - + " in JDK 1.1", Project.MSG_WARN); - return; - } fileUtils.setFileLastModified(file, time); log("Setting modification time for " + file, MSG_VERBOSE); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]