/*
Zeitrechnung - a class library to determine calendar events
Copyright (c) 1984-2023 Ulrich Hilger, http://uhilger.de
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package de.uhilger.zeitrechnung.ereignis;
import de.uhilger.zeitrechnung.kalender.ChristlicherKalender;
import de.uhilger.zeitrechnung.Datum;
import de.uhilger.zeitrechnung.Definition;
import java.util.ArrayList;
import java.util.List;
/**
* Die Klasse OsterEreignis dient zur Bestimmung des Zeitpunkts des
* Ostersonntages sowie davon abhaengiger Ereignisse.
*
*
* Ein Objekt der Klasse OsterEreignis kann wiederverwendet werden. Es genuegt,
* einer Instanz der Klasse OsterEreignis mehrfach hintereinander die
* Definition zu uebergeben und dann die Methode getZeitpunkte fuer das
* betreffende Jahr zu nutzen, also
*
*
* OsterEreignis oe = new OsterEreignis();
* Definition def = new Definition();
* // erster Aufruf
* def.setp1(3);
* oe.setDefinition(def);
* oe.getZeitpunkte(2022);
* // zweiter Aufruf
* def.setp1(51);
* oe.setDefinition(def);
* oe.getZeitpunkte(2022);
* usw.
*
*
* Solange das Jahr nicht wechselt, wird der Ostertermin nur einmal bestimmt.
*
*
* Die Ereignis-Definition lautet:
* OsterEreignis.getDefinition.setp1(Anzahl Tage vor (-) oder nach (+)
* Ostersonntag);
* OsterEreignis.getDefinition.setp2(OsterEreignis.WESTLICH oder
* OsterEreignis.ORTHODOX);
* wobei Monat einer Ganzzahl aus [Definition.JANUAR ..
* Definition.DEZEMBER] entspricht.
*
*
* @author Ulrich Hilger
*/
public class OsterEreignis extends EreignisBasis {
/** Typnummer fuer westliches Ostern */
public static final long WESTLICH = 1;
/** Typnummer fuer orthodoxes Ostern */
public static final long ORTHODOX = 2;
private long jahr;
private long ostern;
private long osterArt;
/**
* Ein Objekt der Klasse OsterEreignis erzeugen
*/
public OsterEreignis() {
super();
jahr = Long.MIN_VALUE;
ostern = Long.MIN_VALUE;
osterArt = WESTLICH;
}
/**
* Den Typ des Ereignisses ermitteln
*
* @return Ereignis.TYP_OSTERN
*/
@Override
public int getTyp() {
return Ereignis.TYP_OSTERN;
}
/**
* Die Tage eines Jahres im gregorianischen Kalendersystem
* ermitteln, an denen das Ereignis stattfindet.
*
* @param isoJahr das Jahr im gregorianischen Kalender,
* fuer das ermittelt werden soll, an welchen Tagen das Ereignis stattfindet
* @return die Liste aus Datum-Objekten, die die Tage im gregorianischen
* Kalender bezeichnet, an denen das Ereignis stattfindet
*/
@Override
public List getZeitpunkte(long isoJahr) {
ChristlicherKalender ck = new ChristlicherKalender();
Definition def = getDefinition();
if (ostern > Long.MIN_VALUE && jahr == isoJahr && osterArt == def.getp2()) {
// Ostern wurde fuer das fragliche Jahr schon bestimmt
} else {
jahr = isoJahr;
osterArt = def.getp2();
if (osterArt == WESTLICH) {
ostern = ck.ostern(isoJahr);
} else {
ostern = ck.orthodoxesOstern(isoJahr);
}
}
Datum d = ck.vonTagen(ostern + getDefinition().getp1());
ArrayList list = new ArrayList();
list.add(d);
return list;
}
}