View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.log4j.util;
19  
20  import java.io.BufferedReader;
21  import java.io.File;
22  import java.io.FileInputStream;
23  import java.io.FileNotFoundException;
24  import java.io.FileReader;
25  import java.io.IOException;
26  import java.io.InputStream;
27  import java.io.InputStreamReader;
28  import java.util.zip.GZIPInputStream;
29  
30  
31  public class Compare {
32    static final int B1_NULL = -1;
33    static final int B2_NULL = -2;
34  
35    private static final InputStream open(
36            final Class testClass,
37            final String fileName) throws IOException {
38        String resourceName = fileName;
39        if (fileName.startsWith("witness/")) {
40            resourceName = fileName.substring(fileName.lastIndexOf('/') + 1);
41        }
42        InputStream is = testClass.getResourceAsStream(resourceName);
43        if (is == null) {
44            File file = new File(fileName);
45            if (file.exists()) {
46                is = new FileInputStream(file);
47            } else {
48                throw new FileNotFoundException("Resource "
49                        + resourceName + " not found");
50            }
51        }
52        return is;
53    }
54  
55    public static boolean compare(Class testClass,
56                                  final String file1,
57                                  final String file2)
58      throws IOException {
59      BufferedReader in1 = new BufferedReader(new FileReader(file1));
60      BufferedReader in2 = new BufferedReader(new InputStreamReader(
61              open(testClass, file2)));
62      try {
63        return compare(testClass, file1, file2, in1, in2);
64      } finally {
65        in1.close();
66        in2.close();
67      }
68    }
69      
70   public static boolean compare(
71           Class testClass, String file1, String file2, BufferedReader in1, BufferedReader in2) throws IOException {
72  
73      String s1;
74      int lineCounter = 0;
75  
76      while ((s1 = in1.readLine()) != null) {
77        lineCounter++;
78  
79        String s2 = in2.readLine();
80  
81        if (!s1.equals(s2)) {
82          System.out.println(
83            "Files [" + file1 + "] and [" + file2 + "] differ on line "
84            + lineCounter);
85          System.out.println("One reads:  [" + s1 + "].");
86          System.out.println("Other reads:[" + s2 + "].");
87          outputFile(testClass, file1);
88          outputFile(testClass, file2);
89  
90          return false;
91        }
92      }
93  
94      // the second file is longer
95      if (in2.read() != -1) {
96        System.out.println(
97          "File [" + file2 + "] longer than file [" + file1 + "].");
98        outputFile(testClass, file1);
99        outputFile(testClass, file2);
100 
101       return false;
102     }
103 
104     return true;
105   }
106 
107   /** 
108    * 
109    * Prints file on the console.
110    *
111    */
112   private static void outputFile(Class testClass, String file)
113     throws IOException {
114     InputStream is = open(testClass, file);
115     BufferedReader in1 = new BufferedReader(new InputStreamReader(is));
116 
117     String s1;
118     int lineCounter = 0;
119     System.out.println("--------------------------------");
120     System.out.println("Contents of " + file + ":");
121 
122     while ((s1 = in1.readLine()) != null) {
123       lineCounter++;
124       System.out.print(lineCounter);
125 
126       if (lineCounter < 10) {
127         System.out.print("   : ");
128       } else if (lineCounter < 100) {
129         System.out.print("  : ");
130       } else if (lineCounter < 1000) {
131         System.out.print(" : ");
132       } else {
133         System.out.print(": ");
134       }
135 
136       System.out.println(s1);
137     }
138     in1.close();
139   }
140 
141 
142     public static boolean gzCompare(final Class testClass,
143                                     final String actual,
144                                     final String expected)
145       throws FileNotFoundException, IOException {
146       String resourceName = expected;
147       int lastSlash = expected.lastIndexOf("/");
148       if (lastSlash >= 0) {
149           resourceName = expected.substring(lastSlash + 1);
150       }
151       InputStream resourceStream = testClass.getResourceAsStream(resourceName);
152       if (resourceStream == null) {
153           throw new FileNotFoundException("Could not locate resource " + resourceName);
154       }
155 
156       BufferedReader in1 = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(actual))));
157       BufferedReader in2 = new BufferedReader(new InputStreamReader(new GZIPInputStream(resourceStream)));
158       try {
159         return gzCompare(testClass, actual, expected, in1, in2);
160       } finally {
161         in1.close();
162         in2.close();
163       }
164     }
165 
166     public static boolean gzCompare(Class testClass, String file1, String file2, BufferedReader in1, BufferedReader in2) throws IOException {
167 
168       String s1;
169       int lineCounter = 0;
170 
171       while ((s1 = in1.readLine()) != null) {
172         lineCounter++;
173 
174         String s2 = in2.readLine();
175 
176         if (!s1.equals(s2)) {
177           System.out.println(
178             "Files [" + file1 + "] and [" + file2 + "] differ on line "
179             + lineCounter);
180           System.out.println("One reads:  [" + s1 + "].");
181           System.out.println("Other reads:[" + s2 + "].");
182           outputFile(testClass, file1);
183           outputFile(testClass, file2);
184 
185           return false;
186         }
187       }
188 
189       // the second file is longer
190       if (in2.read() != -1) {
191         System.out.println(
192           "File [" + file2 + "] longer than file [" + file1 + "].");
193         outputFile(testClass, file1);
194         outputFile(testClass, file2);
195 
196         return false;
197       }
198 
199       return true;
200     }
201 
202 }