-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTerminMitWiederholungImpl.java
292 lines (253 loc) · 8.18 KB
/
TerminMitWiederholungImpl.java
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
package kalender;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import kalender.TerminMitWiederholungImpl.WiederholungImpl;
import kalender.interfaces.Datum;
import kalender.interfaces.DatumsGroesse;
import kalender.interfaces.Dauer;
import kalender.interfaces.IntervallIterator;
import kalender.interfaces.Monat;
import kalender.interfaces.Tag;
import kalender.interfaces.Termin;
import kalender.interfaces.TerminMitWiederholung;
import kalender.interfaces.Wiederholung;
import kalender.interfaces.Woche;
public class TerminMitWiederholungImpl extends TerminImpl implements TerminMitWiederholung {
private Wiederholung wdh;
// Konstruktorprobleme auflösen
public TerminMitWiederholungImpl(String beschreibung, Datum start, Dauer dauer, WiederholungType type, int anzahl,
int zyklus) {
super(beschreibung, start, dauer);
wdh = new WiederholungImpl(type, anzahl, zyklus);
}
public TerminMitWiederholungImpl(String beschreibung, Datum start, Dauer dauer, Wiederholung wdh) {
super(beschreibung, start, dauer);
wdh = new WiederholungImpl(wdh);
}
// added crap
public Wiederholung getWdh() {
return new WiederholungImpl(wdh);
}
@Override
public Map<Datum, Termin> termineIn(Monat monat) {
// auf termineFuer zurückführen
return termineFuer(monat);
}
@Override
public Map<Datum, Termin> termineIn(Woche woche) {
// auf termineFuer zurückführen
return termineFuer(woche);
}
@Override
public Map<Datum, Termin> termineAn(Tag tag) {
// auf termineFuer zurückführen
return termineFuer(tag);
}
/**
* Beispiel für den naiven Iterator, der alle Wiederholungen explizit
* aufzaehlt
*/
@Override
public Iterator<Termin> iterator() {
return new Iterator<Termin>() {
private TerminMitWiederholung current = null;
private int howManySeen = 0;
@Override
public boolean hasNext() {
return howManySeen <= wdh.anzahl();
}
@Override
public Termin next() {
if (current == null) {
current = TerminMitWiederholungImpl.this;
} else {
current = new TerminMitWiederholungImpl(getBeschreibung(), current.getWdh().naechstesDatum(),
getDauer(), current.getWdh().sub(1));
}
howManySeen += 1;
return current;
}
};
}
@Override
public IntervallIterator<Datum> intervallIterator(int von, int bis) {
return new IntervallIterator<Datum>() {
// end Index als upper bound merken / cursor initialisieren
private TerminMitWiederholung current = null;
private int howManySeen = von;
@Override
public boolean hasNext() {
// in Abhängigkeit von cursor und upper bound (upper bound
// ist inkl.)
return howManySeen <= bis;
}
@Override
public Datum next() {
// nächstes Element mit geeigneter Methode von
// Wiederholung berechnen
if (current == null) {
current = TerminMitWiederholungImpl.this;
} else {
current = new TerminMitWiederholungImpl(getBeschreibung(), current.getWdh().naechstesDatum(),
getDauer(), current.getWdh().sub(1));
}
howManySeen += 1;
return current.getDatum();
}
};
}
@Override
public Map<Datum, Termin> termineFuer(DatumsGroesse groesse) {
// TODO Indizes fuer Start und End Intervall berechnen
System.out.println(groesse.getStart().differenzInTagen(this.getDatum()));
int startIndex = (int)(groesse.getStart().differenzInTagen(this.getDatum())) / wdh.intervallLaenge();
int endIndex = (int) groesse.getEnde().differenzInTagen(this.dat) / wdh.intervallLaenge();
System.out.println(startIndex + "; " + endIndex);
// TODO Indizes auf Gültigkeit prüfen
// wenn endIndex > maxIntervallIndex dann setze endIndex auf
// maxIntervallIndex
if (endIndex > wdh.maxIntervallIndex()) {
endIndex = wdh.maxIntervallIndex();
}
//
// wenn endIndex < startIndex || endIndex < 0 || startIndex < 0 ||
// endIndex > maxIntervallIndex
// gib null zurück
if (endIndex < startIndex || endIndex < 0 || startIndex < 0 || endIndex > wdh.maxIntervallIndex()) {
return null;
}
//
// TODO hier den Intervalliterator nutzen
// Map erzeugen und die Wiederholungen einsammeln
IntervallIterator<Datum> iv = intervallIterator(startIndex, endIndex);
Map<Datum, Termin> ter = new HashMap<Datum, Termin>();
while(iv.hasNext()){
Datum datum = iv.next();
ter.put(datum , this);
}
return ter;
}
public class WiederholungImpl implements Wiederholung {
private WiederholungType wdhType;
private int anzahl;
private int cycle;
public WiederholungImpl(WiederholungType wdhType, int anzahl, int cyclus) {
this.wdhType = wdhType;
this.anzahl = anzahl;
this.cycle = cyclus;
}
public WiederholungImpl(Wiederholung wdh) {
//System.out.println(wdh.getType() + " " + wdh.anzahl() + " " + wdh.getZyklus());
this(wdh.getType(), wdh.anzahl(), wdh.getZyklus());
}
@Override
public WiederholungType getType() {
return wdhType;
}
@Override
public int getZyklus() {
return cycle;
}
@Override
public int anzahl() {
return anzahl;
}
@Override
public int maxIntervallIndex() {
return anzahl;
}
@Override
public int intervallLaenge() {
return cycle * wdhType.inTagen();
}
/*
* @see kalender.interfaces.Wiederholung#naechstesIntervall(kalender.
* interfaces.Datum)
*
* Methode liefert den Intervallindex für das einem Datum nachfolgendem
* Intervall. Es werden auch Intervalle berechnet, die außerhalb des
* gültigen Bereichs maxIntervallIndex liegen. Nutzer der Methode
* müssen sicher stellen, dass die Gültigkeit des Index geprüft wird.
*/
@Override
public int naechstesIntervall(Datum dat) {
long diff = dat.differenzInTagen(getDatum());
long div = diff / intervallLaenge();
long mod = diff % intervallLaenge();
/*
* div <= 0 und mod < 0: tag liegt vor dem ersten Termin der
* Wiederholung (Intervall 0) div > 0 && mod > 0: tag liegt vor dem
* Termin im Intervall div+1 div >= 0 && mod == 0: tag ist ein
* Termin der Wiederholung im Intervall div
*/
int intervallIndex = -1;
if (div <= 0 && mod < 0)
intervallIndex = 0;
if (diff > 0 && mod > 0)
intervallIndex = (int) div + 1;
if (diff >= 0 && mod == 0)
intervallIndex = (int) div;
return intervallIndex;
}
/*
* @see kalender.interfaces.Wiederholung#vorherigesIntervall(kalender.
* interfaces.Datum)
*
* Methode liefert den Intervallindex für das einem Datum
* vorausgehenden Intervall. Es werden auch Intervalle berechnet, die
* außerhalb des gültigen Bereichs maxIntervallIndex liegen. Nutzer
* der Methode müssen sicher stellen, dass die Gültigkeit des Index
* geprüft wird.
*/
@Override
public int vorherigesIntervall(Datum dat) {
long diff = dat.differenzInTagen(getDatum());
long div = diff / intervallLaenge();
long mod = diff % intervallLaenge();
/*
* diff < 0: dann liegt das Datum vor dem ersten Termin Fehler div
* >= 0 && mod = 0: dann interval = div sonst intervall =
* (naechstesIntervall(dat) -1)
*/
if (diff < 0)
return -1;
if (div >= 0 && mod == 0)
return (int) div;
return naechstesIntervall(dat) - 1;
}
/*
* @see kalender.interfaces.Wiederholung#naechstesDatum()
*/
@Override
public Datum naechstesDatum() {
return naechstesDatum(1);
}
/*
* @see kalender.interfaces.Wiederholung#naechstesDatum(int)
*/
@Override
public Datum naechstesDatum(int faktor) {
int anzahlTage = faktor * intervallLaenge();
return new DatumImpl(getDatum()).add(new DauerImpl(anzahlTage, 0, 0));
}
/*
* @see kalender.interfaces.Wiederholung#sub(int)
*/
@Override
public Wiederholung sub(int wdhCount) {
return new WiederholungImpl(wdhType, anzahl - wdhCount, cycle);
}
/*
* @see kalender.interfaces.Wiederholung#add(int)
*/
@Override
public Wiederholung add(int wdhCount) {
return new WiederholungImpl(wdhType, anzahl + wdhCount, cycle);
}
}
@Override
public String toString() {
return "TerminMitWiederholungImpl [wdh=" + wdh + "]";
}
}