Projekt

Obecné

Profil

Stáhnout (14 KB) Statistiky
| Větev: | Revize:
1 cbd6adb3 Daniel Stuš
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 7cafefe1 Daniel Stuš
 * @version 0.8
19 cbd6adb3 Daniel Stuš
 *
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
    /** Pole uchovavajici bitmapu */
35
    private int[] bitmap;
36
37 7cafefe1 Daniel Stuš
    private Calendar goodFriday, easterMonday;
38
39 cbd6adb3 Daniel Stuš
40
41
    //-------------- Konstruktor -------------/
42
43
    /**
44
     * Konstruktor incializuje a nastavuje důležité parametry tridy (@code Bitmap)
45
     *
46
     * @param dateFrom Datum zacatku obdobi
47
     * @param dateTo Datum konce obdobi
48
     * @param lineNumber Cislo linky
49
     */
50 7cafefe1 Daniel Stuš
    public Bitmap(Calendar dateFrom, Calendar dateTo, String lineNumber) {
51 cbd6adb3 Daniel Stuš
        this.dateFrom = dateFrom;
52
        this.dateTo = dateTo;
53
        this.lineNumber = lineNumber;
54
        this.bitmap = new int[(int) getDateRange()];
55 7cafefe1 Daniel Stuš
        getEasterHolidays(dateFrom.get(Calendar.YEAR));
56 cbd6adb3 Daniel Stuš
    }
57
58
59
    //----------------- Metody ----------------/
60
61
    /**
62 7cafefe1 Daniel Stuš
     * Metoda vrací počet dní uživatelem zvoleného období
63 cbd6adb3 Daniel Stuš
     *
64
     * @return Počet dní v uživatelem zvoleném období (rozmezí)
65
     */
66
    public long getDateRange() {
67
        LocalDate from = this.dateFrom.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
68
        LocalDate to = this.dateTo.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
69
70
        long noOfDaysBetween = ChronoUnit.DAYS.between(from, to);
71
        return noOfDaysBetween+1;
72
    }
73
74
    public long getDatePosition(Calendar date) {
75
        LocalDate from = this.dateFrom.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
76
        LocalDate to = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
77
78
        long datePosition = ChronoUnit.DAYS.between(from, to);
79 de8ed2a2 Jan Jirman
        //Re #7443
80
        return datePosition;
81 cbd6adb3 Daniel Stuš
    }
82
83
84
    public void setWorkdays(int value) {
85
        value = validateValue(value);
86 7cafefe1 Daniel Stuš
        Calendar currentDay = (Calendar) this.dateFrom.clone();
87 cbd6adb3 Daniel Stuš
88
        for (int i = 0; i < this.bitmap.length; i++) {
89 7cafefe1 Daniel Stuš
            if (currentDay.get(Calendar.DAY_OF_WEEK) != 7 && currentDay.get(Calendar.DAY_OF_WEEK) != 1 && !isBankHoliday(currentDay)) {
90 cbd6adb3 Daniel Stuš
                this.bitmap[i] = value;
91
            }
92
93 7cafefe1 Daniel Stuš
            currentDay.add(Calendar.DATE, 1);
94 cbd6adb3 Daniel Stuš
        }
95
    }
96
97
    public void setSundaysAndHolidays(int value) {
98
        value = validateValue(value);
99 7cafefe1 Daniel Stuš
        Calendar currentDay = (Calendar) this.dateFrom.clone();
100 cbd6adb3 Daniel Stuš
101
        for (int i = 0; i < this.bitmap.length; i++) {
102 7cafefe1 Daniel Stuš
            if (currentDay.get(Calendar.DAY_OF_WEEK) != 7) {
103 cbd6adb3 Daniel Stuš
                this.bitmap[i] = value;
104
            }
105
106 7cafefe1 Daniel Stuš
            currentDay.add(Calendar.DATE, 1);
107 cbd6adb3 Daniel Stuš
        }
108
    }
109
110
    public void setDay(Calendar day, int value) {
111
        value = validateValue(value);
112
        int dayPosition = (int) getDatePosition(day);
113
114
        bitmap[dayPosition] = value;
115
    }
116
117
118
    public void setOneDayOnly(Calendar day) {
119
        fillWithZeros();
120
        int dayPosition = (int) getDatePosition(day);
121
122
        bitmap[dayPosition] = 1;
123
    }
124
125
    public void setDaysInRange(Calendar from, Calendar to, int value) {
126
        value = validateValue(value);
127 7cafefe1 Daniel Stuš
        Calendar currentDay = (Calendar) this.dateFrom.clone();
128
        to.add(Calendar.DATE, 1);
129
        from.add(Calendar.DATE, -1);
130
131
        for (int i = 0; i < this.bitmap.length; i++) {
132
            if (currentDay.after(from) && currentDay.before(to) && !isBankHoliday(currentDay)) {
133
                this.bitmap[i] = value;
134
            }
135 cbd6adb3 Daniel Stuš
136 7cafefe1 Daniel Stuš
            currentDay.add(Calendar.DATE, 1);
137 cbd6adb3 Daniel Stuš
        }
138
139
    }
