package sos.scheduler.job;

import java.io.File;
import java.util.Iterator;
import java.util.Vector;

import sos.spooler.Job_impl;
// import sos.util.SOSDate;
import sos.util.SOSFile;
import sos.util.SOSGZip;

/**
 * compress and rotate scheduler log files
 @author andreas.pueschel@sos-berlin.com 
 */
public class JobSchedulerRotateLog extends Job_impl {

    public boolean spooler_process() {

      /** give a path for files to remove */
      String filePath = spooler.log_dir()
      
      /** give the number of days, defaults to 14 days */
      long fileAge = 14;
      
      /** give a regular expression as file specification */
      String fileSpec = "^(scheduler)([0-9\\-]+)";
      if (spooler.id() != null && spooler.id().length() 0fileSpec +=  "(\\." + spooler.id() ")";
      fileSpec += "(\\.log)$";
      

    if (spooler_task.params().var("file_path"!= null
    && spooler_task.params().var("file_path").length() 0) {
        filePath = spooler_task.params().var("file_path");
      spooler_log.info(".. job parameter [file_path]: " + filePath);
    }
      
    if (spooler_task.params().var("file_specification"!= null
    && spooler_task.params().var("file_specification").length() 0) {
      fileSpec = spooler_task.params().var("file_specification");
      spooler_log.info(".. job parameter [file_specification]: " + fileSpec);
    }
          
    if (spooler_task.params().var("file_age"!= null
    && spooler_task.params().var("file_age").length() 0) {
      fileAge = Long.parseLong(spooler_task.params().var("file_age"));
      spooler_log.info(".. job parameter [file_age]: " + fileAge);
    }
      
    
      

      
      try {
        int counter = 0;

        if (!filePath.endsWith("/")) filePath += "/";
        
        Vector filelist = SOSFile.getFilelist(spooler.log_dir(), fileSpec, 0);
        Iterator iterator = filelist.iterator();
        while(iterator.hasNext()) {
          File tempFile = (File)iterator.next();
          long interval = System.currentTimeMillis()-tempFile.lastModified();
          if (tempFile.canWrite() && interval > (fileAge*24*3600*1000) ) {
            try {
                counter++;
              String gzipFilename = filePath + tempFile.getName().concat(".gz");
                SOSGZip.compressFile(tempFile, new File(gzipFilename));
                tempFile.delete();
                
                spooler_log.info".. log file [" + tempFile.getName() 
                        "] compressed to: " + gzipFilename);
              
              catch (Exception e) {
                throw (new Exception("an error occurred compressing log file [" + tempFile.getPath() "] to gzip file: " + e.getMessage()));
              }
          }
        }
        
        if (counter > 0spooler_log.info(counter + " log files compressed");
        

      catch (Exception e) {
        spooler_log.warn("an error occurred cleaning up log files: " + e.getMessage());
      }
      
      try {
          spooler.log().start_new_file();
          
      catch (Exception e) {
        spooler_log.warn("an error occurred rotating log file: " + e.getMessage());
        return false;
      }
      
      return false;
    }

}