/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2015, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.core.util; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.zip.GZIPInputStream; import java.util.zip.ZipInputStream; public class Compare { static final int B1_NULL = -1; static final int B2_NULL = -2; public static boolean compare(String file1, String file2) throws FileNotFoundException, IOException { if (file1.endsWith(".gz")) { return gzFileCompare(file1, file2); } else if (file1.endsWith(".zip")) { return zipFileCompare(file1, file2); } else { return regularFileCompare(file1, file2); } } static BufferedReader gzFileToBufferedReader(String file) throws IOException { FileInputStream fis = new FileInputStream(file); GZIPInputStream gzis = new GZIPInputStream(fis); return new BufferedReader(new InputStreamReader(gzis)); } static BufferedReader zipFileToBufferedReader(String file) throws IOException { FileInputStream fis = new FileInputStream(file); ZipInputStream zis = new ZipInputStream(fis); zis.getNextEntry(); return new BufferedReader(new InputStreamReader(zis)); } public static boolean gzFileCompare(String file1, String file2) throws IOException { BufferedReader in1 = gzFileToBufferedReader(file1); BufferedReader in2 = gzFileToBufferedReader(file2); return bufferCompare(in1, in2, file1, file2); } public static boolean zipFileCompare(String file1, String file2) throws IOException { BufferedReader in1 = zipFileToBufferedReader(file1); BufferedReader in2 = zipFileToBufferedReader(file2); return bufferCompare(in1, in2, file1, file2); } public static boolean regularFileCompare(String file1, String file2) throws FileNotFoundException, IOException { BufferedReader in1 = new BufferedReader(new FileReader(file1)); BufferedReader in2 = new BufferedReader(new FileReader(file2)); return bufferCompare(in1, in2, file1, file2); } public static boolean bufferCompare(BufferedReader in1, BufferedReader in2, String file1, String file2) throws FileNotFoundException, IOException { String s1; int lineCounter = 0; while ((s1 = in1.readLine()) != null) { lineCounter++; String s2 = in2.readLine(); if (!s1.equals(s2)) { System.out.println("Files [" + file1 + "] and [" + file2 + "] differ on line " + lineCounter); System.out.println("One reads: [" + s1 + "]."); System.out.println("Other reads:[" + s2 + "]."); outputFile(file1); outputFile(file2); return false; } } // the second file is longer if (in2.read() != -1) { System.out.println("File [" + file2 + "] longer than file [" + file1 + "]."); outputFile(file1); outputFile(file2); return false; } return true; } /** * * Prints file on the console. * */ private static void outputFile(String file) throws FileNotFoundException, IOException { BufferedReader in1 = null; try { in1 = new BufferedReader(new FileReader(file)); String s1; int lineCounter = 0; System.out.println("--------------------------------"); System.out.println("Contents of " + file + ":"); while ((s1 = in1.readLine()) != null) { lineCounter++; System.out.print(lineCounter); if (lineCounter < 10) { System.out.print(" : "); } else if (lineCounter < 100) { System.out.print(" : "); } else if (lineCounter < 1000) { System.out.print(" : "); } else { System.out.print(": "); } System.out.println(s1); } } finally { close(in1); } } public static boolean gzCompare(String file1, String file2) throws FileNotFoundException, IOException { BufferedReader in1 = null; BufferedReader in2 = null; try { in1 = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(file1)))); in2 = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(file2)))); String s1; int lineCounter = 0; while ((s1 = in1.readLine()) != null) { lineCounter++; String s2 = in2.readLine(); if (!s1.equals(s2)) { System.out.println("Files [" + file1 + "] and [" + file2 + "] differ on line " + lineCounter); System.out.println("One reads: [" + s1 + "]."); System.out.println("Other reads:[" + s2 + "]."); outputFile(file1); outputFile(file2); return false; } } // the second file is longer if (in2.read() != -1) { System.out.println("File [" + file2 + "] longer than file [" + file1 + "]."); outputFile(file1); outputFile(file2); return false; } return true; } finally { close(in1); close(in2); } } static void close(Reader r) { if (r != null) try { r.close(); } catch (IOException e) { } } }