de.bsvrz.ars.ars.mgmt.tasks.scheduler
Class TimeIntervalCron

java.lang.Object
  extended by de.bsvrz.ars.ars.mgmt.tasks.scheduler.TimeIntervalCron

public class TimeIntervalCron
extends Object

Diese Klasse stellt ein ZeitIntervallCron dar.

Die Spezifikation erfolgt durch die Angabe von 5 Terminfeldern, wobei im ersten Feld die Minute [0;59], im zweiten Feld die Stunde [0;23], im dritten Feld der Tag [1;31], im viertem Feld der Monat [1;12] und im letzten Feld der Wochentag {Mo,Di,Mi,Do,Fr,Sa,So} angegeben werden kann. Pro Terminfeld sind mehrere Einträge, die durch Kommata getrennt werden müssen, möglich. Die Eingabe eines '*' deckt den gesamten Bereich eines Terminfeldes ab. Mit dem Zeichen '-' können Teilbereiche abgedeckt werden. Die Angaben aller Terminfelder sind UND-verknüpft.

Reihenfolge und Bedeutung der Felder

FeldMögliche Werte
Minute0-59
Stunde0-23
Tag1-31
Monat1-12
Wochentag>Mo/Di/Mi/Do/Fr/Sa/So

Die Syntax ist im Vergleich zu Cron reduziert. Insbesondere können keine Schritte (etwa '* / 5' um einen Befehl alle 5 Minuten auszuführen) angegeben werden.

Außerdem muss beachtet werden, dass alle Felder UND-Verknüpft sind. Das heißt, '0 0 1 * Mo' steht für "um Mitternacht wenn der Montag auch der erste eines Monats ist". Unter Linux/Cron bedeutet diese Angabe jedoch "Mitternachts an jedem Montag und am ersten eines Monats."

Author:
beck et al. projects GmbH, Phil Schrettenbrunner

Field Summary
private  Calendar c
           
private static HashMap<String,Integer> DAYNAMES
           
private  boolean[] dayOfMonth
           
private  boolean[] dayOfWeek
           
private  boolean hasParseErrors
           
private  boolean[] hour
           
private  boolean[] minute
           
private  boolean[] month
           
private  String originalTimeIntervalCron
           
 
Constructor Summary
TimeIntervalCron()
          Standardkonstruktor.
TimeIntervalCron(String fields)
           
 
Method Summary
 Calendar getNextRun(Calendar startingFrom)
          Berechnet das Datum des nächsten Ausführungstages.
 String getParsedInterval()
          Gibt den analysierten String wieder aus, nur als Aufzählung (ohne "-" oder *)
 boolean hasParseErrors()
          Liefert wahr, wenn es beim letzten setFields() zu Parsefehlern kam
 boolean hasValues()
          Gibt an, ob Zeiten gespeichert sind.
private  void init()
          Initialisert die internen Felder mit leeren Arrays
private  int nameToNumber(String s)
           
private  void parseField(String field, boolean[] destArray, int offset)
          Anaylsiert ein einzelnen Feld und setzt alle nötigen Einträge im Boolean Array dest auf true;
 void setFields(String fields)
          Analysiert den übergebenen String und setzt intern die Felder für das entsprechende Datum.
 boolean shouldRun(Date date)
          Prüft, ob die übergebene Zeit in das Interval fällt, zu dem der Job laufen soll.
 String toString()
          Gibt das übergebene String-Pattern wieder aus, oder 'ParseError', wenn er sich nicht hat parsen lassen
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

DAYNAMES

private static final HashMap<String,Integer> DAYNAMES

hasParseErrors

private boolean hasParseErrors

originalTimeIntervalCron

private String originalTimeIntervalCron

minute

private boolean[] minute

hour

private boolean[] hour

dayOfMonth

private boolean[] dayOfMonth

month

private boolean[] month

dayOfWeek

private boolean[] dayOfWeek

c

private Calendar c
Constructor Detail

TimeIntervalCron

public TimeIntervalCron()
Standardkonstruktor. Es wird keine Zeit gesetzt, daher wird bei jeder Anfrage false (also nicht-starten) geantwortet, bis mittels set() ein String in Cron-Sytnax übergeben wird.


TimeIntervalCron

public TimeIntervalCron(String fields)
Parameters:
fields -
Method Detail

setFields

public void setFields(String fields)
Analysiert den übergebenen String und setzt intern die Felder für das entsprechende Datum. Alte Einstellungen gehen dabei verlohren.

Wenn der übergebene String Syntaxfehler enthält, werden alle alle Felder deaktiviert so dass es nie zu einer Ausführung kommt.

Parameters:
fields -

shouldRun

public boolean shouldRun(Date date)
Prüft, ob die übergebene Zeit in das Interval fällt, zu dem der Job laufen soll. Die Sekunden werden dabei ignoriert, d.h. es wird immer abgerundet.

Parameters:
date - Milisekunde eines Zeitpunkts, der überprüft werden soll
Returns:
Wahr, wenn der Zeitpunkt durch die gesetzten Zeitspannen abgedeckt wird, ansonten falsch

getNextRun

public Calendar getNextRun(Calendar startingFrom)
Berechnet das Datum des nächsten Ausführungstages. Berücksichtigt wird dabei nur der Zeitraum eines Jahres.

Parameters:
startingFrom - Datum von dem ab gesucht werden soll. Null falls von "jetzt" an gesucht werden soll.
Returns:
Datum des nächsten Ausführungstages innerhalb des nächsten Jahres, ansonsten null.

hasValues

public boolean hasValues()
Gibt an, ob Zeiten gespeichert sind.

Returns:
Wahr, wenn Zeiten gespeichert sind. Falsch, wenn es niemals zu einer Ausführung kommen würden

toString

public String toString()
Gibt das übergebene String-Pattern wieder aus, oder 'ParseError', wenn er sich nicht hat parsen lassen

Overrides:
toString in class Object

getParsedInterval

public String getParsedInterval()
Gibt den analysierten String wieder aus, nur als Aufzählung (ohne "-" oder *)

Returns:
der analysierte String

hasParseErrors

public boolean hasParseErrors()
Liefert wahr, wenn es beim letzten setFields() zu Parsefehlern kam

Returns:
Ob es Fehler beim Parsen des Strings beim letzten Aufruf von setFields gab.

parseField

private void parseField(String field,
                        boolean[] destArray,
                        int offset)
                 throws ParseException
Anaylsiert ein einzelnen Feld und setzt alle nötigen Einträge im Boolean Array dest auf true;

Parameters:
field - String, der analysiert werden soll.
destArray - Ziel array, in dem die zugehärigen Felder auf true gesetzt werden sollen
offset - offset, falls das Array nicht bei 0 anfängt (Tag und Monat beginnen mit 1).
Throws:
ParseException

nameToNumber

private int nameToNumber(String s)

init

private void init()
Initialisert die internen Felder mit leeren Arrays