/* * $Id: Compare.java,v 1.5 2003/03/07 10:09:30 jeremias Exp $ * ============================================================================ * The Apache Software License, Version 1.1 * ============================================================================ * * Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without modifica- * tion, 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 acknowledgment: "This product includes software * developed by the Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. * * 4. The names "FOP" 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 name, without prior written permission of the * Apache Software Foundation. * * 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 (INCLU- * DING, 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 and was originally created by * James Tauber . For more information on the Apache * Software Foundation, please see . */ package org.apache.fop.tools.anttasks; import java.util.Date; import java.util.List; import java.util.StringTokenizer; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import org.apache.tools.ant.BuildException; import java.text.DateFormat; /** * This class is an extension of Ant, a script utility from * http://ant.apache.org. * It provides methods to compare two files. */ public class Compare { private static final boolean IDENTICAL_FILES = true; private static final boolean NOTIDENTICAL_FILES = false; private String referenceDirectory, testDirectory; private String[] filenameList; private String filenames; private BufferedInputStream oldfileInput; private BufferedInputStream newfileInput; /** * Sets directory for test files. * @param testDirectory the test directory */ public void setTestDirectory(String testDirectory) { if (!(testDirectory.endsWith("/") | testDirectory.endsWith("\\"))) { testDirectory += File.separator; } this.testDirectory = testDirectory; } /** * Sets directory for reference files. * @param referenceDirectory the reference directory */ public void setReferenceDirectory(String referenceDirectory) { if (!(referenceDirectory.endsWith("/") | referenceDirectory.endsWith("\\"))) { referenceDirectory += File.separator; } this.referenceDirectory = referenceDirectory; } /** * Sets the comma-separated list of files to process. * @param filenames list of files, comma-separated */ public void setFilenames(String filenames) { StringTokenizer tokens = new StringTokenizer(filenames, ","); List filenameListTmp = new java.util.ArrayList(20); while (tokens.hasMoreTokens()) { filenameListTmp.add(tokens.nextToken()); } filenameList = new String[filenameListTmp.size()]; filenameList = (String[])filenameListTmp.toArray(new String[0]); } private boolean compareBytes(File oldFile, File newFile) { try { oldfileInput = new BufferedInputStream(new java.io.FileInputStream(oldFile)); newfileInput = new BufferedInputStream(new java.io.FileInputStream(newFile)); int charactO = 0; int charactN = 0; boolean identical = true; while (identical & (charactO != -1)) { if (charactO == charactN) { charactO = oldfileInput.read(); charactN = newfileInput.read(); } else { return NOTIDENTICAL_FILES; } } return IDENTICAL_FILES; } catch (IOException io) { System.err.println("Task Compare - Error: \n" + io.toString()); } return NOTIDENTICAL_FILES; } private boolean compareFileSize(File oldFile, File newFile) { if (oldFile.length() != newFile.length()) { return NOTIDENTICAL_FILES; } else { return IDENTICAL_FILES; } } // end: compareBytes private boolean filesExist(File oldFile, File newFile) { if (!oldFile.exists()) { System.err.println("Task Compare - ERROR: File " + referenceDirectory + oldFile.getName() + " doesn't exist!"); return false; } else if (!newFile.exists()) { System.err.println("Task Compare - ERROR: File " + testDirectory + newFile.getName() + " doesn't exist!"); return false; } else { return true; } } private void writeHeader(PrintWriter results) { String dateTime = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date()); results.println("Test Results\n"); results.println("

Compare Results
"); results.println("created " + dateTime + "

"); results.println("" + "" + "" + ""); } /** * Main method of task compare * @throws BuildException If the execution fails. */ public void execute() throws BuildException { boolean identical = false; File oldFile; File newFile; try { PrintWriter results = new PrintWriter(new java.io.FileWriter("results.html"), true); this.writeHeader(results); for (int i = 0; i < filenameList.length; i++) { oldFile = new File(referenceDirectory + filenameList[i]); newFile = new File(testDirectory + filenameList[i]); if (filesExist(oldFile, newFile)) { identical = compareFileSize(oldFile, newFile); if (identical) { identical = compareBytes(oldFile, newFile); } if (!identical) { System.out.println("Task Compare: \nFiles " + referenceDirectory + oldFile.getName() + " - " + testDirectory + newFile.getName() + " are *not* identical."); results.println(""); } else { results.println(""); } } } results.println("
reference filetest fileidentical?
" + oldFile.getName() + " " + newFile.getName() + "" + " No
" + oldFile.getName() + " " + newFile.getName() + "" + " Yes
"); } catch (IOException ioe) { System.err.println("ERROR: " + ioe); } } // end: execute() }