/* 
 | 
  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.Datum; 
 | 
import de.uhilger.zeitrechnung.Definition; 
 | 
import de.uhilger.zeitrechnung.kalender.BasisKalender; 
 | 
import de.uhilger.zeitrechnung.kalender.ISOKalender; 
 | 
import de.uhilger.zeitrechnung.kalender.JulianischerKalender; 
 | 
import de.uhilger.zeitrechnung.kalender.Wandler; 
 | 
import de.uhilger.zeitrechnung.kalender.Zeitrechnung; 
 | 
import java.util.ArrayList; 
 | 
import java.util.List; 
 | 
import java.util.logging.Level; 
 | 
import java.util.logging.Logger; 
 | 
  
 | 
/** 
 | 
 * Wochentag vor oder nach einem Datum, zB Totensonntag (fuenter Sonntag  
 | 
 * vor dem 24.12. oder Freitag vor dem Mittsommertag (24.6.) usw. 
 | 
 *  
 | 
 * <code> 
 | 
 * {"name":"Totensonntag","typ":3,"p1":0,"p2":12,"p3":24,"p4":-5}, 
 | 
 * </code> 
 | 
 *  
 | 
 * <p> 
 | 
 * Ereignisdefinition<br> 
 | 
 * p1 Wochentag (0=Sonntag .. 6=Samstag)<br> 
 | 
 * p2 Monat (1=Januar .. 12=Dezember)<br> 
 | 
 * p3 Tag <br> 
 | 
 * p4 Wochentag vor (-) oder nach (+), z.B. -5 fuer fuenfter wie in 'fuenfter Freitag vor' <br> 
 | 
 * p5 Kalendersystem 1 gregorianisch (Standardvorbelegung), 2 julianisch <br> 
 | 
 * </p> 
 | 
 * @author Ulrich Hilger 
 | 
 */ 
 | 
public class TagDatumEreignis extends EreignisBasis { 
 | 
  
 | 
  /** 
 | 
   * Ein Objekt der Klasse TagDatumEreignis erstellen 
 | 
   */ 
 | 
  public TagDatumEreignis() { 
 | 
    super(); 
 | 
  } 
 | 
   
 | 
  /** 
 | 
   * Den Typ des Ereignisses ermitteln 
 | 
   *  
 | 
   * @return Ereignis.TYP_TAG_DATUM 
 | 
   */ 
 | 
  @Override 
 | 
  public int getTyp() { 
 | 
    return Ereignis.TYP_TAG_DATUM; 
 | 
  } 
 | 
  
 | 
  /** 
 | 
   * 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) { 
 | 
    ISOKalender g = new ISOKalender(); 
 | 
    Definition def = getDefinition(); 
 | 
    long monat = def.getp2(); 
 | 
    long tag = def.getp3(); 
 | 
    long kalender = def.getp5(); 
 | 
    ArrayList list = new ArrayList(); 
 | 
    if(GREGORIANISCHER_KALENDER == kalender || Long.MAX_VALUE == kalender) { 
 | 
      long basisDatum = g.zuTagen(isoJahr, (int) monat, (int) tag); 
 | 
      long generischesDatum = g.nterTag((int) def.getp4(), (int) def.getp1(), basisDatum); 
 | 
      Datum d = g.vonTagen(generischesDatum); 
 | 
      list.add(d);       
 | 
      list.add(d);       
 | 
    } else { 
 | 
      long start = g.zuTagen(isoJahr, Definition.JANUAR, 1); 
 | 
      long end = g.zuTagen(isoJahr, Definition.DEZEMBER, 31); 
 | 
      JulianischerKalender j = new JulianischerKalender(); 
 | 
      Datum jStart = j.vonTagen(start); 
 | 
      long jStartJahr = jStart.getJahr(); 
 | 
      Datum jEnd = j.vonTagen(end); 
 | 
      long jEndJahr = jEnd.getJahr(); 
 | 
      long anzahlJahre = (jEndJahr - jStartJahr) + (long) 1; 
 | 
      for (long y = 0; y < anzahlJahre; y++) { 
 | 
        long tage = j.zuTagen(jStartJahr + y, (int) def.getp2(), (int) def.getp3()); 
 | 
        long generischesDatum = g.nterTag((int) def.getp4(), (int) def.getp1(), tage); 
 | 
        if (generischesDatum >= start && generischesDatum <= end) { 
 | 
          Datum d = g.vonTagen(generischesDatum); 
 | 
          list.add(d); 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    return list; 
 | 
  }  
 | 
} 
 |