Skip to contentMethod: accept(VoraussichtlicheDokumentenklassenVariableVisitor)
      1: package zeit.serientermin;
2: 
3: import auftraege.VoraussichtlicheDokumentenklassenVariableVisitor;
4: import auftraege.auftragsBildungsParameter.abstraction.VoraussichtlicheDokumentenklassenVariable;
5: import com.google.common.base.Objects;
6: import tec.uom.se.ComparableQuantity;
7: import zeit.eintraege.KalenderEintrag;
8: import zeit.eintraege.Zeitraum;
9: 
10: import javax.measure.quantity.Time;
11: import java.time.LocalDate;
12: import java.time.LocalDateTime;
13: import java.util.Collection;
14: import java.util.Collections;
15: 
16: /**
17:  * Abstrakte Klasse die einen SerienTermin repräsentiert.
18:  */
19: public abstract class SerienTermin implements VoraussichtlicheDokumentenklassenVariable {
20: 
21:     private final KalenderEintrag eintrag;
22: 
23:     /**
24:      * Konstruktor welcher den übergebenen Eintrag dem entsprechenden Feld zuweist.
25:      * @param eintrag Kalendereintrag der sich wiederholt.
26:      */
27:     protected SerienTermin(final KalenderEintrag eintrag) {
28:         this.eintrag = eintrag;
29:     }
30: 
31:     /**
32:      * @param eintrag                Kalendereintrag der sich wiederholt.
33:      * @param wiederholungsIntervall Intervall in welchem sich der SerienTermin wiederholt.
34:      * @return einen IntervallSerientermin mit den spezifizierten Daten.
35:      */
36:     public static SerienTermin createSerienterminMitIntervall(final KalenderEintrag eintrag, final ComparableQuantity<Time> wiederholungsIntervall) {
37:         return IntervallSerienTermin.create(eintrag, wiederholungsIntervall);
38:     }
39: 
40:     /**
41:      * @param eintrag Kalendereintrag der sich wiederholt.
42:      * @return einen sich monatlich wiederholenden {@link MonatlicherSerientermin Serientermin}.
43:      */
44:     public static SerienTermin createMonatlichenSerientermin(final KalenderEintrag eintrag) {
45:         return MonatlicherSerientermin.create(eintrag);
46:     }
47:     /**
48:      * @param tag Tag für welchen geprüft werden soll, ob der SerienTermin sich an ihm wiederholt.
49:      * @return alle Kalendereinträge des SerienTermin zum spezifizierten Tag.
50:      */
51:     public Collection<KalenderEintrag> getKalenderEintraegeDesSerienTerminAmTag(final LocalDate tag) {
52:         if (this.zeitraumAmTag(this.eintrag.getZeitraum(), tag)) {
53:             return Collections.singleton(this.eintrag);
54:         }
55:         return this.berechneKalenderEintraegeZumTag(tag);
56:     }
57: 
58:     /**
59:      * @param tag gegebener Tag als LocalDate.
60:      * @return alle Kalendereinträge die durch den Serientermin zum gegebenen Tag erzeugt werden.
61:      */
62:     protected abstract Collection<KalenderEintrag> berechneKalenderEintraegeZumTag(LocalDate tag);
63: 
64:     /**
65:      * @param zeitraum ein Zeitraum
66:      * @param tag ein Tag
67:      * @return true, falls der Zeitraum den gegebenen Tag schneidet.
68:      */
69:     protected boolean zeitraumAmTag(final Zeitraum zeitraum, final LocalDate tag) {
70:         return zeitraum.ueberschneidet(Zeitraum.createWholeDay(tag));
71:     }
72: 
73:     @Override
74:     public boolean equals(final Object o) {
75:         if (this == o) {
76:             return true;
77:         }
78:         if (!(o instanceof SerienTermin)) {
79:             return false;
80:         }
81:         final SerienTermin that = (SerienTermin) o;
82:         return Objects.equal(this.eintrag, that.eintrag);
83:     }
84: 
85:     @Override
86:     public int hashCode() {
87:         return Objects.hashCode(this.eintrag);
88:     }
89: 
90:     /**
91:      * @return KalenderEintrag, welcher serienmäíg wiederholt werden soll.
92:      */
93:     public KalenderEintrag getEintrag() {
94:         return this.eintrag;
95:     }
96: 
97:     /**
98:      * @param zeitpunkt
99:      *                 Zeiitpunkt, der zu prüfen ist.
100:      *
101:      * @return <b>true</b>, falls der übergebene Zeitpunkt in den Serientermin fällt, <b>false</b> sont.
102:      */
103:     public boolean beinhaltetZeitpunkt(final LocalDateTime zeitpunkt) {
104:         return this.berechneKalenderEintraegeZumTag(zeitpunkt.toLocalDate()).stream().anyMatch(it -> it.getZeitraum().contains(zeitpunkt));
105:     }
106: 
107:     @Override
108:     public <T> T accept(final VoraussichtlicheDokumentenklassenVariableVisitor<T> v) {
109:         return v.handle(this);
110:     }
111: }