140
141
    public void setDaysInWeek(int dayNumber, int value) {
142
        value = validateValue(value);
143 7cafefe1 Daniel Stuš
        Calendar currentDay = (Calendar) this.dateFrom.clone();
144 cbd6adb3 Daniel Stuš
145
        for (int i = 0; i < this.bitmap.length; i++) {
146 7cafefe1 Daniel Stuš
            if (currentDay.get(Calendar.DAY_OF_WEEK) == dayNumber) {
147 cbd6adb3 Daniel Stuš
                this.bitmap[i] = value;
148
            }
149
150 7cafefe1 Daniel Stuš
            currentDay.add(Calendar.DATE, 1);
151 cbd6adb3 Daniel Stuš
        }
152
    }
153
154
    public void setWeeks(int value, int remainder) {
155
        value = validateValue(value);
156 7cafefe1 Daniel Stuš
        Calendar currentDay = (Calendar) this.dateFrom.clone();
157 cbd6adb3 Daniel Stuš
158
        for (int i = 0; i < this.bitmap.length; i++) {
159 7cafefe1 Daniel Stuš
            if ((currentDay.get(Calendar.WEEK_OF_YEAR)%2)==remainder) {
160 cbd6adb3 Daniel Stuš
                this.bitmap[i] = value;
161
            }
162
163 7cafefe1 Daniel Stuš
            currentDay.add(Calendar.DATE, 1);
164 cbd6adb3 Daniel Stuš
165
        }
166
    }
167
168 82a06985 Daniel Stuš
    public void setWeeks(int value, int remainder, int dayNumber) {
169
        value = validateValue(value);
170
        Calendar currentDay = (Calendar) this.dateFrom.clone();
171
172
        for (int i = 0; i < this.bitmap.length; i++) {
173
            if ((currentDay.get(Calendar.WEEK_OF_YEAR)%2) == remainder && currentDay.get((Calendar.DAY_OF_WEEK)) == dayNumber) {
174
                this.bitmap[i] = value;
175
            }
176
177
            currentDay.add(Calendar.DATE, 1);
178
179
        }
180
    }
181
182 cbd6adb3 Daniel Stuš
183
    public void setWeeksRange(Calendar from, Calendar to, int value, int remainder) {
184 7cafefe1 Daniel Stuš
185 cbd6adb3 Daniel Stuš
        value = validateValue(value);
186 7cafefe1 Daniel Stuš
        Calendar currentDay = (Calendar) this.dateFrom.clone();
187
        to.add(Calendar.DATE, 1);
188
        from.add(Calendar.DATE, -1);
189 cbd6adb3 Daniel Stuš
190 7cafefe1 Daniel Stuš
        for (int i = 0; i < this.bitmap.length; i++) {
191
            if (currentDay.after(from) && currentDay.before(to)) {
192
                if ((currentDay.get(Calendar.WEEK_OF_YEAR)%2)==remainder) {
193
                    this.bitmap[i] = value;
194
                }
195 cbd6adb3 Daniel Stuš
            }
196
197 7cafefe1 Daniel Stuš
            currentDay.add(Calendar.DATE, 1);
198 cbd6adb3 Daniel Stuš
        }
199
200
    }
201
202 82a06985 Daniel Stuš
    public void setWeeksRange(Calendar from, Calendar to, int value, int remainder, int dayNumber) {
203
204
        value = validateValue(value);
205
        Calendar currentDay = (Calendar) this.dateFrom.clone();
206
        to.add(Calendar.DATE, 1);
207
        from.add(Calendar.DATE, -1);
208
209
        for (int i = 0; i < this.bitmap.length; i++) {
210
            if (currentDay.after(from) && currentDay.before(to)) {
211
                if ((currentDay.get(Calendar.WEEK_OF_YEAR)%2)==remainder && currentDay.get((Calendar.DAY_OF_WEEK)) == dayNumber) {
212
                    this.bitmap[i] = value;
213
                }
214
            }
215
216
            currentDay.add(Calendar.DATE, 1);
217
        }
218
219
    }
220
221 7cafefe1 Daniel Stuš
    public void unsetHolidays() {
222
        Calendar currentDay = (Calendar) this.dateFrom.clone();
223
224
        for (int i = 0; i < this.bitmap.length; i++) {
225
            if (isBankHoliday(currentDay)) {
226
                this.bitmap[i] = 0;
227
            }
228
229
            currentDay.add(Calendar.DATE, 1);
230
        }
231
    }
