// Path: src/main/java/org/apache/log4j/rolling/helper/FileRenameAction.java
// public final class FileRenameAction extends ActionBase {
//     /**
//      * Source.
//      */
//     private final File source;
// 
//     /**
//      * Destination.
//      */
//     private final File destination;
// 
//     /**
//      * If true, rename empty files, otherwise delete empty files.
//      */
//     private final boolean renameEmptyFiles;
// 
//     /**
//      * Creates an FileRenameAction.
//      *
//      * @param src current file name.
//      * @param dst new file name.
//      * @param renameEmptyFiles if true, rename file even if empty, otherwise delete empty files.
//      */
//     public FileRenameAction(final File src, final File dst, boolean renameEmptyFiles) {
//         source = src;
//         destination = dst;
//         this.renameEmptyFiles = renameEmptyFiles;
//     }
// 
//     /**
//      * Rename file.
//      *
//      * @return true if successfully renamed.
//      */
//     public boolean execute() {
//         return execute(source, destination, renameEmptyFiles);
//     }
// 
//     /**
//      * Rename file.
//      * @param source current file name.
//      * @param destination new file name.
//      * @param renameEmptyFiles if true, rename file even if empty, otherwise delete empty files.
//      * @return true if successfully renamed.
//      */
//     public static boolean execute(final File source, final File destination, boolean renameEmptyFiles) {
//         if (renameEmptyFiles || source.length() > 0) {
//             return source.renameTo(destination);
//         }
//         return source.delete();
//     }
// }
// 
// Path: src/main/java/org/apache/log4j/rolling/helper/GZCompressAction.java
// public final class GZCompressAction extends ActionBase {
//   /**
//    * Source file.
//    */
//   private final File source;
// 
//   /**
//    * Destination file.
//    */
//   private final File destination;
// 
//   /**
//    * If true, attempt to delete file on completion.
//    */
//   private final boolean deleteSource;
// 
// 
//   /**
//    * Create new instance of GZCompressAction.
//    *
//    * @param source file to compress, may not be null.
//    * @param destination compressed file, may not be null.
//    * @param deleteSource if true, attempt to delete file on completion.  Failure to delete
//    * does not cause an exception to be thrown or affect return value.
//    */
//   public GZCompressAction(
//     final File source, final File destination, final boolean deleteSource) {
//     if (source == null) {
//       throw new NullPointerException("source");
//     }
// 
//     if (destination == null) {
//       throw new NullPointerException("destination");
//     }
// 
//     this.source = source;
//     this.destination = destination;
//     this.deleteSource = deleteSource;
//   }
// 
//   /**
//    * Compress.
//    * @return true if successfully compressed.
//    * @throws IOException on IO exception.
//    */
//   public boolean execute() throws IOException {
//     return execute(source, destination, deleteSource);
//   }
// 
//   /**
//    * Compress a file.
//    *
//    * @param source file to compress, may not be null.
//    * @param destination compressed file, may not be null.
//    * @param deleteSource if true, attempt to delete file on completion.  Failure to delete
//    * does not cause an exception to be thrown or affect return value.
//    * @return true if source file compressed.
//    * @throws IOException on IO exception.
//    */
//   public static boolean execute(
//     final File source, final File destination, final boolean deleteSource)
//           throws IOException {
//     if (source.exists()) {
//       FileInputStream fis = new FileInputStream(source);
//       FileOutputStream fos = new FileOutputStream(destination);
//       GZIPOutputStream gzos = new GZIPOutputStream(fos);
//       byte[] inbuf = new byte[8102];
//       int n;
// 
//       while ((n = fis.read(inbuf)) != -1) {
//         gzos.write(inbuf, 0, n);
//       }
// 
//       gzos.close();
//       fis.close();
// 
//       if (deleteSource && !source.delete()) {
//           LogLog.warn("Unable to delete " + source.toString() + ".");
//       }
// 
//       return true;
//     }
// 
//     return false;
//   }
// 
// 
//     /**
//      * Capture exception.
//      *
//      * @param ex exception.
//      */
//     protected void reportException(final Exception ex) {
//          LogLog.warn("Exception during compression of '" + source.toString() + "'.", ex);
//     }
// 
// }


