bodewig 2004/09/08 07:29:17 Modified: src/etc/testcases/taskdefs checksum.xml src/etc/testcases/taskdefs/expected asf-logo.gif.md5 src/main/org/apache/tools/ant/taskdefs Checksum.java src/testcases/org/apache/tools/ant/taskdefs ChecksumTest.java Added: src/etc/testcases/taskdefs/expected asf-logo.gif.md5sum asf-logo.gif.pattern asf-logo.gif.svf Log: Support different output formats in checksum, PR 16539, based on a patch by Mark R. Diggory Revision Changes Path 1.7 +28 -1 ant/src/etc/testcases/taskdefs/checksum.xml Index: checksum.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/checksum.xml,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- checksum.xml 18 Dec 2003 08:39:06 -0000 1.6 +++ checksum.xml 8 Sep 2004 14:29:16 -0000 1.7 @@ -4,7 +4,11 @@ <target name="cleanup"> <delete file="../asf-logo.gif.MD5" /> <delete file="../asf-logo.gif.md5" /> - <delete> + <delete file="../asf-logo.gif.MD5SUM" /> + <delete file="../asf-logo.gif.md5sum" /> + <delete file="../asf-logo.gif.SVF" /> + <delete file="../asf-logo.gif.svf" /> + <delete> <fileset dir="checksum"> <include name="**/*.MD5"/> </fileset> @@ -16,6 +20,18 @@ <checksum file="../asf-logo.gif" fileext=".MD5" /> </target> + <target name="createMD5SUMformat"> + <checksum file="../asf-logo.gif" format="MD5SUM" fileext=".MD5SUM" /> + </target> + + <target name="createSVFformat"> + <checksum file="../asf-logo.gif" format="SVF" fileext=".SVF" /> + </target> + + <target name="createPattern"> + <checksum file="../asf-logo.gif" pattern="foo{0}bar" fileext=".PATTERN" /> + </target> + <target name="setProperty"> <checksum file="../asf-logo.gif" property="logo.MD5" /> </target> @@ -29,6 +45,17 @@ overwrite="true" /> <checksum file="../asf-logo.gif" fileext=".MD5" verifyproperty="no.logo.MD5" /> + </target> + + <target name="verifyMD5SUMAsTask"> + <copy file="expected/asf-logo.gif.md5sum" todir=".." /> + <checksum file="../asf-logo.gif" fileext=".md5sum" + verifyproperty="logo.MD5" format="MD5SUM"/> + + <copy file="checksum.xml" tofile="../asf-logo.gif.MD5SUM" + overwrite="true" /> + <checksum file="../asf-logo.gif" fileext=".MD5SUM" + verifyproperty="no.logo.MD5" format="MD5SUM"/> </target> <target name="verifyAsCondition"> 1.2 +1 -1 ant/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5 Index: asf-logo.gif.md5 =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- asf-logo.gif.md5 19 Nov 2001 15:18:46 -0000 1.1 +++ asf-logo.gif.md5 8 Sep 2004 14:29:16 -0000 1.2 @@ -1 +1 @@ -0541d3df42520911f268abc730f3afe0 \ No newline at end of file +0541d3df42520911f268abc730f3afe0 1.1 ant/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5sum Index: asf-logo.gif.md5sum =================================================================== 0541d3df42520911f268abc730f3afe0 *asf-logo.gif 1.1 ant/src/etc/testcases/taskdefs/expected/asf-logo.gif.pattern Index: asf-logo.gif.pattern =================================================================== foo0541d3df42520911f268abc730f3afe0bar 1.1 ant/src/etc/testcases/taskdefs/expected/asf-logo.gif.svf Index: asf-logo.gif.svf =================================================================== MD5 (asf-logo.gif) = 0541d3df42520911f268abc730f3afe0 1.40 +122 -33 ant/src/main/org/apache/tools/ant/taskdefs/Checksum.java Index: Checksum.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Checksum.java,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- Checksum.java 9 Mar 2004 16:48:04 -0000 1.39 +++ Checksum.java 8 Sep 2004 14:29:16 -0000 1.40 @@ -34,12 +34,16 @@ import java.util.Enumeration; import java.util.Set; import java.util.Arrays; +import java.text.MessageFormat; +import java.text.ParseException; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.condition.Condition; +import org.apache.tools.ant.types.EnumeratedAttribute; import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.util.StringUtils; /** * Used to create or verify file checksums. @@ -127,6 +131,11 @@ private int readBufferSize = 8 * 1024; /** + * Formater for the checksum file. + */ + private MessageFormat format = FormatElement.getDefault().getFormat(); + + /** * Sets the file for which the checksum is to be calculated. */ public void setFile(File file) { @@ -209,6 +218,26 @@ } /** + * Select the in/output pattern via a well know format name. + * + * @since 1.7.0 + */ + public void setFormat(FormatElement e) { + format = e.getFormat(); + } + + /** + * Specify the pattern to use as a MessageFormat pattern. + * + * <p>{0} gets replaced by the checksum, {1} by the filename.</p> + * + * @since 1.7.0 + */ + public void setPattern(String p) { + format = new MessageFormat(p); + } + + /** * Files to generate checksums for. */ public void addFileset(FileSet set) { @@ -223,7 +252,7 @@ boolean value = validateAndExecute(); if (verifyProperty != null) { getProject().setNewProperty(verifyProperty, - new Boolean(value).toString()); + new Boolean(value).toString()); } } @@ -246,39 +275,39 @@ if (file == null && filesets.size() == 0) { throw new BuildException( - "Specify at least one source - a file or a fileset."); + "Specify at least one source - a file or a fileset."); } if (file != null && file.exists() && file.isDirectory()) { throw new BuildException( - "Checksum cannot be generated for directories"); + "Checksum cannot be generated for directories"); } if (file != null && totalproperty != null) { throw new BuildException( - "File and Totalproperty cannot co-exist."); + "File and Totalproperty cannot co-exist."); } if (property != null && fileext != null) { throw new BuildException( - "Property and FileExt cannot co-exist."); + "Property and FileExt cannot co-exist."); } if (property != null) { if (forceOverwrite) { throw new BuildException( - "ForceOverwrite cannot be used when Property is specified"); + "ForceOverwrite cannot be used when Property is specified"); } if (file != null) { if (filesets.size() > 0) { throw new BuildException("Multiple files cannot be used " - + "when Property is specified"); + + "when Property is specified"); } } else { if (filesets.size() > 1) { throw new BuildException("Multiple files cannot be used " - + "when Property is specified"); + + "when Property is specified"); } } } @@ -289,12 +318,12 @@ if (verifyProperty != null && forceOverwrite) { throw new BuildException( - "VerifyProperty and ForceOverwrite cannot co-exist."); + "VerifyProperty and ForceOverwrite cannot co-exist."); } if (isCondition && forceOverwrite) { throw new BuildException("ForceOverwrite cannot be used when " - + "conditions are being used."); + + "conditions are being used."); } messageDigest = null; @@ -323,7 +352,7 @@ fileext = "." + algorithm; } else if (fileext.trim().length() == 0) { throw new BuildException( - "File extension when specified must not be an empty string"); + "File extension when specified must not be an empty string"); } try { @@ -371,15 +400,7 @@ Project.MSG_VERBOSE); if (totalproperty != null) { // Read the checksum from disk. - String checksum = null; - try { - BufferedReader diskChecksumReader - = new BufferedReader(new FileReader(checksumFile)); - checksum = diskChecksumReader.readLine(); - } catch (IOException e) { - throw new BuildException("Couldn't read checksum file " - + checksumFile, e); - } + String checksum = readChecksum(checksumFile); byte[] digest = decodeHex(checksum.toCharArray()); allDigests.put(file, digest); } @@ -389,8 +410,8 @@ } } else { String message = "Could not find file " - + file.getAbsolutePath() - + " to generate checksum for."; + + file.getAbsolutePath() + + " to generate checksum for."; log(message); throw new BuildException(message, getLocation()); } @@ -457,23 +478,26 @@ if (isCondition) { File existingFile = (File) destination; if (existingFile.exists()) { - fis = new FileInputStream(existingFile); - InputStreamReader isr = new InputStreamReader(fis); - BufferedReader br = new BufferedReader(isr); - String suppliedChecksum = br.readLine(); - fis.close(); - fis = null; - br.close(); - isr.close(); - checksumMatches = checksumMatches - && checksum.equals(suppliedChecksum); + try { + String suppliedChecksum = + readChecksum(existingFile); + checksumMatches = checksumMatches + && checksum.equals(suppliedChecksum); + } catch (BuildException be) { + // file is on wrong format, swallow + checksumMatches = false; + } } else { checksumMatches = false; } } else { File dest = (File) destination; fos = new FileOutputStream(dest); - fos.write(checksum.getBytes()); + fos.write(format.format(new Object[] { + checksum, + src.getName(), + }).getBytes()); + fos.write(StringUtils.LINE_SEP.getBytes()); fos.close(); fos = null; } @@ -561,5 +585,70 @@ } return out; + } + + /** + * reads the checksum from a file using the specified format. + * + * @since 1.7 + */ + private String readChecksum(File f) { + BufferedReader diskChecksumReader = null; + try { + diskChecksumReader = new BufferedReader(new FileReader(f)); + Object[] result = format.parse(diskChecksumReader.readLine()); + if (result == null || result.length == 0 || result[0] == null) { + throw new BuildException("failed to find a checksum"); + } + return (String) result[0]; + } catch (IOException e) { + throw new BuildException("Couldn't read checksum file " + f, e); + } catch (ParseException e) { + throw new BuildException("Couldn't read checksum file " + f, e); + } finally { + if (diskChecksumReader != null) { + try { + diskChecksumReader.close(); + } catch (IOException e) { + // ignore + } + } + } + } + + /** + * Helper class for the format attribute. + * + * @since 1.7 + */ + public static class FormatElement extends EnumeratedAttribute { + private static HashMap formatMap = new HashMap(); + private static final String CHECKSUM = "CHECKSUM"; + private static final String MD5SUM = "MD5SUM"; + private static final String SVF = "SVF"; + + static { + formatMap.put(CHECKSUM, new MessageFormat("{0}")); + formatMap.put(MD5SUM, new MessageFormat("{0} *{1}")); + formatMap.put(SVF, new MessageFormat("MD5 ({1}) = {0}")); + } + + public FormatElement() { + super(); + } + + public static FormatElement getDefault() { + FormatElement e = new FormatElement(); + e.setValue(CHECKSUM); + return e; + } + + public MessageFormat getFormat() { + return (MessageFormat) formatMap.get(getValue()); + } + + public String[] getValues() { + return new String[] {CHECKSUM, MD5SUM, SVF}; + } } } 1.12 +28 -1 ant/src/testcases/org/apache/tools/ant/taskdefs/ChecksumTest.java Index: ChecksumTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/ChecksumTest.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- ChecksumTest.java 9 Mar 2004 16:48:57 -0000 1.11 +++ ChecksumTest.java 8 Sep 2004 14:29:16 -0000 1.12 @@ -47,6 +47,27 @@ project.resolveFile("../asf-logo.gif.MD5"))); } + public void testCreateMD5SUMformat() throws IOException { + FileUtils fileUtils = FileUtils.newFileUtils(); + executeTarget("createMD5SUMformat"); + assertTrue(fileUtils.contentEquals(project.resolveFile("expected/asf-logo.gif.md5sum"), + project.resolveFile("../asf-logo.gif.MD5SUM"))); + } + + public void testCreateSVFformat() throws IOException { + FileUtils fileUtils = FileUtils.newFileUtils(); + executeTarget("createSVFformat"); + assertTrue(fileUtils.contentEquals(project.resolveFile("expected/asf-logo.gif.svf"), + project.resolveFile("../asf-logo.gif.SVF"))); + } + + public void testCreatePattern() throws IOException { + FileUtils fileUtils = FileUtils.newFileUtils(); + executeTarget("createPattern"); + assertTrue(fileUtils.contentEquals(project.resolveFile("expected/asf-logo.gif.pattern"), + project.resolveFile("../asf-logo.gif.PATTERN"))); + } + public void testSetProperty() { executeTarget("setProperty"); assertEquals("0541d3df42520911f268abc730f3afe0", @@ -72,6 +93,12 @@ public void testVerifyAsTask() { testVerify("verifyAsTask"); + assertNotNull(project.getProperty("no.logo.MD5")); + assertEquals("false", project.getProperty("no.logo.MD5")); + } + + public void testVerifyMD5SUMAsTask() { + testVerify("verifyMD5SUMAsTask"); assertNotNull(project.getProperty("no.logo.MD5")); assertEquals("false", project.getProperty("no.logo.MD5")); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]