Bestimmung der Zeitpunkte von Ereignissen
ulrich
2023-03-19 8cf8493e4b918cece529fef978d50c8b9835d230
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
  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 <http://www.gnu.org/licenses/>.
 */
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.
 *
 * <p>
 * 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 </p>
 *
 * <code>
 *  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.
 * </code>
 *
 * Solange das Jahr nicht wechselt, wird der Ostertermin nur einmal bestimmt.
 *
 * <p>
 * Die Ereignis-Definition lautet:<br>
 * OsterEreignis.getDefinition.setp1(Anzahl Tage vor (-) oder nach (+)
 * Ostersonntag);<br>
 * OsterEreignis.getDefinition.setp2(OsterEreignis.WESTLICH oder
 * OsterEreignis.ORTHODOX);<br>
 * wobei Monat einer Ganzzahl aus [Definition.JANUAR ..
 * Definition.DEZEMBER] entspricht.
 * </p>
 *
 * @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<Datum> 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;
  }
}