import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.pattern.PatternConverter;
import org.apache.log4j.rolling.helper.Action;
import org.apache.log4j.rolling.helper.FileRenameAction;
import org.apache.log4j.rolling.helper.GZCompressAction;
import org.apache.log4j.rolling.helper.ZipCompressAction;
import org.apache.log4j.helpers.LogLog;
    }

    return new RolloverDescriptionImpl(newActiveFile, append, null, null);
  }

  /**
   * {@inheritDoc}
   */
  public RolloverDescription rollover(final String currentFileName) {
    if (maxIndex >= 0) {
      int purgeStart = minIndex;

      if (!explicitActiveFile) {
        purgeStart++;
      }

      if (!purge(purgeStart, maxIndex)) {
        return null;
      }

      StringBuffer buf = new StringBuffer();
      formatFileName(new Integer(purgeStart), buf);

      String renameTo = buf.toString();
      String compressedName = renameTo;
      Action compressAction = null;

      if (renameTo.endsWith(".gz")) {
        renameTo = renameTo.substring(0, renameTo.length() - 3);
        compressAction =
// Path: src/main/java/org/apache/log4j/rolling/helper/FileRenameAction.java
// public final class FileRenameAction extends ActionBase {
//     /**
//      * Source.
//      */
//     private final File source;
// 
//     /**
//      * Destination.
//      */
//     private final File destination;
// 
//     /**
//      * If true, rename empty files, otherwise delete empty files.
//      */
//     private final boolean renameEmptyFiles;
// 
//     /**
//      * Creates an FileRenameAction.
//      *
//      * @param src current file name.
//      * @param dst new file name.
//      * @param renameEmptyFiles if true, rename file even if empty, otherwise delete empty files.
//      */
//     public FileRenameAction(final File src, final File dst, boolean renameEmptyFiles) {
//         source = src;
//         destination = dst;
//         this.renameEmptyFiles = renameEmptyFiles;
//     }
// 
//     /**
//      * Rename file.
//      *
//      * @return true if successfully renamed.
//      */
//     public boolean execute() {
//         return execute(source, destination, renameEmptyFiles);
//     }
// 
//     /**
//      * Rename file.
//      * @param source current file name.
//      * @param destination new file name.
//      * @param renameEmptyFiles if true, rename file even if empty, otherwise delete empty files.
//      * @return true if successfully renamed.
//      */
//     public static boolean execute(final File source, final File destination, boolean renameEmptyFiles) {
//         if (renameEmptyFiles || source.length() > 0) {
//             return source.renameTo(destination);
//         }
//         return source.delete();
//     }
// }
// 
// Path: src/main/java/org/apache/log4j/rolling/helper/GZCompressAction.java
// public final class GZCompressAction extends ActionBase {
//   /**
//    * Source file.
//    */
//   private final File source;
// 
//   /**
//    * Destination file.
//    */
//   private final File destination;
// 
//   /**
//    * If true, attempt to delete file on completion.
//    */
//   private final boolean deleteSource;
// 
// 
//   /**
//    * Create new instance of GZCompressAction.
//    *
//    * @param source file to compress, may not be null.
//    * @param destination compressed file, may not be null.
//    * @param deleteSource if true, attempt to delete file on completion.  Failure to delete
//    * does not cause an exception to be thrown or affect return value.
//    */
//   public GZCompressAction(
//     final File source, final File destination, final boolean deleteSource) {
//     if (source == null) {
//       throw new NullPointerException("source");
//     }
// 
//     if (destination == null) {
//       throw new NullPointerException("destination");
//     }
// 
//     this.source = source;
//     this.destination = destination;
//     this.deleteSource = deleteSource;
//   }
// 
//   /**
//    * Compress.
//    * @return true if successfully compressed.
//    * @throws IOException on IO exception.
//    */
//   public boolean execute() throws IOException {
//     return execute(source, destination, deleteSource);
//   }
// 
//   /**
//    * Compress a file.
//    *
//    * @param source file to compress, may not be null.
//    * @param destination compressed file, may not be null.
//    * @param deleteSource if true, attempt to delete file on completion.  Failure to delete
//    * does not cause an exception to be thrown or affect return value.
//    * @return true if source file compressed.
//    * @throws IOException on IO exception.
//    */
//   public static boolean execute(
//     final File source, final File destination, final boolean deleteSource)
//           throws IOException {
//     if (source.exists()) {
//       FileInputStream fis = new FileInputStream(source);
//       FileOutputStream fos = new FileOutputStream(destination);
//       GZIPOutputStream gzos = new GZIPOutputStream(fos);
//       byte[] inbuf = new byte[8102];
//       int n;
// 
//       while ((n = fis.read(inbuf)) != -1) {
//         gzos.write(inbuf, 0, n);
//       }
// 
//       gzos.close();
//       fis.close();
// 
//       if (deleteSource && !source.delete()) {
//           LogLog.warn("Unable to delete " + source.toString() + ".");
//       }
// 
//       return true;
//     }
// 
//     return false;
//   }
// 
// 
//     /**
//      * Capture exception.
//      *
//      * @param ex exception.
//      */
//     protected void reportException(final Exception ex) {
//          LogLog.warn("Exception during compression of '" + source.toString() + "'.", ex);
//     }
// 
// }


// Path: src/main/java/org/apache/log4j/rolling/FixedWindowRollingPolicy.java
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.pattern.PatternConverter;
import org.apache.log4j.rolling.helper.Action;
import org.apache.log4j.rolling.helper.FileRenameAction;
import org.apache.log4j.rolling.helper.GZCompressAction;
import org.apache.log4j.rolling.helper.ZipCompressAction;
import org.apache.log4j.helpers.LogLog;

    }

    return new RolloverDescriptionImpl(newActiveFile, append, null, null);
  }

  /**
   * {@inheritDoc}
   */
  public RolloverDescription rollover(final String currentFileName) {
    if (maxIndex >= 0) {
      int purgeStart = minIndex;

      if (!explicitActiveFile) {
        purgeStart++;
      }

      if (!purge(purgeStart, maxIndex)) {
        return null;
      }

      StringBuffer buf = new StringBuffer();
      formatFileName(new Integer(purgeStart), buf);

      String renameTo = buf.toString();
      String compressedName = renameTo;
      Action compressAction = null;

      if (renameTo.endsWith(".gz")) {
        renameTo = renameTo.substring(0, renameTo.length() - 3);
        compressAction =
          new GZCompressAction(