package javacodebook.thread.crontab;

import java.util.*;

/**
 *  Ein Eintrag in der Crontab.
 *  @author Mark Donnermeyer
 */
class CrontabEntry {
    protected int id = 0;
    protected int hour = 0;
    protected int weekday = 0;
    protected Command command = null;
    protected Hashtable parameter = null;
    
    /**
     * Erzeugt einen neuen Eintrag für die Crontab. Man kann nicht selber einen
     * neuen Eintrag erzeugen, sondern muß dies der Crontab überlassen.
     */
    protected CrontabEntry(int id, int hour, int weekday, Command command, Hashtable parameter) {
        this.id        = id;
        this.hour      = hour;
        this.weekday   = weekday;
        this.command   = command;
        this.parameter = parameter;
    }
    
    public String toString() {
        StringBuffer buf = new StringBuffer();
        buf.append(id);
        buf.append("\t");
        buf.append(hour);
        buf.append("\t");
        buf.append(weekday);
        buf.append("\t");
        buf.append(command);
        buf.append("\t");
        buf.append(parameter);
        return buf.toString();
    }
    
    public boolean equals(Object otherEntry) {
        if ((otherEntry == null) || (!(otherEntry instanceof CrontabEntry)))
            return false;
        CrontabEntry tab = (CrontabEntry)otherEntry;
        return (this.id == tab.id);
    }
    
    public int getHour() {
        return hour;
    }
    
    public int getWeekday() {
        return weekday;
    }
    
    public Command getCommand() {
        return command;
    }
    
    public Hashtable getParameter() {
        return parameter;
    }
    
    public int getId() {
        return id;
    }
    
    /**
     * Es wird getestet, ob der Eintrag jetzt ausgeführt werden müßte.
     * Dazu wird die aktuelle Zeit mit der Zeit verglichen, zu der der Eintrag
     * ausgeführt werden soll.
     * @returns true wenn der Eintrag jetzt ausgeführt werden müßte.
     */
    public boolean needsExecution() {
        boolean execute = false;
        
        // Zunächst einmal wird die aktuelle Stunde und der aktuelle Wochentag
        // herausgefunden.
        GregorianCalendar gc = new GregorianCalendar();
        int now_hour    = gc.get(Calendar.HOUR_OF_DAY);
        int now_weekday = gc.get(Calendar.DAY_OF_WEEK);
        
        // Wenn einer der vorgegebenen Werte negativ ist, dann handelt es sich
        // bei dem Wert um ein Asteriks. In diesem Falle werden die Werte
        // now_hour bzw. now_weekday auf aktuelle Werte gesetzt.
        if (hour < 0)
            now_hour = hour;
        if (weekday < 0)
            now_weekday = weekday;
        
        // Prüfen, ob der Eintrag jetzt ausgeführt werden muss.
        return (now_hour == hour && now_weekday == weekday);
    }
    
    /**
     *  Das zu dem Eintrag gehörende Kommando wird ausgeführt.
     */
    protected void execute() {
        try {
            if (parameter == null)
                command.execute();
            else
                command.execute(parameter);
        }
        catch (Exception e) {
        }
    }
}