232
233 cbd6adb3 Daniel Stuš
234
    /**
235
     * Metoda naplní (přemaže) bitmapu nulami
236
     */
237
    public void fillWithZeros() {
238
        Arrays.fill(this.bitmap, 0);
239
    }
240
241
    /**
242
     * Metoda overuje spravnost zadane hodnoty
243
     * - do bitmapy lze zadat pouze 1 nebo 0
244
     * - v pripade ze uzivatel zada cislo vetsi nez jedna metoda vrati jednotku
245
     * - v pripade ze uzivatel zada cislo mensi nez nula metoda vrati nulu
246
     *
247
     * @param value Uzivatelem zadana hodnota
248
     * @return Nova (spravna hodnota) ukladajici se do bitmapy
249
     */
250
    public static int validateValue(int value) {
251
        if (value < 0) value = 0;
252
        else if (value > 0) value = 1;
253
        else return value;
254
        return value;
255
    }
256
257 7cafefe1 Daniel Stuš
    public boolean isBankHoliday(Calendar cal) {
258
259
        int month = cal.get(Calendar.MONTH);
260
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
261
262
        // 1. ledna - Den obnovy samostatného českého státu | Nový rok
263
        if(month == Calendar.JANUARY && dayOfMonth == 1) {
264
            return true;
265
        }
266
267
        // 1. ledna - Den obnovy samostatného českého státu | Nový rok
268
        if(month == Calendar.JANUARY && dayOfMonth == 1) {
269
            return true;
270
        }
271
272
        // Velikonoční pondělí
273
        if(month == easterMonday.get(Calendar.MONTH) && dayOfMonth == easterMonday.get(Calendar.DAY_OF_MONTH)){
274
            return true;
275
        }
276
277
        // Velký pátek
278
        if(month == goodFriday.get(Calendar.MONTH) && dayOfMonth == goodFriday.get(Calendar.DAY_OF_MONTH)){
279
            return true;
280
        }
281
282
        // 1. května - Svátek práce
283
        if(month == Calendar.MAY && dayOfMonth == 1) {
284
            return true;
285
        }
286
287
        // 8. května - Den vítězství
288
        if(month == Calendar.MAY && dayOfMonth == 8) {
289
            return true;
290
        }
291
292
        // 5. července - Den slovanských věrozvěstů Cyrila a Metoděje
293
        if(month == Calendar.JULY && dayOfMonth == 5) {
294
            return true;
295
        }
296
297
        // 6. července - Den upálení mistra Jana Husa
298
        if(month == Calendar.JULY && dayOfMonth == 6) {
299
            return true;
300
        }
301
302
        // 28. září – Den české státnosti
303
        if(month == Calendar.SEPTEMBER && dayOfMonth == 28) {
304
            return true;
305
        }
306
307
        // 28. října – Den vzniku samostatného československého státu
308
        if(month == Calendar.OCTOBER && dayOfMonth == 28) {
309
            return true;
310
        }
311
312
        // 17. listopadu – Den boje za svobodu a demokracii
313
        if(month == Calendar.NOVEMBER && dayOfMonth == 17) {
314
            return true;
315
        }
316
317
        // 24. prosince – Štědrý den
318
        if(month == Calendar.DECEMBER && dayOfMonth == 24) {
319
            return true;
320
        }
321
322
        // 25. prosince – 1. svátek vánoční
323
        if(month == Calendar.DECEMBER && dayOfMonth == 25) {
324
            return true;
325
        }
326
327
        // 26. prosince – 2. svátek vánoční
328
        if(month == Calendar.DECEMBER && dayOfMonth == 26) {
329
            return true;
330
        }
331
332
        // Není svátek
333
        return false;
334
335
    }
336
337
    public void getEasterHolidays(int year) {
338
        int Y = year;
339
        int a = Y % 19;
340
        int b = Y / 100;
341
        int c = Y % 100;
342
        int d = b / 4;
343
        int e = b % 4;
344
        int f = (b + 8) / 25;
345
        int g = (b - f + 1) / 3;
346
        int h = (19 * a + b - d - g + 15) % 30;
347
        int i = c / 4;
348
        int k = c % 4;
349
        int L = (32 + 2 * e + 2 * i - h - k) % 7;
350
        int m = (a + 11 * h + 22 * L) / 451;
351
        int n = h + L - 7 * m + 114;
352
        int month = n / 31;
353
        int day = (n % 31) + 1;
354
355
        Calendar easterMonday = Calendar.getInstance();
356
        //Velikonoční pondělí --> Velikonoční neděle + 1
357
        easterMonday.setTime(new Date(year-1900, month-1, day+1));
358
        //Velký pátek --> Velikonoční neděle - 2
359
        Calendar goodFriday = Calendar.getInstance();
360
        goodFriday.setTime(new Date(year-1900, month-1, day-2));
361
362
        this.easterMonday = easterMonday;
363
        this.goodFriday = goodFriday;
364
    }
