ii
eské vysoké u£ení technické v Praze Fakulta elektrotechnická Katedra po£íta£·
Diplomová práce
Aplikace pro výpo£et biatlonových závod·
Zuzana Malaníková
Vedoucí práce:
Ing. Ivo Malý
Studijní program: Elektrotechnika a informatika, dobíhající, Magisterský
Obor: Výpo£etní technika
23. ledna 2009
iv
v
Pod¥kování Ráda bych na tomto míst¥ pod¥kovala panu inºenýru Ivu Malému. M·j dík mu pat°í nejen za podn¥tné rady a p°ipomínky, které mi v rámci pravidelných konzultací poskytl, ale p°edev²ím za cenný £as, který mi v souvislosti s nimi v¥noval.
vi
vii
Prohlá²ení Prohla²uji, ºe jsem práci vypracovala samostatn¥ a pouºila jsem pouze podklady uvedené v p°iloºeném seznamu. Nemám závaºný d·vod proti uºití tohoto ²kolního díla ve smyslu 60 Zákona £. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o zm¥n¥ n¥kterých zákon· (autorský zákon).
V Praze dne 23. 1. 2009
.............................................................
viii
Abstract The goal of the thesis is to create an application for a processig of biathlon events data in the Czech repupblic, which supports race preparation, data management and collection, printing and results calculation. The thesis consists of an application design based on created analysis of biathlon events data processing technique and it's implementation. The application is implemented in Java programming language.
Abstrakt Výsledkem práce je vytvo°ení aplikace pro zpracování dat biatlonových závod· v R, která zaji²´uje p°ípravu závodu, správu a sb¥r dat, tisk dat a výpo£et výsledk· závodu. Práce sestává z návrhu aplikace vycházející z provedené analýzy zp·sobu zpracovávání dat biatlonových závod· a z popisu její implementace. Aplikace je implementována v programovacím jazyce Java.
ix
x
Obsah 1 Úvod
1
2 Poºadavky a specikace 2.1 2.2
2.3 2.4
Úvod . . . . . . . . . . . . . . . . . . . . . . Funk£ní poºadavky . . . . . . . . . . . . . . 2.2.1 Aktivity p°ed startem závodu . . . . 2.2.1.1 P°íprava závodu . . . . . . 2.2.2 Aktivity v pr·b¥hu závodu . . . . . 2.2.2.1 Start závodu . . . . . . . . 2.2.2.2 Pr·b¥h závodu . . . . . . . 2.2.3 Aktivity po skon£ení závodu . . . . . 2.2.3.1 Úpravy výsledk· . . . . . . 2.2.3.2 Vyhodnocení výsledk· . . . 2.2.3.3 Odevzdání výsledk· . . . . Systémové poºadavky . . . . . . . . . . . . Poºadavky vzhledem k existujícímu systému
3 Analýza 3.1 3.2 3.3 3.4
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uºivatelské role . . . . . . . . . . . . . . . . . . . . . . Hranice systému . . . . . . . . . . . . . . . . . . . . . innosti operátora . . . . . . . . . . . . . . . . . . . . 3.4.1 Import a export dat . . . . . . . . . . . . . . . 3.4.1.1 P°ípad uºití: Import dat . . . . . . . . 3.4.2 Správa dat . . . . . . . . . . . . . . . . . . . . 3.4.2.1 P°ípad uºití: Vytvo°it závodníka . . . 3.4.2.2 P°ípad uºití: Upravit závodníka . . . . 3.4.2.3 P°ípad uºití: Smazat závodníka . . . . 3.4.3 Tvorba startovní listiny . . . . . . . . . . . . . 3.4.3.1 P°ípad uºití: Provést prezentaci . . . . 3.4.3.2 P°ípad uºití: Vytvo°it startovní listinu 3.4.4 Zobrazování dat . . . . . . . . . . . . . . . . . 3.4.4.1 P°ípad uºití: Zobrazit detail závodu . 3.4.5 Zm¥na nastavení . . . . . . . . . . . . . . . . . 3.4.5.1 P°ípad uºití: Zm¥nit nastavení . . . . 3.4.6 Tisk . . . . . . . . . . . . . . . . . . . . . . . . 3.4.6.1 P°ípad uºití: Tisknout . . . . . . . . . xi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3 3 3 4 4 4 5 5 5 5 7 7 7
9
9 9 10 11 12 12 13 13 13 14 14 14 15 16 16 18 18 18 18
xii
OBSAH
3.5 3.6
3.4.7 Práce se závodem z hlediska dynamiky Databáze . . . . . . . . . . . . . . . . . . . . 3.5.1 P°ípad uºití: Poskytnout údaje . . . . asomíra . . . . . . . . . . . . . . . . . . . . 3.6.1 P°ípad uºití: Zaslat £asy . . . . . . .
chování . . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Java Data Object a JPOX . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 Enhancement proces . . . . . . . . . . . . . . . . . . . . . . 5.2.2 Persistence . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.2.1 Persistence descriptor . . . . . . . . . . . . . . . . 5.2.2.2 PersistenceManagerFactory a PersistenceManager 5.2.2.3 Kongurace PersistenceManagerFactory . . . . . . 5.2.3 Práce s persistentními objekty . . . . . . . . . . . . . . . . 5.2.4 JPOX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Jasperreports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dom4j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4.1 Generování XML . . . . . . . . . . . . . . . . . . . . . . . . 5.4.2 Na£ítání XML . . . . . . . . . . . . . . . . . . . . . . . . . JavaComm a RxTx . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
4 Návrh 4.1 4.2 4.3
4.4 4.5
Úvod . . . . . . . . . . . . . . . . . . . . . Diagram komponent . . . . . . . . . . . . Datový model . . . . . . . . . . . . . . . . 4.3.1 Událost . . . . . . . . . . . . . . . 4.3.2 Závod . . . . . . . . . . . . . . . . 4.3.3 Startovní kategorie . . . . . . . . . 4.3.4 Údaje jednotlivce v závodu . . . . 4.3.5 Závodník . . . . . . . . . . . . . . 4.3.6 Klub . . . . . . . . . . . . . . . . . 4.3.7 Kategorie a Druh . . . . . . . . . . 4.3.8 Dopl¬ující tabulky . . . . . . . . . 4.3.8.1 Aktuální data závodníka . 4.3.8.2 asy . . . . . . . . . . . . 4.3.8.3 Koecienty . . . . . . . . Diagram t°íd datových entit . . . . . . . . Vým¥na dat . . . . . . . . . . . . . . . . . 4.5.1 XML schéma pro import . . . . . . 4.5.2 XML schéma pro export . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
5 Pouºité technologie 5.1 5.2
5.3 5.4
5.5
6 Implementace 6.1 6.2 6.3 6.4
Úvod . . . . . . . . . Struktura programu Databáze . . . . . . Ukládání dat . . . . 6.4.1 Anotace t°íd
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
18 19 20 20 20
23
23 23 24 25 25 26 26 27 27 28 29 30 30 30 31 33 34 35
37
37 37 38 38 38 39 39 40 41 41 42 42 42 43
45
45 45 46 47 47
xiii
OBSAH
6.5 6.6
6.7 6.8
6.4.2 Práce s daty . . . . . . . . . . . . . . . . . . . . . 6.4.3 SQL . . . . . . . . . . . . . . . . . . . . . . . . . Aktuální závod . . . . . . . . . . . . . . . . . . . . . . . P°íprava závodu . . . . . . . . . . . . . . . . . . . . . . . 6.6.1 Prezentace . . . . . . . . . . . . . . . . . . . . . . 6.6.2 Startovní listina . . . . . . . . . . . . . . . . . . 6.6.2.1 Losování . . . . . . . . . . . . . . . . . 6.6.2.2 Startovní £ísla a £asy . . . . . . . . . . 6.6.3 Tabulky a zobrazení dat v nich . . . . . . . . . . 6.6.3.1 Datový model tabulky . . . . . . . . . . 6.6.3.2 Zobrazova£e a editory v tabulkách . . . 6.6.4 Tisk . . . . . . . . . . . . . . . . . . . . . . . . . 6.6.4.1 T°ída TiskStartovka a TiskVysledky . . 6.6.4.2 Zdroj dat pro report . . . . . . . . . . . Pr·b¥h závodu . . . . . . . . . . . . . . . . . . . . . . . 6.7.1 Zpracovávání £as· a st°eleb . . . . . . . . . . . . 6.7.2 Sériové rozhraní . . . . . . . . . . . . . . . . . . . Dokon£ení závodu . . . . . . . . . . . . . . . . . . . . . 6.8.1 Úprava výsledk· . . . . . . . . . . . . . . . . . . 6.8.2 Výpo£et výsledk· . . . . . . . . . . . . . . . . . . 6.8.3 Odevzdání výsledk· . . . . . . . . . . . . . . . . 6.8.3.1 Zobrazení stromové struktury událostí a 6.8.3.2 Vytvo°ení souboru pro export . . . . . . 6.8.3.3 Na£tení souboru s importovanými daty
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . závod· . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
48 49 50 51 52 53 54 54 55 55 56 57 57 58 59 59 60 61 61 62 64 64 65 67
7 Záv¥r
69
Literatura
71
A Databázový model
73
B XML schéma Denice dat
75
C Instala£ní a uºivatelská p°íru£ka
79
C.1 Instala£ní p°íru£ka . . . . . . . . . . . C.2 Uºivatelská p°íru£ka . . . . . . . . . . C.2.1 P°ipojení k databázi . . . . . . C.2.2 Práce se závodem . . . . . . . . C.2.3 Zobrazení otev°eného závodu . C.2.4 Prezentace . . . . . . . . . . . . C.2.5 Startovní listina . . . . . . . . C.2.6 Nastavení výpo£tu závodu . . . C.2.7 Tisk startovní listiny . . . . . . C.2.8 Práce se sériovým portem . . . C.2.9 Manuální zadávání £as· . . . . C.2.10 Automatický p°íjem £as·, práce C.2.11 Zadávání st°eleb . . . . . . . . C.2.12 Zadávání trestných kol . . . . . C.2.13 Zadávání údaj· jednotlivce . .
. . . . . . . . . . . s . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . £asomírou . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
79 80 81 81 83 83 85 87 87 88 89 89 91 91 91
xiv
OBSAH
C.2.14 C.2.15 C.2.16 C.2.17 C.2.18
Výpo£et závod· . . . . Tisk výsledkové listiny . Ukon£ení závodu . . . . Import a export dat . . Vytvo°ení nového klubu
D Obsah p°iloºeného CD
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
93 93 94 94 95
97
Seznam obrázk· 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9
Kontextový diagram . . . . . . . . . . Use Case - £innost operátora . . . . . Diagram aktivit - práce s aplikací . . . Diagram aktivit - proces prezentace . . Diagram aktivit - p°epo£ítání výsledk· Diagram aktivit - práce se závodem . . Use Case - databáze . . . . . . . . . . Use Case - £asomíra . . . . . . . . . . Diagram aktivit - p°íjem £as· . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
11 11 12 16 17 19 20 21 21
4.1 4.2 4.3 4.4 4.5 4.6
Diagram komponent . . . . . . . . . . . . . . . . . . . . . . Základní £ást datového modelu . . . . . . . . . . . . . . . . Datový model spojení tabulek StartUdaje a Casy . . . . . . Datový model ukazující propojení tabulek Kategorie a Druh Diagram t°íd - generalizující t°ída DBList . . . . . . . . . . Diagram t°íd - startovní listina . . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
23 24 27 29 32 33
6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12
GUI GUI GUI GUI GUI GUI GUI GUI GUI GUI GUI GUI
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
52 53 54 55 57 59 60 62 63 64 65 66
-
práce se závodem . . . . . prezentace závodník· . . . startovní listina . . . . . . nastavení £as· závodník· . tisk startovní listiny . . . . £asomíra a st°elnice . . . . automatická £asomíra . . . výsledky jednotlivce . . . . výsledky v²ech závodník· . nastavení zp·sobu výpo£tu export dat . . . . . . . . . import dat . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
A.1 Databázový model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 C.1 C.2 C.3 C.4 C.5 C.6
P°ipojení k databázi . . . . . Práce se závodem . . . . . . . Vytvo°ení události . . . . . . Vytvo°ení závodu . . . . . . . Zobrazení otev°eného závodu Prezentace závodník· . . . . .
. . . . . .
. . . . . .
. . . . . . xv
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
81 82 82 83 83 84
xvi
SEZNAM OBRÁZK
C.7 Úprava závodníkových údaj· . . . C.8 Startovní listina . . . . . . . . . . . C.9 Editace startovní kategorie . . . . . C.10 Nastavení £as· závodník· . . . . . C.11 Nastavení výpo£tu . . . . . . . . . C.12 Tisk startovní listiny . . . . . . . . C.13 Nastavení parametr· sériové linky . C.14 Manuální zadávání £as· . . . . . . C.15 Automatická £asomíra . . . . . . . C.16 Zadávání a zobrazení st°eleb . . . . C.17 Zadávání a zobrazení trestných kol C.18 Zadávání údaj· jednotlivce . . . . C.19 Zobrazení výsledk· závod· . . . . . C.20 Import dat . . . . . . . . . . . . . C.21 Export dat . . . . . . . . . . . . . C.22 Vytvo°ení nového klubu . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
84 85 86 86 88 88 89 90 90 91 92 92 93 94 95 95
Seznam tabulek 2.1
Tabulka závodních disciplín . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12
Tabulka Tabulka Tabulka Tabulka Tabulka Tabulka Tabulka Tabulka Tabulka Tabulka Tabulka Tabulka
Udalost . . . . . . . . Udalost - provizorní ID Zavod . . . . . . . . . StartKategorie . . . . Zavodnik . . . . . . . . Klub . . . . . . . . . . Kategorie . . . . . . . Druh . . . . . . . . . . KategorieDruh . . . . ZavodnikAktual . . . . Casy . . . . . . . . . . Koecienty . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
xvii
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
6 25 25 26 26 27 28 28 29 29 30 30 31
xviii
SEZNAM TABULEK
Kapitola 1
Úvod Práce p°edstavená na následujících °ádcích se zabývá problematikou výpo£tu biatlonových závod· a p°iná²í °e²ení jeho zpracování. Biatlon je zimní b¥ºecký závod na lyºích, p°i kterém závodník absolvuje st°elbu z maloráºní pu²ky. Sou£asn¥ se provozuje také letní biatlon, ve kterém se b¥h na lyºích nahrazuje klasickým b¥hem. S vývojem biatlonu do jeho dne²ní podoby, stejn¥ jako i u jiných sport·, ale de facto i jiných oblastí lidské £innosti, p°ichází logicky poºadavek na p°esnost a úplnost shromaº¤ovaných informací. S roustoucím lidským potenciálem ve sportovních odv¥tvích se vyrovnávají schopnosti vrcholových sportovc·, coº je fakt, který klade za cíl zp°es¬ování t¥chto dat. Jedinou sch·dnou cestou jak naplnit tyto poºadavky je pak vyuºití výpo£etní techniky, která ve spojení s vhodým softwarovým vybavením je schopná obslouºit správcovství souvisejících informací na poºadované úrovni. Pro biatlonové závody v R je vedena statistika výsledk· závodník·. Tato je centráln¥ zpracovávána pro v²echny závody na celém území republiky. Výsledky závod· jsou ihned na míst¥ vyhodnoceny a následn¥ p°edávány na centrální úrove¬, kde se celorepublikov¥ vyhodnocují a vypracovávají statistiky. Zde lze identikovat dva odli²né zp·soby práce v rámci zpracovávání dat biatlonových závod· v R. Jinak se data vyhodnocují ihned po skon£ení závodu a jinak pak na centrální úrovni. Výstupem závod· jsou detailní výsledky závodník· ú£astnících se místních závod·. Centrální správa tyto údaje vyuºívá pro výpo£et globálních statistik jednotlivých závodník· v rámci celé republiky. Úkolem mé diplomové práce je seznámit se podrobn¥ s problematikou zpracovávání biatlonových závod·, s procesy spojenými s jejich p°ípravou, s procesy uskute£¬ovanými v pr·b¥hu a p°i vyhodnocování závod·. Je t°eba identikovat jednotlivé aktivity, zam¥°it se na jejich chronologickou posloupnost £i provázanost. Pracovní postupy jsou do ur£ité míry vymezovány pravidly platnými pro biatlonové závody. Z t¥chto pravidel (viz [10]) se bude vycházet v pr·b¥hu tvorby této práce. Výsledkem mé diplomové práce má být aplikace zohled¬ující pouºívané pracovní procesy a vyuºívající technického vybavení, které je v sou£asnosti k dispozici. Aplikace bude slouºit pro p°ípravu závod·, bude podporovat automatické procesy probíhající v pr·b¥hu závod· a taktéº vyhodnotí získaná data. Tato data se budou odevzdávat dále pro centrální zpracování statistik. 1
2
KAPITOLA 1.
ÚVOD
Aplikace pouºívaná v sou£asnosti pro zpracování závod· se brzy stane nevyhovující. A to vzhledem k nov¥ vyvíjenému webovému informa£nímu systému pro centrální správu statistik a výsledk· závodník·. Variantou by bylo stávající systém p°izp·sobit tak, aby byl kompatibilní s novým informa£ním systémem. Dal²ím moºným °e²ením je vývoj nové aplikace, která nejenºe umoºní návaznost na nový centrální systém, ale bude poskytovat i dal²í výhody. T¥mito pozitivy se má stát p°edev²ím moºnost její roz²i°itelnosti do budoucna podle nov¥ se objeviv²ích pot°eb a poºadavk·. Mým úkolem je zrealizovat druhou variantu a tudíº vytvo°it program podporující práci operátor· biatlonových závod·.
Kapitola 2
Poºadavky a specikace 2.1
Úvod
Pracovní postupy a poºadovaná funk£nost, jak uº bylo zmín¥no, jsou ovlivn¥ny existujícími pravidly biatlonu, jejichº nejd·leºit¥j²í body stru£n¥ shrnu v následující kapitole. Závodníci sout¥ºí v kategoriích, které lze rozd¥lit na ºákovské, dorostenecké a seniorské, pokrývající v¥k od 10ti let. Bliº²í roz£len¥ní kategorií lze nalézt v pravidlech biatlonu viz [10]. P°itom je moºné, aby závodník startoval i za kategorii, do které svým v¥kem nespadá. Vºdy se v²ak dodrºuje d¥lení kategorií podle pohlaví. Sout¥ºí se v n¥kolika disciplínách, které odli²ují závody hlavn¥ z hlediska pr·b¥hu, ale také z pohledu záv¥re£ného vyhodnocení výsledk·. Atributy rozli²ující disciplíny jsou nap°. zp·sob st°elby nebo délka trat¥. Av²ak zvlá²tností je, ºe tyto atributy nejsou zcela nem¥nné. Stanovují se odli²n¥ pro zimní a letní sezónu, p°ípadn¥ se ur£í jednorázov¥ pro jeden konkrétní závod. Podrobn¥j²í popis odli²ností jednotlivých disciplín je uveden v následující kapitole.
2.2 2.2.1
Funk£ní poºadavky Aktivity p°ed startem závodu
Závodem se rozumí b¥h jedné disciplíny (ozna£ované téº jako druh závodu), kterého se ú£astní vícero kategorií. Závody se sdruºují do událostí, kdy událostí rozumíme souhrn jednoho aº více závod·. Ta pak m·ºe zabírat £asové rozmezí i více dn· (typicky nap°. dva dny víkendu). Událost má tedy smysl pouze z hlediska lep²í strukturovanosti a klasikace závod· co se tý£e doby, kdy se konaly. Událost probíhá v jednom ur£itém míst¥ Závodu se ú£astní závodníci, jejichº údaje se musí uchovávat. Krom¥ základních údaj· jako jméno, p°íjmení, datum narození závodníka se eviduje také kategorie, výkonnostní t°ída (1, 2, 3, M nebo ºádná) a taktéº klub, ve kterém je zaregistrován a p°ípadn¥ ve kterém hostuje. Na za£átku sezóny je t°eba údaje o p°ipravovaných událostech, závodech a závodnících, kte°í se jich budou ú£astnit, p°edat z centrální úrovn¥ do jednotlivých oblastí, coº bude aplikací podporováno. To, ºe jsou údaje distribuovány z jednoho centrálního 3
4
KAPITOLA 2.
POADAVKY A SPECIFIKACE
úloºi²t¥ dat, ale neznamená, ºe není moºné p°ímo na míst¥ konání závodu dodenovat závody, události £i závodníky nové, p°ípadn¥ m¥nit data získaná p°ed za£átkem sezóny. Dochází také k nutnosti vytvo°ení nového klubu a to v p°ípad¥, ºe sout¥ºící je ze zahrani£í a jeho klub není v databázi k dispozici. Rovn¥º je povoleno v p°ípad¥ pot°eby událost, závod nebo závodníka z aplikace smazat.
2.2.1.1 P°íprava závodu Závodník, který se chce ú£astnit závodu, oznámí sv·j zám¥r registrací neboli p°ihlá²ením do závodu. Registrace probíhá mimo systém písemn¥, faxem £i emailem a má p°edev²ím informa£ní charakter (kolik závodník· pob¥ºí). Jakmile se závodník dostaví na místo závodu, je zaprezentován. Tento proces jiº bude aplikace podporovat. Prezentací dostaviv²ích se závodník· vzniká postupn¥ startovní listina, £ili souhrn b¥ºc· pro daný závod. P°i tvorb¥ startovní listiny operátor p°id¥luje závodník·m startovní £ísla a startovní £asy. Po°adí závodník· je ur£eno náhodným losováním. Losování se provádí v rámci jednotlivých kategorií. Pro stíhací závod a závod s hromadným startem se náhodné rozlosování neprovádí, coº vychází ze specik t¥chto disciplín. Podrobn¥ se jimi budu zabývat na jiném míst¥ v této kapitole. Je-li ur£eno po°adí závodník· na startu, p°id¥lí se b¥ºc·m startovní £ísla. P°i°azení startovních £as· se li²í podle b¥ºecké disciplíny, nap°. u závodu s hromadným startem je £as startu pro závodníky shodný, v jiných disciplínách startují s odstupy. Závodníci jsou vºdy seskupeni tak, aby jednotlivé kategorie vybíhaly na tra´ za sebou. Po°adí startu kategorií ur£í operátor. Nastavování startovních £as· musí být velmi exibilní, jelikoº situace na startu £asto vyºaduje uº stanovené rozd¥lení £as· aktuáln¥ m¥nit podle pot°eby (na poslední chvíli p°ibude závodník, je t°eba p°esunout celou skupinu závodníku o ur£itý interval, dojde k posunu startu závodu,. . . ). Dohotovenou startovní listinu operátor vytiskne. Je moºné ji vytisknout taktéº £áste£n¥ pro jednotlivé kategorie.
2.2.2
Aktivity v pr·b¥hu závodu
2.2.2.1 Start závodu Odstartování závodníka na tra´ probíhá bu¤ pomocí ru£ního m¥°ení, kdy dává startér závodníkovi povel dle £asu startu nebo je startovní povel dán zvukem startovacích hodin. asem startu je pak £as zaznamenaný elektronicky startovací brankou. Závodník m·ºe odstartovat v rozmezí 3 sekund p°ed nebo po startovacím £ase daném startovní listinou. Odstartuje-li pozd¥ji, je sm¥rodatný £as ve startovní listin¥. Start p°ed povoleným £asovým rozmezím je povaºován za p°ed£asný start. Závodník je startérem vrácen zp¥t a odstartuje znovu ve správném £ase. Nestihne-li to, je za £as startu povaºován £as daný startovní listinou.
2.2.
FUNKNÍ POADAVKY
5
2.2.2.2 Pr·b¥h závodu V pr·b¥hu závodu je biatlonista povinen na st°elnici absolvovat st°elecké poloºky, jejichº po£et a zp·sob je dán kategorií závodníka a závodní disciplínou. Maximální po£et st°eleb jsou £ty°i. St°elba se provádí bu¤ vestoje nebo vleºe na cíl s p¥ti jednotlivými ter£i. Za chybný zásah je závodník penalizován bu¤ £asovou p°iráºkou (vytrvalostní závod) nebo trestným kolem. Hodnota £asové p°iráºky a délka trestného kola jsou ur£eny kategorií závodníka. Výsledky st°eleb jsou zaznamenávány do systému ru£n¥ tak, jak p°icházejí ze st°elnice. Závodník·m dokon£ujícím závod je m¥°en £as v cíli. Zpracování cílového £asu je bu¤ manuální nebo automatické. V prvním p°ípad¥ operátor vkládá do systému £as ru£n¥. V druhém p°ípad¥ je £as z £asomíry automaticky zaznamenáván aplikací. Systém v²ak nedokáºe rozpoznat, který závodník do cíle dorazil, a proto je zde pot°ebný zásah operátora, který cílovým £as·m p°i°azuje ru£n¥ p°íslu²ná startovní £ísla. Jiº v pr·b¥hu závod· se zpracovávají výsledky alespo¬ t¥ch závodník·, kte°í jiº závod dokon£ili. 2.2.3
Aktivity po skon£ení závodu
2.2.3.1 Úpravy výsledk· Nejd·leºit¥j²ími údaji pro výpo£et výsledku závodníka jsou jeho startovní a cílový £as. Obecn¥ platí, ºe výsledný £as se rovná b¥ºeckému £asu modikovanému o £asové úpravy. B¥ºecký £as je dán rozdílem £asu závodníka v cíli a na startu (resp. £asu závodníka v cíli a £asu startu prvního závodníka pro stíhací závod). asové úpravy neboli p°iráºky obvykle dopl¬ují operáto°i ru£n¥. Rozli²ují se dva druhy p°iráºek. První si závodník vyslouºí pouze ve vytrvalostním závod¥, kde se neb¥ºí trestná kola. Tato £asová úprava závisí na po£tu netrefených ter£·. Druhý typ p°iráºky m·ºe mít jak formu znevýhodn¥ní tak i zvýhodn¥ní a ukládá se závodníkovi podle aktuálních okolností (kompenzace nezavin¥ného zdrºení na st°elnici, chyba na st°elnici. . . ). B¥ºnou úpravou závodníkových výsledk· po skon£ení závodu je také poznámka pro£ nestartoval, pro£ byl diskvalikován nebo práv¥ zd·vodn¥ní ud¥leného £asového zvýhodn¥ní/znevýhodn¥ní. Výsledky stejn¥ jako startovní listina se tisknou.
2.2.3.2 Vyhodnocení výsledk· Zp·sob vyhodnocení výsledk· se odli²uje u jednotlivých disciplín. Shrnu zde základní parametry (n¥které uº byly v textu zmín¥ny), kterými se závodní disciplíny li²í. Disciplínami, se kterými aplikace pracuje, jsou vytrvalostní závod, rychlostní závod, stíhací závod a závod s hromadným startem. Start závodu probíhá bu¤ hromadn¥, nebo závodníci vybíhají na tra´ v £asových odstupech. Intervaly startu závodník· jsou pro danou disciplínu bu¤ pevn¥ stanoveny (nap°. p·lminutové,. . . ) nebo jsou ur£eny výsledky p°edchozího závodu. Pro stíhací závod závodník startuje s takovým odstupem, jaký m¥l na p°edchozího závodníka ve výsledkové listin¥ kvalika£ního závodu (nej£ast¥ji rychlostního). B¥ºí-li se stíhací závod podle výsledk· vytrvalostního závodu, startuje se v £asových intervalech, které odpovídají polovin¥ ztráty z p°edchozího závodu.
6
KAPITOLA 2.
POADAVKY A SPECIFIKACE
St°elba zahrnuje obvykle £ty°i st°elecké poloºky (s výjimkou rychlostního závodu) a provádí se bu¤ vleºe nebo ve stoje. Za kaºdou netrefenou ránu p°i st°elb¥ se podle druhu závodu ud¥luje závodníkovi ob¥hnutí trestného kola, nebo £asová p°iráºka. Vít¥zem závodu se u rychlostního a vytrvalostního závodu stává závodník s nejlep²ím vít¥zným £asem, coº je rozdíl £asu v cíli a na startu upravený o £asové p°iráºky. U stíhacího závodu a závodu s hromadným startem se vít¥zem stává ten, který jako první prob¥hne cílem (s ohledem na £asové úpravy). P°ehled odli²ností jednotlivých disciplín spolu se vzorcem pro výpo£et výsledného £asu je uveden v tabulce 2.1.
Start St°elecké poloºky St°elba Vít¥z Výsl. £as
Stíhací závod
Závod s hromadným startem
Vytrvalostní závod
Rychlostní závod
intervaly
intervaly
odstupy dle výsledk· kvalif. závodu
LSLS
LS
LLSS
LLSS
trestné minuty
trestná kola
trestná kola
trestná kola
nejniº²í výsl. £as
nejniº²í výsl. £as
první v cíli
první v cíli
(Cil − Start)+ S ∗ P netr ± P
(Cil − Start) ±P
(Cil − Start 1.zav) ±P
(Cil − Start) ±P
hromadný
Tabulka 2.1: Tabulka závodních disciplín st°elecké poloºky se st°ídají - vleºe, vestoje, vleºe a poslední ve stoje cílový £as Start startovní £as Start 1.záv startovní £as prvního závodníka S sou£et netrefených ter£· ve st°elb¥ Pnetr p°iráºka za netrefenou ránu P p°iráºka LSLS
Cíl
Závodník·m se p°id¥lují dle dosaºených výsledk· body. Vzorec pro výpo£et bod· má tvar (2 ∗ casV iteze) − casZavodnika body = ∗ 100 ∗ koef icient, (2.1) casV iteze kde gurují výsledné £asy vít¥ze a závodníka a také koecient stanovený pro startovní kategorii. Ke koecient·m blíºe v kapitole 4.3.8.3.
2.3.
SYSTÉMOVÉ POADAVKY
7
2.2.3.3 Odevzdání výsledk· Pro umoºn¥ní pr·b¥ºného vyhodnocování statistik biatlonist· na celorepublikové úrovni je t°eba odevzdávat výsledky sout¥ºí do centrální databáze pr·b¥ºn¥ po celou sezónu. Nahrávání výsledk· do centrální databáze probíhá obdobnou formu jako importování událostí, závod· a závodník· na za£átku sezóny.
2.3
Systémové poºadavky
Aplikace by m¥la umoº¬ovat víceuºivatelský p°ístup. Bude vyvíjena v jazyku Java, £ímº je zaji²t¥na p°enositelnost mezi r·znými platformami. Jde o jazyk objektov¥ zaloºený, coº je dal²ím p°ínosem z pohledu poºadavku na dal²í roz²i°itelnost programu v budoucnu. Aplikace bude vyuºívat lokální databáze, která musí být lehce zálohovatelná a snadno p°enositelná na jiný po£íta£. Jednou z interakcí aplikace s okolím je spojení s £asomírou. Komunikace s elektronickými hodinami bude probíhat p°es sériové rozhraní. Komunikace bude p°eváºn¥ jednosm¥rná, tj. od £asomíry sm¥rem k aplikaci, kdy hodiny zasílají aplikaci nam¥°ené £asy. Lze si v²ak p°edstavit situaci, kdy bude t°eba °ídit hodiny z aplikace (nap°. reset hodin, ºádost o zaslání £as· v £asomí°e uloºených,. . . ). Tisk startovní nebo výsledkové listiny bude probíhat na p°ipojenou tiskárnu, aplikace bude také podporovat tisk do souboru formátu html a pdf. P°edávání dat mezi lokální a centrální databází se bude uskute£¬ovat pomocí souboru, pro který se zvolí jednotný formát kompatibilní s webovou aplikací na centrální úrovni.
2.4
Poºadavky vzhledem k existujícímu systému
Motivace náhrady v sou£asné dob¥ pouºívaného programu jiº byla zmín¥na v kapitole 1. Poºadavky na nový systém tedy nevycházejí z toho, co aktuálnímu chybí. Naopak lze najít oblasti, které mohou poslouºit za inspiraci a to z toho d·vodu, ºe aktuální systém je dlouhodob¥ pouºíván, coº prov¥°ilo p°edev²ím logiku práce s ním. Ty funkcionality, mín¥no p°edev²ím gracké uºivatelské rozhraní (gui), které se osv¥d£ily, mohou poslouºit za p°edlohu pro návrh p°ípad· uºití systému. Pracovní postupy, kterými se lze inspirovat, se týkají hlavn¥ proces· p°ípravy závod· (nap°. tvorba prezenta£ní listiny) a proces· v pr·b¥hu závod· (nap°. manuální zpracování £as· závodník·). Naopak nelze p°edpokládat inspiraci na niº²ích úrovních implementace. Jiº databázové schéma nebude aktuálnímu odpovídat z d·vodu nov¥ vzniklých poºadavk· (nap°. záznam událostí). Nové schéma bude pln¥ vyuºívat vlastností rela£ních databází, coº aktuální schéma nespl¬uje.
8
KAPITOLA 2.
POADAVKY A SPECIFIKACE
Kapitola 3
Analýza 3.1
Úvod
V této kapitole rozeberu uºivatelské role, které budou s aplikací pracovat a jakým zp·sobem ji budou vyuºívat. Dále se zam¥°ím na funk£nost systému z hlediska jeho pouºití a´ uº uºivateli nebo v rámci interakce s jinými systémy. Procesy uskute£¬ované v rámci práce s aplikací rozeberu na jednotlivé aktivity a budu zkoumat jejich p°ípadnou vzájemnou návaznost. P°i zpracování analýzy jsem pro nastín¥ní chování aplikace zvolila jazyk UML. V analýze vyuºiji diagram· UML, které podchycují chování systému, zobrazují jednotlivé aktivity, události. Dodrºuji notaci UML diagram· uvedenou v [2]. Use case diagramy zobrazují £innosti uºivatel· systému. Jejich hlavním cílem je stanovit hranice systému, to jest rozli²it, co do systému a p°edev²ím jeho funk£nosti stále je²t¥ pat°í a co je jiº sou£ástí okolí systému. Dále se zde denují tzv. akto°i, coº je pojem p°edstavující uºivatele systému nebo jakýkoliv jiný systém, který s tím vyvíjeným interaguje. Model p°ípadu uºití p°edstavuje ur£itou £innost, kterou aktor se systémem vykonává. Diagramy aktivit znázor¬ují pr·b¥h aktivit v systému pomocí akcí a p°echod· mezi nimi.
3.2
Uºivatelské role
P°i práci s biatlonovou aplikací lze identikovat dv¥ uºivatelské role. Hlavní úloha první uºivatelské role, role pozorovatele, spo£ítává v prohlíºení údaj·. Pozorovatel pouºívá systém k zobrazení základních údaj· o konané události, jejích závodech, závodnících, kte°í se sout¥ºe ú£astní. Pozorovatel se chce seznámit s nální podobou startovní listiny, po skon£ení závodu si prohlíºí výsledkovou listinu, p°ípadn¥ podrobné záznamy o závodu jednoho závodníka. Zde jde o £asy závodníka (startovní, cílový, b¥ºecký a výsledný £as), záznamy o jeho st°elb¥, p°ípadn¥ odb¥hnutých trestných kolech, o p°iráºkách, o výsledných bodech a po°adí, kterého dosáhl. Zajímá-li pozorovatele globáln¥j²í pohled na pr·b¥h závodu, m·ºe si zobrazit tabulku v²ech st°eleb, £i údaje o trestných kolech nebo cílových £asech v²ech závodník·. 9
10
KAPITOLA 3.
ANALÝZA
Druhá uºivatelská role, role operátora, vyuºívá mnohem více funkcionalit poskytovaných aplikací neº role pozorovatele. Na této uºivatelské roli leºí zodpov¥dnost za p°ípravu závodu, jeho pr·b¥h i záv¥re£né vyhodnocení. Operátor má za úkol nahrát do aplikace údaje o p°ipravovaných závodech a údaje závodník·. Pokud to situace vyºaduje m·ºe operátor sám lokáln¥ vytvo°it událost nebo závod. Je mu poskytnuto právo na smazání jak události, tak závodu, i na jejich editaci. Obdobné úkony m·ºe operátor provád¥t s daty závodník·. Dal²í vyuºití aplikace operátorem nastupuje v momentu t¥sn¥ p°ed startem závodu, kdy operátor provádí prezentaci závodník·, p°i°azuje jim startovní £ísla a £asy. V pr·b¥hu závodu ru£n¥ vkládá údaje o st°elbách pro jednotlivá startovní £ísla, tak jak jsou mu tyto hlá²eny ze st°elnice. Stejnou úlohu vykonává pro záznam o odb¥hnutých trestných kolech a cílových £asech, jsou-li zaznamenávány ru£n¥. Jestliºe je aplikace napojena na elektronické hodiny, operátor pouze p°i°azuje startovní £ísla p°íslu²ným cílových £as·m, které p°icházejí z hodin a jsou v aplikaci pr·b¥ºn¥ zobrazovány. Po dokon£ení závodu úloha operátora nekon£í, a£koliv výsledky se jiº vyhodnocují automatizovan¥. Je nutné zkompletovat v²echny vý²e zmín¥né údaje pro kaºdého závodníka, navíc se dopl¬ují £asové p°iráºky nebo poznámky. V pravidelných intervalech (nap°. jednou za týden) se vyhodnocené výsledky odevzdávají do centrální databáze. V pr·b¥hu sezóny se m·ºe stát, ºe je n¥jaký závod dodenován na celorepublikové úrovni dodate£n¥ a není v záznamech na lokálních úrovních. Z centrální databáze tedy p°ijde nový soubor dat, který obsahuje nap°. jen tento jeden závod navíc. Je na zodpov¥dnosti operátora, aby nové údaje nahrál do lokální databáze a zachoval údaje existující. Ne p°íli² £astou £inností operátora je i nahrávání výsledk· závod· z jiné oblasti. 3.3
Hranice systému
V této kapitole se denuje rozhraní a zp·sob komunikace mezi aplikací a jejím okolím. Názorn¥ jsou hranice systému zobrazeny na obrázku 3.1. Uºivateli systému, kterými m·ºe být i jiný systém, jsou operátor jako osoba uºívající aplikaci (jak v roli pozorovatele tak v roli operátora), lokální databáze, centrální databáze, £asomíra a tiskárna. Nej£ast¥ji bude aplikace p°icházet do styku s operátorem, který bude nap°íklad zadávat data nebo si je naopak zobrazovat. Dal²í p·sobení uºivatelské role operátor bude rozvedeno v následující kapitole. A£koliv má st°elnice p°i závodech podobnou úlohu jako £asomíra (dodává záznam o st°elb¥ závodníka, £asomíra dodává záznamy £asové) není povaºována za systém interagující s biatlonovou aplikací. Aplikace nezpracovává údaje o st°elb¥ závodníka automaticky, ale je vyuºíván mezi£lánek v podob¥ operátora, který výsledky st°eleb zadává ru£n¥. Tím se st°elnice vylu£uje z okolí aplikace. Komunikace s £asomírou probíhá bu¤ sm¥rem z £asomíry do aplikace, kdy aplikace p°ijímá z hodin £asové údaje, a nebo ze strany aplikace bude umoºn¥no vyslat poºadavek £asomí°e o zaslání uloºených dat nebo ji resetovat. Lokální databáze je vyuºívána neustále p°i úpravách £i vytvá°ení záznam·, které musí být trvale uchovávány. Komunikace s centrální databází bude odli²ná oproti p°ímému p°ístupu aplikace k lokální databázi. Nahrávání dat bude uskute£¬ováno zprost°edkovan¥, jelikoº aplikace nebude mít moºnost p°ístupu k dat·m uloºeným centráln¥.
3.4.
INNOSTI OPERÁTORA
11
Obrázek 3.1: Kontextový diagram
3.4
innosti operátora
Sledováním pracovního postupu operátora se nám odkryjí £innosti a akce, které on od systému vyºaduje (viz obr. 3.2). Prvotní práce s aplikací p°ed startem prvního závodu v sezón¥ se týká správy závod· a událostí, které byly do aplikace naimportovány z centrální databáze. Události a závody je t°eba zakládat, upravovat a p°ípadn¥ ze systému odstra¬ovat. P°i pr·b¥hu závodu se £innost operátora pak v¥t²inou jiº dotýká pouze onoho konkrétního závodu (dále ozna£ováno jako 'práce s závodem'). Jednotlivé £innosti spadající pod tento pojem rozeberu pozd¥ji. Zajímá-li nás posloupnost vyvolání t¥chto akcí, je t°eba se podívat na diagram aktivit zachycující dynamický pohled na systém uvedený na obrázku 3.3. Zde se pak rozpoznají £innosti, které mohou probíhat soub¥ºn¥, £innosti výlu£né nebo opakující se. Z funk£ních poºadavk· v²ak vyplývají mnohé dal²í akce, které operátor vyvolává. Jednoduchý demonstrativní vý£et akcí z pohledu uºití aplikace operátorem je zobrazen v diagramu p°ípad· uºití. Nyní bych rozebrala jednotlivé p°ípady uºití bez Obrázek 3.2: Use Case - £innost bliº²ího zkoumání vzájemných souvislostí t¥chto operátora akcí. V záv¥ru kapitoly v diagramu aktivit demonstruji, jaké logické a chronologické vazby mezi jednotlivými £innostmi existují.
12
KAPITOLA 3.
ANALÝZA
Obrázek 3.3: Diagram aktivit - práce s aplikací
3.4.1
Import a export dat
Na za£átku sezóny je nutné do systému zanést údaje o událostech, závodech, které se budou konat. Tyto importuje operátor z dat vygenerovaných z centrální databáze. Sou£asn¥ s t¥mito údaji se do systému vloºí data závodník·.
3.4.1.1 P°ípad uºití: Import dat • Vstupní podmínky : operátor má k dispozici data vyexportovaná z centrální databáze • Tok událostí : 1. operátor zvolí, která data chce importovat (události, závody, závodníky,. . . ) 2. operátor provede import
• Výstupní podmínky : systém obsahuje importovaná data nebo je zobrazeno hlá²ení, ºe data nemohla být naimportována
3.4.
INNOSTI OPERÁTORA
13
Export dat probíhá velmi obdobn¥, operátor vybere, která data se budou exportovat a uskute£ní export.
3.4.2
Správa dat
Správa dat ve smyslu vytvá°ení nového záznamu, úpravy nebo smazání stávajícího záznamu se týká událostí, závod·, závodník· a klub·. K vytvo°ení nového záznamu by m¥lo docházet spí²e nestandardn¥. Jak jiº bylo zmín¥no d°íve, m·ºe se v pr·b¥hu sezóny stát, ºe je t°eba dodenovat ur£itý závod (a k n¥mu samoz°ejm¥ událost). Úprava údaj· umoº¬uje napravení nep°esností a smazání záznamu zase odstra¬uje nadbyte£ná neuºite£ná data, £i data omylem vloºená.
3.4.2.1 P°ípad uºití: Vytvo°it závodníka P°i prezentaci konkrétního závodu m·ºe nastat situace, kdy závodníkovy údaje v systému zcela chybí a proto operátor na míst¥ závodníkova data do systému vloºí.
• Vstupní podmínky : závodníkovy údaje nejsou v systému • Tok událostí : 1. zadání závodníkových údaj· do systému
• Výstupní podmínky : závodníkovy údaje byly správn¥ uloºeny nebo je zobrazeno hlá²ení, ºe údaje nemohly být uloºeny
3.4.2.2 P°ípad uºití: Upravit závodníka Pokud existující záznamy neodpovídají skute£nostem, operátor je m·ºe poopravit. Úprava záznam· se také týká výsledk· jednotlivých závodník· (nap°. p°i°azení £asové p°iráºky podle aktuální situace).
• Vstupní podmínky : v systému jsou chybné údaje • Tok událostí : 1. zobrazení existujícího záznamu závodníka 2. úprava nesprávných údaj·
• Výstupní podmínky : závodníkovy údaje byly správn¥ uloºeny nebo je zobrazeno hlá²ení, ºe úprava nebyla provedena
14
KAPITOLA 3.
ANALÝZA
3.4.2.3 P°ípad uºití: Smazat závodníka Mazání záznam· by se m¥lo pouºívat p°edev²ím k odstran¥ní omylem vloºených dat.
• Vstupní podmínky : v systému je zcela nesprávný nebo nadbyte£ný záznam o závodníkovi • Tok událostí : 1. zobrazení existujícího záznamu závodníka 2. smazání záznamu
• Výstupní podmínky : závodníkovy údaje byly smazány Obdobné °e²ení se aplikuje pro závody a události (kluby je moºné pouze vytvá°et). Operátor bude zakládat nové záznamy, m·ºe m¥nit atributy záznam· existujících a odstra¬ovat ty, které povaºuje za zbyte£né. 3.4.3
Tvorba startovní listiny
Vytvá°ení startovní listiny, tj. seznamu závodník· cht¥jících startovat v daném závod¥, probíhá procesem prezentace s ohledem na seznam zaregistrovaných závodník·. Registrace není nutnou podmínkou pro start v závodu. Pokud se závodník na závod dostavil, je mu umoºn¥no startovat i kdyº nebyl pro závod zaregistrován. P°i prezentaci se naráºí na problémy s nep°esností v datech závodník· uloºených v systému. Proto se zde £asto vyskytují £innosti úpravy nebo vytvo°ení dat popsané v p°edchozí kapitole. Proces prezentace je zobrazen v následujícím diagramu aktivit 3.4, který ukazuje moºné varianty, které mohou nastat:
• údaje p°ítomného závodníka jsou v po°ádku • údaje jsou nep°esné, proto je nutné údaje opravit • závodník nebyl zaregistrován a jeho údaje v systému chybí, proto dojde ke vloºení nového záznamu Následuje uº jen zaprezentování závodníka, coº znamená jeho p°i°azení do startovní listiny.
3.4.3.1 P°ípad uºití: Provést prezentaci Z pohledu p°ípadu pouºití se prezentace popí²e následovn¥.
• Vstupní podmínky : 1. je provedena a uzav°ena registrace 2. závodník se dostavil k závodu
• Tok událostí :
3.4.
INNOSTI OPERÁTORA
15
1. byl-li závodník registrován (a) je provedena prezentace 2. nebyl-li registrován (a) je provedena prezentace
• Výstupní podmínky : závodníci, kte°í se dostavili k závodu, jsou za°azeni do startovní listiny • Alternativní tok : 1. byl-li závodník registrován s odli²nými údaji (a) p°echod na use case Upravit závodníka (b) je provedena prezentace 2. závodníkovy údaje v systému chybí (a) p°echod na use case Vytvo°it závodníka (b) je provedena prezentace Startovní listina nyní obsahuje zaprezentované závodníky, kterým se ur£í po°adí, ve kterém budou do závodu vybíhat. Po°adí m·ºe být dáno výsledky v p°edchozím závodu, nebo se ur£í losováním. Následuje p°i°azení startovních £as· a £ísel. Operátor má moºnost jiº vygenerované £asy nebo startovní £ísla upravovat. Operátor si také stanovuje, v jakém po°adí jsou uspo°ádány startovní kategorie. Atributy startovních kategorií si m·ºe prohlíºet i je m¥nit.
3.4.3.2 P°ípad uºití: Vytvo°it startovní listinu • Vstupní podmínky : je zaprezentován alespo¬ jeden závodník • Tok událostí : 1. systém automaticky generuje startovní listinu za základ¥ procesu prezentace 2. stanovení po°adí závodník· (a) po°adí je ur£eno výsledkem p°edchozího závodu (b) po°adí je ur£eno losováním 3. p°id¥lení startovních £as· a startovních £ísel dle po°adí startu
• Výstupní podmínky : je vytvo°ena startovní listina • Alternativní tok : 1. operátor zm¥ní po°adí startovních kategorií 2. operátor ru£n¥ upravuje startovní £ísla £i £asy závodník· 3. operátor odprezentuje závodníka, který nebude v závodu startovat 4. editace startovní kategorie (a) operátor zobrazí atributy vybrané startovní kategorie (startovní £as, st°elba, koecient výpo£tu,. . . ) (b) operátor m·ºe zm¥nit atributy startovní kategorie
16
KAPITOLA 3.
ANALÝZA
Obrázek 3.4: Diagram aktivit - proces prezentace
3.4.4
Zobrazování dat
Vedle operátora bude pozorovatel ten, kdo p°edev²ím bude aplikaci uºívat k zobrazení r·zných údaj·. Pozorovatele zajímá nap°. sestavená startovní listina, detaily konaného závodu, detaily konkrétního závodníka nebo celkové výsledky závodu. P°ípad uºití v²ak demonstruji pouze na zobrazení detail· závodu (tj. jeho název, identika£ní £íslo, startovní £as,. . . ). Dále se pouºívá zobrazování seznamu v²ech událostí a závod·.
3.4.4.1 P°ípad uºití: Zobrazit detail závodu • Vstupní podmínky : informace o závodu byly nahrány z centrální databáze a je otev°en konkrétní závod • Tok událostí : 1. operátor poºádá o zobrazení detailu otev°eného závodu 2. systém vyhledá konkrétní údaje
3.4.
INNOSTI OPERÁTORA
17
• Výstupní podmínky : jsou zobrazeny detaily • Alternativní tok : 1. zobrazení závodníka (a) vyhledáním dle jména, p°íjmení, id závodníka (b) vybráním ze seznamu závodník· 2. zobrazení výsledk· v²ech závodník· (a) p°epo£et výsledk· prob¥hne automaticky (nap°. na základ¥ zm¥ny n¥kterých údaj·) a výsledky jsou zobrazeny (b) p°epo£et výsledk· je vyvolán operátorem manuáln¥ a následn¥ jsou výsledky zobrazeny 3. zobrazení výsledk· jednoho závodníka vyhledáním podle startovního £ísla 4. zobrazení seznamu v²ech událostí 5. zobrazení seznamu v²ech závod·
Akci zobrazení výsledk· logicky p°edchází jejich výpo£et. Výsledky závodník· se v pr·b¥hu závodu aktualizují podle toho, jak závodníci dobíhají do cíle. P°epo£et je tedy vyvolán vºdy, jakmile je n¥který pro výpo£et pot°ebný údaj systémem zaznamenán (nap°. závodníkovi byl p°i°azen cílový £as) nebo byl jiº existující údaj pozm¥n¥n. Výpo£et výsledk· m·ºe také vyvolat operátor manuáln¥. Zp·sob p°epo£ítání výsledk· je nazna£en v následujícím diagramu 3.5.
Obrázek 3.5: Diagram aktivit - p°epo£ítání výsledk·
18
KAPITOLA 3.
3.4.5
ANALÝZA
Zm¥na nastavení
Uºivatelská role operátora je zodpov¥dná za správné vypo£ítání výsledk· závodu. A a£koliv výpo£et probíhá automaticky, je závislý na n¥kolika prom¥nných, které m·ºe operátor m¥nit. Jde nap°. o zvolení zp·sobu výpo£tu výsledného £asu dle závodní disciplíny nebo nastavení koecientu pouºitého pro výpo£et bod· závodník·. Velmi d·leºitý je také p°íjem £as· zasílaných automaticky £asomírou. Ten je zaji²t¥n správným nastavením komunika£ního rozhraní mezi po£íta£em a £asovým za°ízením.
3.4.5.1 P°ípad uºití: Zm¥nit nastavení • Tok událostí : 1. zobrazení aktuálního nastavení 2. úprava aktuálního nastavení
• Výstupní podmínky : nastavení bylo zm¥n¥no 3.4.6
Tisk
Akci tisku pouºije operátor ve dvou momentech v pr·b¥hu závodu. P°ed jeho zapo£etím, kdy je nutné vytisknout hotovou startovní listinu, a po jeho dokon£ení, kdy jsou jiº spo£ítány výsledky
3.4.6.1 P°ípad uºití: Tisknout • Vstupní podmínky : aplikace obsahuje údaje, které se mají vytisknout • Tok událostí : 1. volba parametr· tisku - tisk na tiskárnu nebo do souboru 2. zadání poºadavku na tisk
• Výstupní podmínky : údaje jsou vyti²t¥ny nebo je ohlá²ena chyba tisku • Alternativní tok : 1. operátor vybere pouze n¥které kategorie k vyti²t¥ní 3.4.7
Práce se závodem z hlediska dynamiky chování
Práce se závodem zahrnuje £innosti, které jiº byly zmín¥ny v p°edchozích kapitolách. Z t¥ch nejd·leºit¥j²ích zopakuji prezentování závodník·, tvorbu startovní listiny nebo úpravu £i zobrazování údaj·. V následujícím diagramu aktivit 3.6 je znázorn¥no, jak tyto £innosti vzájemn¥ souvisí. Aktivita 'Zm¥nit nastavení' p°edstavuje nastavování zp·sobu výpo£tu, ale i nastavování parametr· spojení s £asomírou, £i její p°ipojení nebo odpojení. V²echny £innosti z diagramu jsou podmín¥ny vybráním konkrétního závodu, av²ak jejich vyvolání jiº nemusí podléhat ur£ité souslednosti. Logicky je samoz°ejm¥ vhodné nejprve závodníky zaprezentovat, pak pracovat se startovní listinou, zadávat cílové £asy, st°elby,
3.5.
19
DATABÁZE
Obrázek 3.6: Diagram aktivit - práce se závodem
nechat provést výpo£et závod· a následn¥ pracovat s výsledky. Tisk by m¥l také následovat aº po zobrazení smysluplné listiny. Nicmén¥ v p°ípad¥, ºe operátor pracuje se závodem konaným v minulosti, kdy jsou ve²keré údaje uº dány a výsledky spo£ítány, není t°eba vyvolávat aktivity v n¥jaké konkrétní posloupnosti. Naopak n¥které aktivity operátor vynechá (zaprezentování, tvorba startovní listiny,. . . ), protoºe jiº ztrácejí smysl.
3.5
Databáze
Dal²ími elementy, které tvo°í okolí systému, jsou databáze. Lokální databáze provádí v rámci systému t°i £innosti. Poskytuje nebo upravuje údaje v ní uchované a ukládá data nová. Centrální databáze se s lokální ztotoº¬uje pouze ve dvou aktivitách a to v poskytování a ukládání informací (viz obr. 3.7). Dle poºadavk· není centrální databáze napojena do systému p°ímo. Exportem dat do centrální databáze se posléze nahrávají údaje nové i pozm¥n¥né. Ob¥ £innosti tedy spadají pod jednu aktivitu 'Uloºit údaje'. Na poºádání operátora systém pot°ebuje údaje zve°ej¬ovat (use case Zobrazit detail závodu).
20
KAPITOLA 3.
3.5.1
ANALÝZA
P°ípad uºití: Poskytnout údaje
• Vstupní podmínky : systém zadal poºadavek na zobrazení údaj· (use case zobrazit detail závodu) • Tok událostí : 1. databáze vyhledá informace 2. databáze p°edá údaje systému
• Výstupní podmínky : systém získal pot°ebné informace nebo je zobrazeno hlá²ení, ºe údaje nejsou k dispozici V p°ípad¥ use casu Upravit závodníka (operátor hodlá m¥nit závodníkovy údaje) se vyvolá následn¥ aktivita databáze Zm¥nit Obrázek 3.7: Use Case - databáze údaje, která provedené zm¥ny promítá do svých záznam·. Aktivita databáze spo£ívající v uloºení nových údaj· je vyvolávána nap°. use casem Vytvo°it závodníka. Ob¥ aktivity jiº nebudu podrobn¥ji rozvád¥t. 3.6
asomíra
innost £asomíry spo£ívá v zasílání cílových £as· závodník· do systému. O dal²í zpracování p°ijatých dat se stará systém sám. A£koliv jsou diagramy p°ípad· uºití rozd¥leny podle uºivatel· systému, je do této sekce zahrnut i uºivatel operátor (viz obr. 3.8). Je to z toho d·vodu, ºe do ur£ité míry m·ºe £asomíru nahradit. 3.6.1
P°ípad uºití: Zaslat £asy
• Vstupní podmínky : probíhá závod • Tok událostí : 1. £asomíra p°edává systému údaje o £asu
• Výstupní podmínky : systém má informace o £asu konkrétního závodníka • Alternativní tok : 1. operátor zadává údaje o £asu a identikaci závodníka do systému ru£n¥ 2. zasílání £as·, o které bylo zaºádáno ze systému (a) operátor poºádá pomocí systému £asomíru o zaslání £as· uloºených v její pam¥ti (b) £asomíra dodá systému v²echny údaje ze své pam¥ti
3.6.
21
ASOMÍRA
Zp·sob p°íjmu cílových £as· závodník· aplikací je nazna£en diagramem aktivit na obrázku 3.9. Manuální zadání £as· provádí operátor, jakmile má k dispozici pot°ebné údaje, tj. £as a identikaci závodníka (startovní £íslo). Druhá varianta p°íjmu £as· spo£ívá v pr·b¥ºném zaznamenání údaj· p°icházejících p°es sériový port z £asomíry. Systém tato data p°ijme a uloºí ihned, jakmile je dostane. Stále je v²ak p°ipraven na p°íchod a zpracování dal²ích dat. asomíra posílá pouze £asy bez konkrétního ur£ení, kterému závodníkovi pat°í. Proto je zde nezbytná kooperace operátora, který tyto údaje dopl¬uje o startovní £ísla závodník· p°ijíºd¥jících do cíle. M·ºe se stát, ºe fotobu¬ka zachytí pohyb, který neodpovídá p°íjezdu závodníka do cíle. Systém nem·ºe rozpoznat, ºe jde o zmate£ný údaj a zpracuje jej stejn¥ jako jakýkoliv jiný.
Obrázek 3.8: Use Case - £asomíra
Obrázek 3.9: Diagram aktivit - p°íjem £as·
22
KAPITOLA 3.
ANALÝZA
Na operátorovi tedy je, aby zajistil správnost p°ijímaných dat. asové údaje, které byly identikovány jako správné a dopln¥ny startovním £íslem, pak vstupují do procesu výpo£tu závodu.
Kapitola 4
Návrh 4.1
Úvod
Návrhová £ást práce obsahuje p°edstavení základních komponent systému, dále se bude v¥novat podrobn¥ji datovému modelu. Na základ¥ datového modelu bude navrºen diagram t°íd, které p°edstavují datové entity. Poºadavek na vým¥nu dat s centrální úrovní byl v analytické £ásti uchopen p°edev²ím z pohledu operátora. V návrhové £ásti bude denován zp·sob a forma p°edávání dat. 4.2
Diagram komponent
Aplikace poskytuje gracké uºivatelské rozhraní (dále gui), které je komponentou závislou na mnohých dal²ích. Vztahy mezi komponentami názorn¥ zachycuje obrázek 4.1.
Obrázek 4.1: Diagram komponent
gui slouºí v prvé °ad¥ pro zobrazení dat, vyuºívá zde tak komponenty database. Tato komponenta bude sloºena ze dvou balí£k· a to z databaseConnect obstarávající p°ipojení k databázi a z balí£ku db, který provádí správu dat uloºených v databázi. Krom¥ 23
24
KAPITOLA 4.
NÁVRH
zobrazení dat bude aplikace pomocí uºivatelského rozhraní poskytovat dal²í funkce, které jiº nemusí obstarávat komponenta gui. Nap°íklad rozlosování závodník· zaji²´uje komponenta losovani. Pro tisk dokument· se vyuºívá komponenty print, pro výpo£et výsledk· komponenty vypocet, vým¥nu dat s centrální databází zaji²´uje komponenta xml a komunikaci se sériovým portem pak komponenta serial. Tyto £ty°i vyjmenované komponenty pro svou práci pot°ebují vyuºívat dat z databáze a tím jsou rovn¥º závislé na komponent¥ database. V²echny komponenty s výjimkou database budou v rámci implementace poskytovány stejnojmennými balí£ky.
4.3
Datový model
Základní kostru datového modelu tvo°í tabulky odpovídající entitám událost, závod a závodník (tj. tabulky Udalost, Zavod a Zavodnik). Dále se v modelu vyskytují tabulky reprezentující entity d·leºité z pohledu b¥ºeného závodu jako jsou startovní kategorie (tabulka StartKategorie), nebo údaje jednotlivce v závodu (tabulka StartUdaje). Na obrázku 4.2 je £ást databázového schématu, která zobrazuje vztahy mezi základními tabulkami datového modelu. Událost obsahuje nepovinn¥ aº n¥kolik závod·, závod také nepovinn¥ více startovních kategorií. Nepovinnost, a£ se m·ºe zdát nelogická, je zde z toho d·vodu, ºe událost lze zaloºit aniº pro ni existuje závod, resp. lze vytvo°it záznam pro závod aniº pro n¥j ve startovní listin¥ zatím existuje startovní kategorie.
Obrázek 4.2: Základní £ást datového modelu
Startovní kategorie vzniká sou£asn¥ s prvním záznamem závodníka konkrétní kategorie ve startovní listin¥. Na jednu startovní kategorii se m·ºe vázat více záznam· ze startovní listiny. Záznam startovní listiny je reprezentován tabulkou StartUdaje obsahující informace jako startovní £íslo, £as na startu, £as v cíli a jiné a tento záznam musí být vºdy spojen se záznamem n¥kterého závodníka, kterému p°íslu²í. Závodník pak m·ºe startovat ve více závodech a tomu pak i odpovídá více záznam· v tabulce StartUdaje. Celý databázový model, který je uveden v p°íloze A, pak dopl¬ují tabulky £íselníkového charakteru jako druh p°edstavující biatlonovou disciplínu, kategorie nebo klub.
4.3.
25
DATOVÝ MODEL
4.3.1
Událost
Základní atributy události, kterými jsou název, zkratka, místo konání a dva datumy pro ur£ení rozmezí konání události, jsou ukázány v tabulce 4.1. Datumy jsou ukládány jako °et¥zce s délkou deset. Jejich formát je rrrr-mm-dd. Identikátorem, který má úlohu primárního klí£e, je atribut IDUdalosti. Jelikoº událost m·ºe být denována i mimo Název IDUdalosti Zkratka Nazev MistoKonani DatumOd DatumDo
Datový typ integer varchar(20) varchar(255) varchar(255) varchar(10) varchar(10)
Primární/cizí klí£ PK
Povinnost ano ano ano ano ano ano
Tabulka 4.1: Tabulka Udalost centrální úrove¬, bylo nezbytné o²et°it unikátnost tohoto atributu pro situace, kdy se ve dvou lokálních verzích aplikace vytvo°í dv¥ r·zné události se shodným identikátorem. Tuto úlohu zastávají dva atributy IDUdalostiPr a Flag (viz tab. 4.2). První Název IDUdalostiPr Flag
Datový typ integer integer
Primární/cizí klí£
Povinnost ano ano
Tabulka 4.2: Tabulka Udalost - provizorní ID p°edstavuje provizorní identikátor generovaný v závodech. Pro záznam vytvo°ený v aplikaci se atribut Flag nastavuje na hodnotu 2 (hodnotu 1 mají záznamy, které p°icházejí z centrální databáze p°i denování událostí). Touto hodnotou se dává po odeslání do centrální databáze na v¥domí, ºe je t°eba zkontrolovat unikátnost identikátoru (atributy IDUdalosti a IDdalostiPr jsou nastaveny shodn¥). Centrální databáze takovému záznamu vºdy p°i°adí sv·j vlastní identikátor (atribut IDUdalosti, provizorní identikátor nem¥ní) a sou£asn¥ nastaví atribut Flag na hodnotu 3. P°i p°ípadném znovunahrání tohoto záznamu z centrální databáze pak hodnota 3 upozor¬uje na to, ºe p·vodn¥ vygenerovaný identikátor byl zm¥n¥n. Atribut IDUdalostiPr nese starou hodnotu, IDUdalosti pak novou. Tento princip se uplat¬uje také u tabulek závod, závodník a klub. Tyto dva atributy jiº v dal²ích tabulkách uvád¥t nebudu.
4.3.2
Závod
Tabulka závod (viz tab. 4.3) uchovává informace o názvu závodu, datumu, kdy se koná a £asu startu. Závod musí mít denovanou disciplínu. Cizí klí£ ve form¥ atributu IDDruhu odkazuje do tabulky Druh, která obsahuje seznam v²ech disciplín. Jelikoº závod musí spadat pod n¥jakou událost, je v tabulce p°ítomen cizí klí£ práv¥ tabulky Udalost.
26
KAPITOLA 4.
Název IDZavodu IDUdalosti IDDruhu Nazev Datum StartCas
Datový typ integer integer integer varchar(255) varchar(10) varchar(10)
Primární/cizí klí£ PK FK FK
NÁVRH
Povinnost ano ano ano ano ano ne
Tabulka 4.3: Tabulka Zavod 4.3.3
Startovní kategorie
Tabulka pro startovní kategorii rozli²uje jednotlivé startovní kategorie v jednom závodu (odkaz atributem IDZavodu). K tomuto odli²ení slouºí cizí klí£ IDKat tabulky kategorie. Dal²ími specickými údaji pro startovní kategorii jsou hlavn¥ st°elba (nap°. LS vleºe a vestoje), délka trat¥ (nap°. 12,5 km) a p°iráºka za nesest°elenou ránu udávaná v sekundách. Dále má kaºdá startovní kategorie denovaný £as startu m¥°ený elektronickými hodinami (StartCasHodin) a £as startu ur£ovaný b¥ºným £asem (StartCasSvet). Atributy tabulky StartKategorie jsou ukázány v tabulce 4.4. Startovní £as kategorie Název ID IDKat IDZavodu Strelba Delka Prirazka StartCasSvet StartCasHodin Koecient Poznamka PoradiKat
Datový typ integer integer integer varchar(4) double varchar(3) varchar(10) varchar(10) double varchar(1024) integer
Primární/cizí klí£ PK FK FK
Povinnost ano ano ano ne ne ne ne ne ne ne ne
Tabulka 4.4: Tabulka StartKategorie nabývá na významu v závodech s hromadným startem nebo ve stíhacích závodech. Atribut Koeficient pak vystupuje ve vzorci pro výpo£et bod· po dob¥hnutí závodu (viz kapitola 2.2.3.2). Do poznámky se pro konkrétní kategorii uvád¥jí zd·vodn¥ní £asových úprav závodník· nebo pro£ ten který závodník nestartoval, byl diskvalikován nebo nedokon£il. 4.3.4
Údaje jednotlivce v závodu
Tabulka s názvem StartUdaje je velmi ob²írná, pro bliº²í zkoumání jejích atribut· je v p°íloze kompletní databázový model. Uº bylo zmín¥no, ºe záznam údaj· jednotlivce odpovídá jednomu závodícímu (p°ítomnost cizího klí£e tabulky Zavodnik). Dal²ím cizím
4.3.
27
DATOVÝ MODEL
klí£em je odkaz na startovní kategorii, do které údaj náleºí. P°es sv·j název neslouºí tabulka pouze pro uloºení dat týkajících se startu (startovní £íslo, startovní £as), ale jsou zde kompletní informace o tom, jak si závodník v závodu vedl, tj. záznam st°eleb, trestných kol, cílový £as, £asové p°iráºky. Po té, co se spo£ítají výsledky, jsou body a po°adí závodník· uloºeny také zde. Cílový £as se ur£uje s p°esností na desetinu sekundy a proto má formát v¥t²iny £asových údaj· v této tabulce tvar hh:mm:ss,d. P°i°azované body se po£ítají s p°esností na dv¥ desetinná místa. Obrázek 4.3 zobrazuje, jak jsou údaje jednotlivce propojeny s tabulkou CasyAktual, která ukládá cílové £asy závodník·. Kaºdý £as se p°es cizí klí£ IDStartVys odkazuje na jeden záznam údaj· jednotlivce. Kardinalita vztahu 0:m je zvolena proto, ºe se po£ítá s moºným vyuºitím £asomíry i na ukládání mezi£as·.
Obrázek 4.3: Datový model spojení tabulek StartUdaje a Casy
4.3.5
Závodník
O závodníkovi je t°eba uchovávat jeho základní data jako jsou jméno, p°íjmení, a datum narození. Pro pot°eby závod· a za°azení do správné startovní kategorie se pak ukládají informace o pohlaví, výkonnostní t°íd¥, kategorii a klubu. Protoºe závodník m·ºe startovat i za jiný klub, neº ve kterém je registrován, obsahuje tabulka také odkaz na klub hostující. V následující tabulce 4.5 pro stru£nost neuvádím v²echny atributy. Název ID IDKlubHost IDKategorie IDKlubDom IDZavodnika Jmeno Prijmeni
Datový typ integer integer integer integer integer varchar(255) varchar(255)
Primární/cizí klí£ PK FK FK FK
Povinnost ano ne ano ano ano ano ano
Tabulka 4.5: Tabulka Zavodnik
4.3.6
Klub
Klub nese název a zkratku (databázové atributy viz tab. 4.6). Vystupuje v modelu pouze v návaznosti na tabulku Zavodnik, za to ale hned dvakrát. Jeden vztah p°edstavuje klub
28
KAPITOLA 4.
NÁVRH
závodníka, kde je závodník zaregistrován a jako takový je ve vztahu povinný. Druhý vztah p°edstavuje klub, za který závodník m·ºe hostovat, proto je tento nepovinný. Kardinalita vztah· je 1:m, resp. 0:m pro nepovinný vztah. Název IDKlubu Zkratka Nazev
Datový typ integer varchar(15) varchar(255)
Primární/cizí klí£ PK
Povinnost ano ano ano
Tabulka 4.6: Tabulka Klub
4.3.7
Kategorie a Druh
Kategorie je denována pohlavím (atribut nabývajících hodnot 'M' nebo 'Z') a rozmezím v¥k· (dva celo£íselné atributy). Má pak unikátní název i zkratku (viz tab. 4.7). V databázovém modelu vystupuje hlavn¥ ve vztahu k závodníkovi, jehoº kategorii denuje a ve vztahu ke startovní kategorii, kdy rozli²uje jednotlivé kategorie pro start jednoho závodu. V obou t¥chto vztazích je p°ítomnost kategorie ve vztahu povinná. Kardinalita t¥chto vztah· je m:1. Název ID Zkratka Nazev Pohlavi VekOd VekDo
Datový typ integer varchar(15) varchar(155) char(1) integer integer
Primární/cizí klí£ PK
Povinnost ano ano ano ano ano ano
Tabulka 4.7: Tabulka Kategorie Druh je tabulka denující závodní disciplínu, tj. ur£ující techniku a její zkratku. S kaºdou disciplínou je spojen jiný zp·sob výpo£tu b¥ºeckého £asu závodníka (nap°. u stíhacího závodu do výpo£tu výsledku vstupuje £as prvního závodníka na trati v dané kategorii ne jeho startovní £as, dal²í rozdíl je v zapo£ítávání p°iráºky za netrefenou ránu na st°elnici). Tyto dva atributy pomáhají ur£it, jaký typ vzorce se pouºije p°i záv¥re£ném výpo£tu výsledk·. Tabulka Druh (viz tab. 4.8) se váºe k tabulce Zavod, vztah má kardinalitu m:0.
4.3.
29
DATOVÝ MODEL
Název IDDruhu Zkratka Technika ZpusobVypoctu PrirazkaZaStrelbu
Datový typ integer varchar(20) varchar(255) integer integer
Primární/cizí klí£ PK
Povinnost ano ano ano ne ne
Tabulka 4.8: Tabulka Druh V kapitole v¥nující se startovní kategorii byly zmín¥ny st°elba, délka závodu a p°iráºka jako její atributy. Tyto hodnoty jsou pevn¥ dány pro kaºdou dvojici kategorie a závodní disciplíny. Existuje tedy dal²í £íselník (dále ozna£ovaný jako KategorieDruh) denující vyjmenované atributy, který je sám závislý na tabulkách Kategorie a Druh. Vzájemný vztah je ukázán na obrázku 4.4.
Obrázek 4.4: Datový model ukazující propojení tabulek Kategorie a Druh Nyní se m·ºe zdát zbyte£né, pro£ st°elbu s délkou a p°iráºkou v·bec v tabulce StartKategorie uvád¥t a pro£ jednodu²e nevyuºít propojení na tabulku KategorieDruh. D·vodem je fakt, ºe pro zimní a letní sezónu biatlonu se pouºívají odli²né hodnoty st°eleb, délek závod· a p°iráºek. Proto jsou aktuáln¥ pouºité hodnoty vºdy uloºeny p°ímo u dané startovní kategorie pro zachování této informace. P°ehled atribut· databázové tabulky KategorieDruh je ukázán v tabulce 4.9. Název ID IDKat IDDruhu Strelba Delka Prirazka
Datový typ integer integer integer varchar(4) double varchar(10)
Primární/cizí klí£ PK FK FK
Povinnost ano ano ano ne ne ne
Tabulka 4.9: Tabulka KategorieDruh
4.3.8
Dopl¬ující tabulky
Databázový model nyní dopl¬ují uº jenom tabulky bez vztah· k ostatním. Tedy alespo¬ bez relací v databázovém smyslu. V této kapitole osv¥tlím pro£ tomu tak je.
30
KAPITOLA 4.
NÁVRH
4.3.8.1 Aktuální data závodníka Tabulka ZavodnikAktual (viz tab. 4.10) má jediný cíl a to uchovávat nejaktuáln¥j²í závodníkovy údaje. V p°ípad¥, ºe nap°. závodník zm¥ní p°íjmení vzniká problém s jeho výsledky, které se vztahují k závodníkovu p·vodnímu p°íjmení. P·vodní informaci je pot°eba zachovat, stejn¥ jako p°íjmení nové. Proto ve²keré údaje týkající se ú£asti v závodu jsou vºdy vázány na tabulku Zavodnik, ve které daná osoba m·ºe gurovat i vícekrát (podle toho, kolikrát m¥nila své osobní údaje) a která tedy reektuje aktuální data závodníka v dob¥ konání závodu. ili jakákoliv zm¥na v p°íjmení nebo výkonnostní t°íd¥ (p°ípadn¥ ve jmén¥ £i datumu narození) znamená nový záznam v tabulce Zavodnik a úpravu jedine£ného záznamu závodníka v tabulce ZavodnikAktual. Název IDZavodnika Jmeno Prijmeni Den Mesic Rok Pohlavi VykTrida
Datový typ integer varchar(255) varchar(255) integer integer integer char(1) char(1)
Primární/cizí klí£ PK
Povinnost ano ano ano false false ano ano ano
Tabulka 4.10: Tabulka ZavodnikAktual
4.3.8.2 asy Tabulka £as· slouºí k zaznamenání v²ech £as· p°icházejících z £asomíry, tj. i t¥ch které jsou chybové, nadbyte£né. V moment¥, kdy operátor p°i°adí k £asu startovní £íslo, uzná jej tím za platný £as. Ihned se tedy vytvo°í duplicitní záznam v tabulce CasyAktual a v tabulce Casy se ozna£í onen záznam atributem UlozeniCasu jako uloºený a tím p°ipravený pro vstup do procesu následných výpo£t·. Následuje souhrn atribut· entity Casy v tabulce 4.11. Název ID Cas IDZavodu StartCislo UlozeniCasu
Datový typ integer varchar(10) integer integer integer
Primární/cizí klí£ PK
Povinnost ano ne ne ne ne
Tabulka 4.11: Tabulka Casy
4.3.8.3 Koecienty Jiº bylo zmín¥no, ºe výpo£et bod· je ovlivn¥n koecientem. Tento koecient je reálné £íslo nabývající kladných hodnot men²ích neº rovných 1. Hodnota koecientu se li²í pro
4.4.
31
DIAGRAM TÍD DATOVÝCH ENTIT
kaºdou startovní kategorii podle toho, kolik závodník· se v ní závodu ú£astnilo a také jaké bylo zastoupení výkonnostních t°íd v této kategorii. Jeden záznam tabulky p°edstavuje sadu koecient·, které se uplatní pro kategorii s ur£itým po£tem závodník·. Vybere se takový koecient, který odpovídá nejvy²²í výkonnostní t°íd¥, která se v této startovní kategorii objevila. Výkonnostní t°ídy jsou uspo°ádány následovn¥ - ºádná, 1., 2., 3. a M. Je-li v kategorii závodník· více neº uvádí jakýkoliv záznam z tabulky, bere se za sm¥rodatný záznam s nejvy²²ím po£tem závodník·. Sloupce tabulky Koeficienty jsou sepsány v tabulce 4.12. Název ID PocetZavodniku MVT IVT IIVT IIIVT ZadnaVT
Datový typ integer integer double double double double double
Primární/cizí klí£ PK
Povinnost ano ano ano ano ano ano ano
Tabulka 4.12: Tabulka Koecienty
4.4
Diagram t°íd datových entit
V této kapitole chci v návaznosti na uvedený databázový model p°edstavit návrh t°íd, které zodpovídají za práci s daty a s databází. Kaºdé jednotlivé databázové tabulce bude v programu odpovídat jedna t°ída. Popisovaný model resp. £ást digramu t°íd je zobrazen na obrázku 4.5. Uvedu p°íklad pro entitu událost. K tabulce Udalost bude navrºena t°ída Udalost a instance této t°ídy pak odpovídají databázovým záznam·m tabulky Udalost. V²echny takovéto t°ídy budou mít za ú£el reprezentování dat a jejich úpravu (my²leno pouze programovou ne zm¥nu záznamu v databázi). T°ída tedy bude obsahovat privátní prom¥nné odpovídající jednotlivým sloupc·m databázové tabulky a ve°ejné metody getX() a setX() (tj. getNazev(), setNazev(String nazev)), které hodnoty prom¥nných zp°ístup¬ují navenek a umoº¬ují je m¥nit. Soubor instancí t°ídy Udalost, který by odpovídal v²em záznam·m z databáze, bude obsaºen v instanci t°ídy UdalostList, která má charakter singletonu. Tato t°ída bude moci generovat jen jedinou instanci, jejíº privátní prom¥nnou je seznam událostí (List
list) a tím je zaru£ena existence jediného seznamu v²ech záznam· událostí. Tato t°ída zprost°edkovává p°ístup do databáze. Hlavními metodami jsou:
• loadList() na£ítající seznam instancí t°ídy Udalost, • add(Udalost u) p°idávající nový objekt do seznamu a do databáze, • remove(Udalost u) odebírající objekt ze seznamu a vymazávající jej z databáze, • update(Udalost u) upravující hodnoty objektu.
32
KAPITOLA 4.
NÁVRH
Obrázek 4.5: Diagram t°íd - generalizující t°ída DBList
Jelikoº i ostatní t°ídy XList(X nahrazuje t°ídu odpovídající databázové entit¥) budou vyuºívat t¥chto metod je denována rodi£ovská t°ída DBList, která denuje spole£né prom¥nné (seznam objekt·) a metody (add(Object o), remove(Object o), update (Object o)). Ostatní t°ídy XList z ní pak d¥dí. Na následujícím schématu je ukázka £ásti diagramu t°íd pro pochopení uvedeného principu. Jednotlivé t°ídy nemají kv·li p°ehlednosti zobrazeny v²echny své prom¥nné a metody, ale jen ty podstatné. D¥di£nost mezi t°ídami DBList a ostatnímy XList je nazna£ena generalizujícím spojením. Vztah mezi t°ídou p°edstavující databázovou tabulku a t°ídou obsahující seznam instancí je kompozi£ní. M·ºeme si v²imnout, ºe t°ída Zavod vystupuje ve více vztazích. Za prvé v kompozi£ním vztahu ke t°íd¥ obsahující seznam v²ech jejích instancí a za druhé v agrega£ním vztahu ke t°íd¥ Udalost. Instance t°ídy Udalost si totiº taktéº uchovává seznam závod·, samoz°ejm¥ jen t¥ch, které s danou událostí souvisejí. Tento princip existence t°ídy X odpovídající databázové tabulce a t°ídy XList se vztahuje na tabulky Udalost, Zavod, Zavodnik, ZavodnikAktual, Druh, Kategorie, KategorieDruh, Klub, Casy, CasyAktual a Koeficienty. Opomenuty z·stávají tabulky StartKategorie a StartUdaje. Je ov²em logické, ºe u nich by existence zast°e²ující t°ídy XList postrádala smysl. Souhrn v²ech záznam· o startech závodník· nap°í£ v²emi závody v sezón¥ je neuºite£ný. Uplatnit se dá v²ak seznam startovních kategorií u jednoho
4.5.
33
VÝM
NA DAT
závodu a následn¥ seznam údaj· jednotlivc· pro v²echny kategorie jednoho závodu. Tyto dva seznamy zast°e²uje t°ída StartListina, která má asocia£ní vazbu s t°ídou Zavod, nebo´ existence zmín¥ných seznam· je podmín¥na existencí instance Zavod. Samotná t°ída StartListina je zodpov¥dná za spolupráci s databází obdobn¥ jako t°ídy XList. Denuje proto dv¥ privátní metody
• loadStartUdaje() a loadStartKategorie() pro na£tení seznamu startovních kategorií a seznamu v²ech údaj· jednotlivc· (nehled¥ na kategorie) pro jeden závod. Dále jiº ve°ejné metody
• addStartUdaje(StartUdaje o) pro p°idání objektu do seznamu údaj· jednotlivc·, addStartKategorie(StartKategorie o) pro p°idání objektu do seznamu startovních kategorií a uloºení do databáze, • removeStartUdaje(StartUdaje o), removeStartKategorie(StartKategorie o) pro odebrání z p°íslu²ných seznam· a z databáze, • updateStartUdaje(StartUdaje o), updateStartKategorie(StartKategorie o) pro úpravu objekt· jak v aplikaci tak v databázi. Instance t°ídy StartUdaje se obdobn¥ jako instance t°ídy Zavod vyskytují ve více vztazích a to jako seznam údaj· jednotlivc· pro v²echny závodníky v daném závod¥ (relace se t°ídou StartListina) a jako seznam údaj· jednotlivc· pouze v jedné startovní kategorii (relace se t°ídou StartKategorie). Vzájemné závislosti t°íd jsou ukázány na obrázku 4.6.
Obrázek 4.6: Diagram t°íd - startovní listina
4.5
Vým¥na dat
P°ená²ení dat mezi aplikací a centrální úrovní bude probíhat p°edáváním dat v souboru. Aby se snadno podchytila struktura dat (nap°. událost je sloºena ze závod·, závod z více kategorií,. . . ), bude se vyuºívat xml souboru. xml jazyk umoº¬uje pomocí zna£ek udrºet strukturovaná data v rámci oby£ejného textového souboru.
34
KAPITOLA 4.
NÁVRH
Jak má konkrétní xml soubor vypadat se stanoví xml schématem, které denuje strukturu dokumentu. Struktura se vytvá°í pomocí element· (zna£ek), které se do sebe dle pot°eby mohou zano°ovat. Element nese jméno a m·ºe mít i atribut. Skládá se bu¤ z jiných element·, nebo obsahuje pouze text, tj. informa£ní hodnotu. V této kapitole strukturu pouºívaných xml soubor· navrhnu. Blíºe k vytvá°ení xml schémat v [5]. 4.5.1
XML schéma pro import
Jelikoº se údaje p°edávané do centrální databáze a údaje z ní £erpané li²í (nap°. z centrální databáze se neposílají výsledky závod·), denují se dv¥ schémata, jedno pro kaºdý sm¥r komunikace. Pro importování z centrální databáze se denuje xml struktura podle schématu DeniceDat. Struktura uloºení element· je uvedena v následující ukázce:
DefiniceDat Koeficienty KategorieDruhy Druhy VsechnyKategorie ParametryKategorii Kluby Zavodnici Udalosti Udalost Zavod Zavod Udalost Zavod Kaºdý element s názvem uvedeným v mnoºném £ísle (Kluby, Druhy, Udalosti) obsahuje jeden aº n¥kolik element· stejného typu (Klub, Druh, Udalost). Element p°edstavující databázovou tabulku se pak skládá z element· odpovídajích sloupc·m tabulky. Element Udalost pak navíc obsahuje i závody, které do dané události spadají. Kompletní denice schématu je v p°íloze B. Následuje ukázka £ásti xml souboru se zobrazením struktury element· Udalost a Zavod:
1 1.P - ATEX CUP v letním biatlonu ºactva 1.P - ATEX CUP v l <Misto>Byst°ice pod Hostýnem 2006-05-27 2006-05-27 1 1.P Byst°ice pH 2006-05-27 <StartovniCas>09:00 1
4.5.
VÝM
NA DAT
35
1 Element KategorieDruhy neodpovídá databázové tabulce a sdruºuje v sob¥ v²echny druhy, kategorie a parametry denované pro dvojici kategorie-druh. Elementy p°edstavující databázové tabulky jsou opat°eny atributem, který je unikátním identikátorem z databáze. Tabulka KategorieDruh je závislá na datech tabulek Kategorie a Druh a proto má atribut· více:
<ParametryKategorie id="42" idKategorie="47" idDruhu="1"> U událostí, závod·, závodník· a klub· se navíc udává je²t¥ atribut p°edstavující provizorní identikátor, jehoº funkce byla vysv¥tlena v kapitole 4 v podkapitole 4.3.1. 4.5.2
XML schéma pro export
Pro export výsledk· závod· se pouºije schéma upravené. Krom¥ názvu ko°enového elementu tj. hlavního elementu struktury (Vysledky) se li²í strukturou elementu Zavod. Jinak z·stává struktura souboru zachována. Element Zavod v p°ípad¥ exportu dat musí obsahovat krom¥ atribut· závodu navíc údaje o startovních kategoriích a samoz°ejm¥ po°adí a výsledcích závodník·. Struktura elementu Zavod li²ícího se od p°edchozího schématu pro import vypadá následovn¥:
Zavod StartovniKategorie Zavodnik Zavodnik Zavodnik StartovniKategorie Zavodnik Pod elementem Zavodnici, který na p°edchozím p°íkladu není uveden (viz schéma pro import dat z p°edchozí kapitoly), lze najít základní informace o biatlonistech jako jméno, p°íjmení, £i do které kategorie pat°í. Element Zavodnik uvedený pod uzlem StartovniKategorie v rámci závodu v²ak jiº obsahuje jen identikátor závodníka a informace podstatné pro ur£ení výsledk· (startovní £íslo, startaovní £as, cílový £as, p°iráºka, body,. . . ).
36
KAPITOLA 4.
NÁVRH
Kapitola 5
Pouºité technologie 5.1
Úvod
Kapitola pouºité technologie je do práce za°azena z d·vodu seznámení s technologiemi, které nejsou zcela b¥ºné a kterých v implementa£ní £ásti práce budu vyuºívat. Základní principy pouºitých technologií osv¥tlím v následujících podkapitolách, £ímº se v kapitole v¥nované implementaci mohu zam¥°it na konkrétní aplikaci a pouºití t¥chto technologií.
5.2
Java Data Ob ject a JPOX
Pro trvalé uchování dat událostí, závod·, závodník· a jiných entit vyuºívá aplikace databázi. Pro práci s databází pouºiji ve své práci technologii Java Data Object. Java Data Object (jdo) je standardizované aplika£ní rozhraní mezi Java objekty a datovým úloºi²t¥m. jdo poskytuje objektovou persistenci (object persistence ), coº znamená ukládání a získávání dat z databáze ve form¥ Java objekt·. Tento p°ístup odd¥luje manipulaci dat na aplika£ní úrovni od manipulace dat v rámci databáze, tj. logiku aplikace od zp·sobu uloºení dat. Aplika£ní objekt, který se bude ukládat do databáze, m·ºe nap°íklad p°edstavovat spojení dvou databázových tabulek, av²ak programátor aplika£ní logiky nemusí databázový model znát. Odstra¬uje nutnost psaní kódu v sql jazyce nebo´ pracuje na úrovni objekt· a ne databázových tabulek. jdo podporuje ukládání dat do objektových i rela£ních databází. Podrobn¥ji k jdo viz [7]. Výhodami pouºití jdo je tedy odd¥lení vlastní implementace od zp·sobu práce s databází, £ímº je umoºn¥na zm¥na databáze bez v¥t²ího zásahu do aplikace samotné. A samoz°ejm¥ programátorovi odpadá sloºité kódování sql dotaz· pro získávání, modikaci a ukládání dat do databáze. Tato kapitola je v¥nována seznámení s obecnými principy práce s jdo, které ve své práci uplatním. Uvedu, jakým zp·sobem se denuje, které objekty a jak se do databáze prost°ednictvím této technologie ukládají a seznámím se základními operacemi s persistetními daty . 37
38
KAPITOLA 5.
5.2.1
POUITÉ TECHNOLOGIE
Enhancement proces
Javovská t°ída, jejíº objekty mají být ukládány do databáze, musí implementovat rozhraní PersistenceCapable. To se stane po té, co je na t°ídu aplikován proces roz²í°ení (enhancement proces ), který jí dodá p°íslu²né metody. Modikace t°ídy prob¥hne na úrovni byte-kódu, £ímº z·stává zachován p·vodní zdrojový kód t°ídy. Aby mohl enhancement proces prob¥hnout, je t°eba pro p°íslu²nou t°ídu vytvo°it persistence descriptor, který ur£uje mapování prom¥nných t°ídy na sloupce p°íslu²né tabulky v databázi. 5.2.2
Persistence
P°i vyuºití
jdo
se v implementaci rozli²ují t°i typy t°íd:
• Persistence Capable, jejichº instance mohou být ukládány do databáze. Tyto t°ídy musí projít enhancement procesem, neº je moºné vyuºít jdo prost°edí. • Persistence Aware, které manipulují s instacemi t°íd PersistenceCapable. • normální t°ídy, které nemají s persistencí dat nic spole£ného. U t°íd typu PersistenceCapable je nutné v¥d¥t, které typy prom¥nných jsou podporovány v procesu ukládání do databáze. jdo specikace denuje dva typy, které je moºné uloºit do databáze:
• First Class Object (FCO), coº jsou objekty t°íd PersistanceCapable. • Second Class Object (SCO), coº je denovaný vý£et datových typ· jako int, float, double[], Integer, List, Set, Collection. . . A£koliv je ur£itý typ podporován v rámci jdo implementace, nemusí to automaticky znamenat, ºe pat°í mezi datové typy, které se defaultn¥ na£ítají jako prom¥nné t°ídy PersistanceCapable (tzn. ºe p°i získání objektu z databáze se hodnota prom¥nné inicializuje podle údaj· v databázi). Datové typy, které pat°í do skupiny default fetch group, se defaultn¥ na£ítají. P°íkladem typu, který se defaultn¥ z databáze nena£ítá je kup°íkladu double[]. Ostatní typy je moºno do této skupiny p°idat, nebo jim vytvo°it vlastní pojmenovanou skupinu named fetch group. Rovn¥º typy, které nejsou defaultn¥ persistentní (tj. nejsou automaticky ukládány do databáze), mohou být nastaveny jako persistentní. Tím se dostáváme ke zp·sobu mapování prom¥nných t°ídy PersistanceCapable na sloupce databáze.
5.2.2.1 Persistence descriptor jpox
•
podporuje t°i zp·soby, jak vytvo°it persistence descriptor : xml
Metadata
• anotace • kombinace obou p°edchozích
5.2.
JAVA DATA OBJECT A JPOX
39
Ú£elem v²ech metod je ur£it, které prom¥nné t°ídy p°íslu²í kterým sloupc·m v databázi. První moºnost vyuºívá soubor· xml, jejichº struktura popisuje jednotlivé persistentní t°ídy a jejich prom¥nné. Ve své práci vyuºívám druhé varianty, která je zaloºena na pouºití anotací, tj. zna£ek, které se vkládají p°ímo do kódu p°ed denice nebo deklarace t°íd £i polí. Zna£ka @PersistenceCapable nebo @PersistenceAware ur£ující typ t°ídy se vkládá p°ed deklaraci t°ídy. T°ídám PersistenceCapable se p°idává atribut detachable s hodnotou true, coº znamená, ºe objekt je moºné po získání z databáze od ní odpojit a pracovat s ním v rámci aplikace samostatn¥. Byly-li n¥které jeho prom¥nné zm¥n¥ny, p°ipojí se pak zp¥t k databázi a hodnoty v databázi odpovídající tomuto objektu jsou upraveny. P°ed deklaraci prom¥nných se vloºením zna£ky @Persistent ur£uje persistentnost dané prom¥nné. Uvede-li se v závorce atribut persistenceModifier s hodnotou NONE, prom¥nná se do databáze neukládá. Atributem primaryKey ozna£ujeme, ºe prom¥nná zastává funkci primárního klí£e. P°ed deklaraci prom¥nných se vkládá také zna£ka @Column s atributem name. Touto anotací se stanovuje, kterému sloupci v databázi se daná poloºka t°ídy p°i°adí, její atribut jdbcType ur£uje typ ukládané prom¥nné. T°ída opat°ená anotacemi je uvedena v následujícím p°íkladu:
@PersistenceCapable(detachable="true") public class Druh { @Persistent(primaryKey="true") @Column(name="IDDruhu") private int idDruhu; @Persistent @Column(name="Zkratka", jdbcType="varchar", length=20) private String zkratka; }
...
Podrobn¥j²í p°íklad na anotace je uveden v £ásti v¥nující se implementaci v kapitole 6.4.1.
5.2.2.2 PersistenceManagerFactory a PersistenceManager Aplikace vyuºívající jdo vyºaduje minimáln¥ jednu instanci t°ídy PersistenceManagerFactory (dále pmf), která spravuje konguraci persistence a umoº¬uje vytvá°et instance t°ídy PersistenceManager (dále pm). Instance t°ídy PersistenceManager poskytuje metody k persistenci objekt·.
5.2.2.3 Kongurace PersistenceManagerFactory Kongurace pmf obsahuje nap°. parametry pro p°ipojení k databázi nebo denování chování persistentních objekt· a je uloºena v souboru jpox.properties. Kaºdý parametr je zaznamenán ve tvaru název parametru = hodnota parametru. Kongura£ní soubor pak vypadá nap°. následovn¥:
40
KAPITOLA 5.
POUITÉ TECHNOLOGIE
javax.jdo.PersistenceManagerFactoryClass= org.jpox.jdo.JDOPersistenceManagerFactory javax.jdo.option.ConnectionDriverName= org.apache.derby.jdbc.ClientDriver org.jpox.query.allowAllSQLStatements=true org.jpox.persistenceByReachabilityAtCommit=false dbURL=F:/Eclipse_workspace/biatlon/biatlonDB Pro vytvo°ení instance pmf je vºdy nutné denovat parametry:
• javax.jdo.PersistenceManagerFactoryClass, který ur£uje název t°ídy implementující rozhraní PersistenceManagerFactory • javax.jdo.option.ConnectionDriverName ur£ující jméno ovlada£e vyuºívaného pro p°ipojení k databázi • javax.jdo.option.ConnectionURL specikující databázi. Tento parametr se v kongura£ním souboru nevyskytuje, protoºe se skládá z více hodnot, z nichº n¥které nastavuje uºivatel po spu²t¥ní aplikace. 5.2.3
Práce s persistentními ob jekty
Základní operace pro persistenci dat jsou:
• uloºení nového objektu : pm.makePersistent(o) Má-li objekt reference na dal²í objekty, které jsou také persistable, uloºí se do databáze i ty. Tomuto chování lze zabránit nastavením vlastnosti pmf org.jpox.persistenceByReachabilityAtCommit na hodnotu false. • získání objektu z databáze :
pomocí rozhraní Extent Uvedu obecný p°íklad1 :
Extent e = pm.getExtent(mydomain.MyClass.class, true); Iterator iter=e.iterator(); while (iter.hasNext()) { MyClass my_obj=(MyClass)iter.next(); ... }
pomocí rozhraní Query
Uvedu na p°íkladu získání seznamu v²ech událostí. Zde se navíc vyuºije podpory dotazovacího jazyka sql.
Query q = pm.newQuery("javax.jdo.query.SQL", "SELECT idudalosti, idudalostipr, zkratka, nazev, " + "mistokonani, datumod, datumdo, flag FROM UDALOST"); lst = (List) q.execute(); 1
zdroj: http://db.apache.org/jdo/pm.html
jdo
5.3.
JASPERREPORTS
41
• odstran¥ní objektu : pm.deletePersistent(o) V²echny metody persistence jsou zpracovávány v transakcích. Vyskytne-li se chyba, jsou zm¥ny v rámci transakce vráceny zp¥t. Po provedení transakce jsou objekty odpojeny od databáze metodou pm.setDetachAllOnCommit(true), £ímº s nimi lze v rámci aplikace pracovat i po ukon£ení transakce.
5.2.4
JPOX
Pro persistenci objekt· se v aplikaci vyuºije projektu jpox, coº je implementace jdo specikace. jpox podporuje v¥t²inu rela£ních databází a také umoº¬uje vyuºít n¥kterých dotazovacích jazyk·, z nichº ve své práci zuºitkuju pouze dotazovací jazyk sql. V dob¥ dohotovení mé práce, která vyuºívá jpox 1.2, se projekt jpox nahrazuje projektem DataNucleus a tudíº dal²í verze jpox jiº nebudou vyvíjeny.
5.3
Jasperreports
Pro tisk je moºno pouºít knihovnu JasperReports (JR), která umoº¬uje dynamickou tvorbu dokument·. Nástroj poskytuje výstupy na tiskárnu nebo do souboru ve formátech pdf, html, xml a jiných. Tato kapitola objasní základní principy pouºití knihovny jr, které se následn¥ aplikují p°i tisku startovní a výsledkové listiny. jr pouºívá ²ablonu, která denuje vzhled a rozmíst¥ní element·. ablona je roz£len¥ná do více sekcí (nap°. záhlaví, zápatí, nadpis a detail), do kterých se umís´ují r·zné typy element· jako linky, statická nebo dynamická textová pole a jiné. ablona je xml soubor a nese p°íponu .jrxml. Snadnou tvorbu ²ablony umoº¬uje program iReports, který nabízí gracký editor pro rozmíst¥ní element· v reportu.
Výhoda jr tkví nap°. v moºnosti denování více ²ablon, £ímº vzniknou pro stejná data r·zné reporty pouºitelné r·zné p°íleºitosti. Kompilací ²ablony metodou compileReport() t°ídy JasperCompileManager vznikne soubor s p°íponou .jasper. Sou£asn¥ je validována ²ablona a p°ipojují se související data, £ímº se mohou vyhodnotit výrazy reportu. Report se naplní daty metodou fillReport() t°ídy JasperFillManager, tím se vygeneruje soubor s p°íponou .jrprint. Výsledkem této operace je objekt p°edstavující dokument p°ipravený pro tisk. Tento objekt m·ºe být exportován do souboru r·zných formát·. jr také umoº¬uje pouºití subreport·, coº znamená vloºení jednoho reportu do jiného. Této moºnosti se vyuºívá p°edev²ím tehdy, má-li se ur£itá £ást dokumentu vícekrát opakovat. Pro takovou £ást se denuje vlastní report, který pak vystupuje v pozici subreportu vzhledem k master reportu, do kterého se bude vkládat.
Za zdroj dat m·ºe slouºit spojení s rela£ní databází, kolekce, pole objekt· nebo data.
xml
Podrobný návod k vyuºití ve²kerých moºností nabízených Jasperreports lze £erpat z [6].
42
KAPITOLA 5.
5.4
POUITÉ TECHNOLOGIE
Dom4j
Pro tvorbu xml dokument· a jejich na£ítání je vyuºito knihovny dom4j a to p°edev²ím z d·vody její snadné pouºitelnosti. Celá xml struktura se uchovává v jediné prom¥nné. Práce s obsahem souboru je obdobná práci se seznamy. Metody pro p°idávání £i získávání element· v rámci xml struktury jsou velmi jednoduché, proto byla knihovna zvolena pro vým¥nu dat souborem xml. 5.4.1
Generování XML
Objekt t°ídy Document má za úkol v sob¥ uchovávat celou strukturu element· a vytvá°í se statickou metodou createDocument() t°ídy DocumentHelper. Základní práci s xml elementy poskytují metody:
• addElement(String nazev) p°idávající nový element. Metoda se volá bu¤ na prom¥nnou Document nebo Element a vrací nov¥ vytvo°ený element. • addAttribute(String nazev, String hodnota) p°idá elementu atribut ur£ený jménem a hodnotou. • addText(String text) p°idá elementu hodnotu v podob¥ textu. První element se p°idává zmín¥nou metodou addElement(String nazev) volanou na instanci t°ídy Document. Kaºdý dal²í element se nav¥²uje stejnou metodou bu¤ na ko°en nebo na jiný existující uzel xml stromu. Element m·ºe mít denován atributy. Atribut se elementu p°idává metodou elementu addAttribute(String nazev, String hodnota). Má-li obsahovat element n¥jakou hodnotu, vyuºívá se metody addText(String text). 5.4.2
Na£ítání XML
Pro zpracování existujícího xml souboru je t°eba um¥t procházet jeho strukturou. Základními operacemi nesoucími podobnou funkci jsou:
• elements() vracející seznam element·, které jsou obsaºeny v práv¥ zpracovávaném uzlu, • elementIterator() vracející iterátor p°es potomky daného elementu. Konkrétní uzel se zpracovává metodami:
• attribute(String nazev) vracející pro zpracovávaný element jeho atribut se zadaným jménem, • getText() vracející hodnotu atributu, na který je metoda volána, • elementText(String nazev) vracející hodnotu textového elementu potomka, kterého rozli²íme názvem.
5.5.
JAVACOMM A RXTX
43
Pro zpracování xml dokumentu se vyuºívá t°ídy SAXReader. Prom¥nná document, do které se na£te struktura element· souboru inputFile, se vytvo°í následovn¥:
SAXReader xmlReader = new SAXReader(); Document document = xmlReader.read(inputFile); Na£ítání za£íná ko°enovým elementem, jeho potomci se získávají uvedenou metodou elements() nebo se p°es n¥ iteruje pomocí iterátoru. V jakém elementu se nacházíme p°i pr·chodu xml strukturou lze ov¥°it metodou getName() vracející název uzlu. Hodnoty textových element· se získávají metodou elementText(String nazev) volanou na zpracovávaný element. Hodnoty atribut· pak zmín¥nou metodou getText(). 5.5
JavaComm a RxTx
Komunikace aplikace s elektronickými hodinami probíhá prost°ednictvím sériového portu. Pro práci se sériovým portem je denováno aplika£ní programátorské rozhraní JavaComm. Toto rozhraní implementují dv¥ knihovny JavaComm a RxTx. V této kapitole ukáºu funkce rozhraní JavaComm, které se posléze vyuºijí p°i implementaci komunikace se sériovým portem RS-232. Pro navázání komunikace se sériovou linkou je nejprve pot°eba daný port nalézt. Postupuje se v následujících krocích:
• získání seznamu v²ech dostupných port· (identikátor· port·) • iterováním p°es tento seznam se u kaºdého portu kontroluje, zda jde o sériový port s hledaným jménem • získání portu Seznam dostupných port· se získá pomocí statické metody t°ídy CommPortIdentifier:
Enumeration portIdentifiers = CommPortIdentifier.getPortIdentifiers(); Identikátory port· p°edstavují objekty t°ídy CommPortIdentifier. Zji²t¥ní, o jaký typ portu se jedná, se provede metodou getPortType(). Podle jména (nap°. "COM1") se ur£í hledaný port. K tomu slouºí metoda getName(). Kontrola se tak provádí výrazem (prom¥nná pid p°edstavuje identikátor portu):
(pid.getPortType() == CommPortIdentifier.PORT_SERIAL) && (pid.getName().equals(portName)) Posledním krokem je získání portu z identikátoru portu:
port = (SerialPort) portId.open("name", 10000); V metod¥ open vystupují parametry Název aplikace ºádající port a ekací doba (ms) na otev°ení. Tato metoda vyhazuje vyjímku PortInUseException ozna£ující, ºe ºádaný port je jiº obsazen.
44
KAPITOLA 5.
POUITÉ TECHNOLOGIE
Kapitola 6
Implementace 6.1
Úvod
Aplikace je implementována v programovacím jazyce Java (viz [3]). Nejprve zmíním rozd¥lení t°íd do balí£k· a stru£n¥ uvedu, jaké funkcionality balí£ek zaji²´uje. Celou prací se prolíná ukládání a získávání dat z databáze, proto je hned následující kapitola v¥nována práci s databází. Poté se zam¥°ím na jednotlivé balí£ky zvlá²´ a podrobn¥ji a to v posloupnosti, v jaké jsou vyuºívány p°i operátorov¥ práci s aplikací. Sou£asn¥ bude text dopl¬ován o snímky grackého uºivatelského rozhraní aplikace pro ilustraci operátorovy práce.
6.2
Struktura programu
Program je sloºen z následujících balí£k·:
• comparators : denuje srovnávání objekt· • databaseConnect : zaji²´uje p°ipojení k databázi • db : reprezentuje data z databáze v podob¥ objekt·, spravuje data v databázi • editor : denuje editory typu JCheckBox, JComboBox pro jejich uºití nap°. v tabulkách • exception : spravuje výjimky • gui : vytvá°í gracké uºivatelské rozhraní1 • listeners : zahrnuje poslucha£e událostí • losovani : obstarává losování závodník· ve startovní listin¥ • print : zaji²´uje tisk startovní a výsledkové listiny • renderer : vytvá°í zobrazova£e typu JCheckBox, JComboBox • serial : zprost°edkovává komunikaci s £asomírou 1 Balí£ek gui nebude v práci podrobn¥ji popisován. Více k tvorb¥ grackého uºivatelského rozhraní v [4]
45
46
KAPITOLA 6.
IMPLEMENTACE
• singleton : obsahuje t°ídy AktualniZavod a Frame navrhnuté dle návrhového vzoru singleton • sorting : slouºí k °azení dat v tabulkách • tableModel : zahrnuje datové modely pro tabulky • time : slouºí k p°evodu £asových a datových formátu mezi aplikací a databází • treeModel : obsahuje datový model pro komponentu JTree • verifier : ov¥°uje vstupní data formulá°·
gui
• vypocet : provádí výpo£et závod· • xml : importuje a exportuje data v podob¥ 6.3
xml
soubor·
Databáze
Aplikace vyuºívá databáze Derby, která je nabízena ve dvou verzích:
• Embedded pouºitelná pro aplikace s jedním uºivatelem. Derby pak b¥ºí na stejné jvm (Java Virtual Machine) jako aplikace. • Server umoº¬ující víceuºivatelský p°ístup. Aplikace se p°ipojují k serveru, kde b¥ºí Derby. Poºadavky víceuºivatelského p°ístupu poloºené v kapitole 2.3 spl¬uje druhý framework, který je v práci pouºit. Vyuºití serverové verze databáze vyºaduje p°ed p°ístupem do databáze spu²t¥ní serveru. Po skon£ení práce s aplikací je t°eba server ukon£it. Tyto £innosti lze provést p°íkazy p°íkazové °ádky nebo v rámci javovské aplikace. Víceuºivatelský p°ístup k databázi v²ak spou²t¥ní a zastavování serveru v rámci aplikace vylu£uje. Pro svou jednoduchost bylo zvoleno °e²ení spu²t¥ní serveru pomocí p°íkazu start p°íkazové °ádky. Pro spu²t¥ní byl vytvo°en .bat soubor ve tvaru:
set DERBY_HOME="C:\Program Files\db-derby-10.4.1.3-bin" java -jar %DERBY_HOME%\lib\derbynet.jar start Prom¥nnou DERBY_HOME je t°eba nastavit na p°íslu²ný adresá°, ve kterém je databáze Derby nainstalována. P°edpokládá se správné nastavení prom¥nné JAVA_HOME. Pro ukon£ení £innosti serveru p°íkazem server shutdown je vytvo°en .bat soubor obsahující °ádky:
set DERBY_HOME="C:\Program Files\db-derby-10.4.1.3-bin" java -jar %DERBY_HOME%\lib\derbyrun.jar server shutdown Dal²ím krokem je získání p°ipojení k databázi, coº se provádí p°i zavád¥ní instance t°ídy PersistenceManagerFactory (viz kapitola 5.2.2.2). P°i vytvá°ení instance této t°ídy se p°ipojení do databáze denuje °et¥zcem, jenº má tvar:
jdbc:derby://host:port/database
6.4.
UKLÁDÁNÍ DAT
47
V²echny hodnoty pro nastavení p°ipojení k databázi uchovává t°ída Connect balí£ku databaseConnect ve svých statických prom¥nných:
• driver ovlada£ pro p°ipojení k databázi (v kapitole 5.2.2.3 zmín¥ný org.apache. derby.jdbc.ClientDriver) • dbName jméno, resp. adresa databáze • host a port adresa a port serveru • connURL jiº zmín¥ný °et¥zec pro p°ipojení k databázi • dbPropsFile adresa uloºení souboru jpox.properties • properties prom¥nná properties obsahující vý²e zmín¥né hodnoty, které slouºí pro vytvo°ení instance PersistenceFactoryManager Adresa databáze je dána nastavením v souboru jpox.properties a aplika£n¥ ji není moºno m¥nit. D·vodem je vyuºití klient-server p°ístupu. Naopak jméno serveru a port pro p°ipojení nastavuje uºivatel a soubor jpox.properties tyto hodnoty neobsahuje. et¥zec connURL ur£ující p°ipojení je sloºen ze zmín¥ných prom¥nných jméno serveru, jeho port a adresa databáze. V kapitole 5.2.2.3 je podrobn¥ji rozvedena struktura kogura£ního souboru, který slouºí pro inicializaci prom¥nné properties. 6.4
Ukládání dat
Zp·sob ukládání dat technologií jpox byl vysv¥tlen v kapitole 5.2. V této kapitole p°edvedu p°íklad vytvo°ení persistence descriptoru, vytvo°ení instancí t°íd zaji²´ujících persistenci a zmíním potíºe, na které jsem p°i pouºití této technologie narazila. 6.4.1
Anotace t°íd
T°ídy, jejichº datové poloºky mají být ukládány do databáze, se ozna£ují jako PersistenceCapable. P°íkladem nech´ jsou t°ídy Zavodnik, Klub nebo Druh. Naopak p°íklady t°íd, které persistenci provád¥jí (PersistenceAware), jsou t°eba t°ídy DBList, ZavodniciList nebo DruhList. Pro namapování datových poloºek t°íd PersistenceCapable na sloupce tabulek v databázi jsem zvolila anotace popsané v kapitole 5.2.2.1. Následuje ukázka anotace pro t°ídu KategorieDruh:
@PersistenceCapable(detachable="true") public class KategorieDruh { @Persistent(primaryKey="true") @Column(name = "ID") private int id; @Persistent
48
KAPITOLA 6.
IMPLEMENTACE
@Column(name="strelba", jdbcType ="varchar", length=6) private String strelba; @Persistent @Column(name = "prirazka", jdbcType = "varchar", length=10) private String prirazka; @Persistent @Column(name="delka") private double delka; @Persistent(defaultFetchGroup="true") @Column(name="iddruhu") private Druh druh; @Persistent(defaultFetchGroup="true") @Column(name="idkat") private Kategorie kategorie; Aby p°i získání objektu typu KategorieDruh byly na£teny i prom¥nné typu Kategorie a Druh, které p°edstavují reference na jiné objekty (a nejsou tedy na£ítány defaultn¥), roz²í°í se default fetch group o tyto typy. To se provede nastavením vlastnosti defaultFetchGroup u anotace @Persistent na hodnotu true. 6.4.2
Práce s daty
V aplikaci vyuºívám pouze po jedné instanci t°ídy PersistenceManagerFactory a PersistenceManager. Objekty t¥chto t°íd jsou statické prom¥nné ve t°íd¥ DBManager, která je typu PersistenceAware. Objekt pmf se zavede statickou metodou t°ídy JDOHelper s parametrem typu Properties, který ur£uje konguraci pmf:
pmf = JDOHelper.getPersistenceManagerFactory(properties); Objekt pm se získá následovn¥:
pm = pmf.getPersistenceManager(); Za na£tení kongurace odpovídá t°ída Connect (viz kapitola 6.3) uchovávájící ve t°ídních prom¥nných název kongura£ního souboru jpox.properties a v prom¥nné typu Properties zmi¬ovanou konguraci. Tato prom¥nná je typu HashMap, tj. pro kaºdý klí£ uchovává jeho hodnotu. Metodou setProperties() se nastavují jednotlivé hodnoty parametr· ze souboru jpox.properties. Ve°ejnou metodou getProperties() se vlastnosti zp°ístupní pro t°ídu DBManager, která je vyuºije ke tvorb¥ instance PersistenceManagerFactory. Persistence objekt· je provád¥na ve t°ídách XList metodami add(Object o), update (Object o), remove(Object o), p°íp. removeAll(). Persistenci objekt· provádí instance t°ídy PersistenceManager získávaná následovn¥:
6.4.
UKLÁDÁNÍ DAT
49
pm = DBManager.getPersistenceManager(); Persistentní operace jsou, jak jiº bylo zmín¥no, zpracovávány v transakcích. Pouºití transakce je ukázáno na p°íkladu vkládání objektu do databáze ve t°íd¥ DBList :
public boolean add(T o) { PersistenceManager pm = DBManager.getPersistenceManager(); pm.setDetachAllOnCommit(true); Transaction tx = pm.currentTransaction(); try { tx.begin(); pm.makePersistent(o); tx.commit(); } finally { if (tx.isActive()) { tx.rollback(); } } boolean retval = list.add(o); }
6.4.3
return retval;
SQL
Bohuºel jsem nemohla pouºít anotací t°íd a jejich výhod pro v²echny t°ídy PersistenceCapable. V pr·b¥hu provád¥ní persistentních operací se objevovaly chyby (nap°. chyb¥la reference na objekt, nebylo moºno k objektu p°istoupit, a£koliv byl detachován,. . . ). Odstran¥ní t¥chto potíºí jsem si slibovala od správné kongurace vlastností MaxFetchDepth a Persistence-By-Reachability. První nastavuje hloubku, do které se z databáze na£ítají objekty dle objektového grafu. Druhou jsem se naopak snaºila zabránit ukládání referencovaných objekt·. Jelikoº ani jedna cesta nevedla k cíli a je moºné, ºe chyba tkví v knihovn¥ jpox (nebo´ na vlastnost Persistence-ByReachability bylo hlá²eno vícero chyb), rozhodla jsem se automatické persistenci n¥kterých objekt· vyhnout. Persistenci objekt· t°íd Udalost, Zavod, StartKategorie a StartUdaje nenechávám p°ímo na technologii jpox nýbrº ji provádím pomocí sql dotaz· v rámci jpox podpory dotazovacích jazyk·. Pro tyto t°ídy tedy nejsou denovány ani anotace. P°íklad pouºití dotazovacího jazyka sql pro provedení operace update na objekt t°ídy Udalost následuje:
50
KAPITOLA 6.
IMPLEMENTACE
Query q = pm.newQuery("javax.jdo.query.SQL", "UPDATE UDALOST SET " + "idudalostipr = :idudpr , " + "zkratka = :zkr , " + "nazev = :naz , " + "mistokonani = :misto , " + "datumod = :datumod , "+ "datumdo = :datumdo ," + "flag = :flag " + "WHERE idudalosti = :idud"); Map params = new HashMap(); params.put("idudpr", u.getIdUdalostiPr()); params.put("zkr", u.getZkratka()); params.put("naz", u.getNazev()); params.put("misto", u.getMisto()); params.put("datumod", u.getDatumOd()); params.put("datumdo", u.getDatumDo()); params.put("idud", u.getIdUdalosti()); params.put("flag", u.getFlag()); Object o = q.executeWithMap(params); Pro provedení dotazu do databáze je vyuºito rozhraní Query, které bylo vysv¥tleno v kapitole 5.2.3.
6.5
Aktuální závod
St¥ºejní práce operátora spo£ívá ve zpracování závodu. Nejprve tedy v rámci implementace uvedu zp·sob reprezentace entity závod a její vztah k jiným t°ídám. V pr·b¥hu operátorovy práce se závodem neposta£uje v rámci aplikace t°ída Zavod pro plné reprezentování dat a metod spojených s probíhajícím závodem. Krom¥ názvu £i doby startu se k závodu váºe nap°. startovní listina, £asy závodník· nebo probíhající výpo£et. Tato data a operace s nimi spojené jsou podchyceny v jiných t°ídách. V programu budou obsaºeny instancí t°ídy AktualniZavod s pat°i£nými referencemi na jiné objekty. Protoºe se v daném £ase b¥ºí pouze jeden závod, je t°eba zajistit existenci pouze jedné instance této t°ídy. Vyuºije se zde tedy návrhového vzoru singleton. Existence jediné instance t°ídy je zaji²t¥na privátním konstruktorem a statickou metodou getInstance() vracející instanci t°ídy AktualniZavod, kterou inicializuje privátním konstruktorem p°i svém prvním volání. Následuje vý£et nejd·leºit¥j²ích dat t°ídy s konstruktorem a statickou metodou getInstance():
public class AktualniZavod { private static AktualniZavod singleton;
6.6.
51
PÍPRAVA ZÁVODU
private private private private private private
Zavod StartListina CasyAktualList Vypocet TiskStartovka TiskVysledky
zavod; startListina; casyAktualList; vypocet; tiskStart; tiskVysl;
... /** * private constructor */ private AktualniZavod() {} /** * @return instance of singleton */ public static AktualniZavod getInstance(){ if(singleton == null){ singleton = new AktualniZavod(); } return singleton; } ... } 6.6
P°íprava závodu
Následující kapitoly sledují práci operátora p°i závodu a jsou dopl¬ovány obrázky z grackého uºivatelského rozhraní aplikace, které je zaji²´ováno balí£kem gui. Práce operátora v rámci jednoho závodu za£íná otev°ením tohoto závodu výb¥rem ze seznamu závod· pro danou sezónu (viz obr. 6.1) Akce otev°ení závodu znamená inicializaci singletonu AktualniZavod metodou setZavod(Zavod zavod). Nyní obsahuje singleton AktualniZavod instanci závodu, se kterým bude operátor pracovat. Dále se zp°ístupní ty poloºky v menu, které dávají smysl pouze p°i práci s konkrétním závodem (nap°. Prezentace, Startovní listina, Tisk, Výsledky,. . . ). Toto okno aplikace slouºí pro správu událostí a závod· (vytvá°ení, mazání, vyhledávání,. . . ) a je instancí t°ídy IntFramePraceSeZavodem.
52
KAPITOLA 6.
IMPLEMENTACE
Obrázek 6.1: GUI - práce se závodem
6.6.1
Prezentace
Prvním úkolem operátora v den závodu je provedení prezentace závodník·, kte°í se k závodu dostavili. Nalezení konkrétního závodníka v seznamu v²ech uleh£uje ltrování a vyhledávání dle závodníkova id, jména £i p°íjmení (viz obr. 6.2). Zaprezentovaní závodníci jsou ozna£eni v posledním sloupci za²krtnutím v poli. Toto pole je sou£asn¥ editovatelné a tudíº lze snadno do startovní listiny dal²í biatlonisty p°idávat nebo je odebírat. V²echny tyto funkce zaji²´uje instance t°ídy IntFrameStartListina. Prezentací závodníka se vytvo°í nová instance t°ídy StartUdaje(Zavodnik zav, int idKat) (parametry jsou závodník a id kategorie závodu), která uchovává ve²keré údaje jednotlivce pot°ebné k závodu. Tato instance se p°idá do prom¥nné seznamStartUdaju typu ArrayList<StartUdaje>, která je uchovávána t°ídou StartListina, jejíº jedinou instanci obsahuje singleton AktualniZavod:
StartUdaje stUdaje = new StartUdaje(zav, zav.getKat().getIdKat()); AktualniZavod.getInstanceOf().getStartListina().addStartUdaje(stUdaje); Okno pro prezentaci zastává také funkci správy závodník·. Jak bylo zmín¥no v analýze v kapitole 3.4.3, je t°eba p°i procesu prezentace data závodník· upravovat £i vkládat. Zobrazený seznam závodník· je vyltrovaný seznam ze t°ídy ZavodniciList, který neobsahuje duplicity závodník· (nap°. závodník zm¥nil p°íjmení, je tedy v seznamu dvakrát, problematika byla rozebrána v kapitole 4.3.8.1). Práv¥ upravením jednoho záznamu zobrazeného v tabulce (úprava p°íjmení, výkonnostní t°ídy) se vytvo°í nová instance t°ídy Zavodnik a seznam ve t°íd¥ ZavodniciList se roz²í°í. Naopak unikátní sez-
6.6.
PÍPRAVA ZÁVODU
53
Obrázek 6.2: GUI - prezentace závodník·
nam závodník· s jejich nejaktuáln¥j²ími údaji ve t°íd¥ ZavodniciAktualList (tj. seznam instancí t°ídy ZavodnikAktual) z·stane zachován, jen je pat°i£ný záznam pozm¥n¥n. Vytvo°ení zcela nového závodníka pak logicky znamená jak vytvo°ení nové instance Zavodnik tak i ZavodnikAktual. U smazání jde taktéº o odstran¥ní v²ech záznam· závodníka se stejným idZavodnika ze seznamu ZavodniciList a odstran¥ní jednoho záznamu ze seznamu ZavodniciAktualList. Nicmén¥, pokud uº závodník startoval v n¥jakém závod¥, je t°eba jeho údaje pro pozd¥j²í zpracování zachovat a proto jeho smazání není dovoleno. 6.6.2
Startovní listina
Startovní listina, jak nazna£uje p°edchozí kapitola, zobrazuje data obsaºená t°ídou StartListina. Nejd·leºit¥j²í je samoz°ejm¥ seznam závodník·, který je zachycen v prom¥nné typu seznam seznamStartUdaju obsahující objekty t°ídy StartUdaje. Sou£asn¥ v²ak operátor vidí seznam startovních kategorií, který je reprezentován prom¥nnou seznamStartKategorii typu ArrayList<StartKategorie>. Vykreslení okna uºivatelského rozhraní obstarává t°ída IntFrameStartListina (viz obr. 6.3).
54
KAPITOLA 6.
IMPLEMENTACE
Obrázek 6.3: GUI - startovní listina
6.6.2.1 Losování Závodníci jsou ve startovní listin¥ uspo°ádáni losováním. Rozlosování závodník· zaji²´uje balí£ek losovani. Rozhraní Losovani deklaruje t°ídám balí£ku metodu rozlosuj(), která po°adí závodník· vypo£ítává. Implementovány jsou dva zp·soby losování:
• náhodné losování, které poskytuje t°ída Nahodne, • losování ze závodu implementované t°ídou ZeZavodu Náhodné losování °adí závodníky v rámci jejich startovních kategorií pomocí metody nextInt(int max) (objektu t°ídy Random) vracející náhodné £íslo v intervalu 0 aº max do náhodného po°adí. P°i losování ze závodu operátor v nov¥ otev°eném okn¥ se seznamem závod· vybere kvalika£ní závod, na jehoº základ¥ se ur£í po°adí do aktuálního závodu spolu s rozestupy vycházejícími z výsledk· kvalika£ního závodu.
6.6.2.2 Startovní £ísla a £asy Okno startovní listiny je v rámci poskytovaných funkcionalit podporováno dal²ími okny pro nastavování £as· a startovních £ísel (viz obr. 6.4). Závodníkovi nebo startovní kategorii se nastavují £asy dva. Jeden p°edstavuje b¥ºný reálný £as a druhý je £asem elektronických hodin. Práce s £asem umoº¬uje upravovat jeden £asový údaj bez nutnosti uvád¥t i druhý. A£koliv operátor upraví kup°íkladu jen b¥ºný reálný £as, tím ºe je nastavena svázanost obou £as·, se pat°i£n¥ upraví i startovací £as hodin. Dále m·ºe operátor
6.6.
PÍPRAVA ZÁVODU
55
v okn¥ ur£ovat rozestupy mezi jednotlivými závodníky. Ve²kerá tato nastavení lze taktéº provád¥t pro startovní kategorie, £ímº je mín¥n £as vyb¥hnutí prvního závodníka dané kategorie (resp. celé kategorie pro hromadný zp·sob startu). Startovní £ísla se nastavují velmi podobným zp·sobem. T°ídy poskytující fukn£nosti v rámci práce se startovními £asy a £ísly jsou IntFrameNastavCasy a IntFrameNastavStartCisla.
Obrázek 6.4: GUI - nastavení £as· závodník·
6.6.3
Tabulky a zobrazení dat v nich
6.6.3.1 Datový model tabulky Pro zobrazení seznamu v²ech závodník· £i údaj· jednotlivce se pouºívají tabulky. Pro zobrazení dat v tabulkách vyuºiji t°ídy javovské JTable, která zajistí vizuální podobu tabulky v aplikaci. Implementace tabulek v Jav¥ je zaloºena na známé softwarové architektu°e Model-View-Controller, která odd¥luje datový model, uºivatelské rozhraní a °ídící logiku do t°í vzájemn¥ nezávislých komponent. T°ída JTable zaji²´uje funkci vizuální a data tabulky jsou uchována v datovém modelu t°ídy. Za napln¥ní dat tabuky je zodpov¥dné rozhraní TableModel, které poskytuje d·leºité informace o datech jako nap°. rozm¥ry tabulky (po£et °ádk· a sloupc·), typy dat uloºených ve sloupcích, informace o záhlavích sloupc· (názvy) a moºnost editovatelnosti jednotlivých bun¥k tabulky. Implementovat toto rozhraní není nutné, nebo´ jsou k dispozici t°ídy AbstractTableModel a DefaultTableModel, které jej jiº implementují. Podle [1] je
56
KAPITOLA 6.
IMPLEMENTACE
vhodn¥j²í vyuºít t°ídy AbstractTableModel, protoºe ta neudrºuje narozdíl od DefaultTableModel odkazy na data a je tedy pro v¥t²í objemy dat pam¥´ov¥ mén¥ náro£ná. T°ída p°edstavující datový model pro tabulku d¥dí z abstraktní t°ídy AbstractTableModel a tím sta£í dodenovat pouze metody poskytující informace o po£tu °ád· a sloupc· v tabulce a metodu vracející hodnotu bu¬ky pro zadaný °ádek a sloupec:
• public int getRowCount(); • public int getColumnCount(); • public Object getValueAt(int row, int column); Data, se kterými tyto metody pracují jsou uloºeny v prom¥nné data typu ArrayList. Prom¥nná columnNames typu String[] slouºí k denování záhlaví jednotlivých sloupc·. Jelikoº se v uºivatelském rozhraní bude vyskytovat více tabulek obsahující objekty r·zných t°íd, bude pot°eba i více datových model·. Implementovala jsem tedy t°ídu TableValues, která denuje spole£né prom¥nné a metody. Bude stát v d¥di£né hierarchii nejvý² a ostatní t°ídy z ní d¥dí. Jelikoº kaºdá jednotlivá tabulka bude obsahovat jiný typ dat, je t°ída TableValues denována jako generická neboli parametrizovaná. To znamená, ºe prom¥nná data nemusí mít ur£en typ uloºených objekt·. Tím je umoºn¥no ur£ení konkrétního typu dat aº na niº²í úrovni, kdy se typ T zadá p°i denování potomk· t°ídy TableValues. Deklarace prom¥nné data, záhlaví generické t°ídy a jejího potomka vypadá následovn¥:
• protected ArrayList data; • abstract public class TableValues extends AbstractTableModel • public class TableValuesZavod extends TableValues Generické t°ídy je vyuºito taktéº v balí£ku db, kdy je t°ída DBList rodi£em pro t°ídy pracující se seznamy r·zných objekt· (DBList obsahuje prom¥nnou List list, potomci jsou deklarováni nap°. následovn¥ ZavodList extends DBList). Více k implementaci generických t°íd viz [8]. Ve t°íd¥ potomka t°ídy TableValues se konstruktorem denuje pole °et¥zc·, které p°edstavuje záhlaví sloupc· a prom¥nné data se p°i°adí data k zobrazení v tabulce.
AbstractTableModel se stará také o správu listener· £i generování událostí TableModelEvents. Je vyuºito p°edev²ím metod fireTableDataChanged() nebo addTableModelListener (TableModelListener l). První metodou se informují v²ichni registrovaní poslucha£i o tom, ºe data v tabulce byla zm¥n¥na, naopak druhá umoº¬uje s vlastním denovaným poslucha£em tyto zm¥ny odchytit a adekvátn¥ na n¥ zareagovat.
6.6.3.2 Zobrazova£e a editory v tabulkách N¥které sloupce tabulek jako nap°. sloupec kategorie ve startovní listin¥ nebo sloupec informující o zaprezentování závodníka v okn¥ prezentace mají denovány vlastní zobrazova£e. V prvním p°ípad¥ se spolu se zobrazova£em typu JComboBox denuje taktéº editor téhoº typu, coº usnad¬uje editace startovní kategorie výb¥rem z p°edem stanovených hodnot. U prezentace závodníka se vyskytuje zase editor typu JCheckBox.
6.6.
PÍPRAVA ZÁVODU
6.6.4
57
Tisk
Technologie pouºitá pro tisk dokument· byla popsána v kapitole 5.3. V programu vyuºiji moºnosti tvorby subreport· p°i denování master ²ablony pro tisk celého dokumentu (startovní nebo výsledovkové listiny). Master ²ablona ur£uje jen rozvrºení nadpisu dokumentu a místo pro vloºení subreport·. Subreportem se denuje rozvrºení tisku jedné startovní kategorie (záhlaví tabulky s £ísly závodník·, jmény,. . . ) a proto se subreport vyskytuje v master reportu vícekrát podle po£tu startovních kategorií. Gracké uºivatelské rozhraní pro tisk je znázorn¥no na obr. 6.5.
Obrázek 6.5: GUI - tisk startovní listiny
6.6.4.1 T°ída TiskStartovka a TiskVysledky Tvorbu report· mají na starosti t°ídy TiskStartovka a TiskVysledky balí£ku xml. Proces vytvo°ení tiskového dokumentu popsaný v kapitole 5.3 (na£tení ²ablony, kompilace, napln¥ní reportu daty a tisk) je uveden v následující ukázce:
JasperDesign jdMaster = JRXmlLoader.load(new File(designMaster)); JasperDesign jdSub = JRXmlLoader.load(new File(designSub)); JasperCompileManager.compileReportToFile(jdMaster, compiled); JasperCompileManager.compileReportToFile(jdSub, compiledSub); JasperPrint print = JasperFillManager.fillReport(compiled, param, data); JasperPrintManager.printReport(print, true);
58
KAPITOLA 6.
IMPLEMENTACE
Metoda pln¥ní dat reportu fillReport(String soubor, Map parametry, JRDataSource zdrojDat) vyºaduje t°i parametry. Prvním je název zkompilovaného souboru, druhým je prom¥nná typu Map obsahující parametry reportu a posledním datový zdroj. Parametry reportu jsou data ovliv¬ující globální vzhled reportu. Jako parametry p°edávám procesu pln¥ní název zobrazující se v záhlaví dokumentu a domovský adresá° aplikace dopl¬ující adresu umíst¥ní generovaných pdf a html soubor·. Poslední parametr p°edstavuje zdroj dat.
6.6.4.2 Zdroj dat pro report JRDataSource je rozhraní pro zdroje dat reportu. Toto rozhraní je implementováno t°ídami • p°edstavující zdroj dat pro master report (StartJRDataSourceMaster, resp. VysledkyJRDataSourceMaster) • a t°ídami reprezentujícími datové zdroje subreport· (StartJRDataSourceDetail, resp. VysledkyJRDataSourceDetail). Data jsou uloºena v prom¥nné data typu ArrayList, která zapouzd°uje pro master report objekty t°ídy StartKategorie. Data subreport· jsou objekty t°ídy StartUdaje. Díky pouºitému rozhraní JRDataSource se musí doimplementovat metody
boolean next() throws JRException; Object getFieldValue(JRField jrField)throws JRException ; Metoda next() se volá v dob¥ pln¥ní reportu daty, kdyº se p°es data iteruje. Druhá metoda vrací pro kaºdé pole v reportu pat°i£nou hodnotu z aktuálního datového zdroje. Pole reportu slouºí k mapování dat z datového zdroje do ²ablony reportu. Denuje se jménem a typem, p°i£emº jméno i typ musí odpovídat korespondující hodnot¥ z datového zdroje. Uvedu p°íklad pro pole nesoucí hodnotu p°íjmení závodníka ve startovní listin¥. ablona .jrxml pak obsahuje °ádek:
Obsah pole se denuje pomocí tagu textFieldExpression a pouºití odkazu na hodnotu pole zápisem $F{název pole}. Denování hodnoty pole vypadá následovn¥:
Má-li se v poli vyskytnout parametr, odkáºe se na jeho hodnotu obdobn¥ $P{název parametru}. Metoda getFieldValue(JRField jrField) t°ídy implementující JRDataSource rozhraní, zodpovídá za vypln¥ní p°íslu²ného pole v reportu správnou hodnotou a ve zjednodu²ené podob¥ má tuto formu:
6.7.
PRB
H ZÁVODU
59
if("P°ijmení".equals(jrField.getName()) return data.get(index).getZavodnik().getPrijmeni(); Prom¥nná index je iterována metodou next(). Za b¥hu je moºné rozhodnout, zda se element skute£n¥ zobrazí. Slouºí k tomu tag printwhenexpression, který se denuje v ²ablon¥ reportu pro pat°i£ný element:
<printWhenExpression> 6.7 6.7.1
Pr·b¥h závodu Zpracovávání £as· a st°eleb
V pr·b¥hu závodu se pracuje p°edev²ím s daty ze st°elnice a ze záv¥re£né £asomíry dobíhajících závodník· (viz obr. 6.6). S údaji o st°elb¥ souvisí také tabulka se záznamem trestných kol, která by pro ur£ité závodní dispciplíny m¥la odráºet st°elbu závodníka. P°ehled odb¥hnutých trestných kol má stejnou podobu jako p°ehled st°eleb. Tato okna (p°edstavující instance t°íd IntFrameCasomira, IntFrameStrelnice a IntFrameTrestnaKola) obsluhuje operátor manuáln¥ vkládáním nových dat.
Obrázek 6.6: GUI - £asomíra a st°elnice Údaje o st°elb¥ a p°íp. trestných kolech se získávají ze seznamu údaj· jednotlivc·, který je sou£ástí instance t°ídy StartListina v rámci singletonu AktualniZavod. asy závodník· zaznamenávané operátorem ru£n¥ se ukládají do seznamu ve t°íd¥ CasyAktualList a p°edstavují objekty t°ídy CasyAktual, které jiº mají referenci na objekty údaj· jednotlivc· (StartUdaje).
60
KAPITOLA 6.
IMPLEMENTACE
Je-li na aplikaci p°ipojena £asomíra, údaje £as·, které jsou systému zasílány, si operátor m·ºe prohlíºet v okn¥ Automatická £asomíra. Toto okno (viz 6.7) je instancí t°ídy IntFrameCasomiraAuto a poskytuje navíc moºnost ovládat £asomíru (ºádost o zaslání £as· uloºených v její pam¥ti, vyresetování £asomíry). asy, které p°icházejí z fotobu¬ky, jsou nejprve ukládány jako instance t°ídy Casy do seznamu ve t°íd¥ CasyList. P°i°azením startovního £ísla a jejich uloºením jsou p°evedeny do zmín¥ného seznamu CasyAktualList.
Obrázek 6.7: GUI - automatická £asomíra
6.7.2
Sériové rozhraní
Pro komunikaci s £asomírou, která se uskute£¬uje p°es sériový port, je vyuºito ze dvou zmín¥ných implementací aplika£ního rozhraní JavaComm (viz kapitola 5.5) knihovny rxtx. Tato kapitola seznamuje s vlastní implementací obsluhy komunikace se sériovým portem, která vyuºívá metod denovaných aplika£ním rozhraním JavaComm. T°ída SerialComm balí£ku serial zaji²´uje navázání komunikace se sériovým portem. Datové poloºky t°ídy jsou v následujícím výpisu:
public class SerialComm implements Runnable{ static CommPortIdentifier static Enumeration SerialPort InputStream OutputStream SerialReaderListener Thread
portId; portList; serialPort; is; os; serialReader; readThread;
6.8.
DOKONENÍ ZÁVODU
61
V kapitole 5.5 bylo p°edvedeno, jak nalézt a získat pot°ebný port ze seznamu dostupných port·. Identikace portu (nap°. jménem "COM1") a jeho dal²í parametry jsou zahrnuty v singletonu AktualniZavod, který rovn¥º uchovává instanci t°ídy SerialComm. Je-li jiº port k dispozici, je t°eba inicializovat instanci t°ídy InputStream, resp. OutputStream pro £tení z portu, resp. zápis na port:
is = serialPort.getInputStream(); os = serialPort.getOutputStream(); Naslouchání na portu bude zaji²´ovat instance t°ídy SerialReaderListener, která se vytvo°í s parametrem t°ídy InputStream:
serialReader = new SerialReaderListener(is); Tento poslucha£ musí být zaregistrován metodou serialPort.addEventListener (serialReader). Jelikoº je p°ísun dat asynchronní, port chce být informován o dostupnosti vstupních dat. iní tak metodou serialPort.notifyOnDataAvailable(true). T°ída SerialReaderListener implementuje rozhraní SerialPortEventListener a p°edenováním metody serialEvent(SerialPortEvent event) reaguje na události sériového portu. Metodou is.available() se kontroluje dostupnost dat, na£eº je instance t°ídy InputStream zpracovává tradi£ním zp·sobem. Zápis dat se provádí instance OutputStreamu op¥t klasicky. 6.8 6.8.1
Dokon£ení závodu Úprava výsledk·
Jiº p°i dobíhání závodník· ale p°edev²ím po dokon£ení závodu se upravují údaje jednotlivc· o £asové p°iráºky nebo poznámky. Slouºí k tomu okno Výsledky jednotlivce (viz obr. 6.8), které umoº¬uje prohlíºení údaj· dle startovních £ísel a také editaci £as·, st°eleb a trestných kol závodníka. Zobrazené okno Poznámka st. kategorie shrnuje poznámky v²ech závodník· v rámci jedné startovní kategorie. Poznámku lze upravovat pouze upravením poznámky p°íslu²ného závodníka. Tyto fukn£nosti zaji²´uje t°ída IntFrameVysledkyJednotlivce.
62
KAPITOLA 6.
IMPLEMENTACE
Obrázek 6.8: GUI - výsledky jednotlivce
Souhrnný p°ehled výsledk· v²ech závodník· je moºno vid¥t v okn¥ Výsledky (viz obr 6.9) poskytovaného t°ídou IntFrameVysledky. Toto okno slouºí p°edev²ím pro souhrnný p°ehled. Zobrazuje výsledky závodník·, seznam startovních kategorií s p°ípadnou poznámkou a také seznam závodník·, kte°í závod nedokon£ili (a´ uº z d·vodu, ºe byli diskvalikováni, nebo na start v·bec nenastoupili). Jak bylo zmín¥no poznámka se skládá z poznámek zaznamenaných k údaj·m jednotlivce v okn¥ Výsledky jednotlivce. Nicmén¥ lze p°ipojit také poznámku k celé startovní kategorii, coº se provádí práv¥ v okn¥ Výsledky v²ech. Tato £ást poznámky ale není zahrnuta v tisku výsledk·, nebo´ v tiskové podob¥ jsou zobrazeny údaje jednotlivce a poznámky, které se jich bezprost°edn¥ týkají.
6.8.2
Výpo£et výsledk·
Výpo£et výsledk· m·ºe probíhat pr·b¥ºn¥. Zaji²´uje jej balí£ek vypocet s jedinou t°ídou Vypocet. P°epo£ítání výsledk· m·ºe vyvolat operátor volbou P°epo£ítat v okn¥ Výsledky (viz p°edchozí kapitola). Dal²í moºností je zapnout automatický p°epo£et a p°epo£ítání se vyvolá v moment, kdy byla zm¥n¥na n¥která data z údaj· jednotlivce, která výsledek závodu ovliv¬ují. I kdyº dojde ke zm¥n¥ u jednoho závodníka, musí se p°epo£ítat celá jeho kategorie, kv·li moºnému ovlivn¥ní po°adí, ztrát nebo bod· ostatních závodník·. Proto bylo v balí£ku listeners denováno rozhraní StartDataListener s metodou startDataChanged(), která je volána instancí t°ídy StartListina práv¥ ve zmín¥ných p°ípadech. Toto rozhraní implementuje t°ída StartDataPrepocet, která výpo£et vyvolá.
6.8.
DOKONENÍ ZÁVODU
63
Obrázek 6.9: GUI - výsledky v²ech závodník·
Výpo£et je realizován metodou evaluate(StartKategorie stKat) t°ídy Vypocet. Neº se ov²em za£n¥ provád¥t, je t°eba znát, jaká závodní disciplína se ve výpo£tu zpracovává. Podle druhu závodu se pak výpo£et li²í ve dvou atributech:
• ur£ení b¥ºeckého £asu • zapo£ítání p°iráºky za netrefenou ránu. B¥ºecký £as se m·ºe ur£it bu¤ ode£tením cílového £asu závodníka od jeho £asu na startu, nebo ode£tem cílového £asu závodníka od startovního £asu prvního beºce v dané kategorii. P°iráºka za netrefenou ránu se bu¤ bere v potaz nebo se ºádná nep°id¥luje. Nastavení zp·sobu výpo£tu se provádí oknem Nastavení výpo£tu (viz obr. 6.10). Nejprve se p°i výpo£tu ur£í, zda daný závodník dokon£il závod a zda byla uº nahlá²ena jeho st°elba (je-li k výsledku pot°eba). Podle zvoleného zp·sobu se pak vypo£ítá b¥ºecký £as a zapo£ítají £asové úpravy. Ty mohou dle disciplíny obsahovat p°iráºky za netrefené rány. Dal²ím krokem je výpo£et po°adí v kategorii a ur£ení ztráty na vít¥ze kategorie provád¥né metodou setPoradi(StartKategorie stKat). Na záv¥r p°epo£tu se ohodnotí závodníci p°íslu²ným po£tem bod· (metoda setBody(StartKategorie stKat)). Body se p°id¥lují dle vzorce uvedeného v kapitole 2.2.3.2. Ve vzorci vystupuje krom¥ výsledného £asu závodníka a výsledného £asu vít¥ze kategorie také parametr koecient, který se nastavuje pro danou startovní kategorii. Implicitní hodnota koecientu je 1 (tj. koecient se vlastn¥ neaplikuje), coº znamená, ºe se vypo£tené body na základ¥ £as· nem¥ní. Koecientem nabývajícím hodnot 0 aº 1 (viz kapitola 4.3.8.3) se výsledné skóre m·ºe sníºit.
64
KAPITOLA 6.
IMPLEMENTACE
Obrázek 6.10: GUI - nastavení zp·sobu výpo£tu
6.8.3
Odevzdání výsledk·
Okno pro odevzdání výsledk· (viz obr. 6.11) slouºí pro vygenerování xml souboru, který se bude zasílat do centrální databáze. Jelikoº je moºné generovat také soubor s denicemi dat, je nutné v panelu Volby zvolit správnou xml ²ablonu. Dále se vybírají entity, které budou do exportu zahrnuty (koecienty, kategorie spolu s druhy, kluby, závodníci a události). Kaºdá událost v sob¥ zahrnuje alespo¬ jeden závod, proto jsou události zobrazeny v pravém panelu ve stromové struktu°e, která umoº¬uje snadný výb¥r entit k exportu p°i zachování p°ehledu, co v²e bylo pro export vybráno. A£koliv import dat neprobíhá v záv¥ru závodu nýbrº spí²e na za£átku sezóny, zahrnu jej do této kapitoly, protoºe na£ítání xml souboru z pohledu implementace úzce souvisí s jeho generováním. Okno pro import dat (viz obr. 6.12) má velmi podobnou strukturu, jako export dat. Op¥t se volí druh importovaných dat (data deni£ní nebo výsledky závod·). Dialogovým oknem se v adresá°ové struktu°e vybere soubor ur£ený k importu. Stejn¥ jako v exportu je zde moºnost importovat pouze n¥které entity. Výb¥r událostí a závod· se taktéº provádí ve stromové struktu°e.
6.8.3.1 Zobrazení stromové struktury událostí a závod· Ko°en stromu obsahuje jako své potomky v²echny události, kaºdá událost má za své potomky závody, které jsou sou£asn¥ i listy stromu. Zde je op¥t pouºito principu Model-View-Controller, kdy má t°ída JTree funkci pohledu a stará se o zobrazení dat. Data jsou zapouzd°ena pro import ve vlastní t°íd¥ TreeModelElement d¥dící z javovské DefaultTreeModel, která implementuje rozhraní TreeModel a p°edstavuje tedy komponentu model. D·leºitými metodami t°ídy DefaultTreeModel, které se starají o vloºení £i vyjmutí uzlu jsou metody:
• insertNodeInto() • removeNodeFromParent()
6.8.
DOKONENÍ ZÁVODU
65
Obrázek 6.11: GUI - export dat
T°ída TreeModelElement udrºuje jednu prom¥nou root typu ElementNode, coº je op¥t vlastní t°ída p°edstavující ko°en stromu a tím implementující rozhraní MutableTreeNode. Aby mohla zastávat funkci uzlu uchovává v sob¥ objekt v uzlu zobrazovaný, dále odkaz na rodi£e a na své potomky:
public class ElementNode implements MutableTreeNode{ protected Object element; protected MutableTreeNode parent; protected Vector children = new Vector(); Uzly stromu je moºné v uºivatelském rozhraní vybírat díky denovanému editoru vycházejícímu z komponenty JCheckBox. Strom pro export dat zapouzd°uje objekty t°íd Udalost a Zavod. Ty které jsou operátorem vybrány v za²krtávacím poli se dále zpracují pro vytvo°ení souboru s exportovanými daty. V p°ípad¥ importu dat obsahují uzly stromu elementy instance t°ídy Document (viz kapitola 5.4) reprezentující taktéº události a závody.
6.8.3.2 Vytvo°ení souboru pro export V této kapitole p°edstavím t°ídy, které jsou sou£ástí balí£ku xml a vytvá°ejí nebo naopak na£ítají xml soubor. Struktura soubor·, které aplikace generuje, byla popsána v rámci návrhu v kapitole 4.5.
66
KAPITOLA 6.
IMPLEMENTACE
Obrázek 6.12: GUI - import dat
Generování souboru xml zaji²´uje t°ída XMLGenerator (a t°ídy od ní d¥dící), jejímiº základními datovými poloºkami jsou:
protected protected protected protected
Document XMLWriter FileOutputStream OutputStreamWriter
document; writer; fout; out;
T°ída XMLGenerator obstarává pouze vytvá°ení takových element·, které jsou pro schéma importu i exportu dat shodné. Dále zaji²´uje zapsání xml dokumentu uchovaného v prom¥nné document do souboru pomocí instance t°ídy XMLWriter a její metody write (Document document). Vytvo°ení zbývajících element· leºí na potomcích t°ídy XMLGenerator, na t°íd¥ XMLGeneratorDefinic a XMLGeneratorVysledku. T°ídy generující xml dokument pouze vyuºívají metod balí£ku dom4j uvedených v kapitole 5.4. Níºe je uvedena metoda, která slouºí pro vytvo°ení elementu Druhy skládajícího se z více element· Druh a tedy obsahujícího v²echny závodní disciplíny:
private void addDruhy(Element root){ Element elemDruhy, e; elemDruhy = root.addElement("Druhy"); for(Druh druh : DruhList.getInstance().getList()){ e = elemDruhy.addElement("Druh").addAttribute("idDruhu", String.valueOf(druh.getIdDruhu()));
6.8.
}
DOKONENÍ ZÁVODU
}
67
e.addElement("Zkratka").addText(druh.getZkratka()); e.addElement("Technika").addText(druh.getTechnika());
6.8.3.3 Na£tení souboru s importovanými daty Na£tení dat ze souboru
xml
provádí t°ída XMLReader s jejími prom¥nnými:
protected Document document; protected File inputFile; protected SAXReader xmlReader; T°ída XMLReader (a rovn¥º t°ídy od ní d¥dící) zaji²´uje zpracování t¥ch £ástí xml soubor·, ve kterých se xml schémata prolínají. Specika p°i na£ítání xml souboru s denicí dat obstará t°ída XMLReaderDefinic, odli²nosti u xml souboru s výsledkovými daty zase t°ída XMLReaderVysledku. Struktura xml dokumentu ur£eného prom¥nnou inputFile se uchovává stejn¥ jako p°i generování v prom¥nné document. Objekt t°ídy SAXReader balí£ku dom4j obstará (jak bylo uvedeno v kapitole 5.4) na£tení souboru do prom¥nné document. tení dat z
xml
souboru ukáºu na vytvo°ení objektu t°ídy Druh:
private void parseDruh(Element e){ Druh druh = new Druh();
}
druh.setIdDruhu(Integer.parseInt(e.attribute("idDruhu").getText())); druh.setZkratka(e.elementText("Zkratka")); druh.setTechnika(e.elementText("Technika")); ...
68
KAPITOLA 6.
IMPLEMENTACE
Kapitola 7
Záv¥r V pr·b¥hu vzniku této práce jsem se seznámila s problematikou zpracování dat biatlonových závod·, coº mi umoºnilo vytvo°it aplikaci provád¥jící jejich výpo£et. V rámci návrhu práce byl vytvo°en rela£ní databázový model a následn¥ realizována databáze událostí, závod·, závodník· a souvisejicích entit vyuºívaje databáze Derby. Hlavní cíl, výpo£et závod·, je spln¥n. Navíc aplikace umoº¬uje také správu událostí, závod· a závodník·. P°i správ¥ dat s trvalým uloºením v databázi je vyuºito technologie jdo a její implementace jpox. Data jsou do aplikace nahrávána a z ní pak odevzdávána v souborech xml, které jsou vytvá°eny a zpracovávány pomocí knihovny dom4j. Vyuºitím knihovny RxTx byla realizována poºadovaná komunikace aplikace s £asomírou prost°ednictvím sériového rozhraní. Knihovna jasperreports pak umoºnila denovat dv¥ ²ablony pro tisk startovní a výsledkové listiny. Do budoucna by se práce mohla roz²í°it nap°. o zavedení skupin namísto startovních kategorií, za situace kdy by skupina mohla p°edstavovat více slou£ených men²ích kategorií nebo naopak jen £ást n¥jaké v¥t²í. Výhoda zavedení skupin by se projevila p°i sestavování startovní listiny práv¥ pro p°ípady slu£ování nebo rozd¥lování startovních kategorií. Jelikoº jiº aplikace umoº¬uje komunikaci p°es sériové rozhraní, mohla by stejným zp·sobem jako £asy závodník· zpracovávat i záznamy st°eleb ze st°elnice. P°íjem st°eleb ze st°elnice je mnohem komplikovan¥j²í neº p°íjem £as· a nebyl proto ani v zadání práce poºadován. Zaznamenávání mezi£as· v pr·b¥hu závodu se v sou£asné dob¥ nepouºívalo, nicmén¥ za p°edpokladu, ºe bude k dispozici více elektronických hodin, jde o oblast, o kterou se téº do budoucna m·ºe aplikace rozr·st.
69
70
KAPITOLA 7.
ZÁV
R
Literatura [1] SPELL, Brett. Java Programujeme profesionáln¥. Praha: Computer Press, 2002. [2] ARLOW, Jim, NEUSTADT, Ila. UML a unikovaný proces vývoje aplikací. Praha: Computer Press, 2003. [3] HEROUT, Pavel. U£ebnice jazyka Java. eské Bud¥jovice: KOPP, 2006. [4] HEROUT, Pavel. Java gracké uºivatelské prost°edí a £e²tina. eské Bud¥jovice: KOPP, 2004 [5] ÁK, Miroslav. XML za£ínáme programovat podrobný pr·vodce za£ínajícího uºivatele. Praha: Grada Publishing a.s., 2003. [6] TOFFOLI, Giulio. The denitive guide to iReport. [7] ROOS, Robin M.Java data object. [8] PECINOVSKÝ, Rudolf. Java 5.0 Novinky jazyka a upgrade aplikací. Brno: CP Books a.s., 2005. [9] Manuál k £asomí°e ALGE TIMING Timer S4 http://www.alge-timing. com/alge/download/manual/index-1e.html [10] pravidla biatlonu http://www.czech-biathlon.com/ [11] Jasperreports a iReport http://jasperforge.org [12]
jpox
[13]
jdo
http://www.jpox.org/
http://db.apache.org/jdo/
[14] dom4j http://www.dom4j.org/ [15] Derby http://db.apache.org/derby/ [16] RxTx http://rxtx.qbang.org/wiki/index.php/Main_Page [17] programování sériového portu http://en.wikibooks.org/wiki/Serial_ Programming:Serial_Java
71
72
LITERATURA
Dodatek A
Databázový model Tato p°íloha zobrazuje kompletní schéma databáze.
Obrázek A.1: Databázový model
73
74
DODATEK A.
DATABÁZOVÝ MODEL
Dodatek B
XML schéma Denice dat V této p°íloze je uvedeno kompletní
xml
schéma pro import dat.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="DefiniceDat"> <xs:complexType> <xs:sequence> <xs:element ref="Koeficienty" minOccurs="0"/> <xs:element ref="KategorieDruhy" minOccurs="0"/> <xs:element ref="Kluby" minOccurs="0"/> <xs:element ref="Zavodnici" minOccurs="0"/> <xs:element ref="Udalosti" minOccurs="0"/> <xs:attribute name="Datum" type="xs:date" use="required"/> <xs:element name="Koeficienty"> <xs:complexType> <xs:sequence> <xs:element ref="Koeficient" maxOccurs="unbounded"/> <xs:element name = "KategorieDruhy"> <xs:complexType> <xs:sequence> <xs:element ref="Druhy" minOccurs="0"/> <xs:element ref="VsechnyKategorie" minOccurs="0"/> <xs:element ref="ParametryKategorii" minOccurs="0"/> <xs:element name="Udalosti"> <xs:complexType> <xs:sequence> <xs:element ref="Udalost" maxOccurs="unbounded"/> <xs:element name="Zavodnici"> <xs:complexType> <xs:sequence> <xs:element ref="Zavodnik" maxOccurs="unbounded"/>
75
76
DODATEK B.
XML SCHÉMA DEFINICE DAT
<xs:element name="Kluby"> <xs:complexType> <xs:sequence> <xs:element ref="Klub" maxOccurs="unbounded"/> <xs:element name="VsechnyKategorie"> <xs:complexType> <xs:sequence> <xs:element ref="Kategorie" maxOccurs="unbounded"/> <xs:element name="Druhy"> <xs:complexType> <xs:sequence> <xs:element ref="Druh" maxOccurs="unbounded"/> <xs:element name="ParametryKategorii"> <xs:complexType> <xs:sequence> <xs:element ref="ParametryKategorie" maxOccurs="unbounded"/>
<xs:element name="Udalost"> <xs:complexType> <xs:sequence> <xs:element name="Flag" type="xs:unsignedInt"/> <xs:element name="Nazev" type="xs:string"/> <xs:element name="Zkratka" type="xs:string"/> <xs:element name="Misto" type="xs:string"/> <xs:element name="DatumOd" type="xs:date"/> <xs:element name="DatumDo" type="xs:date"/> <xs:element ref="Zavod"/> <xs:attribute name="idUdalosti" type="xs:unsignedInt" use="required"/> <xs:attribute name="idUdalostiPr" type="xs:unsignedInt" use="required"/> <xs:element name="Zavod"> <xs:complexType> <xs:sequence> <xs:element name="Flag" type="xs:unsignedInt"/> <xs:element name="Nazev" type="xs:string"/> <xs:element name="Datum" type="xs:date"/> <xs:element name="StartovniCas" type="TypStartovniCas"/> <xs:element name="idDruhu" type="xs:unsignedInt"/> <xs:element name="idUdalosti" type="xs:unsignedInt"/> <xs:attribute name="idZavodu" type="xs:unsignedInt" use="required"/> <xs:attribute name="idZavoduPr" type="xs:unsignedInt" use="required"/> <xs:element name="Zavodnik">
77 <xs:complexType> <xs:sequence> <xs:element name="Flag" type="xs:unsignedInt"/> <xs:element name="KategorieZavodnika" type="xs:unsignedInt"/> <xs:element name="KlubZavodnikaDomov" type="xs:unsignedInt"/> <xs:element name="KlubZavodnikaHost" type="xs:unsignedInt"/> <xs:element name="Jmeno" type="xs:string"/> <xs:element name="Prijmeni" type="xs:string"/> <xs:element name="DatumNarozeni" type="xs:date"/> <xs:element name="VykonnostniTrida"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="1"/> <xs:element name="Pohlavi" type="TypPohlavi"/> <xs:attribute name="idZavodnika" type="xs:unsignedInt" use="required"/> <xs:attribute name="idZavodnikaPr" type="xs:unsignedInt" use="required"/> <xs:element name="Koeficient"> <xs:complexType> <xs:sequence> <xs:element name="PocetZavodniku" type="xs:unsignedInt"/> <xs:element name="MVT" type="xs:double"/> <xs:element name="IVT" type="xs:double"/> <xs:element name="IIVT" type="xs:double"/> <xs:element name="IIIVT" type="xs:double"/> <xs:element name="zadnaVT" type="xs:double"/> <xs:attribute name="idKoeficientu" type="xs:unsignedInt" use="required"/> <xs:element name="Klub"> <xs:complexType> <xs:sequence> <xs:element name="Flag" type="xs:unsignedInt"/> <xs:element name="Nazev" type="xs:string"/> <xs:element name="Zkratka" type="xs:string"/> <xs:attribute name="idKlubu" type="xs:unsignedInt" use="required"/> <xs:element name="Kategorie"> <xs:complexType> <xs:sequence> <xs:element name="Nazev" type="xs:string"/> <xs:element name="Zkratka" type="xs:string"/> <xs:element name="VekOd" type="xs:unsignedInt"/> <xs:element name="VekDo" type="xs:unsignedInt"/> <xs:element name="Pohlavi" type="TypPohlavi"/> <xs:attribute name="idKategorie" type="xs:unsignedInt" use="required"/> <xs:element name="Druh"> <xs:complexType> <xs:sequence> <xs:element name="Zkratka" type="xs:string"/> <xs:element name="Technika" type="xs:string"/> <xs:attribute name="idDruhu" type="xs:unsignedInt" use="required"/>
78
DODATEK B.
XML SCHÉMA DEFINICE DAT
<xs:element name="ParametryKategorie"> <xs:complexType> <xs:sequence> <xs:element name="Delka" type="xs:double"/> <xs:element name="Strelba"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="1"/> <xs:maxLength value="4"/> <xs:element name="Prirazka" type="TypStartovniCas"/> <xs:attribute name="id" type="xs:unsignedInt" use="required"/> <xs:attribute name="idKategorie" type="xs:unsignedInt" use="required"/> <xs:attribute name="idDruhu" type="xs:unsignedInt" use="required"/> <xs:simpleType name="TypPohlavi"> <xs:restriction base="xs:string"> <xs:enumeration value="M"/> <xs:enumeration value="Z"/> <xs:simpleType name="TypStartovniCas"> <xs:restriction base="xs:string"> <xs:minLength value="5"/> <xs:maxLength value="10"/> <xs:whiteSpace value="collapse"/>
Dodatek C
Instala£ní a uºivatelská p°íru£ka C.1
Instala£ní p°íru£ka
Instalace je popsána pro systém Windows. 1. Instalace Java Runtime Environment : Soubor jre-6u11-windows-i586-p-iftw.exe spus´te a nainstalujte do adresá°e C:\Program Files\Java 2. Instalace databáze Derby : Rozbalte soubor db-derby-10.4.1.3-bin.zip do adresá°e C:\Program Files. 3. Databázový server : Ov¥°te funk£nost nainstalované databáze spu²t¥ním databázového serveru souborem startServer.bat. P°i správné instalaci se do p°íkazového °ádku vypí²e, ºe server je spu²t¥n a p°ipraven p°ijímat p°ipojení na portu 1527. Spu²t¥ním souboru shutdownServer.bat server ukon£íme. Byla-li databáze instalována jinam, neº do doporu£ovaného adresá°e, je nutné oba .bat soubory upravit. Obsahují nastavení prom¥nné DERBY_HOME, která musí ukazovat na nainstalovanou databázi:
set DERBY_HOME="C:\Program Files\db-derby-10.4.1.3-bin" 4. Instalace aplikace : P°ekopírujte adresá° biatlon z instala£ního cd do adresá°e C:\. Vnit°ní struktura adresá°e biatlon je znázorn¥na na následujícím obrázku:
biatlon biatlonDB lib reporty xml biatlon.jar jpox.properties shutdownServer.bat startServer.bat 79
80
DODATEK C.
INSTALANÍ A UIVATELSKÁ PÍRUKA
• Adresá° biatlonDB obsahuje databázi. • V adresá°i lib jsou v²echny pot°ebné knihovny. • Adresá° reporty má v sob¥ uloºeny ²ablony denující report. V p°ípad¥ tvorby pdf nebo html souboru se tyto vygenerují zde. • Do adresá°e xml se ukládají vygenerované trální databáze.
xml
soubory s daty pro export do cen-
• Souborem biatlon.jar se spou²tí aplikace. M·ºe se spustit poklikáním nebo p°íkazem p°íkazové °ádky:
java -jar biatlon.jar • Soubor jpox.properties obsahuje konguraci pro p°ipojení do databáze. Byla-li databáze nainstalována do jiného neº doporu£eného adresá°e, je t°eba soubor otev°ít a upravit °ádek obsahující odkaz na nainstalovanou databázi:
dbURL=C:/biatlon/biatlonDB • Soubory shutdownServer.bat a startServer.bat jiº byly zmín¥ny. C.2
Uºivatelská p°íru£ka
P°íru£ka je koncipovaná coby pr·vodce, tedy v sérii na sebe navazujících krok· a nepopisuje tak poloºky menu postupn¥ nýbrº dle zp·sobu práce operátora. Úvodem p°iblíºím základní rozd¥lení poloºek v menu aplikace: Závodník
Výsledky
P°ipojit k databázi
Výsledky v²ech
Odpojit od databáze
Výsledky jednotlivce
Práce se závodem
Nastavení výpo£tu
Zav°ít závod
Zapnout p°epo£et
automatický
Vypnout p°epo£et
automatický
Zobrazit detail Export Import Zav°ít
Periferie Otev°ení sériové linky
Startovní listina
Odpojení sériové linky
Prezentace Startovní listina Nový závodník Nový klub asomíra/St°elby asomíra manuální asomíra automatická St°elnice Trestná kola
Parametry sériové linky Tisk Tisk startovky Tisk výsledk·
C.2.
UIVATELSKÁ PÍRUKA
C.2.1
81
P°ipojení k databázi
Spus´te soubor startServer.bat, £ímº se nastartuje databázový server. Dále spus´te program biatlon.jar. V menu Závod vyberte P°ipojit k databázi. Pro p°ipojení k databázi b¥ºící na stejném stroji jako aplikace zadejte v nov¥ otev°eném okn¥ (viz obr. C.1) do pole Server IP/hostname text 127.0.0.1, v poli port pak ponechtejte implicitní 1527. Klikn¥te na tla£ítko P°ipojit. Pro p°ípadné odpojení od databáze se v menu Závod zvolí Odpojení od databáze a potvrdí tla£ítkem Odpojit.
Obrázek C.1: P°ipojení k databázi
C.2.2
Práce se závodem
V menu Závod zvolte Práce se závodem. Otev°e se nové okno (viz obr. C.2). Funk£ní prvnky okna Práce se závodem:
• Vytvo°it událost otev°e nové okno pro zadání dat nové události (viz obr. C.3) • Odstranit událost smaºe událost vyzna£enou v tabulce událostí • Filtrovat ltrace zobrazených dat dle:
Datumu volbou datumu a stiknutím klávesy ENTER nebo kliknutím na tla£ítko Filtrovat
Místa vybráním místa konání události ze seznamu Druhu vybráním závodní disciplíny ze seznamu • Zru²it ltr zobrazí v²echna data • Vytvo°it závod pro vybranou událost otev°e nové okno pro zadání dat nového závodu (viz obr. C.4) • Odstranit závod smaºe závod ozna£ený v tabulce závod· • Otev°ít závod otev°e závod pro práci s ním
82
DODATEK C.
INSTALANÍ A UIVATELSKÁ PÍRUKA
Obrázek C.2: Práce se závodem
Obrázek C.3: Vytvo°ení události
• Zav°ít závod zav°e závod, který byl otev°en • Editovat závod otev°e okno pro úpravu dat závodu (okno má stejný vzhled jako okno pro vytvá°ení závodu) • Obnovit na£te aktuální data událostí a závod· z databáze • Zav°ít zav°e okno Práce se závodem Vyberte závod a klikn¥te na tla£ítko Otev°ít závod. Okno Práce se závodem se zav°e.
C.2.
UIVATELSKÁ PÍRUKA
83
Obrázek C.4: Vytvo°ení závodu
C.2.3
Zobrazení otev°eného závodu
Podrobnosti otev°eného závodu si lze prohlédnout volbou poloºky Zobrazit detail v menu Závod (viz obr. C.5). Hodnoty zde upravené se ukládají tla£ítkem Uloºit. Chcete-li okno zav°ít bez uloºení provedených zm¥n, zvolte tla£itko Zru²it.
Obrázek C.5: Zobrazení otev°eného závodu
C.2.4
Prezentace
V menu Startovní listina zvolte poloºku Prezentace (viz obr. C.6). Funk£nost okna Prezentace:
84
DODATEK C.
INSTALANÍ A UIVATELSKÁ PÍRUKA
Obrázek C.6: Prezentace závodník·
• Za/Odprezentovat zaprezentuje resp. odprezentuje závodníka, v tabulce se ozna£í res. odzna£í závodník (zna£ka v posledním sloupci) • Vytvo°it závodníka otev°e okno pro vytvo°ení nového závodníka (stejné jako pro jeho úpravu viz níºe) • Upravit závodníka otev°e okno pro úpravu závodníka, který je ozna£en v tabulce (viz obr. C.7)
Obrázek C.7: Úprava závodníkových údaj·
• Vymazat závodníka vymaºe závodníka ozna£eného v tabulce • Zaprezentovat do jiné kategorie otev°e okno s výb¥rovým seznamem kategorií a zaprezentuje závodníka do kategorie zvolené • Obnovit na£te aktuální data závodník· z databáze • Filtr ltrace zobrazených dat dle:
C.2.
UIVATELSKÁ PÍRUKA
85
Kategorie závodníka Domovského klubu Hostovského klubu Zaprezentování
• Zru²it ltr zru²í zvolený ltr a zobrazí v²echny závodníky • Vyhledání závodníka dle identikátoru, jména £i p°íjmení a jejich kombinace • Kontrola p°ípustnosti kategorie zkontroluje, zda je kategorie závodníka pro danou závodní disciplínu v·bec denovaná • Zav°ít Dal²í ovládacím prvkem je pravé tla£ítko my²i poskytující volby Za/Odprezentovat, Vytvo°it závodníka, Upravit závodníka a Vymazat závodníka. Vyberte závodníka pro zaprezentování a zvolte tla£ítko Za/Odprezentovat nebo jej zaprezentujte za²krtnutím posledního polí£ka v tabulce. Od²krtnutím polí£ka závodníka ze závodu odstraníte. Tla£ítkem Zav°ít prezentaci ukon£íte. Av²ak k prezentaci se lze pozd¥ji vrátit. C.2.5
Startovní listina
V nabídce Startovní listina vyberte poloºku Startovní listina. Otev°e se okno se seznamem závodník· v závodu (viz obr. C.8).
Obrázek C.8: Startovní listina V tabulce Po°adí kategorií nastavte po°adí kategorií v závod¥ zápisem £ísla do prvního sloupce tabulky. Ozna£ením startovní kategorie v tabulce a volbou tla£ítka Editovat start.
86
DODATEK C.
INSTALANÍ A UIVATELSKÁ PÍRUKA
kategorii lze upravovat data startovní kategorie v novém okn¥ (viz obr. C.9). Tla£ítkem Na£íst koecienty v tomto okn¥ se dle po£tu závodník· kategorie a jejich výkonnostních t°íd nastaví pro danou kategorii p°íslu²ný koecient pro výpo£et závodu. Nepouºije-li se toto tla£ítko, aplikuje se defaultní koecient s hodnotou 1.
Obrázek C.9: Editace startovní kategorie
Na panelu Losování vyberte v seznamu zp·sob losování (Náhodn¥ nebo Ze závodu). Pro volbu ze závodu se otev°e okno se seznamem závod·, zvolte na základ¥ kterého závodu se losování provede. Tla£ítkem Rozlosovat se závodník·m rozlosuje po°adí. Ozna£te prvního závodníka v tabulce. Tla£ítkem Nastavit £asy se otev°e okno (viz obr. C.10). Zadejte £asy, p°íp. rozestup po sob¥ jdoucí závodník·, vyberte v panelu Volby nastavení Závodníci a na v²echny následující a potvr¤te tla£ítkem Nastavit. asy závodník· se nastaví se zadaným rozestupem nebo s implicitním rozestupem 15 vte°in.
Obrázek C.10: Nastavení £as· závodník· Funk£nost okna Nastavení £as·:
• Volby nastavení Závodníci nastavují se £asy závodník· • Volby nastavení Kategorie nastavují se £asy kategorií • volba na jeden záznam nastaví se záznam ozna£ený v tabulce ve Startovní listin¥
C.2.
UIVATELSKÁ PÍRUKA
87
• volba na v²echny vybrané nastaví se v²echny ozna£ené záznamy • volba na v²echny následující nastaví se v²echny záznamy po£ínající ozna£eným záznamem • Svázání £as· pro tuto volbu sta£í nastavit jen jeden z £as· (Startovní £as nebo Startovní £as reálný), druhý £as se dopo£ítá automaticky. P°edpokládá se, ºe závodníci jiº £asy p°id¥leny m¥ly a nyní je t°eba nap°. v²echny £asy o stejnou dobu posunout. • Zachování rozestup· op¥t se p°edpokládají jiº nastavené £asy závodník·. Nap°. p°i posunutí za£átku startu závodu ov²em chceme udchovat jiº p°id¥lené rozestupy závodník·, které mohou být r·zné. Zp¥t v okn¥ Startovní listina vyberte první záznam v tabulce závodník·. Tla£ítkem P°i°adit st. £ísla otev°ete okno pro nastavování startovních £ísel. Zvolte pro v²echny následující, do pole Start.£íslo zadejte £íslo 1 a potvr¤te tla£ítkem Nastavit. V²em závodník·m budou p°i°azena startovní £ísla. Dal²í funk£nost okna Startovní listina:
• Ozna£it v²e vybráním ozna£í v²echny záznamy v tabulce závodník·, od²krtnutím odzna£í v²echny záznamy • Obnovit na£te aktuální data z databáze • Nastavit £as závodu nastaví £as závodu dle údaje v poli St. £as závodu • Odprezentovat odebere ozna£eného závodníka ze závodu • Zav°ít zav°e okno Startovní listina C.2.6
Nastavení výpo£tu závodu
V menu Výsledky vyberte poloºku Nastavení výpo£tu. Zobrazí se nové okno (viz obr. C.11). Pro druhy závodu rychlostní, vytrvalostní a hromadný start zvolte v panelu Zp·sob výpo£tu moºnost Cíl mínus Start. Pro stíhací závod zvolte druhou moºnost Cíl mínus Start prvního. V panelu P°iráºka za netrefenou nastavte Ano pro vytrvalostní závod. Pro rychlostní, stíhací a závod s hromadným startem zvolte Ne. V okn¥ je zobrazena také tabulka koecient·. C.2.7
Tisk startovní listiny
Zvolte v menu Tisk poloºku Tisk startovky. Otev°e se okno s volbami tisku (viz obr. C.12). Ponechte vybrány v²echny startovní kategorie. V panelu Nastavení ponechejte volbu nastavenou na °azení dle startovních £ísel. Chcete-li zm¥nit po°adí startovních kategorií, zapi²t¥ po°adí p°ímo do tabulky nebo zvolte kategori a tla£ítky Nahoru a Dol· ji posouvejte. Zvolte, zda chcete tisknout do souboru nebo na tiskárnu. Tla£ítkem Tisknout spustíte tisk.
88
DODATEK C.
INSTALANÍ A UIVATELSKÁ PÍRUKA
Obrázek C.11: Nastavení výpo£tu
Obrázek C.12: Tisk startovní listiny
C.2.8
Práce se sériovým portem
Chcete-li pouºívat £asomíru, vyberte v menu Periferie poloºku Parametry sériové linky (obr. C.13). Defaultní hodnoty zm¥nte volbou z výb¥rových seznam·. Potvr¤te tla£ítkem Uloºit nebo okno zav°ete bez uloºení zm¥n tla£ítkem Zru²it.
C.2.
UIVATELSKÁ PÍRUKA
89
Obrázek C.13: Nastavení parametr· sériové linky
V menu Periferie zvolte poloºku Otev°ení sériové linky pro spu²t¥ní naslouchání na portu a p°íjem £as· z £asomíry. Pro ukon£ení práce s portem zvolte poloºku Odpojení sériové linky.
C.2.9
Manuální zadávání £as·
Pro vloºení £asového údaje, který nep°ijde p°ímo z £asomíry, se zvolí v menu asomíra/St°elby poloºka asomíra manuální. V otev°eném okn¥ (viz obr. C.14) na panelu Manuální vkládání £as· zadávejte do pole Startovní £íslo startovní £íslo závodník· a do pole as jejich £asy v cíli. Tla£ítkem Vloºit se zadané hodnoty uloºí a p°epí²í do tabulky. Tla£ítko Obnovit slouºí pro na£tení aktuální dat z databáze. Tla£ítko Zav°ít zavírá okno Manuální £asomíra.
C.2.10
Automatický p°íjem £as·, práce s £asomírou
V menu asomíra/St°elby volbou poloºky asomíra automatická se otev°e okno (viz obr. C.15)zobrazující £asy p°icházející z £asomíry. Poslední p°íchozí £as je zobrazen v poli Poslední £as. Funk£nost okna Automatická £asomíra:
• Nahraj £asy nahrajte z £asomíry v²echny £asy, které jsou u ní uloºeny v pam¥ti. asy se zobrazí v tabulce. • Reset Comportu za²le signál reset na £asomíru • Vloºit °ádek vloºí do tabulky prázdný °ádek, aby bylo moºne si p°edvyplnit startovní £ísla, jejich po°adí dob¥hnutí do cíle je jiº známé.
90
DODATEK C.
INSTALANÍ A UIVATELSKÁ PÍRUKA
Obrázek C.14: Manuální zadávání £as·
• Uloºit uloºí v²echny £asy z tabulky, které mají p°id¥leno startovní £íslo. Startovní £íslo se k £asu p°id¥lí vloºením p°ímo v tabulce. Uloºené £asy se ozna£í 'x' v posledním sloupci tabulky. • Obnovit na£te aktuální data z databáze • Zav°ít zav°e okno Automatická £asomíra
Obrázek C.15: Automatická £asomíra
C.2.
UIVATELSKÁ PÍRUKA
C.2.11
91
Zadávání st°eleb
Pro zadání st°eleb vyberte v menu asomíra/St°elby poloºku St°elnice. Zobrazí se okno St°elnice (obr. C.16) s tabulkou startovních £ísel a jejich st°eleb. St°elby se zadávají p°ímo v tabulce. Hodnoty '-' znamenají, ºe daná kategorie tuto st°eleckou poloºku nemá denovánu, hodnoty 'x' pak, ºe st°elba závodníka je²t¥ nebyla zadána.
Obrázek C.16: Zadávání a zobrazení st°eleb
C.2.12
Zadávání trestných kol
Pro zadání trestných kol vyberte v menu asomíra/St°elby poloºku Trestná kola. Zobrazí se okno Trestná kola (obr. C.17) s tabulkou startovních £ísel a jejich trestných kol. Trestná kola se stejn¥ jako st°elby zadávají p°ímo v tabulce. Hodnoty '-' op¥t znamenají, ºe daná kategorie tutu st°eleckou poloºku nemá denovánu a tudíº nelze za ni b¥ºet trestné kolo, hodnoty 'x' pak, ºe trestná kola závodníka je²t¥ nebyla zadána. C.2.13
Zadávání údaj· jednotlivce
Okno Výsledky jednotlivce (viz obr. C.18) slouºí pro úpravu dat jednotlivce. V menu Výsledky zvolte poloºku Výsledky jednotlivce. Vyhledání závodníka prove¤te zadáním startovního £ísla do pole Startovní £íslo a stisknutím klávesy Enter nebo tla£ítkem Hledat. Tla£ítka ozna£ená '<' a '>' zobrazí p°edchozího nebo následujícího závodníka. V okn¥ lze m¥nit hodnoty startovního, cílového, b¥ºeckého a výsledného £asu, zadávat st°elby, trestná kola a £asovou p°iráºku (pro znevýhodn¥ní zvolte tla£ítko ozna£ené '+', pro zvýhodn¥ní '-'). Výb¥rovým seznamem Status se m¥ní status závodníka (Dokon£il/a, Nestartoval/a,. . . ). Textové pole poznámka slouºí pro vloºení poznámky k zobrazenému
92
DODATEK C.
INSTALANÍ A UIVATELSKÁ PÍRUKA
Obrázek C.17: Zadávání a zobrazení trestných kol
Obrázek C.18: Zadávání údaj· jednotlivce
startovnímu £íslu. Poznámka se uloºí p°i ukládání celého formulá°e tla£ítkem Uloºit. Vymazat lze poznámku tla£ítkem Smazat poznámku. Pole Poznámka st. kategorie zobrazuje souhrnnou poznámku pro v²echny závodníky kategorie. Tla£ítkem Obnovit se na£tou aktuální data z databáze. Je v²ak nutné vyhledat znovu startovní £íslo, aby se obrazovka p°ekreslila novými údaji. Tla£ítkem Zav°ít se okno Výsledky jednotlivce uzav°e.
C.2.
UIVATELSKÁ PÍRUKA
C.2.14
93
Výpo£et závod·
Zvolte v menu Výsledky poloºku Výsledky v²ech. Zobrazí se okno (viz obr. C.19) s tabulkou výsledk· jednotlivc·, dále je zobrazen seznam závodník·, kte°í závod nedokon£ili a seznam startovních kategorií s poznámkami. Volbou tla£ítka P°epo£ítat se manuáln¥ vyvolá p°epo£et výsledk· závod·. Funk£nosti okna Výsledky v²ech:
• ltrování dle startovní kategorie • zobrazení poznámky startovní kategorie výb¥rem kategorie v tabulce. Zobrazí se jak obecná poznámka startovní kategorie, tak i v²echny poznámky k závodník·m v dané kategorii. • vloºení poznámky ke startovní kategorii zápisem do textového pole na panelu Poznámky ke kategoriím a potvrzením tla£ítkem Uloºit • smazání poznámky startovní kategorie tla£ítkem Smazat poznámku. Smaºe se pouze obecná poznámka startovní kategorie, poznámky, které byly vkládány u jednotlivých závodník· z·stanou zachovány. • Obnovit zobrazí aktuální data z databáze Volbou Zav°ít se okno Výsledky v²ech uzav°e.
Obrázek C.19: Zobrazení výsledk· závod·
C.2.15
Tisk výsledkové listiny
Okno pro tisk výsledkové listiny pracuje na obdobném principu jako okno pro tisk startovní listiny (viz kap. C.2.7).
94 C.2.16
DODATEK C.
INSTALANÍ A UIVATELSKÁ PÍRUKA
Ukon£ení závodu
V menu Závod zvolte poloºku Zav°ít závod. Stejnou akci lze provést v okn¥ Práce se závodem tla£ítkem Zav°ít závod. C.2.17
Import a export dat
V menu Závod zvolte poloºku Import. Otev°e se nové okno (viz obr. C.20). V panelu Typ importu zvolte, zda chcete importovat denice dat bez výsledk· anebo výsledky závodu. Do textového pole Ze souboru napi²te umíst¥ní xml souboru s daty nebo tla£ítkem otev°ít vyberte v adresá°ové struktu°e p°íslu²ný soubor. Elementy, které se mají importovat, se zvolí výb¥rem v levé tabulce. Jsou-li ozna£eny události, vyberte v pravé stromové struktu°e události a závody pro import. Pod tabulkou element· i stromovou strukturou lze za²krtnutím Ozna£it v²e vybrat rovnou v²echny záznamy. P°ed importem dat je moºné zvolit Smazat staré záznamy. Nebude-li tato volba za²krtnuta, nahrají se nové záznamy k aktuálním. Shodné záznamy v²ak budou p°epsány. Tla£ítko Importovat data naimportuje do databáze. Zru²ení importu se provede tla£ítkem Zru²it.
Obrázek C.20: Import dat V menu Závod zvolte poloºku Export. Otev°e se nové okno (viz obr. C.21). V panelu volby vyberte, zda se budou exportovat denice závod· bez výsledk· nebo naopak výsledky závod·. V panelu Exportovat vybert za²krtnutím, které objekty chcete exportovat. Vyberete-li události, p°ejd¥te na panel strom událostí a ve stromové struktu°e op¥t za²krtáváním vybírejte, které události £i závody mají být sou£ástí exportu. Pro výb¥r v²ech poloºek v o obou panelech je pod nimi umíst¥n za²krtávací pole vybrat v²e. Export se provede tla£ítkem Exportovat. Soubor se uloºí na disk. Zru²ení exportu se provede tla£ítkem Zru²it.
C.2.
UIVATELSKÁ PÍRUKA
95
Obrázek C.21: Export dat
C.2.18
Vytvo°ení nového klubu
Je-li otev°en závod lze v menu Startovní listina poloºkou Nový klub zaloºit nový klub. V okn¥ Nový klub (obr. C.22) zadejte údaje klubu a potvr¤te tla£ítkem Vytvo°it. Nechceteli klub zaloºit, zav°ete okno bez uloºení dat tla£ítkem Zru²it. Pro ukon£ení práce s aplikací
Obrázek C.22: Vytvo°ení nového klubu zvolte v menu Závod poloºku Zav°ít. Spu²t¥ním souboru shutdownServer.bat se ukon£í £innost databázového serveru.
96
DODATEK C.
INSTALANÍ A UIVATELSKÁ PÍRUKA
Dodatek D
Obsah p°iloºeného CD Tato kapitola shrnuje obsah
cd
p°iloºeného k práci.
Implementace schema_databaze xml_schemata zdrojove_soubory zdrojove_soubory.zip program biatlon biatlonDB lib reporty sablony xml biatlon.jar jpox.properties shutdownServer.bat startServer.bat biatlon.zip text pdf DP_Malanikova_2009.pdf tex figures DP_Malanikova_2009.tex Popis jednotlivých adresá°· a soubor·:
• Implementace - adresá° se soubory vytvo°enými v rámci implementace práce
schema_databaze adresá° s sql skriptem pro vytvo°ení databáze xml_schemata adresá° s xml schématy denujícími soubory exportu a importu dat
zdrojove_soubory zdrojový projekt aplikace 97
98
DODATEK D.
OBSAH PILOENÉHO CD
zdrojove_soubory.zip zabalené zdrojové soubory • Program - adresá° s programem
biatlon program ∗ biatlonDB databáze ∗ lib knihovny ∗ reporty adresá° pro generované pdf a html soubory · sablony adresá° se ²ablonami tisku ∗ biatlon.jar aplikace ∗ jpox.properties kongura£ní soubor pro p°ipojení do databáze ∗ shutdownServer.bat soubor ukon£ující £innost databázového serveru ∗ startServer.bat soubor spou²t¥jící databázový server
biatlon.zip zabalený program • Text - adresá° s textem práce
tex adresá° se zdrojovými soubory LATEX pdf adresá° s diplomovou prací v pdf formátu