package sos.scheduler.job;

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

import sos.spooler.Job_impl;
import sos.util.SOSFile;

/**
 @author andreas.pueschel@sos-berlin.com
 *
 
 * cleanup temporary files created by other jobs
 * Paramters:
 * file_path Path for the files to remove
 * file_specification Regular expression as file specification
 * file_age Minimum file-age either milliseconds or hh:mm[:ss]
 * $Id: JobSchedulerCleanupFiles.java 2868 2007-07-31 15:32:00Z al $
 */
public class JobSchedulerCleanupFiles extends Job_impl {

    public boolean spooler_process() {

      /** give a path for files to remove */
      String filePath = System.getProperty("java.io.tmpdir");
      
      /** give a regular expression as file specification */
      String fileSpec = "^(sos.*)";
      
      /** give the number of milliseconds, defaults to 24 hours */
      long fileAge = 86400000;
      
      /** number of files which causes a warning */
      int warningFileLimit = 0;
      

    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) {
      String sFileAge = spooler_task.params().var("file_age");
      if (sFileAge.indexOf(":")>-1fileAge = calculateFileAge(sFileAge);
      else fileAge = Long.parseLong(sFileAge);
      spooler_log.info(".. job parameter [file_age]: " + fileAge);
    }
      
    if (spooler_task.params().var("warning_file_limit"!= null
        && spooler_task.params().var("warning_file_limit").length() 0) {
          String sWarningFileLimit = spooler_task.params().var("warning_file_limit");          
          warningFileLimit = Integer.parseInt(sWarningFileLimit);
          spooler_log.info(".. job parameter [warning_file_limit]: " + warningFileLimit);
    }
    
      try {        
        String[] filePaths = filePath.split(";");
        String[] fileSpecs = fileSpec.split(";");
        for (int i=0; i<filePaths.length; i++){
          int counter = 0;
          filePath = filePaths[i];
          if (filePath.trim().equalsIgnoreCase("java.io.tmpdir"))
            filePath = System.getProperty("java.io.tmpdir");
          if (filePaths.length == fileSpecs.length){
            fileSpec = fileSpecs[i];
          else {
            fileSpec = fileSpecs[0];
          }
          spooler_log.debug1("Looking for files in: "+filePath);
          Vector filelist = SOSFile.getFolderlist(filePath, fileSpec, 0);
          if filelist.size() == 0){
            spooler_log.info(".. No files matched.");            
          }
          
          Iterator iterator = filelist.iterator();
          if (warningFileLimit>&& filelist.size()>=warningFileLimit){
            spooler_log.warn(filelist.size()+" files were found in directory "+filePath+". "+
                "That is more than warning_file_limit ("+warningFileLimit+").");
          }
          while(iterator.hasNext()) {
            File tempFile = (File)iterator.next();
            long interval = System.currentTimeMillis()-tempFile.lastModified();
            if interval > fileAge ) {
              counter += SOSFile.deleteFile(tempFile);
            }
          }          
          if (counter > 0spooler_log.info(counter + (filePath.equals(System.getProperty("java.io.tmpdir")) " temporary" """ files removed");
        }
        
        
        
      catch (Exception e) {
        spooler_log.warn("an error occurred on cleanup of files: " + e.toString());
      }
      
      return false;
    }
    
    private long calculateFileAge(String hoursMinSec) {
      long age=0;
      String[] timeArray = hoursMinSec.split(":");
      long hours = Long.parseLong(timeArray[0]);
      long minutes = Long.parseLong(timeArray[1]);
      long seconds = 0;
      if (timeArray.length>2){
        seconds = Long.parseLong(timeArray[2]);
      }
      age = hours*3600000+minutes*60000+seconds*1000;
      return age;
    }
}