365
366
    public String getBitmapString() {
367
        return Arrays.toString(this.bitmap).replaceAll("\\[|\\]|,|\\s", "");
368
    }
369
370 cbd6adb3 Daniel Stuš
    public Calendar getDateFrom() {
371
        return dateFrom;
372
    }
373
374
    public void setDateFrom(Calendar dateFrom) {
375
        this.dateFrom = dateFrom;
376
    }
377
378
    public Calendar getDateTo() {
379
        return dateTo;
380
    }
381
382
    public void setDateTo(Calendar dateTo) {
383
        this.dateTo = dateTo;
384
    }
385
386
    public String getLineNumber() {
387
        return lineNumber;
388
    }
389
390
    public void setLineNumber(String lineNumber) {
391
        this.lineNumber = lineNumber;
392
    }
393
394
    public int[] getBitmap() {
395
        return bitmap;
396
    }
397
398
    public void setBitmap(int[] bitmap) {
399
        this.bitmap = bitmap;
400
    }
401
402
    @Override
403
    public String toString() {
404
        return Arrays.toString(this.bitmap);
405
    }
406
407
408
    /**
409
     *
410
     * hlavni metoda pro ozkouseni funkcnosti {@code Bitmap}
411
     *-issue #7374
412
     *
413
     * @param args parametry programu
414
     */
415
    public static void main(String[] args) {
416
417
        Calendar dateFrom = Calendar.getInstance();
418
        Calendar dateTo = Calendar.getInstance();
419
        dateFrom.setTime(new Date(2019-1900, 4, 1)); // -- Jen pro testování Deprecated --
420
        dateTo.setTime(new Date(2019-1900, 4, 31)); // rok udáván od 1900, měsíc se počítá od 0
421
422
423 7cafefe1 Daniel Stuš
        Bitmap bitmap = new Bitmap(dateFrom, dateTo, "143440");
424 cbd6adb3 Daniel Stuš
425
426
        // ------------- KONTROLNÍ VÝPISY -----------------
427
        System.out.println("------------- KONTROLNÍ VÝPISY -----------------");
428 7cafefe1 Daniel Stuš
        System.out.println("Linka: "+ bitmap.getLineNumber());
429 cbd6adb3 Daniel Stuš
        System.out.println("Datum: od: " + bitmap.getDateFrom().getTime() + " | do: " + bitmap.getDateTo().getTime());
430 7cafefe1 Daniel Stuš
        System.out.println("První den je: "+bitmap.getDateFrom().get(Calendar.DAY_OF_WEEK) + " (1 - Neděle; 2 - Pondělí; 3 - Úterý; 4 - Středa; 5 - Čtvrtek; 6 - Pátek; 7 - Sobota)");
431 cbd6adb3 Daniel Stuš
        System.out.println("Počet dní v rozmezí: " + bitmap.getDateRange());
432
        System.out.println(bitmap.toString());
433
434
        //Jede pouze v pracovní dny
435
        bitmap.setWorkdays(1);
436
        System.out.println("\nJede v pracovní dny:");
437
        System.out.println(bitmap.toString());
438 de8ed2a2 Jan Jirman
        
439
        bitmap.fillWithZeros();
440
        
441
        bitmap.setSundaysAndHolidays(1);
442
        System.out.println(bitmap.toString());
443 cbd6adb3 Daniel Stuš
444
        // Kontrola přemazání
445
        System.out.println("\nKontrola přemazání:");
446
        bitmap.fillWithZeros();
447
        System.out.println(bitmap.toString());
448
449
        //Nastavit pouze Pondělky - atribut 2
450
        System.out.println("\nJede každé pondělí:");
451
        bitmap.setDaysInWeek(2, 1);
452
        System.out.println(bitmap.toString());
453
454
        //přemazání
455
        bitmap.fillWithZeros();
456 de8ed2a2 Jan Jirman
        
457
        Calendar dateTo2 = Calendar.getInstance();
458
        dateTo2.setTime(new Date(2019-1900, 4, 13));
459
        bitmap.setWeeksRange(dateFrom, dateTo2, 1, 1);
460
        System.out.println(bitmap.toString());
461 cbd6adb3 Daniel Stuš
462
        //Nastavit liché týdny (zbytek(remainder) 1 - liché)
463
        System.out.println("\nLiché týdny:");
464
        bitmap.setWeeks(1, 1);
465
        System.out.println(bitmap.toString());
466
467 7cafefe1 Daniel Stuš
        //Velikonoce pro svátky
468
        System.out.println("Velikonoční pondělí: " + bitmap.easterMonday.getTime());
469
        System.out.println("Velký pátek: " + bitmap.goodFriday.getTime());
470 cbd6adb3 Daniel Stuš
471
472
    }
473
474
475
}