package javacodebook.thread.crontab;

import java.util.Date;
import java.util.Enumeration;

/**
 * Der CronDaemon startet zu jeder vollen Stunde und sieht in der Crontab
 * nach, ob ein oder mehrere Jobs zu erledigen sind. Ist dies der Fall, führt 
 * er den Job aus.
 * @author  Mark Donnermeyer
 */
public class CronDaemon extends Thread
{
    private Crontab crontab = null;
    
    public CronDaemon(Crontab crontab)
    {
        this.crontab = crontab;
    }
    
    public void run()
    {
        while(true)
        {   
            System.out.println("Lese Crontab um " + (new java.util.Date()));
            Enumeration jobs = crontab.listEntries();
            
            while (jobs.hasMoreElements())
            {
                CrontabEntry entry = (CrontabEntry)jobs.nextElement();            
                System.out.println(entry + "\t" + entry.needsExecution());
                if (entry.needsExecution())
                    entry.execute();
            }

            // So, jetzt bis zur nächsten vollen Stunde schlafen gehen
            // Da unbekannt ist, wie lange die Ausführung der Jobs
            // gedauert hat, muss die Zeitspanne bis zur nächsten vollen
            // Stunde ausgerechnet werden.
            // Wenn uns jemand unterbricht, dann geht es sofort weiter.
            try {
                long now = (new Date()).getTime();
                long hour = 1000*60*60; // 1 Stunde in Millisekunden
                long left = hour - (now%hour);             
                this.sleep(left+450);
            }
            catch (Exception e)
            {}
        }
    }
}
