/*
 * Copyright 1999,2004 The Apache Software Foundation.
 * 
 * Licensed 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.
 */

package org.apache.log4j.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.util.zip.GZIPInputStream;
import java.io.*;


public class Compare {
  static final int B1_NULL = -1;
  static final int B2_NULL = -2;

  public static boolean compare(String file1, String file2)
    throws IOException {
    BufferedReader in1 = new BufferedReader(new FileReader(file1));
    InputStream is = Compare.class.getResourceAsStream("/" + file2);
    if (is == null) {
        is = new FileInputStream(file2);
    }
    BufferedReader in2 = new BufferedReader(new InputStreamReader(is));
    try {
      return compare(file1, file2, in1, in2);
    } finally {
      in1.close();
      in2.close();
    }
  }
    
 public static boolean compare(String file1, String file2, BufferedReader in1, BufferedReader in2) throws 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 = 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);
    }
    in1.close();
  }
  
    public static boolean gzCompare(String file1, String file2)
      throws FileNotFoundException, IOException {
      BufferedReader in1 = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(file1))));      
      BufferedReader in2 = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(file2))));
      try {
        return gzCompare(file1, file2, in1, in2);
      } finally {
        in1.close();
        in2.close();
      }
    }
      
    public static boolean gzCompare(String file1, String file2, BufferedReader in1, BufferedReader in2) throws 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;
    }
}
