1
|
package data;
|
2
|
|
3
|
import java.time.LocalDate;
|
4
|
import java.time.ZoneId;
|
5
|
import java.time.temporal.ChronoUnit;
|
6
|
import java.util.Arrays;
|
7
|
import java.util.Calendar;
|
8
|
import java.util.Date;
|
9
|
|
10
|
//------ TO-DO LIST ----
|
11
|
// TODO: 04.05.2019 JavaDoc - Dokumentace
|
12
|
|
13
|
/**
|
14
|
*
|
15
|
* Trida uchovavajici informace a umoznujici praci s bitmapou
|
16
|
*
|
17
|
* @author Daniel Stus, Marek Sobota, Lukas Scurko, Jan Jirman
|
18
|
* @version 0.5
|
19
|
*
|
20
|
*/
|
21
|
public class Bitmap {
|
22
|
|
23
|
//-------------- Atributy --------------/
|
24
|
|
25
|
/** Atribut - Datum zacatku obdobi */
|
26
|
private Calendar dateFrom;
|
27
|
|
28
|
/** Atribut - Datum konce obdobi */
|
29
|
private Calendar dateTo;
|
30
|
|
31
|
/** Atribut s cislem linky pro kterou je generovana bitmapa */
|
32
|
private String lineNumber;
|
33
|
|
34
|
/** Atribut s cislem spoje linky pro kterou je generovana bitmapa */
|
35
|
private String connectionNumber;
|
36
|
|
37
|
/** Pole uchovavajici bitmapu */
|
38
|
private int[] bitmap;
|
39
|
|
40
|
/** Atribut uchovavajici hodnotu dne (ktery den v tydnu odpovida) pocatku obdobi */
|
41
|
private int firstDayOfWeek;
|
42
|
|
43
|
|
44
|
//-------------- Konstruktor -------------/
|
45
|
|
46
|
/**
|
47
|
* Konstruktor incializuje a nastavuje důležité parametry tridy (@code Bitmap)
|
48
|
*
|
49
|
* @param dateFrom Datum zacatku obdobi
|
50
|
* @param dateTo Datum konce obdobi
|
51
|
* @param lineNumber Cislo linky
|
52
|
* @param connectionNumber Cislo spoje dane linky
|
53
|
*/
|
54
|
public Bitmap(Calendar dateFrom, Calendar dateTo, String lineNumber, String connectionNumber) {
|
55
|
this.dateFrom = dateFrom;
|
56
|
this.dateTo = dateTo;
|
57
|
this.lineNumber = lineNumber;
|
58
|
this.connectionNumber = connectionNumber;
|
59
|
this.bitmap = new int[(int) getDateRange()];
|
60
|
this.firstDayOfWeek = dateFrom.get(Calendar.DAY_OF_WEEK);
|
61
|
}
|
62
|
|
63
|
|
64
|
//----------------- Metody ----------------/
|
65
|
|
66
|
/**
|
67
|
* Metda vrací počet dní uživatelem zvoleného období
|
68
|
*
|
69
|
* @return Počet dní v uživatelem zvoleném období (rozmezí)
|
70
|
*/
|
71
|
public long getDateRange() {
|
72
|
LocalDate from = this.dateFrom.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
73
|
LocalDate to = this.dateTo.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
74
|
|
75
|
long noOfDaysBetween = ChronoUnit.DAYS.between(from, to);
|
76
|
return noOfDaysBetween+1;
|
77
|
}
|
78
|
|
79
|
public long getDatePosition(Calendar date) {
|
80
|
LocalDate from = this.dateFrom.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
81
|
LocalDate to = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
82
|
|
83
|
long datePosition = ChronoUnit.DAYS.between(from, to);
|
84
|
//Re #7443
|
85
|
return datePosition;
|
86
|
}
|
87
|
|
88
|
|
89
|
public void setWorkdays(int value) {
|
90
|
value = validateValue(value);
|
91
|
int dayOfWeek = this.dateFrom.get(Calendar.DAY_OF_WEEK);
|
92
|
|
93
|
for (int i = 0; i < this.bitmap.length; i++) {
|
94
|
if (dayOfWeek != 7 && dayOfWeek != 1) {
|
95
|
this.bitmap[i] = value;
|
96
|
}
|
97
|
|
98
|
dayOfWeek++;
|
99
|
if (dayOfWeek == 8) dayOfWeek = 1;
|
100
|
}
|
101
|
}
|
102
|
|
103
|
public void setSundaysAndHolidays(int value) {
|
104
|
value = validateValue(value);
|
105
|
int dayOfWeek = firstDayOfWeek;
|
106
|
|
107
|
for (int i = 0; i < this.bitmap.length; i++) {
|
108
|
if (dayOfWeek != 7) {
|
109
|
this.bitmap[i] = value;
|
110
|
}
|
111
|
|
112
|
dayOfWeek++;
|
113
|
if (dayOfWeek == 8) dayOfWeek = 1;
|
114
|
}
|
115
|
}
|
116
|
|
117
|
public void setDay(Calendar day, int value) {
|
118
|
value = validateValue(value);
|
119
|
int dayPosition = (int) getDatePosition(day);
|
120
|
|
121
|
bitmap[dayPosition] = value;
|
122
|
}
|
123
|
|
124
|
|
125
|
public void setOneDayOnly(Calendar day) {
|
126
|
fillWithZeros();
|
127
|
int dayPosition = (int) getDatePosition(day);
|
128
|
|
129
|
bitmap[dayPosition] = 1;
|
130
|
}
|
131
|
|
132
|
public void setDaysInRange(Calendar from, Calendar to, int value) {
|
133
|
value = validateValue(value);
|
134
|
int dayPositionFrom = (int) getDatePosition(from);
|
135
|
int dayPositionTo = (int) getDatePosition(to);
|
136
|
|
137
|
for (int i = dayPositionFrom; i < dayPositionTo; i++) {
|
138
|
bitmap[i] = value;
|
139
|
}
|
140
|
|
141
|
}
|
142
|
|
143
|
public void setDaysInWeek(int dayNumber, int value) {
|
144
|
value = validateValue(value);
|
145
|
int dayOfWeek = firstDayOfWeek;
|
146
|
|
147
|
for (int i = 0; i < this.bitmap.length; i++) {
|
148
|
if (dayOfWeek == dayNumber) {
|
149
|
this.bitmap[i] = value;
|
150
|
}
|
151
|
|
152
|
dayOfWeek++;
|
153
|
if (dayOfWeek == 8) dayOfWeek = 1;
|
154
|
}
|
155
|
}
|
156
|
|
157
|
|
158
|
// TODO: 04.05.2019 ?? Sude/Liche -- Platí pro víkendy ??
|
159
|
public void setWeeks(int value, int remainder) {
|
160
|
value = validateValue(value);
|
161
|
int dayOfWeek = this.dateFrom.get(Calendar.DAY_OF_WEEK);
|
162
|
int weekNumber = this.dateFrom.get(Calendar.WEEK_OF_MONTH);
|
163
|
|
164
|
for (int i = 0; i < this.bitmap.length; i++) {
|
165
|
if ((weekNumber % 2)==remainder) {
|
166
|
this.bitmap[i] = value;
|
167
|
}
|
168
|
|
169
|
dayOfWeek++;
|
170
|
if (dayOfWeek == 8) dayOfWeek = 1;
|
171
|
if (dayOfWeek == 2) weekNumber++;
|
172
|
|
173
|
}
|
174
|
}
|
175
|
|
176
|
|
177
|
public void setWeeksRange(Calendar from, Calendar to, int value, int remainder) {
|
178
|
value = validateValue(value);
|
179
|
int dayOfWeek = from.get(Calendar.DAY_OF_WEEK);
|
180
|
int weekNumber = from.get(Calendar.WEEK_OF_MONTH);
|
181
|
int dayPositionFrom = (int) getDatePosition(from);
|
182
|
int dayPositionTo = (int) getDatePosition(to);
|
183
|
|
184
|
for (int i = dayPositionFrom; i < dayPositionTo; i++) {
|
185
|
if ((weekNumber % 2)==remainder) {
|
186
|
this.bitmap[i] = value;
|
187
|
}
|
188
|
|
189
|
dayOfWeek++;
|
190
|
if (dayOfWeek == 8) dayOfWeek = 1;
|
191
|
if (dayOfWeek == 2) weekNumber++;
|
192
|
}
|
193
|
|
194
|
}
|
195
|
|
196
|
// TODO: 04.05.2019 Kombinace (Sudé/Liché týdny + Časové kódy)
|
197
|
|
198
|
/**
|
199
|
* Metoda naplní (přemaže) bitmapu nulami
|
200
|
*/
|
201
|
public void fillWithZeros() {
|
202
|
Arrays.fill(this.bitmap, 0);
|
203
|
}
|
204
|
|
205
|
/**
|
206
|
* Metoda overuje spravnost zadane hodnoty
|
207
|
* - do bitmapy lze zadat pouze 1 nebo 0
|
208
|
* - v pripade ze uzivatel zada cislo vetsi nez jedna metoda vrati jednotku
|
209
|
* - v pripade ze uzivatel zada cislo mensi nez nula metoda vrati nulu
|
210
|
*
|
211
|
* @param value Uzivatelem zadana hodnota
|
212
|
* @return Nova (spravna hodnota) ukladajici se do bitmapy
|
213
|
*/
|
214
|
public static int validateValue(int value) {
|
215
|
if (value < 0) value = 0;
|
216
|
else if (value > 0) value = 1;
|
217
|
else return value;
|
218
|
return value;
|
219
|
}
|
220
|
|
221
|
public Calendar getDateFrom() {
|
222
|
return dateFrom;
|
223
|
}
|
224
|
|
225
|
public void setDateFrom(Calendar dateFrom) {
|
226
|
this.dateFrom = dateFrom;
|
227
|
}
|
228
|
|
229
|
public Calendar getDateTo() {
|
230
|
return dateTo;
|
231
|
}
|
232
|
|
233
|
public void setDateTo(Calendar dateTo) {
|
234
|
this.dateTo = dateTo;
|
235
|
}
|
236
|
|
237
|
public String getLineNumber() {
|
238
|
return lineNumber;
|
239
|
}
|
240
|
|
241
|
public void setLineNumber(String lineNumber) {
|
242
|
this.lineNumber = lineNumber;
|
243
|
}
|
244
|
|
245
|
public String getConnectionNumber() {
|
246
|
return connectionNumber;
|
247
|
}
|
248
|
|
249
|
public void setConnectionNumber(String connectionNumber) {
|
250
|
this.connectionNumber = connectionNumber;
|
251
|
}
|
252
|
|
253
|
public int[] getBitmap() {
|
254
|
return bitmap;
|
255
|
}
|
256
|
|
257
|
public void setBitmap(int[] bitmap) {
|
258
|
this.bitmap = bitmap;
|
259
|
}
|
260
|
|
261
|
public int getFirstDayOfWeek() {
|
262
|
return firstDayOfWeek;
|
263
|
}
|
264
|
|
265
|
public void setFirstDayOfWeek(int firstDayOfWeek) {
|
266
|
this.firstDayOfWeek = firstDayOfWeek;
|
267
|
}
|
268
|
|
269
|
@Override
|
270
|
public String toString() {
|
271
|
return Arrays.toString(this.bitmap);
|
272
|
}
|
273
|
|
274
|
|
275
|
/**
|
276
|
*
|
277
|
* hlavni metoda pro ozkouseni funkcnosti {@code Bitmap}
|
278
|
*-issue #7374
|
279
|
*
|
280
|
* @param args parametry programu
|
281
|
*/
|
282
|
public static void main(String[] args) {
|
283
|
|
284
|
Calendar dateFrom = Calendar.getInstance();
|
285
|
Calendar dateTo = Calendar.getInstance();
|
286
|
dateFrom.setTime(new Date(2019-1900, 4, 1)); // -- Jen pro testování Deprecated --
|
287
|
dateTo.setTime(new Date(2019-1900, 4, 31)); // rok udáván od 1900, měsíc se počítá od 0
|
288
|
|
289
|
|
290
|
Bitmap bitmap = new Bitmap(dateFrom, dateTo, "143440", "1");
|
291
|
|
292
|
|
293
|
// ------------- KONTROLNÍ VÝPISY -----------------
|
294
|
System.out.println("------------- KONTROLNÍ VÝPISY -----------------");
|
295
|
System.out.println("Linka: "+ bitmap.getLineNumber()+" - Spoj:"+bitmap.getConnectionNumber());
|
296
|
System.out.println("Datum: od: " + bitmap.getDateFrom().getTime() + " | do: " + bitmap.getDateTo().getTime());
|
297
|
System.out.println("První den je: "+bitmap.getFirstDayOfWeek() + " (1 - Neděle; 2 - Pondělí; 3 - Úterý; 4 - Středa; 5 - Čtvrtek; 6 - Pátek; 7 - Sobota)");
|
298
|
System.out.println("Počet dní v rozmezí: " + bitmap.getDateRange());
|
299
|
System.out.println(bitmap.toString());
|
300
|
|
301
|
//Jede pouze v pracovní dny
|
302
|
bitmap.setWorkdays(1);
|
303
|
System.out.println("\nJede v pracovní dny:");
|
304
|
System.out.println(bitmap.toString());
|
305
|
|
306
|
bitmap.fillWithZeros();
|
307
|
|
308
|
bitmap.setSundaysAndHolidays(1);
|
309
|
System.out.println(bitmap.toString());
|
310
|
|
311
|
// Kontrola přemazání
|
312
|
System.out.println("\nKontrola přemazání:");
|
313
|
bitmap.fillWithZeros();
|
314
|
System.out.println(bitmap.toString());
|
315
|
|
316
|
//Nastavit pouze Pondělky - atribut 2
|
317
|
System.out.println("\nJede každé pondělí:");
|
318
|
bitmap.setDaysInWeek(2, 1);
|
319
|
System.out.println(bitmap.toString());
|
320
|
|
321
|
//přemazání
|
322
|
bitmap.fillWithZeros();
|
323
|
|
324
|
Calendar dateTo2 = Calendar.getInstance();
|
325
|
dateTo2.setTime(new Date(2019-1900, 4, 13));
|
326
|
bitmap.setWeeksRange(dateFrom, dateTo2, 1, 1);
|
327
|
System.out.println(bitmap.toString());
|
328
|
|
329
|
//Nastavit liché týdny (zbytek(remainder) 1 - liché)
|
330
|
System.out.println("\nLiché týdny:");
|
331
|
bitmap.setWeeks(1, 1);
|
332
|
System.out.println(bitmap.toString());
|
333
|
|
334
|
|
335
|
|
336
|
|
337
|
}
|
338
|
|
339
|
|
340
|
}
|