aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop/tools/anttasks/FileCompare.java
blob: 5deaa7da2a509f7389c48a62dd41c8234e151b6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* $Id$ */
 
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 FileCompare {
    
    private String referenceDirectory, testDirectory;
    private String[] filenameList;
    private String filenames;

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

    /**
     * Compares two files to see if they are equal
     * @param f1 first file to compare
     * @param f2 second file to compare
     * @return true if files are same, false otherwise
     */
    public static boolean compareFiles(File f1, File f2) throws IOException {
        return (compareFileSize(f1, f2) && compareBytes(f1, f2));
    }

    /**
     * Compare the contents of two files.
     * @param true if files are same byte-by-byte, false otherwise
     */
    private static boolean compareBytes(File file1, File file2) throws IOException {
        BufferedInputStream file1Input =
            new BufferedInputStream(new java.io.FileInputStream(file1));
        BufferedInputStream file2Input =
            new BufferedInputStream(new java.io.FileInputStream(file2));

        int charact1 = 0;
        int charact2 = 0;

        while (charact1 != -1) {
            if (charact1 == charact2) {
                charact1 = file1Input.read();
                charact2 = file2Input.read();
            } else {
                return false;
            }
        }

        return true;
    }

    /**
     * Does a file size compare of two files
     * @param true if files are same length, false otherwise
     */
    private static boolean compareFileSize(File oldFile, File newFile) {
        if (oldFile.length() != newFile.length()) {
            return false;
        } else {
            return true;
        }
    }    // 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("<html><head><title>Test Results</title></head><body>\n");
        results.println("<h2>Compare Results<br>");
        results.println("<font size='1'>created " + dateTime
                        + "</font></h2>");
        results.println("<table cellpadding='10' border='2'><thead>"
                        + "<th align='center'>reference file</th>"
                        + "<th align='center'>test file</th>"
                        + "<th align='center'>identical?</th></thead>");
    }

    /**
     * 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("<tr><td><a href='"
                                        + referenceDirectory
                                        + oldFile.getName() + "'>"
                                        + oldFile.getName()
                                        + "</a> </td><td> <a href='"
                                        + testDirectory + newFile.getName()
                                        + "'>" + newFile.getName() + "</a>"
                                        + " </td><td><font color='red'>No</font></td></tr>");
                    } else {
                        results.println("<tr><td><a href='"
                                        + referenceDirectory
                                        + oldFile.getName() + "'>"
                                        + oldFile.getName()
                                        + "</a> </td><td> <a href='"
                                        + testDirectory + newFile.getName()
                                        + "'>" + newFile.getName() + "</a>"
                                        + " </td><td>Yes</td></tr>");
                    }
                }
            }
            results.println("</table></html>");
        } catch (IOException ioe) {
            System.err.println("ERROR: " + ioe);
        }
    }    // end: execute()

}