Z´apadoˇcesk´a univerzita v Plzni Fakulta aplikovan´ych vˇed Katedra informatiky a v´ypoˇcetn´ı techniky

Bakal´aˇrsk´apr´ace

Webov´aaplikace pro poˇr´ad´an´ız´avod˚u v orientaˇcn´ım bˇehu

Plzeˇn2017 Jan Palc´ut M´ısto t´eto strany bude zad´an´ıpr´ace. Prohl´aˇsen´ı

Prohlaˇsuji, ˇzejsem bakal´aˇrskou pr´aci vypracoval samostatnˇea v´yhradnˇe s pouˇzit´ım citovan´ych pramen˚u.

V Plzni dne 26. ˇcervna 2017

Jan Palc´ut Podˇekov´an´ı

T´ımto bych chtˇel podˇekovat vedouc´ımu bakal´aˇrsk´epr´ace panu Ing. Tom´aˇsovi Hercigovi za cenn´erady, pˇripom´ınky a odborn´eveden´ıt´eto pr´ace. Abstract

The topic of this bachelor thesis is the creation of a web application for organizing orienteering races including user registration, creation of races, registration of users to races, management of teams and contestants, and results evaluation based on selected criteria. Section2 deals with the de- scription of web frameworks. Section3 describes the Spring modules and the reasons why this framework was chosen for implementation. Sec- tion4 includes used technologies. The Section5 describes the funcionalities of the website and database. Section6 describes the creation of the ap- plication in the framework Spring, the structure of the project and selected sections of the code. Section7 includes race simulation, stress test, web browsers compatibility, and Selenium tests.

Abstrakt

Pˇredmˇetem m´ebakal´aˇrsk´epr´ace je vytvoˇren´ıwebov´eaplikace pro poˇr´ad´an´ı z´avod˚uv orientaˇcn´ım bˇehu umoˇzˇnuj´ıc´ı registraci uˇzivatel˚u, vytv´aˇren´ı z´a- vod˚u, registraci uˇzivatel˚udo z´avodu, spravov´an´ıseznamu t´ym˚uvˇcetnˇe´uˇcast- n´ık˚ua n´asledn´evyhodnocen´ızadan´ych v´ysledk˚upodle zvolen´ych krit´eri´ı. Kapitola2 se zab´yv´apopisem webov´ych framework˚ujazyka Java. Kapi- tola3 popisuje moduly Springu a ˚uvody proˇcbyl tento framework vybr´an pro implementaci. Kapitola4 obsahuje pouˇzit´etechnologie. Kapitola5 po- pisuje funkcionality webu a datab´azi. Kapitola6 popisuje tvorbu aplikace ve frameworku Spring, strukturu projektu a vybran´eˇc´asti k´odu. Kapitola7 ob- sahuje simulaci z´avodu, z´atˇeˇzov´ytest aplikace, zkouˇsku kompatibility webo- v´ych prohl´ıˇzeˇc˚ua Selenium testy. Obsah

1 Uvod´ 1

2 Reˇserˇse framework˚u2 2.1 ...... 2 2.2 JavaServer Faces...... 2 2.3 ...... 3 2.4 ...... 3 2.5 Apache Tapestry...... 4 2.6 OpenXava...... 4 2.7 RIFE...... 5 2.8 Seam...... 5 2.9 Srovn´an´ıframework˚u...... 6

3 Framework Spring7 3.1 Historie...... 7 3.2 Moduly...... 7

4 Pouˇzit´etechnologie 10 4.1 HyperText Markup Language...... 10 4.2 Cascading Style Sheets...... 11 4.3 Bootstrap...... 11 4.4 Javascript a jQuery...... 12 4.5 Hibernate...... 12 4.6 DataTables...... 12

5 N´avrh aplikace 14 5.1 Poˇzadavky na aplikaci...... 14 5.2 Tˇr´ıdy uˇzivatel˚u...... 15 5.3 Funkcionality webu...... 16 5.4 N´avrh datab´aze...... 21

6 Implementace 28 6.1 Struktura projektu...... 28 6.1.1 Komponenty...... 28 6.1.2 Obsah sloˇzky webapp...... 33 6.2 Uk´azky implementace...... 35 7 Testov´an´ı 37 7.1 Simulace z´avodu...... 37 7.2 Z´atˇeˇzov´ytest...... 39 7.3 Kompatibilita prohl´ıˇzeˇc˚u...... 40 7.4 Selenium testy...... 41

8 Z´avˇer 43

Literatura 44

Pˇr´ılohy 47 A Datab´aze...... 48 B Dokumentace...... 49 C Obsah DVD...... 65 1 Uvod´

C´ılem m´ebakal´aˇrsk´epr´ace je vytvoˇren´ıwebov´eaplikace pro poˇr´ad´an´ıori- entaˇcn´ıch bˇeh˚u. Tato webov´aaplikace umoˇzn´ıspravovat z´avody, u kter´ych p˚ujde pˇri vytv´aˇren´ıdefinovat vlastn´ıkategorie a poˇcet ˇclen˚uv t´ymu. Sou- ˇc´ast´ız´avodu bude registrace pˇres formul´aˇre, kter´eumoˇzn´ıuˇzivateli pˇridat do z´avodu jeho t´ym nebo registrovat s´amsebe jako uˇzivatele bez t´ymu. Z regis- trovan´ych t´ym˚ubude vytvoˇren seznam, kter´ybude slouˇzit jako prezentace ´uˇcastn´ık˚uz´avod˚u. Spr´avci z´avodu bude umoˇznˇeno pˇrid´avat, mazat t´ymy a editovat jednotliv´e´udaje o t´ymech i jejich ˇclenech. Souˇc´ast´ıseznamu re- gistrovan´ych t´ym˚ubude umoˇznˇeno spr´avci z´avodu importovat a exportovat t´ymy ve form´atu XLSX.

D´ale bude souˇc´ast´ıwebov´eaplikace spr´ava a prezentace v´ysledk˚u. Spr´ava bude umoˇzˇnovat zad´av´an´ıstartovn´ıho ˇcasu, ˇcasu dokonˇcen´ı, z´ıskan´ych bod˚u a urˇcen´ıd´elky z´avodu pro v´ypoˇcetpenalizace. Spr´ava i vizualizace v´ysledk˚u bude obsahovat filtry, ˇrazen´ıhodnot v tabulce a vyhled´av´an´ınejen pro efek- tivnˇejˇs´ızad´av´an´ıv´ysledk˚u, ale i napˇr´ıklad umoˇznˇen´ızobrazit v´ysledky pro pˇr´ısluˇsnou kategorii. U zobrazen´ych v´ysledk˚ubude pro spr´avce z´avodu umoˇz- nˇeno vyfiltrovan´e´udaje exportovat ve form´atu XLSX a CSV.

Prvn´ım bodem zad´an´ım´ebakal´aˇrsk´epr´ace je prov´est reˇserˇsinejpouˇz´ı- vanˇejˇs´ıch framework˚upro tvorbu webov´ych aplikac´ıv jazyce Java, ve kter´e bude o kaˇzd´emz nich naps´ano p´ar vˇet. Souˇc´ast´ı reˇserˇsebude i n´asledn´y v´ybˇerframeworku, kter´ybude pouˇzit pro implementaci n´avrhu ˇreˇsen´ı.

Druh´ym bodem m´eho ˇreˇsen´ıje n´avrh webov´eaplikace, kter´ybude vych´a- zet ze zadan´ych poˇzadavk˚una aplikaci. Souˇc´ast´ın´avrhu bude popis v´ybˇeru jednotliv´ych technologi´ıpro implementaci, popis funkcionalit webu a n´avrh ˇreˇsen´ıukl´ad´an´ıdat pro potˇreby webu.

Po n´avrhu n´asleduje implementace. V t´eto ˇc´asti dojde k vytvoˇren´ıwebov´e aplikace ve frameworku Spring. Na tento bod navazuje testov´an´ı, ve kter´em bude provedena simulace imagin´arn´ıho z´avodu. C´ılem tohoto testu bude od- halit nedostatky aplikace. Dalˇs´ım testem bude z´atˇeˇzov´ytest, kter´ydefinuje rozsah velikosti z´avodu, pro kter´ybude tato aplikace pouˇziteln´a.Souˇc´ast´ı testov´an´ıbude zkouˇska kompatibility nejpouˇz´ıvanˇejˇs´ıch prohl´ıˇzeˇc˚ua vytvo- ˇren´ıSelenium test˚upro ovˇeˇren´ıspr´avnosti funkcionalit aplikace. Na z´avˇer bude vytvoˇrena uˇzivatelsk´adokumentace, kter´abude souˇc´ast´ıpˇr´ılohy.

1 2 Reˇserˇse framework˚u

V t´eto kapitole je pops´ana reˇserˇseosmi framework˚upro tvorbu webov´ych aplikac´ı v jazyce Java. Tato kapitola neobsahuje Spring, protoˇze jemu je vˇenov´ana cel´akapitola3.

2.1 Apache Struts 2

Struts 2 je popul´arn´ıwebov´yframework, kter´yje zaloˇzen na MVC architek- tuˇre. Vznikl kompletn´ım pˇreps´an´ım p˚uvodn´ıarchitektury jeho pˇredch˚udce, kter´ynesl oznaˇcen´ıStruts. K pˇreps´an´ıdoˇslo pˇredevˇs´ım proto, ˇze nov´averze mˇela b´yt l´epe pouˇziteln´aa rozˇs´ıˇriteln´apro v´yvoj´aˇre.

Pˇri vzniku nov´everze se odstoupilo od p˚uvodn´ıch akˇcn´ıch formul´aˇr˚u. Se Strust 2 se pˇreˇslo k pouˇz´ıv´an´ıPOJO (Plain Old Java Object) tˇr´ıd pro vstup z formul´aˇr˚u. Tento framework n´am poskytuje vlastn´ıznaˇcky, kter´e uˇsetˇr´ıpsan´ık´odu pro v´yvoj´aˇre. Souˇc´ast´ıtˇechto znaˇcekje i moˇznost vyuˇzit´ı technologie Ajax.

Jako dalˇs´ıv´yhoda se ud´av´ajednoduch´arozˇs´ıˇritelnost o dalˇs´ıframeworky. Lze snadno integrovat frameworky jako je Spring, Tiles nebo SiteMash. Pro rozˇs´ıˇritelnost j´adra frameworku lze pouˇz´ıt i dalˇs´ız´asuvn´emoduly, kter´ych tento framework nab´ız´ınespoˇcet [1].

2.2 JavaServer Faces

JavaServer Faces (JSF) je stejnˇejako Struts webov´yframework, kter´ypod- poruje pouˇzit´ıMVC architektury. C´ılem tohoto frameworku je zjednoduˇsen´ı konstrukce uˇzivatelsk´eho rozhran´ı.

K usnadnˇen´ı tvorby uˇzivatelsk´eho rozhran´ı doch´az´ı skl´ad´an´ım jednot- liv´ych ˇsablon pomoc´ıkomponent˚u, kter´ejdou jednoduˇsevloˇzit a vyˇzaduj´ı minim´aln´ıkonfiguraci. Tento framework poskytuje API, kter´epopisuje kom- ponenty uˇzivatelsk´eho rozhran´ı, spravuje jejich stav, zpracov´av´aud´alosti a ovˇeˇruje spr´avnost dat. Tento framework nab´ız´ıˇradu z´akladn´ıch knihoven, kter´eobsahuj´ıkomponenty pro pouˇzit´ı. V pˇr´ıpadˇenevyhovuj´ıc´ıch z´aklad-

2 n´ıch komponent˚utˇechto knihoven n´am JSF poskytuje API pro jejich vlastn´ı v´yvoj a rozˇs´ıˇren´ı.

Stejnˇejako Strust 2 n´am nab´ız´ımoˇznost integrace r˚uzn´ych framework˚u jako je Spring nebo Hibernate. I tento framework podporuje vlastn´ıznaˇcky, kter´elze pouˇzit pˇripr´aci se ˇsablonami [2].

2.3 Apache Wicket

Wicket je komponentovˇezaloˇzen´yframework pro tvorbu webov´ych str´anek, kter´yje vyv´ıjen pod licenc´ıApache License 2.0 neziskovou organizac´ıApache Software Foundation.

Framework n´am umoˇzˇnuje vytvoˇrit znovu pouˇziteln´ekomponenty. U jed- notliv´ych komponent˚uje potˇreba definovat, jak bude kaˇzd´ykomponent re- agovat na vstup od uˇzivatele. Pro pˇrehlednost mezi k´odem Java a znaˇc- kovac´ım jazykem lze pouˇz´ıt pro vkl´ad´an´ı k´odu napsan´eho v jazyce Java do HTML znaˇcky JSP (JavaServer Pages). Framework Wicket poskytuje i vlastn´ıznaˇcky, kter´enab´ız´ıˇradu moˇznost´ı.

Stejnˇejako ostatn´ıv´yˇseuveden´eframeworky i Wicket umoˇzˇnuje integraci jin´ych framework˚u(jako je Spring) a podporuje Ajax technologii. Od verze 6 dokonce tento framework zaˇcalpodporovat nejpouˇz´ıvanˇejˇs´ıJavaScriptovou knihovnu jQuery [3,4].

2.4 Google Web Toolkit

Google Web Toolkit (GWT) je v´yvojov´yn´astroj pro tvorbu RIA (RICH Internet Application). Tento n´astroj n´amumoˇzˇnuje ps´at klientskou stranu v jazyce Java.

Jedineˇcnost tohoto n´astroje spoˇc´ıv´av tom, ˇzekompiluje klientsk´yk´od napsan´yv jazyce Java do skriptovac´ıho jazyka JavaScript. Kromˇev´yhody psan´ıklientsk´estrany v jazyce Java je n´am tak´eumoˇzˇnuje plnˇedebugovat celou aplikaci. Souˇc´ast´ıGoogle Web Toolkit je integrace frameworku JUnit a n´astroje Maven.

3 Google Web Toolkit poskytuje Widgets knihovnu, kter´aobsahuje z´a- kladn´ın´astroje jako je Button, TextBox, TextArea, DatePicker nebo Rich- TextArea. V pˇr´ıpadˇenenalezen´ıvhodn´eho n´astroje umoˇzˇnuje GWT rozˇs´ıˇren´ı o vlastn´ın´astroj [5].

2.5 Apache Tapestry

Apache Tapestry je komponentovˇezaloˇzen´yframework pro tvorbu webov´ych str´anek jako je napˇr´ıklad Wicket. Uˇzz n´azvu vypl´yv´a, ˇzese jedn´ao framwork adoptovan´yorganizac´ıApache Software Foundation.

Tapestry na sv´ych str´ank´ach uv´ad´ı, ˇzepro psan´ıwebov´ych str´anek s po- uˇzit´ım toho frameworku kromˇejazyka Java lze vyuˇz´ıt i JVM jazyk˚ujako je Scala nebo Groovy. Tapestry n´am umoˇzˇnuje snadn´evytv´aˇren´ı nov´ych komponent˚u. Jednotliv´eˇsablony aplikace lze skl´adat z r˚uzn´ych komponent˚u. I u Tapestry doch´az´ık pouˇz´ıv´an´ıPOJOs a podpoˇre Ajaxu.

Od verze 5 poskytuje framework moˇznost automatick´eho naˇcten´ızmˇen u tˇr´ıd a ˇsablon. Dˇr´ıve muselo doj´ıt k opˇetovn´emu pˇresunut´ıWAR souboru do servlet kontejneru. Tato vlastnost n´amumoˇzˇn´ı pˇr´ıjemnˇejˇs´ı a rychlejˇs´ı v´yvoj aplikace. Proces neust´al´eho znovuzav´adˇen´ıWAR souboru do servlet kontejneru je totiˇznepˇr´ıjemn´ya zdrˇzuje v´yvoj aplikace [6,7].

2.6 OpenXava

OpeXava je framework pro rychl´yv´yvoj podnikov´ych aplikac´ıvyuˇz´ıvaj´ıc´ıch jazyk Java. Hod´ıse pˇredevˇs´ım pro aplikace, ve kter´ych je potˇreba 4 z´aklad- n´ıch vlastnost´ı, kter´ymi jsou vytv´aˇren´ı, naˇcten´ı, upravov´an´ıa smaz´an´ı.

Tento framework n´amumoˇzˇnuje generovat uˇzivatelsk´arozhran´ıpro webo- v´estr´anky, mobiln´ızaˇr´ızen´ıa tablety. Program´ator jen vytvoˇr´ıJava tˇr´ıdy, kde pouˇzije anotaci OpenXava a JPA pro definov´an´ımodelu. Pot´edoch´az´ı k vyuˇzit´ın´astroj˚uzjednoduˇsen´eho modelu MDD (Model-Driven Develop- ment), kter´ypouˇz´ıv´aOpenXava. Vyuˇzit´ı tohoto zjednoduˇsen´eho modelu n´amumoˇzˇnuje generovat funkcionality v ˇcase, coˇzje znaˇcn´av´yhoda oproti klasick´emu MDD modelu, kde doch´az´ık generov´an´ıvˇsech funkcionalit pˇre- dem.

4 Tento framework zajiˇst’uje jednoduch´evytv´aˇren´ıfunkc´ıjako je export do PDF, snadn´epˇrid´av´an´ı, upravov´an´ı, zobrazen´ıa smaz´an´ıdat nebo pouˇzit´ı filtr˚upro vizualici dat. Rozhran´ıvyuˇz´ıv´atechnologie Ajax, kter´an´amzaruˇc´ı efektivn´ıpr´aci bez obnovov´an´ıstr´anky [8].

2.7 RIFE

V pˇredchoz´ıch pˇr´ıkladech jsme mˇeli framework Struts 2, kter´yje poˇzadav- kovˇezaloˇzen´ya Wicket, kter´yje naopak komponentovˇezaloˇzen´y. RIFE je specifick´yt´ım, ˇzem´ıs´ıtyto dva zp˚usoby do sebe v podobˇejejich nejlepˇs´ıch vlastnost´ı. RIFE slouˇz´ıpro v´yvoj webov´ych str´anek, ale v tomto pˇr´ıpadˇebez pouˇzit´ıJava Enterprise Edition.

Tento framework se skl´ad´az vrstev. Tyto vrstvy obsahuj´ı funkce pro v´yvoj webov´ych aplikac´ı. Kaˇzd´avrstva byla navrhnuta tak, aby byla in- tegrovateln´as ostatn´ımi vrstvami, ale dok´azala fungovat i samostatnˇe.Pˇri pouˇz´ıv´an´ıtohoto frameworku nejsme odk´az´ani na to, abychom vyuˇz´ıvali jen tyto vrstvy, i kdyˇzteoreticky obsahuj´ıveˇsker´enutn´ez´akladn´ıfunkcionality pro v´yvoj webu. RIFE podporuje integraci jin´ych framework˚ujako je Spring, Hibernate nebo Velocity.

D´ale n´am tento framework nab´ız´ıdetekci modifikac´ısoubor˚u, kterou po- skytuje i Apache Tapestry. Tato detekce n´am minimalizuje poˇcetzav´adˇen´ı WAR soubor˚udo servlet kontejneru [9].

2.8 Seam

Seam je framework pro v´yvoj webov´ych aplikaci, kter´yse ˇrad´ıdo kategorie Rich Internet Application a Java Enterprise Edition. Tento framework byl vytvoˇren skupinou lid´ı, kter´avyvinula Hibernate.

Tento framework poskytuje komponentov´ymodel EJB (Enterprise Java Beans) 3.0. Tento model obsahuje kontejner, kter´yˇr´ıd´ıˇzivotn´ıcyklus vˇsech objekt˚uuvnitˇrnˇeho, spravuje transakce (napˇr. commit, rollback), zajiˇst’uje bezpeˇcnost aplikace (ovˇeˇren´ıuˇzivatele) a poskytuje dalˇs´ıfunkcionality. Ob- jekt kaˇzd´etˇr´ıdy lze vloˇzit do tohoto kontejneru. Tento framework n´amza kaˇzdou cenu nevnucuje pouˇzit´ı tohoto modelu. Ovˇsem je potˇreba ˇr´ıci, ˇze

5 tento model zajist´ıˇradu potˇrebn´ych funkcionalit.

Seam framework poskytuje podporu pro Java 5 anotace a efektivn´ıtvorbu z´akladn´ıch funkc´ıpro ukl´ad´an´ı, ˇcten´ı, ´upravu a smaz´an´ıdat s vyuˇzit´ım Hi- bernate a JPA. D´ale poskytuje knihovny ICEfaces a Ajax4JSF, kter´evznikly integrac´ıJavaServer Faces a Ajaxu. Tyto knihovny n´am umoˇzn´ıpracovat s Ajaxem bez nutnosti znalosti JavaScriptu [10, 11].

2.9 Srovn´an´ıframework˚u

Na z´avˇert´eto kapitoly jsem se vytvoˇril tabulku 2.1, ve kter´ejsou frameworky zaˇrazeny do r˚uzn´ych kategori´ı. Porovnat jednotliv´eframeworky nebylo jed- noduch´e. Vˇetˇsina z nich podporuje znaˇcnou ˇradu stejn´ych nebo ´uˇcelovˇe podobn´ych n´astroje. V pˇr´ıpadˇe,ˇze nen´ı potˇrebn´yn´astroj v z´akladu fra- meworku, tak lze vˇetˇsinou framework o tento n´astroj rozˇs´ıˇrit. V tabulce je kategorie komponentovˇezaloˇzen´yframework, poˇzadavkovˇezaloˇzen´yfra- mework a hybridn´ı. Posledn´ız tˇechto tˇr´ıpojm˚uje potˇreba ch´apat jako kom- binaci dvou pˇredchoz´ıch typ˚uframework˚u. D´ale jsou v tabulce dvˇekategorie licenc´ı. Prvn´ıkategorie je 2.0 a druh´aGNU LGPL. V pˇred- posledn´ıkategorii jsou obsaˇzeny frameworky, kter´evyuˇz´ıvaj´ıJava Enterprise Edition platformy. Na z´avˇerje kategorie podpora Ajaxu. Do t´eto kategorie jsem zaˇradil vˇsechny frameworky, protoˇzekaˇzd´ynich podporuje tuto tech- nologii at’ uˇzv podobˇeknihovny jQuery nebo jin´eho n´astroje.

Kategorie Frameworky Komponentovˇezaloˇzen´yframework Wicket, Tapestry, JSF Poˇzadavkovˇezaloˇzen´yframework Spring, Struts 2, OpenXava Hybridn´ıframework RIFE Apache License 2.0 Spring, Struts 2, Wicket, Tapestry GNU LGPL license Seam, OpenXava, RIFE MVC architektura Spring, Struts 2, Seam, RIFE, JSF, Tapestry Java Enterprise Edition Spring, Seam, Struts 2, JSF, Tapestry, GWT, OpenXava, Wicket Podpora Ajaxu Vˇsechny frameworky

Tabulka 2.1: Zaˇrazen´ıframework˚udo kategori´ı

6 3 Framework Spring

Spring je open-source framework pro v´yvoj aplikac´ıv r´amci Java EE (Java Enterprise Edition) platformy. Jako nejd˚uleˇzitˇejˇs´ıvlastnost Springu se uv´ad´ı jeho modul´arnost. Umoˇzˇnuje n´am vyuˇz´ıt jen ty moduly, kter´epotˇrebujeme. Spring podporuje vytv´aˇren´ıwebov´ych, podnikov´ych a desktopov´ych aplikac´ı.

Pˇri v´ybˇeru frameworku jsem se rozhodl pro Spring ve verzi 4.3.1, kter´a moment´alnˇepatˇr´ımezi jednu z posledn´ıch verz´ı. Jedn´ım z d˚uvod˚uproˇcjsem se rozhodl pro Spring, je velikost jeho komunity, kter´ase pr´avem ˇrad´ımezi jedny z nejvˇetˇs´ıch v oblasti programov´an´ıwebov´ych aplikac´ıv jazyce Java. Dalˇs´ım d˚uvodem, proˇcjsem si vybral Spring, je kvalita zpracov´an´ıjeho do- kumentace, kter´aje rozs´ahl´aa popisuje vyuˇzit´ıjednotliv´ych modul˚u. Kromˇe popisu modul˚uobsahuje dokumentace i uk´azky k´od˚ua postupy potˇrebn´epro v´yvoj aplikace.

S vyuˇzit´ım Springu doch´az´ınejen k uˇsetˇren´ıpr´ace, ale i ke kvalitn´ımu zabezpeˇcen´ıaplikace. K uˇsetˇren´ıpr´ace pˇripsan´ıaplikace doch´az´ınapˇr´ıklad integrac´ıjednotliv´ych framework˚udo Springu (tˇreba integrace Hibernate pro ORM) a pro zabezpeˇcen´ıaplikace lze vyuˇz´ıt framework Spring Security.

3.1 Historie

P˚uvodn´ımyˇslenka Springu vznikla v roce 2002, kdy Rod Johnson publikoval knihu Expert One-on-one J2EE Design and Development. Kniha popiso- vala na 750 str´ank´ach framework Interface21, kter´ymˇel usnadnit v´yvoj Java Enterprise Edition aplikac´ı. Za spolupr´ace J˝urgena H˝ullera a Yanna Caro- ffa doˇslo k rozˇs´ıˇren´ıp˚uvodn´ıverze. Prvn´ıjmenovan´yse znaˇcnˇepod´ılel na rozˇs´ıˇren´ık´odu frameworku. Caroff se zapsal do historie pˇredevˇs´ım t´ım, ˇzevy- myslel n´azev Spring pro framework. V ˇcervnu 2003 se ofici´alnˇedostal Spring na veˇrejnost [12].

3.2 Moduly

Framework poskytuje okolo 20 modul˚u, kter´ese pouˇz´ıvaj´ıpodle potˇreby dan´e aplikace. Tyto moduly jsou seskupeny do 8 ˇc´ast´ı(Data Access/Integration,

7 Web, AOP, Aspects, Instrumentation, Messaging, Core Container a Test). Na obr´azku 3.1 lze vidˇetseskupen´ımodul˚u. Pro popis jednotliv´ych modul˚u bylo vyuˇzito zdroje [13].

Obr´azek 3.1: Moduly Springu [13]

Core Container

• Core - Modul, kter´yposkytuje z´akladn´ıˇc´asti frameworku vˇcetnˇeDe- pendency Injection funkc´ı a IoC (Inversion of Control) kontejneru, kter´yslouˇz´ıpro spr´avu objekt˚u.

• Beans - Poskytuje implementaci tov´arn´ıho vzoru, kter´yje nazv´an Be- anFactory.

• Context - Zaloˇzen´yna z´akladˇemodul˚uCore a Beans. Poskytuje pˇr´ıstup k definovan´ym a nakonfigurovan´ym objekt˚um. Obsahuje Application- Context rozhran´ıpro pˇr´ıstup tˇret´ıch stran.

• SpEL - Modul poskytuj´ıc´ıv´yrazov´yjazyk pro dotazovan´ıa manipulaci s objekty.

Data Access/Integration

• JDBC - Obsahuje JDBC (Java Database Connectivity) abstraktn´ıvrstvu, kter´aslouˇz´ıpro pr´aci s datab´azemi.

8 • ORM - Modul poskytuj´ıc´ıintegraˇcn´ıvrstvu pro mapov´an´ırelaˇcn´ıch objekt˚u.

• OXM - Poskytuje abstraktn´ı vrstvu, kter´apodporuje Objekt/XML mapov´an´ı.

• JMS - Obsahuje funkce pro produkov´an´ıa zpracov´an´ızpr´av. Od verze Springu 4.1 poskytuje integraci s modulem Messaging.

• Transactions - Modul pro podporu ˇr´ızen´ıtransakc´ı.

Web

• Web - Modul poskytuje z´akladn´ıwebovˇeorientovan´eintegraˇcn´ıfunkce, jako je multipart file upload a inicializace IoC (Inversion of Control) kontejneru.

• WebSocket - Poskytuje podporu pro obousmˇernou komunikaci mezi klientem a serverem.

• Servlet - Obsahuje implementaci MVC architektury pro webov´eapli- kace.

• Portlet - Modul umoˇzˇnuj´ıc´ırealizaci MVC. Doch´az´ızde k pouˇzit´ıfunk- cionality Web-Servlet modulu.

Ostatn´ımoduly

• AOP - Modul poskytuj´ıc´ıimplementaci aspektovˇeorientovan´eho pro- gramov´an´ı.

• Aspects - Tento modul slouˇz´ıpro propojen´ıs AspectJ, kter´ese vyuˇz´ıv´a pˇriaspektovˇeorientovan´em programov´an´ı.

• Instrumentation - Poskytuje podporu pro dynamick´enaˇc´ıt´an´ıtˇr´ıd do JVM (Java Virtual Machine).

• Messaging - Slouˇz´ıpro podporu s´ıt’ov´ekomunikace.

• Test - Modul pro podporu testov´an´ıJUnit a TestNG.

9 4 Pouˇzit´etechnologie

Pro tvorbu webov´eaplikace bude vyuˇzito MVC architektury, kter´arozdˇeluje aplikaci do 3 logick´ych ˇc´ast´ı. P´ısmeno M (Model) reprezentuje data a byz- nys logiku, p´ısmeno V (View) odpov´ıd´ajednotliv´ym ˇsablon´ama na z´avˇer p´ısmeno C (Controller) slouˇz´ıjako prostˇredn´ık mezi klientem a modelem.

Jak uˇzjsem zm´ınil v kapitole popisuj´ıc´ıSpring, rozhodl jsem se pouˇz´ıt tento framework jako z´aklad pro tvorbu m´ewebov´eaplikace. Pro zajiˇstˇen´ı bezpeˇcnosti pouˇziji Spring Security (ve verzi 3.2.8.). D´ale pak pro vkl´ad´an´ı k´odu napsan´eho v jazyce Java do HTML5 znaˇcekbude vyuˇzito technologie JSP (JavaServer Pages). Tato technologie poskytuje vlastn´ıznaˇcky, kter´emi umoˇzn´ıefektivnˇevytv´aˇret obsah jednotliv´ych webov´ych str´anek. Pro lepˇs´ı prezentaci str´anek jsem se rozhodl pouˇz´ıt CSS aˇzs podporou verze 3, kter´a mi umoˇzn´ızlepˇsit vizualizaci dat oproti pouˇzit´ısamotn´eho HTML5.

Pro zpˇr´ıjemnˇen´ıpr´ace s webovou aplikac´ına stranˇeklienta vyuˇziji skrip- tovac´ıho jazyka JavaScript a knihovny jQuery (ve verzi 1.12.4). Pouˇzit´ıt´eto knihovny a skriptovac´ıho jazyka umoˇzn´ınapˇr´ıklad dynamicky vytv´aˇret tex- tov´eelementy formul´aˇre nebo pos´ılat poˇzadavek na server, zpracovat ho a vr´atit odpovˇed’ bez obnoven´ı str´anky. D´ale pak pˇredevˇs´ım ke zkvalit- nˇen´ıvzhledu webov´ych str´anek pouˇziji framework Bootstrap (ve verzi 3.3.7), kter´ynab´ız´ıˇsk´alu CSS styl˚ua ˇradu JavaScript plugin˚u.

Jako dalˇs´ın´astroj jsem vybral Hibernate ORM ve verzi 4.3.11 pro kon- verzi dat mezi relaˇcn´ıdatab´az´ıa objektovˇeorientovan´ym programovac´ım ja- zykem. Na z´avˇerpouˇziji plugin DataTables (ve verzi 1.10.13), kter´yumoˇzn´ı efektivn´ıpr´aci se z´ıskan´ymi v´ysledky z´avodu.

4.1 HyperText Markup Language

HyperText Markup Language (HTML) je znaˇckovac´ı jazyk, kter´yse po- uˇz´ıv´apro tvorbu webov´ych str´anek. Slovo HyperText vyznaˇcuje metodu, kter´aumoˇzˇnuje pohyb po webu klik´an´ım na hypertextov´eodkazy. Kromˇe pˇresunu v kontextu naˇseho webu umoˇzˇnuje hypertextov´yodkaz pˇresun kam- koli v r´amci rozsahu syst´emu World Wide Web.

Slovo Language n´am ˇr´ık´a, ˇzese jedn´ao jazyk. To n´amud´av´a,ˇzestejnˇe

10 jako ostatn´ıjazyky m´ai tento definovan´ysoupis pravidel, kter´yho popi- suj´ıa umoˇzˇnuj´ıpr´aci s n´ım. Slovo Markup pak popisuje co dˇelaj´ıHTML znaˇcky s textem uvnitˇrnich (jak bude text v prohl´ıˇzeˇcizobrazen). Znaˇcky pak lze podle jedn´eze z´akladn´ıch definic rozdˇelit na p´arov´ea nep´arov´e. P´arov´emusej´ım´ıt odpov´ıdaj´ıc´ıukonˇcovac´ıznaˇcku k sobˇe.Oproti tomu ne- p´arov´enemaj´ıodpov´ıdaj´ıc´ıukonˇcovac´ıznaˇcku [14].

4.2 Cascading Style Sheets

Kask´adov´estyly se pod´ılej´ına prezentaci element˚unapsan´ych ve znaˇckova- c´ım jazyce. CSS vzniklo pˇredevˇs´ım proto, aby oddˇelilo z´akladn´ıstrukturu danou znaˇckovac´ım jazykem a obsah od vzhledu, a tak´eumoˇznilo rozs´ahlejˇs´ı moˇznosti zobrazen´ıdokumentu, neˇzumoˇzˇnuj´ıznaˇckovac´ıjazyky.

Jednotliv´estyly pak lze ps´at r˚uzn´ymi zp˚usoby. Prvn´ım zp˚usobem je ve- ps´an´ıstyl˚una konkr´etn´ıstr´ance do p´arov´eznaˇcky style. Jako dalˇs´ızp˚usob lze CSS do atributu style vepsat u pˇr´ısluˇsn´eho elementu. Posledn´ım zp˚u- sobem je psan´ıstyl˚udo oddˇelen´eho souboru, kter´ylze importovat pomoc´ı znaˇcky link nebo vyuˇzit´ım @import. Soubor obsahuj´ıc´ıstyly lze importovat z lok´aln´ıho i extern´ıho ´uloˇziˇstˇe[15].

4.3 Bootstrap

Bootstrap je open-source front-end framework vyvinut´yspoleˇcnost´ıTwitter. Framework obsahuje ˇsablony n´avrhu zaloˇzen´ena HTML a CSS pro formu- l´aˇre, tlaˇc´ıtka, tabulky, navigaci, mod´aln´ıokna a dalˇs´ı. Souˇc´ast´ıtohoto fra- meworku jsou JavaScriptov´epluginy. S vyuˇzit´ım Bootstrapu m˚uˇzeme snadno definovat responzivn´ıdesign webov´ych str´anek, kter´yse pˇrizp˚usob´ıkonkr´et- n´ımu zaˇr´ızen´ı[16].

Bootstrap nen´ı jedin´ym frameworkem sv´eho druhu. Existuje spousta front-end framework˚u. Dalˇs´ım pˇr´ıkladem lze pak uv´estMaterial Design Lite (MDL) nebo Semantic-UI. Pˇri v´ybˇeru jsem se rozhodl pro Bootstrap pˇre- devˇs´ım proto, ˇzeuˇzjsem s n´ım mˇelosobn´ızkuˇsenost. Dalˇs´ım d˚uvodem je kvalitnˇezpracovan´adokumentace a obrovsk´akomunita lid´ı, kterou m´atento framework.

11 4.4 Javascript a jQuery

JavaScript je objektovˇeorientovan´yskriptovac´ıjazyk. V JavaScriptu oproti ostatn´ım jazyk˚um jako je C, C++ nebo Java nedoch´az´ıke specifikaci typu promˇenn´e.JavaScriptov´yk´od nebo import skriptu na stranˇeklienta najdeme v zobrazen´eˇsablonˇe.Skript˚um vloˇzen´ym v tˇechto dokumentech je umoˇznˇeno vyuˇz´ıt DOM (Document Object Model) k modifikaci dan´ych dokument˚u a pot´en´aslednˇezobrazit proveden´ezmˇeny v prohl´ıˇzeˇci. DOM poskytuje API, kter´edefinuje, jak pˇristoupit k jednotliv´ym objekt˚um, kter´etvoˇr´ıdohromady dokument [17].

Pro zjednoduˇsen´ıpsan´ıskript˚ulze vyuˇz´ıt jQuery knihovnu, kter´apo- skytuje v´ıce´uˇcelovou abstraktn´ıvrstvu. S pouˇzit´ım t´eto knihovny m˚uˇzeme sn´aze pˇristupovat k element˚um dokumentu, upravovat CSS styly a mˇenit ob- sah dokumentu. D´ale m˚uˇzeme pomoc´ıtechnologie Ajax pos´ılat poˇzadavek na server, zpracovat ho a vr´atit odpovˇed’ bez obnoven´ıstr´anky [18].

4.5 Hibernate

Hibernate je open-source framework umoˇzˇnuj´ıc´ıobjektovˇe-relaˇcn´ımapov´an´ı (ORM). Tento framework poskytuje spoustu d˚uleˇzit´ych rozhran´ıch. Avˇsak jako dvˇez´akladn´ıpro tvorbu dotaz˚ubych uvedl rozhran´ı Query a Criteria. Prvn´ıjmenovan´erozhran´ın´amumoˇzn´ıprov´adˇetdotazy a kontrolovat jejich vyhodnocen´ı. Kontrolou vyhodnocen´ıje myˇsleno napˇr´ıklad nastaven´ılimitu omezuj´ıc´ıpoˇcet vr´acen´ych objekt˚u(hodnot). Jednotliv´edotazy mohou b´yt naps´any bud’ v HQL (Hibernate Query Language) nebo v klasick´emSQL. Druh´ejmenovan´erozhran´ın´am umoˇzn´ıdefinovat krit´eria pro vytvoˇren´ıa vy- hodnocen´ıdotazu [19].

4.6 DataTables

DataTables API umoˇzˇnuje prov´adˇetoperace nad inicializovanou tabulkou. K inicializaci DataTables tabulky m˚uˇzedoj´ıt napˇr´ıklad pomoc´ıjQuery pˇr´ıka- zem $("#identifik´atorTabulky").DataTable(). Vyuˇzit´ıAPI umoˇzˇnuje pouˇz´ıvat funkce, kter´en´am napˇr´ıklad umoˇzn´ımˇenit hodnoty v jednotliv´ych ˇr´adc´ıch [20].

12 Vizualizace a moˇznosti tabulky se liˇs´ıpodle n´ami definovan´ych hodnot. DataTables umoˇzˇnuje vyhled´avat v tabulce, ˇradit jednotliv´ehodnoty sloupc˚u abecednˇepro ˇretˇezcenebo podle ˇc´ıseln´ehodnoty u ˇc´ısel. Dalˇs´ıfunkcionali- tou m˚uˇzeb´yt v´ybˇerpoˇctu zobrazen´ych z´aznam˚uv tabulce nebo export dat napˇr´ıklad ve form´atu PDF, XLSX a CSV.

13 5 N´avrh aplikace

Tato kapitola obsahuje poˇzadavky, kter´ejsou kladen´ena vytvoˇren´ıwebov´e aplikace. Druhou podkapitolou je rozdˇelen´ıuˇzivatel˚udo tˇr´ıd a popis jejich vztahu k aplikaci. Pot´en´asleduje n´avrh funkcionalit webu. V z´avˇeru t´eto kapitoly je n´avrh datab´aze.

5.1 Poˇzadavky na aplikaci

Na aplikaci jsou kladeny r˚uzn´epoˇzadavky. Na tyto poˇzadavky lze pohl´ı- ˇzetnapˇr´ıklad z hlediska bezpeˇcnosti nebo funkcionalit webu. Soupis tˇechto n´arok˚ujsem rozdˇelil do dvou skupin na funkˇcn´ıa mimofunkˇcn´ıpoˇzadavky.

Funkˇcn´ıpoˇzadavky

• Vytv´aˇren´ız´avodu - U vytv´aˇren´ız´avodu je kladen poˇzadavek pro de- finov´an´ıvlastn´ıch kategori´ı, kter´en´am umoˇzn´ırozdˇelit t´ymy nebo z´a- vodn´ıky do jednotliv´ych kategori´ı. Rozdˇelen´ıt´ym˚udo kategori´ın´am umoˇzn´ıidentifikovat skupiny, kter´emohou m´ıt napˇr´ıklad urˇcenou ji- nou trasu z´avodu nebo urˇcen´yjin´yˇcas pro dokonˇcen´ız´avodu.

• Registrace - Aplikace mus´ı umoˇznit registraci uˇzivatel˚uuˇzpˇred z´a- vodem pˇres webov´estr´anky. Uˇcelem´ tohoto je m´ıt vˇetˇsinu z´avodn´ık˚u zaregistrovan´ych uˇzpˇred z´avodem.

• Spr´ava t´ymu - Tento poˇzadavek by mˇel umoˇznit upravovat zmˇenu ka- tegorie a n´azev t´ymu. Dalˇs´ım poˇzadavkem tohoto bodu je exportov´an´ı a importov´an´ıt´ym˚uve form´atu XLSX.

• Spr´ava v´ysledk˚u- Spr´ava mus´ı obsahovat filtry, kter´en´am umoˇzn´ı rychleji se zorientovat pˇrizad´av´an´ıv´ysledk˚u, ˇcasu pro start a dokonˇcen´ı z´avodu t´ymu.

• Zobrazen´ı v´ysledk˚u- Vizualizace v´ysledk˚umus´ı umoˇznit filtrov´an´ı podle kategori´ı, seˇrazen´ıjednotliv´ych hodnot v sloupc´ıch a vyhled´a- v´an´ıv tabulce. Dalˇs´ım poˇzadavkem je umoˇznˇen´ıexportov´an´ıdat pro spr´avce z´avodu a jeho vlastn´ıka ve form´atu XLSX a CSV.

14 • Seznam z´avodn´ık˚u- Tento seznam mus´ıumoˇznit mˇenit ´udaje o z´avod- n´ıc´ıch. K pouˇzit´ıtoho seznamu typicky doch´az´ıpˇri placen´ıstartovn´eho pˇred z´avodem, kde se mˇen´ıhodnota ´udaje neplatil na platil.

Mimofunkˇcn´ıpoˇzadavky

• Stabilita aplikace - Tento n´arok je d˚uleˇzit´ypro chod aplikace. Poˇc´ıt´a s pouˇzit´ım t´eto aplikace na m´ıstˇepro spr´avu z´avodu. Nem˚uˇze se st´at, ˇzeby aplikace pˇri zad´av´an´ıdat spadla, stala se nepouˇzitelnou a neu- moˇznila by n´am d´ale spravovat z´avod.

• Pˇrehlednost - Syst´em mus´ıb´yt pˇrehledn´y, protoˇzeje kladen d˚uraz na rychlost zad´av´an´ıv´ysledk˚u.

• Bezpeˇcnost - Webov´aaplikace mus´ıb´yt zabezpeˇcena proti vkl´ad´an´ı skript˚ua HTML znaˇcek, kter´eby mohly poˇskodit obsah webu nebo dokonce zniˇcit z´aznamy v datov´em´uloˇziˇsti. D´ale mus´ıb´yt zabezpeˇceny konkr´etn´ıfunkce odpov´ıdaj´ıc´ıspr´avc˚um a vlastn´ık˚um z´avod˚u, aby se tam nedostal neopr´avnˇen´yuˇzivatel.

5.2 Tˇr´ıdy uˇzivatel˚u

Pro potˇreby webov´eaplikace jsem se rozhodl rozdˇelit uˇzivatele do ˇctyˇrtˇr´ıd. Prvn´ıtˇr´ıdou jsou bˇeˇzn´ın´avˇstˇevn´ıci web˚u, kteˇr´ınejsou pˇrihl´aˇseni do webov´e aplikace. Druhou tˇr´ıdou jsou registrovan´ıuˇzivatel´e,na kter´ebude pˇri n´avrhu pohl´ıˇzeno jako na webu pˇrihl´aˇsen´euˇzivatele. Tˇret´ıtˇr´ıdou jsou uˇzivatel´e,kteˇr´ı vytvoˇrili z´avod. Pˇri popisu n´avrhu na nˇebude pohl´ıˇzeno jako na vlastn´ıky z´avod˚u. Posledn´ıtˇr´ıdou uˇzivatel˚ujsou spr´avci z´avodu. Spr´avcem z´avodu se stane uˇzivatel po pˇriˇrazen´ıvlastn´ıkem z´avodu do seznamu spr´avc˚u.

15 Vytvořit účet Aplikovat filtry Zakázat registraci

Spravovat závod Návštěvník Zobrazit výsledky Vyhodnotit závod závodu jako vlastník Správce závodu Vytvořit závod Definovat kategorie Spravovat správce Přihlášený uživatel Registrovat do Exportvat výsledky závodu Import/Export týmů Vlastník závodu Správovat závod Zadat výsledky

Správce Zařadit do týmu Přidat závodníka Vytvořit tým závodu

Obr´azek 5.1: Tˇr´ıdy uˇzivatel˚u- Use Case Diagram

5.3 Funkcionality webu

Registrace a pˇrihl´aˇsen´ıuˇzivatele

Prvn´ız´akladn´ıfunkcionalitou webu bude registrace uˇzivatele a pˇrihl´aˇsen´ı. Pˇri registraci bude uˇzivatel zad´avat unik´atn´ıpˇrihlaˇsovac´ıjm´eno, email a te- lefonn´ıˇc´ıslo. Dalˇs´ımi zad´avan´ymi ´udaji bude kˇrestn´ıjm´eno, pˇr´ıjmen´ıa na- konec dvakr´at heslo pro ovˇeˇren´ıjeho spr´avnosti. Minim´aln´ıd´elka hesla bude omezena na osm znak˚u.

Pˇrihl´aˇsen´ıuˇzivatele do aplikace bude nutnou podm´ınkou pro vytvoˇren´ı z´avodu a jeho spr´avu. Dalˇs´ıd˚uleˇzitou funkcionalitou pro pˇrihl´aˇsen´eho uˇzi- vatele bude umoˇznˇen´ıregistrace do z´avod˚u.

Vytv´aˇren´ız´avod˚u

Jak uˇzbylo zm´ınˇeno pˇri popisu registrace a pˇrihl´aˇsen´ıuˇzivatele, tak pˇri- hl´aˇsen´ıbude nutnou podm´ınkou, kter´aumoˇzn´ıuˇzivateli vytvoˇrit z´avod. Pˇri

16 vytv´aˇren´ız´avodu se bude zad´avat unik´atn´ın´azev z´avodu a velikost t´ymu, kter´abude omezena na 1 aˇz5 z´avodn´ık˚u.

Souˇc´ast´ıvytvoˇren´ız´avodu bude definov´an´ıpodkategori´ıpro jednotliv´e z´avodn´ıky a t´ymy. Definov´an´ıpodkategori´ıt´ym˚u(z´avodn´ık˚u) p˚ujde rozdˇelit do tˇrech moˇznost´ı:

• Definov´an´ıbez podkategori´ı

• V´ybˇerz pˇredpˇripraven´ych kategori´ı- Kaˇzd´atato kategorie bude obsa- hovat podkategorie. Jednotliv´epˇredpˇripraven´ekategorie a jejich pod- kategorie se budou liˇsit u z´avodn´ık˚ui t´ym˚u.

• Vytvoˇren´ıvlastn´ıch podkategori´ı- Pˇri t´eto volbˇep˚ujde vytvoˇrit pod- kategorie s n´azvem o velikosti 1-20 znak˚u. Maxim´aln´ıpoˇcetvlastn´ıch definovan´ych podkategori´ıbude omezen na poˇcetdvacet.

Seznam z´avod˚u

Pro potˇreby webov´eaplikace budou z´avody rozdˇeleny na dva seznamy. Prvn´ı seznam bude obsahovat z´avody, kter´ese budou konat. V tom seznamu bude vˇzdy odkaz na z´avod, na jeho registraˇcn´ıformul´aˇre, a tak´ezobrazeno, jestli je umoˇznˇena registrace do z´avodu nebo nen´ı. Druh´yseznam bude obsahovat uˇzvyhodnocen´ez´avody, u kter´ych bude odkaz na z´avod a na jeho v´ysledky. Toto zobrazen´ıseznam˚ubude pro vˇsechny tˇr´ıdy uˇzivatel˚ustejn´e.

Z pohledu uˇzivatelsk´ych ´uˇct˚ubude souˇc´ast´ıkaˇzd´eho ´uˇctu seznam, kter´y bude jmenovat moje z´avody. Tento seznam bude obsahovat konkr´etn´ız´avody vytvoˇren´euˇzivatelem, a tak´ez´avody, ve kter´ych je uˇzivateli pˇriˇrazena funkce spr´avce z´avodu. Seznam bude obsahovat odkazy na tyto z´avody.

Registrace z´avodn´ık˚ua t´ym˚u

Registrace bude rozdˇelena do dvou sekc´ı. Prvn´ısekce bude urˇcena pro vlast- n´ıka z´avodu a spr´avce z´avodu. Druh´asekce bude pro bˇeˇznˇepˇrihl´aˇsen´euˇzi- vatele, kteˇr´ıse chtˇej´ıpˇrihl´asit do z´avodu. Mnoˇzstv´ıformul´aˇr˚uv jednotliv´ych sekc´ıch se bude liˇsit podle nastaven´ıvelikosti t´ym˚upˇri registraci. Pro nepˇri- hl´aˇsen´euˇzivatele tato sekce nebude dostupn´a.

17 Pro jednoˇclenn´et´ymy bude administr´atorsk´asekce obsahovat jeden for- mul´aˇr, ve kter´emp˚ujde vyplnit kˇrestn´ıjm´eno, pˇr´ıjmen´ı, telefonn´ıˇc´ıslo, email a zaplacen´ıstartovn´eho. Ani na jeden ze z´akladn´ıch atribut˚uz´avodn´ıka ne- bude nahl´ıˇzeno jako na unik´atn´ı´udaje. Dalˇs´ımi ´udaji, kter´ep˚ujde vybrat bude kategorie t´ymu a z´avodn´ıka1.

Pˇri definovan´emvˇetˇs´ım poˇctu z´avodn´ık˚uv t´ymu neˇzjedna bude k dis- pozici podobn´yformul´aˇrjako u formul´aˇre o velikosti jedna. Tento formul´aˇr se bude liˇsit ve v´ychoz´ım stavu poˇctem z´avodn´ık˚upro vyplnˇen´ı, kter´ybude urˇcen podle definovan´eho poˇctu z´avodn´ık˚uv t´ymu. Pro potˇrebu zvˇetˇsen´ı poˇctu z´avodn´ık˚uv t´ymu budou pˇrid´ana tlaˇc´ıtka, kter´eumoˇzn´ırozˇs´ıˇrit t´ym aˇzo dva ˇcleny. Dalˇs´ızmˇenou oproti pˇredchoz´ımu formul´aˇri je pˇrid´an´ın´azvu t´ymu, kter´ynebude nutn´epˇrivyplˇnov´an´ı formul´aˇre zadat. Nejvˇetˇs´ı zmˇe- nou pˇri velikosti t´ymu vˇetˇs´ıneˇzjedna bude druh´yformul´aˇr, kter´yumoˇzn´ı pˇridat z´avodn´ıka bez t´ymu. Tento formul´aˇrbude obsahovat stejn´eatributy z´avodn´ıka jako pˇredchoz´ıformul´aˇr.

Druh´asekce pro pˇrihl´aˇsen´euˇzivatele bude pˇri velikosti t´ymu jedna ob- sahovat jeden formul´aˇr, ve kter´emse bude vyb´ırat podkategorie pro t´ym i z´avodn´ıka1. Ostatn´ıpotˇrebn´e´udaje o z´avodn´ıkovi budou vzaty z jeho uˇzi- vatelsk´eho ´uˇctu.

U velikosti t´ymu vˇetˇs´ıneˇzjedna bude formul´aˇrsrovnateln´ys adminis- tr´atorsk´ymformul´aˇrem pro registraci t´ymu s poˇctem z´avodn´ık˚uvˇetˇs´ım neˇz jedna. Rozd´ıl ve formul´aˇr´ıch bude v tom, ˇzeu prvn´ıho z´avodn´ıka budou osobn´ıdata vzaty z jeho uˇzivatelsk´eho ´uˇctu a bude nemˇenn´ypoˇcetˇclen˚u v t´ymu. Formul´aˇrnav´ıc nebude u z´avodn´ık˚uobsahovat atribut platby. Pˇri velikosti vˇetˇs´ı neˇzjedna bude tato sekce obsahovat jeˇstˇedruh´yformul´aˇr, kter´yumoˇzn´ıuˇzivatele zaregistrovat jako z´avodn´ıka bez t´ymu. Tento formu- l´aˇrje totoˇzn´yformul´aˇri v sekci pˇrihl´aˇsen´yuˇzivatel pˇri velikosti jedna. Rozd´ıl v nich bude v tom, ˇzev tomto pˇr´ıpadˇenep˚ujde z´avodn´ıkovi pˇriˇradit t´ymovou kategorie.

Spr´ava seznamu t´ym˚u

Na seznam t´ym˚ubudeme moci pohl´ıˇzet dvˇema pohledy. Prvn´ıpohled je ze strany pˇrihl´aˇsen´ych uˇzivatel˚ua nepˇrihl´aˇsen´ych uˇzivatel˚udo syst´emu. Tento pohled je pak potˇreba rozdˇelit podle v´ychoz´ıho nastaven´ı velikosti t´ymu

1v pˇr´ıpadˇejejich definov´an´ı

18 u z´avodu. Pˇri definov´an´ıvelikosti t´ymu jedna budou zobrazeny ´udaje o jed- notliv´ych z´avodn´ıc´ıch vˇcetnˇepˇriˇrazen´epodkategorie z´avodn´ıka i t´ymu2. Pˇri tomto pohledu nebude vidˇetemail a ani telefonn´ıˇc´ıslo z´avodn´ıka. Pro pˇr´ıpad velikosti t´ymu vˇetˇs´ıneˇzjedna bude nav´ıc vidˇetn´azev t´ym˚ua m´ısto jednoho z´avodn´ıka bude zobrazen seznam ˇclen˚ut´ymu.

Druh´ypohled bude slouˇzit pro spr´avce z´avod˚ua vlastn´ıky z´avodu. Pˇride- finovan´evelikosti t´ymu jedna bude kaˇzd´aˇr´adka seznamu odpov´ıdat jednomu z´avodn´ıkovi. V tomto seznamu bude moˇzn´eupravovat osobn´ı´udaje z´avod- n´ık˚uvˇcetnˇezmˇeny podkategori´ıa atributu platil. Souˇc´ast´ıkaˇzd´eˇr´adky bude jeˇstˇeID pro identifikaci z´avodn´ıka a tlaˇc´ıtko pro smaz´an´ı. Seznam bude ob- sahovat tlaˇc´ıtka pro exportov´an´ıa importov´an´ız´avodn´ık˚uve form´atu XLSX.

Pˇri definovan´evelikosti t´ymu vˇetˇs´ıneˇzjedna bude v seznamu zobrazeno ID t´ymu, n´azev t´ymu, jeho ˇclenov´ea t´ymov´apodkategorie2. Souˇc´ast´ıtoho seznamu bude editace podkategorie2, n´azvu t´ymu a tlaˇc´ıtko pro smaz´an´ı t´ymu. Po zm´aˇcknut´ı tohoto tlaˇc´ıtka se zobraz´ı mod´aln´ı okno, ve kter´em p˚ujde vybrat, jestli chceme smazat t´ym i s jeho ˇcleny. Souˇc´ast´ıtoho seznamu bude i importov´an´ıa exportov´an´ıt´ym˚uve form´atu XLSX.

Spr´ava seznamu vˇsech z´avodn´ık˚u

Sekce obsahuj´ıc´ıseznam vˇsech ´uˇcastn´ık˚ubude dostupn´ajen pro vlastn´ıky z´avodu a spr´avce z´avodu. Ostatn´ıuˇzivatel´ezde nebudou m´ıt pˇr´ıstup. Tato sekce bude slouˇzit pro ´upravy osobn´ıch ´udaj˚uz´avodn´ık˚uvˇcetnˇenastaven´ı kategorie z´avodn´ıka a ´upravy atributu platby. Souˇc´ast´ı kaˇzd´eho z´aznamu bude nav´ıc ID t´ymu. Tato sekce bude slouˇzit jen pro z´avody s definovanou velikost´ıt´ymu vˇetˇs´ıneˇzjedna.

Tvorba t´ymu

Tato sekce bude dostupn´ajen pro z´avody, kter´ebudou m´ıt definovanou ve- likost t´ymu vˇetˇs´ıneˇzjedna. Pro bˇeˇzn´euˇzivatele bude v t´eto sekci zobrazen pouze seznam z´avodn´ık˚u, kteˇr´ı nemaj´ı t´ym. Pro tv˚urce z´avodu zde bude podobn´yseznam, kter´ybude rozˇs´ıˇren´yo vˇetˇs´ımnoˇzstv´ıinformac´ıo z´avod- n´ıc´ıch, a tak´ezde bude umoˇznˇeno pracovat s t´ımto seznamem. Prvn´ım roz- ˇs´ıˇren´ım bude vytvoˇren´ıt´ymu v´ybˇerem z´avodn´ık˚uze seznamu. Pˇri v´ybˇeru

2v pˇr´ıpadˇedefinov´an´ıpodkategori´ıpro z´avod

19 z´avodn´ık˚up˚ujde doplnit n´azev t´ymu. V pˇr´ıpadˇedefinovan´ych t´ymov´ych ka- tegori´ıbude nutnost´ıvybrat pˇr´ısluˇsnou kategorii. Kromˇetvorby t´ymu bude umoˇznˇeno i mazat jednotliv´ez´avodn´ıky ze seznamu.

Zobrazen´ıv´ysledk˚u

Pˇri zobrazov´an´ıv´ysledk˚uz´avodu bude vyuˇzito pluginu DataTables, kter´ypo- skytuje ˇradu vhodn´ych funkc´ıpro toto zobrazen´ı. Tento plugin n´amumoˇzn´ı ˇradit hodnoty sloupc˚usestupnˇea vzestupnˇe. Dalˇs´ıfunkc´ı, kter´abude vyuˇzita je vyhled´av´an´ıpˇres vˇsechny sloupce, kter´apodle zadan´ehodnoty vyfiltruje pˇr´ısluˇsn´eodpov´ıdaj´ıc´ıˇr´adky.

V zobrazen´etabulce budou hodnoty seˇrazeny podle v´ypoˇctu celkov´ych bod˚ut´ym˚u(z´avodn´ık˚u). Tento v´ypoˇcet bude zahrnovat souˇcetz´ıskan´ych bod˚ua bonusov´ych bod˚u, od kter´ych bude odeˇctena hodnota penalizace. Hodnota penalizaˇcn´ıch bod˚ubude m´ıt pˇriˇrazen´yjeden bod za kaˇzdou zapo- ˇcatou minutu, kter´apˇres´ahne urˇcen´yˇcas pro z´avod. Souˇc´ast´ıt´eto tabulky bude um´ıstˇen´ı, n´azev t´ymu s ˇcleny, body, bonusov´ebody, penalizace, star- tovn´ıˇcas, celkov´ebody, ˇcas dobˇehnut´ıa ˇcas d´elky bˇehu urˇcen´epro t´ym. V pˇr´ıpadˇe,ˇzebude m´ıt z´avod pˇriˇrazen´et´ymov´epodkategorie, tak i ty bu- dou zobrazeny v tabulce u jednotliv´ych t´ym˚u. Pˇri definovan´evelikosti t´ymu jedna bude sloupec s n´azvem t´ymu a jeho ˇcleny odpov´ıdat jednomu z´avod- n´ıkovi.

Vˇsechny v´yˇsepopsan´evlastnosti budou zobrazeny a umoˇznˇeny pro vˇsech- ny tˇr´ıdy uˇzivatel˚u. Pro vlastn´ıka z´avodu a spr´avce z´avodu bude nav´ıc pˇrid´ana moˇznost exportu v´ysledk˚uve form´atu XLSX a CSV. Export dat se bude vˇzdy liˇsit podle aktu´alnˇevyfiltrovan´ych dat v tabulce.

Spr´ava v´ysledk˚u

Tato sekce bude urˇcena pro vlastn´ıka z´avodu a spr´avce z´avodu. Ostatn´ıtˇr´ıdy uˇzivatel˚uzde nebudou m´ıt pˇr´ıstup. V t´eto sekci se budou nastavovat v´ysledky pro jednotliv´et´ymy (z´avodn´ıky). Tabulka bude stejnˇejako pˇri zobrazov´an´ı v´ysledk˚uimplementov´ana pluginem DataTables s moˇznost´ıˇrazen´ısloupc˚u a vyhled´av´an´ım. U t´eto sekce budou nav´ıc pˇrid´any tˇritlaˇc´ıtka pro rychle filtrov´an´ı. Prvn´ıtlaˇc´ıtko zobraz´ıvˇsechny t´ymy (z´avodn´ıky), druh´ezobraz´ı pouze ˇr´adky, u kter´ych nen´ıvyplnˇenˇcasdokonˇcen´ız´avodu. Posledn´ıtla-

20 ˇc´ıtko filtrov´an´ızobraz´ıˇr´adky, kde bude vyplnˇenˇcas dokonˇcen´ız´avodu. Tyto tlaˇc´ıtka budou implementov´ana pˇredevˇs´ım pro lepˇs´ıorientaci pˇri zad´av´an´ı v´ysledk˚u.

Tabulka bude obsahovat jm´eno t´ymu s jeho ˇcleny, t´ymovou kategorii3, body, bonusov´ebody, ˇcas dokonˇcen´ı, startovn´ıˇcas a posledn´ıatribut bude zvolen´yˇcas, do kter´eho by mˇelt´ym(z´avodn´ık) dokonˇcit z´avod. U kaˇzd´e ˇr´adky p˚ujde ruˇcnˇemˇenit hodnoty bod˚u, startovn´ıho ˇcasu, bonusov´ych bod˚u a ˇcasu dokonˇcen´ız´avodu. Kaˇzd´aˇr´adka nav´ıc bude obsahovat tlaˇc´ıtko, kter´e po jeho zm´aˇcknut´ıpˇriˇrad´ıaktu´aln´ıˇcas jako ˇcas dokonˇcen´ıpro pˇr´ısluˇsnou ˇr´adku.

Pro lepˇs´ıpr´aci s pˇriˇrazov´an´ıstartovn´ıho ˇcasu bude pˇrid´ano mod´aln´ıokno, kter´ese zobraz´ıpo zm´aˇcknut´ına tlaˇc´ıtko. V tomto oknˇep˚ujde pˇriˇradit star- tovn´ıˇcas pro vˇsechny t´ymy (z´avodn´ıky), pro dalˇs´ıch deset bez startovn´ıho ˇcasu nebo pro t´ymy s pˇr´ısluˇsnou kategorii. Druh´ymvyskakovac´ım oknem bude formul´aˇrpro nastaven´ıd´elky z´avodu. Casˇ pro d´elku z´avodu se bude zad´avat v minut´ach. Hodnotu pak p˚ujde pˇriˇradit pro vˇsechny t´ymy nebo pro konkr´etn´ıt´ymy s kategori´ı.

Konfigurace z´avodu

Jedn´ase o sekci, kter´abude urˇcena pro vlastn´ıky z´avodu. V t´eto sekci p˚ujde blokovat a povolovat registraci do z´avodu pro pˇrihl´aˇsen´euˇzivatele. D´ale zde bude moˇzn´ezaˇradit z´avod do skupiny vyhodnocen´ych z´avod˚u. V t´eto sekci tak´ebude moˇzno pˇridat a odebrat spr´avce z´avodu. Pˇrid´av´an´ıuˇzivatel˚umezi spr´avce bude prov´adˇeno pˇres unik´atn´ıpˇrihlaˇsovac´ıjm´eno. Posledn´ımoˇznost´ı bude smaz´an´ız´avodu, u kter´eho bude pˇriprov´adˇen´ıt´eto akce potˇreba zadat heslo uˇzivatele.

5.4 N´avrh datab´aze

Pˇri n´avrhu datab´aze jsem vytvoˇril ER diagram (obr´azek 5.2) s dev´ıti tabul- kami, kter´eobsahuj´ıtˇrin´actrelac´ı. Tento n´avrh n´amzaruˇc´ımoˇznost ukl´ad´an´ı veˇsker´ych potˇrebn´ych dat pro potˇreby webov´eaplikace. ER diagram (obr´a- zek 5.2) pouze popisuje relace mezi jednotliv´ymi tabulkami. Podrobnˇejˇs´ı

3v pˇr´ıpadˇedefinov´an´ıt´ymov´ych podkategori´ız´avodu

21 popis tabulek v podobˇeERA digramu je pˇriloˇzenv pˇr´ıloze.

user contestant

race_cooperation contestant_subcategory

race contestant_category

team

team_category

team_subcategory

Obr´azek 5.2: N´avrh datab´aze- ER diagram

Entita user

Tabulka user slouˇz´ıpro registraci uˇzivatele do syst´emu. Tato entita se zd´a ˇc´asteˇcnˇepodobn´atabulce contestant. Zm´ınˇen´aentita oproti tabulce user obsahuje z´aznamy z´avodn´ık˚upro konkr´etn´ız´avody. Entita je v relaci 1:N s tˇremi tabulkami, kter´ymi jsou tabulky contestant, race_cooperation a race.

• id - Atribut typu int(11) slouˇz´ıc´ıjako jednoznaˇcn´aidentifikace regis- trovan´eho uˇzivatele. K vytvoˇren´ıtohoto ˇc´ısla doch´az´ıpodle pˇr´ısluˇsn´e hodnoty (AUTO INCREMENT) automaticky pˇri vkl´ad´an´ız´aznamu do datab´aze.

• login - Tento atribut slouˇz´ıpro pˇrihlaˇsov´an´ıuˇzivatel˚udo webov´eapli- kace, a proto je unik´atn´ı. Atribut m´ad´an typ varchar(32), kter´yome- zuje maxim´aln´ıvelikost loginu na hodnotu 32 znak˚u.

• email - Stejnˇejako u atributu login se jedn´ao unik´atn´ıatribut. Typ toho atributu je varchar(32).

22 • phone - Telefonn´ıˇc´ıslo je jedin´yatribut u tabulky user, kter´ym˚uˇze b´ytm´ıt hodnotu NULL. Typ toho atributu je varchar(13).

• firstname - Atribut pro zad´an´ıkˇrestn´ıho jm´ena uˇzivatele. Typ atributu je varchar(32).

• surname - Jedn´ase o atribut odpov´ıdaj´ıc´ıpˇr´ıjmen´ıuˇzivatele. Typ atri- butu je varchar(32)

• password - Heslo uˇzivatele, kter´eje omezeno velikost´ı256 znak˚u.

Entita race cooperation

Tato entita umoˇzˇnuje pˇridat libovoln´ypoˇcet spr´avc˚uk pˇr´ısluˇsn´emu z´avodu. Hlavn´ım ´uˇcelem t´eto tabulky je pomoc vlastn´ıkovi z´avod˚us registrac´ı´uˇcast- n´ık˚ua pˇr´ıpadn´ym zad´av´an´ım v´ysledk˚ut´ym˚u. Prim´arn´ıkl´ıˇcem byla urˇcena skupina atribut˚uuser id a race id, kde jejich kombinace zaruˇcuje jedineˇc- nost. Tabulka je ve 2 relac´ıch typu N:1 s tabulkami user a race.

• user id - Ciz´ıkl´ıˇc, kter´yodkazuje na prim´arn´ıkl´ıˇctabulky user.

• race id - Jedn´ase tak´eo ciz´ıkl´ıˇcjako u atributu user id, akor´atv tomto pˇr´ıpadˇeodkazuje na prim´arn´ıkl´ıˇctabulky race.

Entita race

Tabulka race obsahuje z´aznamy odpov´ıdaj´ıc´ız´avod˚um. Entita m´a2 vazby typu N:1 s tabulkami team_category a user. Kromˇe2 relac´ıtypnu N:1 m´a tabulka 3 relace typu 1:N s tabulkami race_cooperation, team a contestant.

• id - Atribut id je prim´arn´ıkl´ıˇctabulky typu int(11).

• name - N´azev z´avodu, kter´ym˚uˇzem´ıt maxim´aln´ıvelikost 32 znak˚u.

• team size - Ud´av´az´akladn´ıvelikost t´ymu, kter´aje urˇcena pro registraci t´ym˚udo z´avodu. Tento atribut je typu int(1).

• registration - Jedn´ase o atribut typu boolean. Tento atribut povoluje a zakazuje registraci do z´avodu. V pˇr´ıpadˇehodnoty true je registrace povolena. Pro hodnotu false je zak´az´ana.

23 • evaluation - Atribut typu boolean, kter´yumoˇzˇnuje zaˇradit z´avod do seznamu vyhodnocen´ych z´avod˚u. Hodnota true ho oznaˇc´ıjako vyhod- nocen´ya hodnota false jako nevyhodnocen´y.

• con category id - Ciz´ıkl´ıˇc,kter´yodkazuje na prim´arn´ıkl´ıˇctabulky contestant_category. Tento atribut umoˇzˇnuje pˇriˇradit z´avodu kate- gorii, kter´aumoˇzn´ıpˇri registraci charakterizovat ´uˇcastn´ıky kategori´ı z tabulky contestant_subcategory. Typick´ym pˇr´ıklad lze urˇcit kate- gorii pohlav´ı, kter´abude m´ıt podkategorii muˇza ˇzena.

• team category id - Jako v pˇr´ıpadˇecon category id se jedn´ao ciz´ıkl´ıˇc funguj´ıc´ı na podobn´emprincipu. V tomto pˇr´ıpadˇeje z´avodu pˇriˇra- zena kategorie z tabulky team_category, kter´aumoˇzn´ıcharakterizovat t´ymy podkategoriemi z tabulky team_subcategory.

• user id - Ciz´ıkl´ıˇcodkazuj´ıc´ına prim´arn´ıkl´ıˇctabulky user. Slouˇz´ıpro identifikaci uˇzivatele, kter´yvytvoˇril z´avod.

Entita team category

Tabulka, kter´aumoˇzˇnuje pˇri vytv´aˇren´ız´avodu definovat vlastn´ıpodkatego- rie pro t´ymy nebo pˇriˇradit t´ymu v´ychoz´ıdostupnou kategorii. Tabulka je v relaci 1:N s tabulkou race, coˇzn´amumoˇzn´ıpˇriˇrazen´ıkategorie z´avodu. Entita je v relaci 1:N s tabulkou team_subcategory, kde tato relace z´aznamy z tabulky team_subcategory pˇriˇrazuje ke konkr´etn´ımu z´aznamu z tabulky team_category.

• id - Atribut id je prim´arn´ıkl´ıˇctypu int(11).

• name - N´azev kategorie, kter´ynab´yv´apˇri definov´an´ıvlastn´ıskupiny podkategori´ıhodnoty NULL. Atribut je typu varchar(20).

• default category - Atribut je typu boolean. Hodnota true pro v´ychoz´ı kategorie pro pˇriˇrazen´ık z´avodu. V opaˇcn´empˇr´ıpadˇeje hodnota false.

Entita team subcategory

Tabulka obsahuj´ıc´ıpodkategorie pˇriˇrazen´ekategorii z entity team_category. Relace s touto tabulkou je N:1. D´ale je entita ve vztahu 1:N s tabulkou team, coˇzumoˇzn´ıpˇriˇrazen´ıkonkr´etn´ıpodkategorie pˇr´ısluˇsn´emu t´ymu.

24 • id - Atribut id je prim´arn´ıkl´ıˇctypu int(11).

• name - N´azev podkategorie, kter´yje typu varchar(20).

• category id - Odkazuje na prim´arn´ıkl´ıˇctabulky team_category.

Entita team

Entita team slouˇz´ı pro vytvoˇren´ı t´ymu. Tabulka je vztahu 1:N s entitou contestant, coˇzn´amumoˇzn´ıpˇriˇrazen´ız´avodn´ıka do t´ymu. Tabuobsahuje dalˇs´ıdvˇerelace typu N:1, kter´eslouˇz´ıpro pˇriˇrazen´ıt´ymu k z´avodu a pˇriˇrazen´ı hodnoty t´ymov´epodkategorie.

• id - Atribut id je prim´arn´ıkl´ıˇctypu int(11).

• name - N´azev t´ymu, kter´yje typu varchar(32). Atribut nab´yv´ahodnoty NULL pˇri definovan´evelikosti t´ymu jedna.

• points - Ud´av´apoˇcetbod˚u, kter´yt´ymz´ıskal. Atribut je typu int(11). V´ychoz´ıhodnota je 0.

• bonus - Atribut typu int(11) a ud´av´apoˇcetz´ıskan´ych bonusov´ych bod˚u. V´ychoz´ıhodnota je 0.

• start time - Startovn´ıˇcas t´ymu, kter´yje typu datetime. V´ychoz´ıhod- nota je NULL po vytvoˇren´ıt´ymu.

• finish time - Atribut typu datetime, kter´yud´av´aˇcas dokonˇcen´ız´avodu t´ymu. V´ychoz´ıhodnota je NULL.

• deadline time - Casˇ zadan´yv minut´ach, kter´yud´av´aˇcasov´eomezen´ı z´avodu. Slouˇz´ıpro v´ypoˇcetpenalizace. Atribut je typu int(11).

• team subcat id - Ciz´ı kl´ıˇc,kter´yodkazuje na prim´arn´ı kl´ıˇctabulky team_subcategory. Tento atribut slouˇz´ı pro pˇriˇrazen´ı podkategorie t´ymu. Atribut m˚uˇzem´ıt hodnotu NULL pro pˇr´ıpad, ˇzeby z´avod nemˇel definovanou t´ymovou kategorii.

• race id - Sekund´arn´ıkl´ıˇcodkazuj´ıc´ına entitu race. Pˇriˇrazuje t´ym ke konkr´etn´ımu z´avodu.

25 Entita contestant category

Entita odpov´ıdaj´ıc´ıfunkˇcnosti tabulky team_category. C´ılem t´eto entity je rozˇs´ıˇrit moˇznost informac´ıo z´avodn´ıkovi v podobˇeumoˇznˇen´ıdefinovat kate- gorii pro z´avod obsahuj´ıc´ıpodkategorie. Tabulka je v relaci 1:N s tabulkami race a contestant_subcategory.

• id - Atribut id je prim´arn´ıkl´ıˇctypu int(11).

• name - N´azev kategorie, kter´ynab´yv´apˇri definov´an´ıvlastn´ıch podka- tegori´ıhodnoty NULL. Atribut je typu varchar(20).

• default category - Atribut je typu boolean. Hodnota true pro v´ychoz´ı kategorie k pouˇzit´ı. V opaˇcn´empˇr´ıpadˇeje hodnota false.

Entita contestant subcategory

Tabulka obsahuj´ıc´ı podkategorie z´avodn´ık˚u. Je ve vztahu 1:N s tabulkou contestant a N:1 s tabulkou contestant_category.

• id - Atribut je prim´arn´ıkl´ıˇctypu int(11).

• name - N´azev podkategorie, kter´yje typu varchar(20).

• category id - Odkazuje na prim´arn´ıkl´ıˇctabulky team_category.

Entita contestant

Entita obsahuj´ıc´ız´aznamy o z´avodn´ıc´ıch. Je ve vztahu N:1 s tabulkou user, race, contestant_subcategory a team.

• id - Je prim´arn´ıkl´ıˇctypu int(11).

• firstname - Atribut odpov´ıdaj´ıc´ıjm´enu z´avodn´ıka. Je typu varchar(32).

• lastname - Pˇr´ıjmen´ız´avodn´ıka, kter´eje typu varchar(32).

• email - Email, kter´ym´aomezen´ı32 znak˚u.

26 • phone - Telefonn´ıˇc´ıslo, kter´eje typu varchar(13).

• paid - Atribut typu boolean. Hodnota true kdyˇzz´avodn´ık zaplatil. V opaˇcn´empˇr´ıpadˇehodnota false.

• user id - Ciz´ıkl´ıˇctabulky user. Odpov´ıd´auˇzivateli, kter´yzaregistroval ´uˇcastn´ıka.

• race id - Sekund´arn´ıkl´ıˇcpˇriˇrazuj´ıc´ız´avodn´ıka k z´avodu.

• con subcat id - Ciz´ıkl´ıˇczaˇrazuj´ıc´ız´avodn´ıka do jedn´ez podkategori´ı podle definov´an´ız´avodu. Hodnota NULL v pˇr´ıpadˇe,ˇze z´avod nem´a definovanou kategorii.

• team id - Sekund´arn´ıkl´ıˇczaˇrazuj´ıc´ız´avodn´ıka do t´ymu. Hodnota NULL pro pˇr´ıpad, ˇzese uˇzivatel zaregistroval jako osoba bez t´ymu.

27 6 Implementace

Tato kapitola popisuje implementaci webov´eaplikace. Souˇc´ast´ıimplemen- tace je popis struktury projektu. D´ale jsou souˇc´ast´ıt´eto kapitoly ˇc´asti k´odu a d˚uleˇzit´ealgoritmy pro chod webov´eaplikace.

6.1 Struktura projektu

Struktura projektu byla ovlivnˇena pˇredevˇs´ım pouˇzit´ım architektury MVC. Dalˇs´ım krokem organizace projektu bylo uspoˇr´ad´an´ıdo rozˇs´ıˇriteln´ea pˇre- hledn´estruktury. Pro potˇrebu webov´eaplikace bylo vytvoˇreno 7 komponent (bal´ıˇck˚u) obsahuj´ıc´ıch dohromady 63 tˇr´ıd. D´ale je obsahem projektu sloˇzka nazvan´awebapp, kter´aobsahuje podsloˇzky Public, WEB-INF a www. Adre- s´aˇrPublic d´ale obsahuje sloˇzky css, images a js. Uvnitˇradres´aˇreWEB-INF jsou z´akladn´ı konfiguraˇcn´ı soubory pro webovou aplikaci. D´ale obsahuje sloˇzku tags, ve kter´ejsou definov´any znaˇcky pro importov´an´ıˇsablon, u kte- r´ych doch´az´ık opakuj´ıc´ıse potˇrebˇeu jin´ych ˇsablon. Sloˇzka www se d´ale rozdˇeluje na dalˇs´ıpodadres´aˇre, kter´eobsahuj´ıJSP soubory.

6.1.1 Komponenty

Controller

• AuthenticationController - Pro pˇrihl´aˇsen´ıa odhl´aˇsen´ıdo syst´emu.

• AvailableRacesController - Odpov´ıd´aseznamu dostupn´ych z´avod˚upro registraci z´avodn´ık˚u.

• ContestantController - Pro zobrazen´ıvˇsech z´avodn´ık˚uv z´avodu. Ob- sahuje metody pro zmˇenu ´udaj˚uo z´avodn´ıkovi.

• CreateRaceController - Odpov´ıd´apohledu pro vytvoˇren´ız´avodu a ob- sahuje metody pro zpracov´an´ıtohoto formul´aˇre.

• ErrorController - Obsahuje metodu pro zobrazen´ıHTTP chybov´ych zpr´av.

• EvaluatedRacesController - Slouˇz´ı k zobrazen´ı seznamu vyhodnoce- n´ych z´avod˚u.

28 • HomeController - Obsahuje metodu pro zobrazen´ı´uvodn´ıstr´anky webu.

• MyRacesController - Pro zobrazen´ıseznamu vlastn´ıch z´avod˚uuˇzivatele vˇcetnˇezobrazen´ız´avod˚u, ve kter´ych je uˇzivatel pˇriˇrazen jako spr´avce.

• RaceController - K zobrazen´ıstr´anky pro konfiguraci z´avodu. Obsa- huje metody umoˇzˇnuj´ıc´ızmˇenit nastaven´ı z´avodu a upravit seznam spr´avc˚uz´avodu.

• RaceRegistrationController - Pro registraci z´avodn´ık˚ua t´ym˚udo z´a- vodu.

• RaceResultController - K zobrazen´ıa spr´avˇev´ysledk˚ut´ym˚u. Obsahuje metody pro zad´an´ı startovn´ıho ˇcasu, bod˚u, ˇcasu dokonˇcen´ı z´avodu a nastaven´ıd´elky z´avodu v minut´ach.

• SoloContestantController - Pro vytvoˇren´ı t´ymu ze z´avodn´ık˚u, kteˇr´ı se registrovali samostatnˇebez t´ymu. Obsahuje i metodu pro maz´an´ı tˇechto z´avodn´ık˚u.

• TeamController - Obsahuje metodu pro zobrazen´ıseznamu t´ym˚u. D´ale obsahuje metody pro ´upravu n´azvu t´ymu, t´ymov´ekategorie nebo sma- z´an´ıt´ymu.

• UserController - K zobrazen´ıprofilu uˇzivatele.

• UserRegistrationController - Pro registraci uˇzivatele do syst´emu.

Form

Tato komponenta obsahuje tˇr´ıdy, kter´eslouˇz´ı pro zabalen´ı z´ıskan´ych dat z formul´aˇr˚una serveru. Objekty t´eto tˇr´ıdy m˚uˇzeme nal´eztv parametrech metod pro zpracov´an´ıdat z formul´aˇr˚u. Tyto objekty b´yvaj´ıoznaˇceny anotac´ı @ModelAttibute nebo @RequestBody. Druh´ajmenovan´aanotace se pouˇz´ıv´a v pˇr´ıpadˇe,ˇzejsou data pos´ılan´aod klienta ve formˇeJSONu. Vyuˇzit´ıtˇechto kontejner˚un´amumoˇzn´ıefektivnˇepracovat se z´ıskan´ymi daty. Pˇripouˇzit´ı prvn´ıanotace lze vyuˇz´ıt objektu tˇr´ıdy BindingResult. Tento objekt mus´ıb´yt jako parametr v metodˇeza zmiˇnovanou anotac´ı. D˚uvodem pouˇzit´ıobjektu t´eto tˇr´ıdy je pˇredevˇs´ım metoda hasErrors(), kter´an´am zachyt´ınapˇr´ıklad chybu pˇriˇrazen´ıˇretˇezcedo objektu Integer. V´ypis 6.1 slouˇz´ık pochopen´ı pˇredchoz´ıch vˇet. Jedn´ase o zjednoduˇsenou uk´azku metody pro registraci t´ymu, kter´aje v tˇr´ıdˇe RaceRegistrationController.

29 1 @RequestMapping(value =”/race/ { id }/teamRegistration”, method = RequestMethod.POST) 2 public @ResponseBody String teamRegistration( @ModelAttribute(”teamRegForm”) TeamRegForm teamRegForm, BindingResult bindingResult , @PathVariable(”id”) int race i d ) { 3//zachyti prirazeni retezce objektu Integer 4 if (bindingResult.hasErrors()) { 5//vratit retezec 6 } 7//vratit retezec 8 } V´ypis 6.1: Zjednoduˇsen´auk´azka metody pro registraci t´ymu

Container

Slouˇz´ıstejnˇejako v pˇr´ıpadˇekomponentu Form jako kontejner pro data. Ob- sahem jsou napˇr´ıklad tˇr´ıdy ContestantImportExcel a TeamImportExcel. Tˇechto kontejner˚ubylo vyuˇzito pˇri zpracov´an´ıdat ze souboru ve form´atu XLSX. D´ale lze v t´eto komponentˇenal´ezti tˇr´ıdy, kter´ych bylo vyuˇzito pro odpovˇed’ na poˇzadavek pˇripouˇzit´ıAjaxu.

Comparator

Tato komponenta obsahuje tˇr´ıdu FinalPointsCompare, kter´aimplemen- tuje rozhran´ı Comparator. Uvnitˇrt´eto tˇr´ıdy je metoda pro porov- n´an´ı sk´ore dvou t´ym˚u compare(Team teamOne, TeamTwo), kter´am´an´a- vratovou hodnotu typu int. Metoda vrac´ı hodnotu -1, jestliˇzem´aprvn´ı argument metody vˇetˇs´ı sk´ore neˇzdruh´y. V opaˇcn´em pˇr´ıpadˇevrac´ı hod- notu 1. Kdyˇzse budou porovn´avan´ebody obou t´ymu rovnat, tak vr´acen´a hodnota bude 0. T´eto metody je v programu vyuˇzito pˇriˇrazen´ıspojov´eho seznamu pro v´ypis v´ysledk˚ut´ym˚u. Uvnitˇrt´eto komponenty je tak´etˇr´ıda SupportedRacesCompare. Metoda compare() t´eto tˇr´ıdy je pouˇzita pro se- ˇrazen´ılistu kooperac´ız´avodu sestupnˇepodle ID.

30 Model

Kaˇzd´atˇr´ıda t´eto komponenty odpov´ıd´apr´avˇejedn´etabulce v datab´azi. U tˇr´ıd je vyuˇzito anotace @Table(value = ""), kde parametr value od- pov´ıd´an´azvu entity vytvoˇren´edatab´aze. Tyto tˇr´ıdy maj´ıpromˇenn´e,kter´e jsou oznaˇceny anotac´ı @Column. Hodnota parametru name u t´eto anotace od- pov´ıd´apˇr´ısluˇsn´emu atributu entity datab´aze. Promˇenn´e,kter´enemaj´ıs atri- buty entity nic spoleˇcn´eho jsou oznaˇceny anotac´ı @Transient. T´eto anotace jsem vyuˇzil pro potˇreby vizualizace v´ysledk˚uu tˇr´ıdy Team, kde jsem takto oznaˇcil promˇenn´epro v´ypoˇcetfin´aln´ıch bod˚u, penalizace a ˇcasu dobˇehnut´ı t´ymu.

Pro mapov´an´ırelac´ımezi jednotliv´ymi entitami je u konkr´etn´ıch objekt˚u v tˇechto tˇr´ıd´ach vyuˇzito anotace @JoinColumn (viz v´ypis 6.2). Parametr name t´eto anotace obsahuje n´azev atributu ciz´ıho kl´ıˇceentity, s kterou je entita v relaci. U objektu tˇr´ıdy je kromˇeanotace @JoinColumn vyuˇzito i anotace pro popis vztahu mezi entitami (napˇr´ıklad @ManyToOne). Tˇr´ıd t´eto komponenty je vyuˇzito pˇripr´acis n´astrojem Hibernate pro ukl´ad´an´ı, upravov´an´ı, vyb´ır´an´ı a maz´an´ız´aznam˚uz datab´aze. Tˇr´ıdy t´eto komponenty obsahuj´ımetody pro z´ısk´an´ıa nastaven´ıhodnot (instanc´ıobjekt˚u).

1 @Entity 2 @Table(name =”team”)//entita team 3 public class Team implements Serializable { 4 5 @Column(name =”name”) 6 private String name;//nazev tymu 7 8 @Transient 9 private String resultTime;//neni soucasti databaze 10 11 @ManyToOne 12 @JoinColumn (name =”race i d”)//propojenis tridou Race 13 private Race race; 14 15//Trida obsahuje metody pro nastavenia ziskani hodnot(instanci) 16 } V´ypis 6.2: Zjednoduˇsen´auk´azka tˇr´ıdy Team

31 Service a DAO

DAO obsahuje tˇr´ıdy, kde jedna tˇr´ıda z t´eto komponenty odpov´ıd´apr´avˇe jedn´etˇr´ıdˇez komponenty Model. Pro potˇreby pr´ace s tˇr´ıdami t´eto kompo- nenty bylo vyuˇzito rozhran´ıch frameworku Hibernate ORM, kter´ymi jsou SessionFactory, Criteria, Query a Session. Tyto rozhran´ın´amumoˇzn´ı pˇrid´avat, upravovat, mazat a vyb´ırat data z datab´aze. Funkˇcnost tˇech ope- rac´ızajiˇst’uje anotace u tˇr´ıd komponenty Model, kter´apopisuje, jak´ymzp˚u- sobem se maj´ıdata objektu transformovat do datab´aze. Jednotliv´emetody tˇr´ıd komponenty Dao se liˇs´ıpodle potˇreby webov´eaplikace.

Service slouˇz´ıjako vrstva, pˇres kterou se pˇristupuje k jednotliv´ymtˇr´ıd´am z DAO. Komponenta obsahuje tˇr´ıdy, kter´emaj´ımetody oznaˇcen´eanotac´ı @Transactional. Tato anotace umoˇzˇnuje pˇr´ıstup k datab´azi pˇres tyto me- tody oznaˇcit jako transakci (viz v´ypis 6.3). Parametry t´eto anotace lze urˇcit, jestli se jedn´ao transakci, kter´aje urˇcena pro ˇcten´ınebo pro z´apis. Pouˇzit´ı t´eto anotace n´am umoˇzn´ıv pˇr´ıpadˇechyby vyvolat navr´acen´ıprov´adˇen´ych zmˇenv datab´azi zpˇetdo p˚uvodn´ıho stavu pˇred zah´ajen´ım transakce. Bez pouˇzit´ıt´eto anotace by jsme museli ruˇcnˇenapsat pˇr´ıkazy pro zaˇc´atek trans- akce, potvrzen´ıtransakce nebo navr´acen´ızmˇeny zpˇetpˇri odchycen´ıvznikl´e chyby [21].

1 @Service 2 public class RaceService { 3 @Autowired 4 RaceDAO raceDAO ; 5 6 @Transactional 7 public void save(Race race) {raceDAO. save(race); } 8 } 9 @Repository 10 public class RaceDAO { 11 @Autowired 12 SessionFactory sessionFactory; 13 14 public void save(Race race) { 15 sessionFactory.getCurrentSession().save(race); 16 } 17 } V´ypis 6.3: Uk´azka uloˇzen´ız´avodu do datab´aze

32 6.1.2 Obsah sloˇzkywebapp

Sloˇzka Public

Tato sloˇzka d´ale obsahuje podsloˇzky css, images a js.

• Sloˇzka css - Obsahuje soubor style.css, ve kter´em jsou mnou napsan´e vlastn´ıkask´adov´estyly.

• Sloˇzka images - Obsahuje dva obr´azky background home.png a logo.png, kter´ejsou vyuˇzity v aplikaci. Prvn´ıjmenovan´yobr´azek je zobrazen na ´uvodn´ıstr´ance webu. Druh´yje obsahem hlaviˇcky webu slouˇz´ıc´ıjako logo str´anky.

• Sloˇzka js - Uvnitˇrsloˇzky je deset JavaScriptov´ych soubor˚uobsahuj´ıc´ı funkce vyuˇzit´eu jednotliv´ych pohled˚ustr´anek pro pˇrid´av´an´ıa odeb´ı- r´an´ıelement˚u, editaci textov´ych pol´ı, editaci funkc´ıu tlaˇc´ıtek nebo pro modifikaci mod´aln´ıch oken. D´ale obsahuje funkce pro pˇrenos dat s vy- uˇzit´ım technologie Ajax, kter´ejsem nejv´ıce vyuˇzil pˇri spr´avˇev´ysledk˚u z´avodu, kde bylo zapotˇreb´ıpos´ılat poˇzadavky na server, zpracovat je a vracet odpovˇedi bez obnoven´ıstr´anky.

Sloˇzka WEB-INF

Obsahem t´eto sloˇzky je z´akladn´ıkonfiguraˇcn´ısoubor webov´eaplikace, sou- bor pro inicializaci kontextu servletu a sloˇzka tags. Obsahem sloˇzky tags jsou definovan´ez´akladn´ıˇsablony, u kter´ych doch´az´ık vyuˇzit´ıv ostatn´ıch ˇsablon´ach.

Pro potˇreby popisu konfiguraˇcn´ıho souboru je potˇreba definovat Java Servlet. Tento pojem ˇr´ık´a, ˇze se jedn´ao tˇr´ıdu, kter´arozˇsiˇruje schopnosti ser- veru a reaguje na pˇr´ıchoz´ıpoˇzadavky. Servlet je d´ale naz´yv´an jako program, kter´ybˇeˇz´ına serveru, aby tvoˇril dynamickou webovou str´anku [22].

• web.xml - Jedn´ase o z´akladn´ıkonfiguraˇcn´ısoubor webov´eaplikace, kter´ydefinuje, jak´eservlety budou zavedeny do servlet kontejneru ser- veru a jak´emapovac´ıvzory k tˇemto servlet˚um odpov´ıdaj´ı. Pro potˇrebu m´ewebov´eaplikace jsem pouˇzil v´ychoz´ı servlet frameworku Spring MVC org.springframework.web.servlet.DispatcherServlet, pro

33 kter´ybyl pouˇzit vzor mapov´an´ılom´ıtko. D´ale tento soubor obsahuje odkaz na inicializaˇcn´ı kontext servletu (mvc-dispatcher-servlet.xml), nastaven´ık´odov´an´ıUTF-8 pro webovou aplikaci a definovan´ıpˇresmˇe- rov´an´ına chybov´ehl´aˇsky odpov´ıdaj´ıc´ınevhodn´emu poˇzadavku klienta na server a dalˇs´ıpotˇrebn´anastaven´ı.

• mvc-dispatcher-servlet.xml - Souˇc´ast´ıtoho souboru jsou veˇsker´epo- tˇrebn´ekonfigurace pro framework Spring MVC. D´ale tento soubor de- finuje pˇr´ıstupov´ecesty v podobˇeURL k metod´am Controller˚u, kde je vyuˇzito dvou parametr˚u acess a method. Prvn´ıjmenovan´yparametr umoˇzˇnuje napˇr´ıklad definovat pˇr´ıstup k metodˇetypu bez moˇznosti pˇr´ı- stupu, pro pˇrihl´aˇsen´euˇzivatele do syst´emu, pˇr´ıstup pro vˇsechny nebo pro konkr´etn´ıuˇzivatele s pˇridˇelenou rol´ı. Druh´yparametr pak umoˇz- ˇnuje definovat, jestli maj´ıb´yt pˇrijat´adata souˇc´ast´ıURL nebo uvnitˇr HTTP poˇzadavku. D´ale tento soubor obsahuje objekty pro datab´azi, Hibernate, Spring Security a dalˇs´ıpotˇrebn´anastaven´ı.

• Sloˇzka tags - Obsahuje ˇsablonu template.tag a race menu.tag, kter´e jsou definov´any jako vlastn´ıznaˇcky. Tyto znaˇcky jsou vyuˇzit´ev ostat- n´ıch JSP souborech. Prvn´ıjmenovan´aˇsablona je importov´ana do vˇsech ostatn´ıch. Import t´eto ˇsablony do ostatn´ıch n´am umoˇzn´ım´ıt hlaviˇcku a z´akladn´ımenu ve vˇsech JSP souborech (viz v´ypis 6.4). Druh´ajme- novan´aˇsablona obsahuje menu z´avodu, kter´eje vyuˇzito u pohled˚u t´ykaj´ıc´ıch se z´avodu.

1 <%@taglib prefix=”t” tagdir=”/WEB−INF/tags”% > 2 3 4//Sem se vklada obsah sablony, ktery bude obalen zakladni sablonou 5 6 V´ypis 6.4: Vloˇzen´ıtemplate.tag do ostatn´ıch ˇsablon

Sloˇzka www

Tato sloˇzka obsahuje podsloˇzky, kter´eseskupuj´ıjednotliv´eJSP soubory podle jejich vyuˇzit´ı.

34 • Sloˇzka error - Obsahuje chybov´eˇsablony.

• Sloˇzka others - Tato sloˇzka zahrnuje ˇsablonu, kter´aje pouˇzita pro ´uvodn´ıstr´anku aplikace. D´ale se uvnitˇrnal´ezaj´ıJSP soubory, kter´e slouˇz´ık zobrazen´ıseznamu vyhodnocen´ych z´avod˚ua dostupn´ych z´a- vod˚upro registraci.

• Sloˇzka race - Obsahuje pohledy t´ykaj´ıc´ıse z´avodu. Tˇemito pohledy jsou napˇr´ıklad zobrazen´ıinformac´ıo z´avodu, v´ysledky z´avodu, registrace z´avodn´ık˚ua dalˇs´ı.

• Sloˇzka user - Uvnitˇrjsou ˇsablony pro pˇrihl´aˇsen´ı, registraci, uˇzivatelskou str´anku, zobrazen´ıseznamu z´avod˚uuˇzivatele a ˇsablona pro odepˇren´ı pˇr´ıstupu.

6.2 Uk´azky implementace

Tato sekce obsahuje uk´azky k´od˚ua popisy algoritm˚u, kter´ych jsem vyuˇzil pˇriprogramov´an´ıwebov´eaplikace.

V´ypoˇcetbod˚ut´ymu

Pro v´ypoˇcetfin´aln´ıch bod˚uslouˇz´ıpˇr´ıkaz (viz v´ypis 6.5), kter´yje uvnitˇrtˇr´ıdy RaceResultController v metodˇe countFinalPoints(). Tato metoda m´a jako parametr spojov´yseznam objekt˚utˇr´ıdy Team. Pˇr´ıkaz seˇcte body t´ymu s bonusov´ymi a odeˇcte od nich penalizaci, kter´ase vypoˇc´ıt´auvnitˇrme- tody countPenalizationPoints(). Tato metoda pˇr´ım´ajako parametr ob- jekt tˇr´ıdy Team. V t´eto metodˇeje vyuˇzito tˇr´ıdy Duration a DateTime, kter´e patˇr´ıdo knihovny Joda-Time. Pˇri vytv´aˇren´ıinstance tˇr´ıdy Duration jako prvn´ıparametr je zaˇc´atek z´avodu (instance tˇr´ıdy DateTime), kter´ypˇriˇc´ıt´a pomoc´ımetody z t´eto tˇr´ıdy ˇcas pro dokonˇcen´ız´avodu v minut´ach. Druh´ym parametrem je datum a ˇcas (instance tˇr´ıdy DateTime) dokonˇcen´ı z´avodu t´ymem. U tˇr´ıdy Duration je d´ale vyuˇzito metody getStandardMinutes(), kter´avypoˇc´ıt´ao kolik minut t´ym pˇres´ahl urˇcen´yˇcas pro z´avod. Kaˇzd´ami- nuta nav´ıc odpov´ıd´ajednomu bodu penalizace. Souˇc´ast´ıt´eto metody je pro- veden v´ypoˇcetpro zjiˇstˇen´ı zapoˇcat´eminuty, kter´ypro zapoˇcatou minutu pˇriˇcte jedniˇcku k penalizaˇcn´ım bod˚um. Tato metoda vrac´ıˇc´ıslo 0 v pˇr´ıpadˇe,

35 ˇzet´ym dokonˇcil z´avod v definovan´em rozmez´ınebo ˇc´ıslo vˇetˇs´ıneˇznula, kter´e bude odpov´ıdat bod˚um penalizace.

1 penalization = countPenalizationPoints(team); 2 int finalPoints = team.getPoints() + team.getBonus() − penalization; V´ypis 6.5: V´ypoˇcet fin´aln´ıch bod˚ut´ymu

Ovˇeˇren´ızadan´ehodata a ˇcasu

Pˇri zad´av´an´ıstartu t´ymu a ˇcasu dokonˇcen´ıjsou tyto dvˇehodnoty zad´av´any ve form´atu yyyy-MM-dd HH:mm:ss. U tohoto form´atu se m˚uˇze st´at, ˇzese ˇclovˇekjednoduˇsesplete, a proto je potˇreba tento form´at ovˇeˇrit. Pro ovˇe- ˇren´ızadan´eho data a ˇcasu jsem vyuˇzil tˇr´ıdy DateTimeFormat (viz v´ypis 6.6) a DateTimeFormatter, kter´ejsou obsahem knihovny Joda-Time. Prvn´ıjme- novan´atˇr´ıda m´astatickou metodu forPattern(), kter´apˇr´ım´ajako parametr ˇretˇezec, ve kter´em jsem definoval poˇzadovan´yform´atdata. N´avratov´ahod- nota t´eto statick´emetody pˇriˇrad´ıinstanci objektu tˇr´ıdy DateTimeFormatter. Tato tˇr´ıda obsahuje metodu parseDateTime(), kter´az pˇrijat´eho ˇretˇezce vy- tvoˇr´ınovou instanci objektu tˇr´ıdy DateTime, kter´aje tak´esouˇc´asti Joda- Time knihovny. Vˇsechny tyto pˇr´ıkazy jsou v try-catch bloku pro zachycen´ı nevhodn´eho form´atu data.

1 DateTime newDate; 2 DateTimeFormatter format = DateTimeFormat. 3 forPattern(”yyyy −MM−dd HH:mm:ss”); 4 try { 5 newDate = format.parseDateTime(datetimeTeamForm. getDateTime()) ; 6 } catch (Exception e) { 7 return”wrong format”; 8 } V´ypis 6.6: Ovˇeˇren´ızadan´eho data

36 7 Testov´an´ı

Tato kapitola popisuje testov´an´ıaplikace na simulaci imagin´arn´ıho z´avodu, z´atˇeˇzov´ytest, zkouˇsku kompatibility webov´ych prohl´ıˇzeˇc˚ua Selenium testy.

7.1 Simulace z´avodu

Testov´an´ıwebov´eaplikace probˇehlo na simulaci imagin´arn´ıho z´avodu. C´ı- lem tohoto testov´an´ıbyla snaha pokusit se naj´ıt moˇzn´enedostatky aplikace a odhalit, jestli je aplikace pouˇziteln´apro re´alnou situaci. Na tomto testov´an´ı se pod´ılel vedouc´ıbakal´aˇrsk´epr´ace Ing. Tom´aˇsHercig, kter´ym´azkuˇsenosti s poˇr´ad´an´ım z´avod˚uv orientaˇcn´ım bˇehu.

Webov´aaplikace byla otestov´ana ruˇcn´ım zad´av´an´ım ´udaj˚upˇres formul´aˇre pro registraci t´ym˚u. Pˇres tyto formul´aˇre bylo pˇrid´ano 71 t´ym˚u, kde kaˇzd´y t´ym obsahoval pr´avˇedva z´avodn´ıky. Souˇc´ast´ıtoho testov´an´ıbylo mˇeˇren´ıˇcasu trv´an´ıjednotliv´ych akc´ı. Registrace vˇsech t´ym˚upˇres registraˇcn´ıformul´aˇre trvala jednu hodinu. Zad´av´an´ıv´ysledk˚uvˇsech t´ym˚uzabralo hodinu a p˚ul. Z toho testov´an´ıvznikl seznam poˇzadavk˚u, kter´eby bylo vhodn´ev aplikaci zmˇenit nebo doplnit.

Seznam poˇzadavk˚uplynouc´ız testov´an´ı:

• V´ychoz´ı kategorie - Umoˇznˇen´ı nastavit v konfiguraci z´avodu, kter´a kategorie bude pˇri registraci vybr´ana jako v´ychoz´ı.

• Seznam t´ymu - Tento seznam neobsahuje ˇz´adn´evyhled´av´an´ı. V Mozilla Firefox tato funkcionalita tak´enen´ık dispozici, protoˇze tento prohl´ıˇzeˇc neumoˇzˇnuje vyhled´avat v zablokovan´ych textov´ych pol´ıch.

• Mod´aln´ıokna - Pˇri´uspˇeˇsn´eeditaci t´ymu nebo z´avodn´ıka vyskoˇc´ımo- d´aln´ıokno, kter´einformuje o proveden´ıakce. Neust´ale zav´ır´an´ıtohoto ozn´amen´ıje nepˇr´ıjemn´e.

• Spr´ava v´ysledk˚u- Bylo by dobr´e,aby si aplikace zapamatovala vybran´e filtry pro zad´av´an´ıv´ysledk˚u. Po obnoven´ıwebov´estr´anky zadavatel v´ysledk˚uo tyto filtry pˇrijde.

• Startovn´ıˇcas - Bylo by dobr´em´ıt moˇznost uloˇzit startovn´ıˇcas v tex- tov´empoli, aby si ho aplikace pamatovala i po obnoven´ıstr´anky.

37 • Zad´av´an´ı v´ysledk˚uv´ıce lidmi - Pˇri zad´av´an´ı v´ysledk˚uv´ıce lidmi se neprom´ıtaj´ızmˇeny v seznamu ostatn´ıch zadavatel˚u. To znamen´a,ˇze kaˇzd´yzadavatel m´asv˚uj jedineˇcn´yseznam, ve kter´emdo doby neˇz obnov´ıstr´anku vid´ıjen vlastn´ızmˇeny. Pˇri t´eto situaci hroz´ı, ˇzedojde k pˇreps´an´ıhodnot jin´eho zadavatele.

• Export v´ysledk˚u- Pro exportov´an´ıv´ysledk˚unen´ık dispozici filtrov´an´ı podle kategori´ı. Jedin´yzp˚usobem, kter´ym lze filtrovat ˇr´adky s kate- goriemi je pˇres vˇsechny sloupce. Tento zp˚usob nen´ıvhodn´y, protoˇze m˚uˇzedoj´ıt k zobrazen´ıneodpov´ıdaj´ıc´ıch ˇr´adk˚u.

• Zad´av´an´ı hodnot - Po zobrazen´ı mod´aln´ıho okna pro zad´av´an´ı v´y- sledk˚use mus´ıkliknout do textov´eho pole. Toto klik´an´ıdo textov´ych pol´ıch zdrˇzuje. Zad´av´an´ıbod˚utak´enepodporuje z´aporn´ehodnoty.

• Stejn´ebody t´ym˚u- Pˇri stejn´ych fin´aln´ıch bodech v´ıce t´ym˚unen´ızo- hlednˇenlepˇs´ıˇcas dokonˇcen´ız´avodu.

Z v´yˇseuveden´eho seznamu jsem se rozhodl nˇekter´ebody v programu do- dˇelat (upravit). Pˇri zobrazen´ımod´aln´ıho okna, kter´eoznamuje zmˇenu ´udaj˚u t´ymu nebo z´avodn´ıka se toto okno po uplynut´ıkr´atk´eho ˇcasov´eokamˇziku samo zavˇre. Pro moˇznost lepˇs´ıho filtrov´an´ıa umoˇznˇen´ıexportu dat podle kategori´ıjsem pˇridal seznam, kter´yvyfiltruje hodnoty tabulky podle zvolen´e pˇr´ısluˇsn´ekategorie. Pˇri otev´ır´an´ıjednotliv´ych mod´aln´ıch oken pro efektiv- nˇejˇs´ızad´av´an´ıv´ysledk˚upˇreskoˇc´ıkurzor do textov´eho pole a umoˇzn´ın´am hned ps´at. Upravil jsem tak´efunkci pro v´ypoˇcet v´ysledk˚u, kter´apˇri stejn´em poˇctu bod˚uupˇrednostn´ıt´ym, kter´ydokonˇcil z´avod rychleji. U zad´av´an´ıv´y- sledk˚ujsem d´ale umoˇznil zad´avat z´aporn´ehodnoty. Seznam t´ym˚ujsem zmˇe- nil do struktury tabulky, kter´aumoˇzˇnuje lepˇs´ızobrazen´ıdat a z´aroveˇnˇreˇs´ı probl´ems vyhled´av´an´ım ´udaj˚uv prohl´ıˇzeˇciMozilla Firefox.

Nejd˚uleˇzitˇejˇs´ım bodem v´yˇseuveden´eho seznamu je umoˇznˇen´ızad´av´an´ı v´ysledk˚uv´ıce lidmi najednou a prom´ıt´an´ı zmˇenmezi ostatn´ı zadavatele. Tento probl´emjsem vyˇreˇsil pos´ıl´an´ım ˇz´adosti o data tabulky s vyuˇzit´ım technologie Ajax. Pro kontrolu shody novˇez´ıskan´ych dat jsem napsal Ja- vaScriptov´yk´ods vyuˇzit´ım knihovny jQuery, kter´yv tabulce ´udaje aktua- lizuje, pˇrid´anov´ea smaˇzeneexistuj´ı. Interval pos´ıl´an´ıˇz´adosti o nov´adata jsem nastavil na kaˇzd´ych 5 sekund. Toto ˇreˇs´ın´am zaruˇc´ıaktu´alnost ´udaj˚u v tabulce. Pro zamezen´ı pˇr´ıpadn´ekolize pˇri zad´av´an´ı v´ysledk˚use s novˇe zad´avan´ymi daty pos´ılaj´ıi p˚uvodn´ı, kter´ese kontroluj´ıs hodnotami v data- b´azi.

38 Simulace z´avodu na fiktivn´ıch datech uk´azala, ˇzeje aplikace schopn´a zvl´adat z´avod obsahuj´ıc´ı140 z´avodn´ık˚u. Z toho testov´an´ıtak´evyplynulo, ˇzewebov´aaplikace obsahuje vˇsechny z´akladn´ıpotˇrebn´efunkcionality pro spr´avu z´avodu. Na nesplnˇen´epoˇzadavky lze nahl´ıˇzet jako na moˇzn´ebudouc´ı rozˇs´ıˇren´ıaplikace. Nebylo dodˇel´ano ukl´ad´an´ıfiltru pˇri spr´avˇev´ysledk˚u, ukl´a- d´an´ıglob´aln´ıho startovn´ıho ˇcasu a v´ybˇer v´ychoz´ıkategorie t´ym˚u(z´avodn´ık˚u) pro zobrazen´ıpˇri registraci t´ym˚u(z´avodn´ık˚u).

7.2 Z´atˇeˇzov´ytest

Pˇri z´atˇeˇzov´emtestu byla aplikace postupnˇetestov´ana na vˇetˇs´ım mnoˇzstv´ı dat do doby neˇzse uk´azala jako nepouˇzitelnou pro spr´avu z´avodu. Pro po- tˇreby testov´an´ıbyl vytvoˇren z´avod, kter´yumoˇzˇnoval registrovat do t´ymu dva z´avodn´ıky a pˇriˇradit kategorii z´avodn´ıkovi i t´ymu. Aplikace byla testov´ana postupn´ym pˇrid´av´an´ım t´ym˚u, kter´ebyly importov´any do aplikace z Excelu.

Z´ıskan´etestovac´ıhodnoty:

• 100 t´ym˚u- Aplikace fungovala bez probl´em˚u. Seznam t´ym˚unaˇc´ıtal 403 ms, seznam z´avodn´ık˚u669 ms a zobrazen´ıv´ysledk˚u544 ms.

• 200 t´ym˚u- Webov´aaplikace st´ale nevykazovala ˇz´adn´ezn´amky pro- bl´emu. Seznam t´ym˚unaˇc´ıtal 448 ms, seznam z´avodn´ık˚u1,19 sekundy a zobrazen´ıv´ysledk˚u611 ms.

• 300 t´ym˚u- Pˇrid´an´ısto t´ym˚unevykazovalo zmˇenu chov´an´ıaplikace. Se- znam t´ym˚unaˇc´ıtal 580 ms, seznam z´avodn´ık˚u1,6 sekundy a zobrazen´ı v´ysledk˚u704 ms.

• 400 t´ym˚u- Pˇri tomto poˇctu byl seznam t´ym˚ui zobrazen´ıv´ysledk˚u v poˇr´adku. Avˇsak tabulka z´avodn´ık˚uuˇzse zaˇc´ınala lehce sekat. Se- znam t´ym˚unaˇc´ıtal 693 ms, seznam z´avodn´ık˚u2,2 sekundy a zobrazen´ı v´ysledk˚u765 ms.

• 500 t´ym˚u- Seznam t´ym˚uuˇzzaˇcal vykazovat zn´amky sek´an´ı se pˇri zmˇenˇekategorie. Stav tabulky z´avodn´ık˚use zase o nˇecozhorˇsil. Se- znam t´ym˚unaˇc´ıtal 808 ms, seznam z´avodn´ık˚u3,2 sekundy a zobrazen´ı v´ysledk˚u798 ms.

39 • 600 t´ym˚u- Pˇri tomto poˇctu uˇzse tabulka t´ym˚ui z´avodn´ık˚uh˚uˇre ovl´adala, protoˇze doch´azelo k sek´an´ı. Seznam t´ym˚unaˇc´ıtal 872 ms, seznam z´avodn´ık˚u4 sekundy a zobrazen´ıv´ysledk˚u900 ms.

• 700 t´ym˚u- Stav tabulky t´ym˚ui z´avodn´ık˚use znaˇcnˇezhorˇsil. Seznam t´ym˚unaˇc´ıtal 1 s, seznam z´avodn´ık˚u4,92 sekundy a zobrazen´ıv´ysledk˚u 1,12 s.

• 1000 t´ym˚u- Seznam t´ym˚ui z´avodn´ık˚uuˇzd´avno uk´azal pˇripˇredcho- z´ıch hodnot´ach, ˇzepˇri vˇetˇs´ım mnoˇzstv´ıt´ym˚unen´ıpˇr´ıliˇspouˇziteln´y. Avˇsak zobrazen´ıv´ysledk˚upˇritomto poˇct˚ut´ym˚uvykazovalo minim´aln´ı zn´amky sek´an´ıse. Seznam t´ym˚unaˇc´ıtal 1,58 s, seznam z´avodn´ık˚u8,32 sekundy a zobrazen´ıv´ysledk˚u1,39 s. V tomto m´ıstˇejsem ukonˇcil z´a- tˇeˇzov´ytest aplikace.

Test byl proveden na notebooku, kde jeho souˇc´ast´ıbyl i server s webo- vou aplikac´ı. Tento notebook mˇel2 j´adrov´yprocesor i7-5500U s frekvenc´ı 2.4 GHz a 8GB operaˇcn´ıpamˇeti. Tento test n´am uk´azal, ˇzewebov´aaplikace je v poˇr´adku pouˇziteln´apro 300 t´ym˚uo velikosti dvou z´avodn´ık˚u. Jako strop pro pouˇzit´ıt´eto aplikace bych zvolil 400 t´ym˚u. Pˇri tomto poˇctu byla aplikace st´ale plnˇefunkˇcn´ı. Akor´at u seznamu z´avodn´ık˚use zaˇcaly projevovat menˇs´ı probl´emy, kter´ebyly st´ale pˇrijateln´epro chod aplikace.

7.3 Kompatibilita prohl´ıˇzeˇc˚u

Funkcionality webov´eaplikace byly vyzkouˇseny na pˇeti z´akladn´ıch nejpou- ˇz´ıvanˇejˇs´ıch prohl´ıˇzeˇc´ıch, kter´ymi jsou Google Chrome, Mozilla Firefox, In- ternet Explorer, Microsoft Edge a Opera. Pˇrizkouˇsceprohl´ıˇzeˇc˚unebyla na- lezen´aˇz´adn´achyba aˇzna jednu malou pˇri vyhled´av´an´ı u Firefoxu v za- blokovan´ych textov´ych pol´ıch. Tento probl´embyl opraven. Sc´en´aˇrzkouˇsky kompatibility prohl´ıˇzeˇc˚ubyl n´asleduj´ıc´ı:

• Registrace uˇzivatel˚u

• Vytvoˇren´ıdvou z´avod˚us rozd´ılnou velikost´ıt´ym˚u

• Registrace t´ym˚u(z´avodn´ık˚u) pˇres vˇsechny typy formul´aˇr˚u

• Editace z´aznam˚ut´ym˚u(z´avodn´ık˚u) vˇcetnˇeexportu a maz´an´ıdat

40 • Spr´ava v´ysledk˚u(Zad´an´ıhodnot, ˇrazen´ı, filtrov´an´ı, export z´aznam˚u)

• Pˇrid´an´ıspr´avce do z´avodu a testov´an´ız jeho pohledu

• Proch´azen´ız´aznam˚uz pohledu nepˇrihl´aˇsen´eho a pˇrihl´aˇsen´eho uˇzivatele

Verze zkouˇsen´ych prohl´ıˇzeˇc˚u:

• Google Chrome 57.0.2987.133

• Mozilla Firefox 47.0.2

• Internet Explorer 11.1066.14393.0

• Microsoft Edge 38.14393.1066.0

• Opera 43.0.2442.1144

7.4 Selenium testy

Webov´aaplikace byla otestov´ana v prohl´ıˇzeˇciMozilla Firefox pouˇzit´ım plu- ginu Selenium IDE (verze 2.9.1). Pˇres tento doplnˇekbylo vytvoˇreno 15 test˚u, pˇrijejichˇzpsan´ıbylo db´ano na to, aby bylo pokryto co nejv´ıce moˇzn´ych vari- ant vstup˚uu formul´aˇr˚u. Vzhledem k tomu, ˇzeje vˇetˇsina formul´aˇr˚uvytv´aˇrena dynamicky, tak bylo dosti obt´ıˇzn´evyzkouˇsetvˇsechny varianty. Z tohoto d˚u- vodu jsem se soustˇredil pˇredevˇs´ım na formul´aˇre, kter´eˇslo testovat v cyklu bez nutnosti pˇreps´an´ıparametr˚utestu.

Na obr´azku 7.1 je uk´azka Selenium testu pro registraci uˇzivatele. V tomto testu bylo pomoc´ıJavaScriptu generov´ano uˇzivatelsk´ejm´eno, pˇr´ıjmen´ı, kˇrest- n´ıjm´eno, telefonn´ıˇc´ıslo a email. U tohoto testu jsem se pˇredevˇs´ım soustˇredil na v´ypis chybov´ych hl´aˇsek pro uˇzexistuj´ıc´ıpˇrihlaˇsovac´ıjm´eno a email. Do JavaScriptu pro generov´an´ıhodnot byla vloˇzena podm´ınka, kter´aovˇeˇruje, jestli je n´ahodnˇevygenerovan´eˇc´ıslo v rozmez´ı 0-3 rovno nule. Jestliˇzeje rovno nule, tak do formul´aˇre bude vloˇzenpr´azdn´yˇretˇezec. U tohoto formu- l´aˇre mus´ıb´ytkaˇzd´yatribut vyplnˇenaˇzna telefonn´ıˇc´ıslo. Pro nevyplnˇen´e poˇzadovan´eatributy je oˇcek´av´ano chybov´eozn´amen´ı. U tohoto testu jsem se nesoustˇredil na d´elku zadan´ych hodnot a ani na shodu hesel uˇzivatele. Testov´an´ıtˇechto pˇr´ıpad˚uprobˇehlo v dalˇs´ıch dvou testech, kter´eu tohoto formul´aˇre byly provedeny.

41 Obr´azek 7.1: Selenium test - registrace uˇzivatele

42 8 Z´avˇer

V r´amci bakal´aˇrsk´epr´ace byla vytvoˇrena webov´eaplikace pro poˇr´ad´an´ız´a- vod˚uv orientaˇcn´ım bˇehu, kter´aumoˇzn´ı registrovat uˇzivatele do syst´emu, vytv´aˇret z´avody vˇcetnˇejejich spr´avy a registrace t´ym˚u(z´avodn´ık˚u) do z´a- vodu spr´avci i bˇeˇzn´ymi uˇzivateli. Dalˇs´ı´ukolem bylo umoˇznˇen´ıspravovat se- znam t´ym˚u(z´avodn´ık˚u) vˇcetnˇe´upravy i maz´an´ı´udaj˚u. Seznam z´avodn´ık˚u mˇelnav´ıc umoˇzˇnovat import i export t´ym˚uve form´atu XLSX. Posledn´ım ´ukolem bylo zobrazen´ıv´ysledk˚uvˇcetnˇejejich spr´avy umoˇzˇnuj´ıc´ıvyhled´avat v tˇechto datech, ˇradit jednotliv´esloupce sestupnˇei vzestupnˇe, filtrovat podle kategori´ıa exportovat data ve form´atu XLSX a CSV.

V prvn´ıˇc´asti pr´ace byla provedena reˇserˇse webov´ych framework˚uv jazyce Java, jej´ıˇzsouˇc´ast´ıbylo i vybr´an´ıjednoho z nich pro implementaci. Nakonec byl vybr´anSpring. Tomuto frameworku byla vˇenov´ana samostatn´akapitola, ve kter´ebyly pops´any d˚uvody v´ybˇeru Springu, jeho dostupn´emoduly a kr´atk´ypopis historie.

Pˇri n´avrhu aplikace byly pops´any poˇzadavky na aplikaci, kter´ebyly roz- dˇeleny pro potˇrebu aplikace na funkˇcn´ıa mimofunkˇcn´ı. Souˇc´ast´ıt´eto ˇc´asti byl vytvoˇren ERA diagram vˇcetnˇepopisu atribut˚ua relac´ıvˇsech tabulek. Pro potˇreby aplikace byli rozdˇeleni uˇzivatel´edo tˇr´ıd. Jednotliv´efunkcionality webu pak byly v n´avrhu pops´any z pohledu pˇr´ıstupu tˇechto tˇr´ıd uˇzivatel˚u.

V implementaci byla pops´ana struktura projektu. Tento popis byl pˇrede- vˇs´ım soustˇredˇenna komponent Controller, u kter´eho byly pops´any k ˇcemu slouˇz´ıjednotliv´etˇr´ıdy. Dalˇs´ıkomponenty uˇzbyly pops´any obecnˇeji. Souˇc´ast´ı implementace byly tak´epops´any konfiguraˇcn´ısoubory, rozdˇelen´ıˇsablon do sloˇzek podle vyuˇzit´ıa dalˇs´ıadres´aˇre obsahuj´ıc´ıkask´adov´estyly, JavaScrip- tov´esoubory nebo obr´azky.

Aplikace byla otestov´ana na simulaˇcn´ım z´avodu. Vˇetˇsina poˇzadavk˚una vylepˇsen´ız toho testov´an´ıbyla dodˇel´ana. Z´atˇeˇzov´ytest uk´azal, ˇzeje aplikace schopn´azvl´adnout v poˇr´adku aˇz300 t´ym˚upˇri definov´an´ıpoˇctu ˇclen˚uv t´ymu dva. Souˇc´ast´ıtestov´an´ıbyla i zkouˇska prohl´ıˇzeˇc˚ua proveden´ıSelenium test˚u.

Na z´avˇerbyla vytvoˇrena uˇzivatelsk´adokumentace. Souˇc´ast´ıt´eto doku- mentace byly pops´any jednotliv´ekroky od registrace uˇzivatele aˇzpo spr´avu v´ysledk˚ut´ym˚u. Touto posledn´ı ˇc´ast´ı byly splnˇeny vˇsechny body zad´an´ı vˇcetnˇepoˇzadavk˚una vytvoˇren´ıaplikace.

43 Literatura

[1] Struts 2 Overview [online]. Tutorials Point, 2015. [cit. 2016/11/25]. Dostupn´ez: https://www.tutorialspoint.com/struts_2/struts_overview.htm.

[2] What is JSF? [online]. Tutorials Point, 2017. [cit. 2017/06/09]. Dostupn´ez: https://www.tutorialspoint.com/jsf/jsf_overview.htm.

[3] Apache Wicket Index [online]. Apache Software Foundation, 2016. [cit. 2016/11/27]. Dostupn´ez: https://cwiki.apache.org/confluence/display/WICKET/Index.

[4] Comparing Wicket and Struts [online]. Apache Software Foundation, 2006. [cit. 2016/11/27]. Dostupn´ez: https://cwiki.apache.org/confluence/display/WICKET/Struts.

[5] GWT - Overview [online]. Tutorials Point, 2015. [cit. 2016/11/28]. Dostupn´ez: https://www.tutorialspoint.com/gwt/gwt_overview.htm.

[6] Introduction [online]. Apache Software Foundation, . [cit. 2016/11/29]. Dostupn´ez: http://tapestry.apache.org/introduction.html.

[7] Apache Tapestry [online]. Apache Software Foundation, . [cit. 2016/11/29]. Dostupn´ez: http://tapestry.apache.org/.

[8] Appendix A: Architecture & philosophy [online]. [cit. 2016/12/05]. Dostupn´ez: https://openxava.wikispaces.com/philosophy_en.

[9] Welcome to RIFE [online]. RIFE t´ym. [cit. 2016/12/06]. Dostupn´ez: http://www.rifers.org.

[10] Ten Good Reasons To Use Seam [online]. Red Hat. [cit. 2016/12/08]. Dostupn´ez: http://seamframework.org/Home/WhySeam.html.

[11] Understanding Enterprise JavaBeans [online]. Oracle, 2008. [cit. 2017/06/25]. Dostupn´ez: https://docs.oracle.com/cd/E13222_01/ wls/docs100/ejb/understanding.html#wp1141710.

[12] Johnson, R. : The Origins of a Project and a Name [online]. Pivotal Software, 2006. [cit. 2016/11/15]. Dostupn´ez: https://spring.io/blog/2006/11/09/ spring-framework-the-origins-of-a-project-and-a-name.

44 [13] Part I. Overview of Spring Framework [online]. Pivotal Software, Inc, 2016. [cit. 2016/11/12]. Dostupn´ez: http://docs.spring.io/spring-framework/docs/current/ spring-framework-reference/html/overview.html.

[14] Shannon, R. What is HTML [online]. 2012. [cit. 2016/04/15]. Dostupn´ez: http://www.yourhtmlsource.com/starthere/whatishtml.html.

[15] Bos, H. W. L. . B. Cascading Style Sheets: Designing for the Web (3rd Edition). Addison-Wesley Professional, 2005. ISBN 0-321-19312-1.

[16] Bootstrap Get Started [online]. Refsnes Data. [cit. 2016/04/05]. Dostupn´ez: https://www.w3schools.com/bootstrap/bootstrap_get_started.asp.

[17] Flanagan, D. JavaScript: The Definitive Guide, 5th Edition. O’Reilly Media, 2006. ISBN 0-596-10199-6.

[18] Jonathan Chaffer, K. S. Mistrovstv´ıv jQuery. Computer Press, 2013. ISBN 978-80-251-4103-8.

[19] Christian Bauer, G. K. Hibernate in action. Manning Greenwich CT, 2005. ISBN 1932394-15-X.

[20] Reference [online]. SpryMedia. [cit. 2016/04/06]. Dostupn´ez: https://datatables.net/reference/.

[21] Part V. Data Access [online]. Pivotal Software, 2016. [cit. 2016/04/08]. Dostupn´ez: http://docs.spring.io/spring-framework/docs/4.3.x/ spring-framework-reference/html/transaction.html.

[22] Servlet Tutorial [online]. SSS IT. [cit. 2016/04/20]. Dostupn´ez: https://www.javatpoint.com/servlet-tutorial.

45 Zkratky

AJAX - Asynchronous JavaScript and XML

AOP - Aspect Oriented Programming

API - Application Programming Interface

CSS - Cascading Style Sheets

DAO - Data Access Objekt

DOM - Document Object Model

EJB - Enterprise Java Beans

GWT - Google Web Toolkit

HQL - Hibernate Query Language

HTML - HyperText Markerup Langugage

IoC - Inversion of Control

J2EE - Java 2 Enterprise Edition

JDBC - Java Database Connectivity

JMS - Java Messaging Service

JPA - Java Persistence API

JSF - JavaServer Faces

JSON - JavaScript Object Notation

JSP - Java Server Pages

JVM - Java Virtual Machine

MDD - Model-Driven Development

MDL - Material Design Lite

MVC - Model-View-Controller

46 ORM - Object-Relational Mapping

OXM - Object/XML Marshalling

POJO - Plain Old Java Object

RIA - Rich Internet Application

SpEL - Spring Expression Language

SQL - Structured Query Language

UI -

WAR - Web Application ARchive

47 Pˇr´ılohy

A Datab´aze

contestant id INT(11) user firstname VARCHAR(32) id INT(11) lastname VARCHAR(32) login VARCHAR(32) email VARCHAR(32) email VARCHAR(32) phone VARCHAR(13) phone VARCHAR(13) paid TINYINT(1) firstname VARCHAR(32) user_id INT(11) surname VARCHAR(32) race_id INT(11) password VARCHAR(256) con_subcat_id INT(11) Indexes team_id INT(11) Indexes

contestant_subcategory race_cooperation id INT(11) user_id INT(11) name VARCHAR(20) race_id INT(11) category_id INT(11) Indexes race Indexes id INT(11) name VARCHAR(32) team_size INT(11) contestant_category registration TINYINT(1) id INT(11)

evaluation TINYINT(1) name VARCHAR(20) team default_category TINYINT(1) team_category con_category_id INT(11) id INT(11) team_category_id INT(11) Indexes id INT(11) name VARCHAR(32) user_id INT(11) name VARCHAR(20) points INT(11) Indexes default_category TINYINT(1) bonus INT(11) Indexes start_time DATETIME team_subcategory finish_time DATETIME id INT(11) deadline_time INT(11) name VARCHAR(20) team_subcat_id INT(11) category_id INT(11) race_id INT(11) Indexes Indexes

Obr´azek 1: ERA diagram datab´aze

48 B Dokumentace

Registrace uˇzivatele

Pˇri registraci (obr´azek2) se mus´ı zadat textov´apole oznaˇcen´aˇcervenou hvˇezdiˇckou. Poˇcetzadan´ych znak˚umus´ıvˇzdy odpov´ıdat rozsahu v z´avorce u n´azvu textov´eho pole. Pro odesl´an´ıformul´aˇre se mus´ıkliknout na modr´e tlaˇc´ıtko s n´apisem Registration.

• Username - unik´atn´ıuˇzivatelsk´ejm´eno (3 - 32 znak˚u) • Firstname - kˇresn´ıjm´eno uˇzivatele (3 - 32 znak˚u) • Surname - pˇr´ıjmen´ıuˇzivatele (3 - 32 znak˚u) • Phone - telefonn´ıˇc´ıslo ve form´atu 123456789 nebo +420123456789 • Email - unik´atn´ıemail (6 - 32 znak˚u) • Password - heslo (8 - 256 znak˚u) • Password again - zad´an´ıstejn´eho hesla znova

Obr´azek 2: Registrace uˇzivatele

49 Pˇrihl´aˇsen´ıuˇzivatele

Pro pˇrihl´aˇsen´ıuˇzivatele (obr´azek3) se mus´ızadat uˇzivatelsk´ejm´eno do pole s n´azvem Username a heslo do pole s n´azvem Password.

Obr´azek 3: Pˇrihl´aˇsen´ıuˇzivatele

Vytvoˇren´ız´avodu

Pˇri vytv´aˇren´ı z´avodu (obr´azek4) se mus´ı zadat n´azev z´avodu s poˇctem znak˚u3 aˇz32 a definovat poˇcetz´avodn´ık˚uv t´ymu. Tento poˇcetse vyb´ır´a z pˇredpˇripraven´eho seznamu, kde lze urˇcit velikost t´ym˚uv rozmez´ı1 aˇz5 z´avodn´ık˚u. D´ale se mus´ızvolit kategorie pro z´avodn´ıky i t´ymy. Pˇri v´ybˇeru kategori´ız´avodn´ık˚ujsou k dispozici tˇri pˇrep´ınaˇce. Prvn´ıpˇrep´ınaˇcje None. Pˇri v´ybˇeru tohoto pˇrep´ınaˇcenebude definov´ana ˇz´adn´akategorie pro z´avodn´ıky. Druh´ym pˇrep´ınaˇcemje Use default category. Pˇri v´ybˇeru tohoto pˇrep´ınaˇce mus´ıme zvolit kategorii z pˇredpˇripraven´eho listu. Posledn´ıvolbou je pˇrep´ınaˇc Create own categories. Pˇri tomto v´ybˇeru m˚uˇzeme definovat 2 aˇz20 vlastn´ıch kategori´ı. Poˇcet textov´ych pol´ıpro definov´an´ıkategori´ıse pˇrid´av´azelen´ym tlaˇc´ıtkem plus a odeb´ır´aˇcerven´ym tlaˇc´ıtkem m´ınus. Definov´an´ıt´ymov´ych kategori´ıprob´ıh´astejn´ym zp˚usobem. Po vyplnˇen´ıvˇsech potˇrebn´ych ´udaj˚use mus´ıkliknout na modr´etlaˇc´ıtko Create race. Po ´uspˇeˇsn´emvytvoˇren´ız´avodu dojde k pˇresmˇerov´an´ına jeho nastaven´ı.

50 Obr´azek 4: Vytvoˇren´ız´avodu

Uvodn´ıstr´anka´ z´avodu

Tato str´anka je rozdˇelena do ˇctyr z´akladn´ıch sekc´ı. Prvn´ı sekce nazv´ana About the race (obr´azek5) obsahuje n´azev z´avodu a v´ychoz´ıvelikost t´ym˚u. Tato sekce je dostupn´apro vˇsechny uˇzivatele. Druhou sekc´ıje Race settings (obr´azek6). Tato sekce obsahuje dvˇetlaˇc´ıtka. Horn´ım tlaˇc´ıtkem lze zablo- kovat pˇrihlaˇsov´an´ız´avodn´ık˚udo z´avodu. Pˇri hodnotˇeEnabled je registrace uvolnˇena a pˇri hodnotˇeDisabled je zablokov´ana. Spodn´ıtlaˇc´ıtko oznaˇcuje z´avod jako vyhodnocen´y. Pˇri hodnotˇeEvaluated je z´avod vyhodnocen´ya pˇri hodnotˇeNot evaluated nen´ı. Mˇenit nastaven´ız´avodu sm´ıpouze jeho vlast- n´ık.

51 Obr´azek 5: Informace o z´avodu

Obr´azek 6: Nastaven´ız´avodu

Tˇret´ısekce slouˇz´ıpro pˇrid´av´an´ıspr´avc˚uz´avodu (obr´azek7). Pro pˇrid´an´ı spr´avce z´avodu se mus´ıvloˇzit jeho uˇzivatelsk´ejm´eno do pole nazvan´eCop- perator login. Pro potvrzen´ıtoho formul´aˇre se mus´ızm´aˇcknout na modr´e tlaˇc´ıtko Add copperator. D´ale tato sekce obsahuje seznam spr´avc˚u, u kte- r´eho lze pˇr´ısluˇsn´eho spr´avce odebrat tlaˇc´ıtkem vedle jeho jm´ena. Tato sekce je dostupn´ajen pro vlastn´ıka z´avodu.

Posledn´ı sekce umoˇzˇnuje majiteli smazat jeho z´avod (obr´azek8). Pro smaz´an´ı z´avodu mus´ı majitel zadat svoje pˇrihlaˇsovac´ı hesla a zm´aˇcknout ˇcerven´etlaˇc´ıtko Delete race.

52 Obr´azek 7: Seznam spr´avc˚uz´avodu a jejich pˇrid´av´an´ı

Obr´azek 8: Smaz´an´ız´avodu

Registrace do z´avodu

Registrace je rozdˇelena do dvou z´akladn´ıch sekc´ı. Prvn´ısekce slouˇz´ıpro po- tˇreby spr´avc˚uz´avodu. V t´eto sekci je formul´aˇrpro zad´an´ıt´ymu nazvan´y Admin team registration (obr´azek9). Tento formul´aˇrobsahuje n´azev t´ym˚u, kter´yse nemus´ıvyplnit. Pˇri jeho vyplnˇen´ımus´ıb´yt n´azev v rozsahu 3 aˇz 32 znak˚u. D´ale se tu definuje kategorie t´ymu ze seznamu kategori´ıpˇriˇra- zen´ych pro tento z´avod. Pot´ese definuj´ıjednotliv´ız´avodn´ıci t´ymu. Poˇcet z´avodn´ık˚uoproti v´ychoz´ıhodnotˇelze zvˇetˇsit aˇzo dva z´avodn´ıky nav´ıc. Pro tyto potˇreby je pˇridan´ezelen´etlaˇc´ıtko plus, kter´ezobraz´ıpole pro zad´an´ı dalˇs´ıho z´avodn´ık a ˇcerven´etlaˇc´ıtko m´ınus, kter´enaopak ubere z´avodn´ıka.

53 U vˇsech z´avodn´ık˚ut´ymu mus´ıb´yt zadan´ekˇrestn´ıjm´eno a pˇr´ıjmen´ıs po- ˇctem znak˚u3 aˇz32. V pˇr´ıpade definovan´ych kategori´ıpro z´avodn´ıky se mus´ı vybrat kategorie ze seznamu. U z´avodn´ık˚ulze d´ale zadat email, telefon a za- ˇskrtnout, jestli zaplatil. Pro umoˇznˇen´ıregistrace z´avodn´ıka bez t´ymu je tu formul´aˇrnazvan´yAdmin solo registration (obr´azek 10). Pˇri registraci z´avod- n´ıka se definuj´ıstejn´e´udaje jako u pˇredchoz´ıho zm´ınˇen´eho formul´aˇre. U toho formul´aˇre oproti pˇredchoz´ımu nelze definovat n´azev t´ymu, vybrat t´ymovou kategorii a ani nejde rozˇs´ıˇrit poˇcetz´avodn´ık˚u.

Obr´azek 9: Registrace t´ymu spr´avcem

54 Obr´azek 10: Registrace z´avodn´ıka bez t´ymu spr´avcem

Druh´asekce je pro pˇrihl´aˇsen´euˇzivatele. Tato sekce obsahuje tak´edva formul´aˇre. U Solo registration formul´aˇre (obr´azek 11) uˇzivatel vyb´ır´apouze kategorii z´avodn´ıka. Zbytek potˇrebn´ych ´udaj˚uje vzato z jeho ´uˇctu. Druh´y formul´aˇr(obr´azek 12) odpov´ıd´aformul´aˇri Admin team registration. Jedinou zmˇenou oproti tomuto formul´aˇri je absence zaˇskrt´avac´ıho tlaˇc´ıtka platby a nevyplˇnuj´ıse ´udaje prvn´ıho z´avodn´ıka kromˇejeho kategorie. Udaje´ o prv- n´ım z´avodn´ıkovi budou vzaty z jeho ´uˇctu.

Obr´azek 11: Registrace z´avodn´ıka bez t´ymu

55 Obr´azek 12: Registrace t´ymu

Sestaven´ıt´ym˚u

Pˇri sestavov´an´ıt´ym˚uze z´avodn´ık˚u(obr´azek 13), kteˇr´ıse registrovali bez t´ymu se vyb´ıraj´ıˇclenov´ekliknut´ım na zelen´etlaˇc´ıtko plus vedle jejich ´udaj˚u. Cerven´etlaˇc´ıtkoˇ m´ınus pak slouˇz´ı pro odznaˇcen´ı z v´ybˇeru. Pˇri vytv´aˇren´ı t´ym˚ulze definovat n´azev t´ymu o velikost 3 aˇz32 znak vˇcetnˇev´ybˇeru t´ymov´e kategorie. Po vyplnˇen´ıpˇr´ısluˇsn´ych hodnot a zvolen´ıˇclen˚use formul´aˇrodeˇsle zm´aˇcknut´ım na modr´etlaˇc´ıtko Registration. Pro smaz´an´ız´avodn´ık˚uslouˇz´ı ˇcerven´etlaˇc´ıtko Delete vedle jejich jm´ena. Sestavov´an´ıt´am˚uje k dispozici jen pro spr´avce a vlastn´ıka z´avodu.

56 Obr´azek 13: Sestaven´ıt´ym˚uze z´avodn´ık˚ubez t´ymu

Seznam t´ym˚u

Pro bˇeˇzn´euˇzivatele tento seznam zobrazuje jen n´azev t´ymu vˇcetnˇejejich ˇclen˚ua podkategorii t´ymu (obr´azek 14). Dalˇs´ıfunkcionality uˇzjsou jen pro spr´avce z´avodu a vlastn´ıka z´avodu. Souˇc´ast´ıseznamu je nav´ıc zobrazeno ID t´ymu a umoˇznˇeno editovat n´azev i podkategorii t´ymu. D´ale je pˇrid´ano tla- ˇc´ıtko Delete pro smaz´an´ıt´ymu. Po zm´aˇcknut´ıtlaˇc´ıtka se zobraz´ımod´aln´ı okno (obr´azek 15), ve kter´emlze vybrat moˇznost smaz´an´ıt´ymu vˇcetnˇez´a- vodn´ık˚unebo bez nich. Nad seznamem t´ym˚uje tlaˇc´ıtko Export teams, kter´e vyexportuje t´ymy ve form´atu XLSX. Vedle toho tlaˇc´ıtka je tlaˇc´ıtko Import teams, na kter´ekdyˇzzm´aˇckneme, tak se otevˇre mod´aln´ıokno pro importo- v´an´ıt´ym˚uve form´atu XLSX (obr´azek 16). Po zm´aˇcknut´ına tlaˇc´ıtko Import XLSX file vybereme soubor pro importov´an´ıa potvrd´ıme tuto akci modr´ym tlaˇc´ıtkem.

57 Obr´azek 14: Seznam t´ym˚u

Obr´azek 15: Smaz´an´ıt´ym˚u

Obr´azek 16: Import t´ym˚uz Excelu

Seznamy z´avod˚u

K dispozici jsou dva z´akladn´ıseznamy z´avod˚u. Prvn´ıobsahuje z´avody, kter´e jsou k dipozici k registrov´an´ı(obr´azek 17). Po zm´aˇcknut´ına n´azev z´avodu

58 budeme pˇresmˇerov´ani na z´akladn´ı informace o z´avodu. Kdyˇzzm´aˇckneme na tlaˇc´ıtko Registration, tak budeme pˇresmˇerov´ani na registraˇcn´ıformul´aˇre. U kaˇzd´eho z´avodu je naps´ano, jestli je moment´alnˇeregistrace povolena nebo zak´az´ana.

Obr´azek 17: Seznam z´avod˚upro registraci

Druh´yseznam (obr´azek 18) obsahuje z´avody, kter´ebyly oznaˇceny jako vyhodnocen´evlastn´ıkem z´avodu. Pˇrikliknut´ına n´azev z´avodu budeme pˇre- smˇerov´ani na informace o z´avodu. Kdyˇzklikneme na tlaˇc´ıtko Results, tak budeme pˇresmˇerov´an´ına v´ysledky z´avodu.

Obr´azek 18: Vyhodnocen´yseznam z´avod˚u

Spr´ava seznamu z´avodn´ık˚u

Tento seznam (obr´azek 19) je urˇcen´ypro spr´avce a vlastn´ıka z´avod˚u. Kaˇzd´a ˇr´adka obsahuje ID t´ymu, ke kter´emu je z´avodn´ık pˇriˇrazen. D´ale je souˇc´ast´ı kaˇzd´eho z´aznamu kˇrestn´ıjm´eno, pˇr´ıjmen´ıa podkategorie. Tyto ´udaje lze po pˇreps´an´ızmˇenit zm´aˇcknut´ım na tlaˇc´ıtko Save. Pro zmˇenu atributu platil je k dispozici tlaˇc´ıtko bud’ zelen´ebarvy (platil) nebo ˇcerven´ebarvy (neplatil).

59 Obr´azek 19: Seznam z´avodn´ık˚ubez telefonn´ıch ˇc´ısel a email˚u

Zobrazen´ıv´ysledk˚u

Zobrazen´ı v´ysledk˚u(obr´azek 20) je dostupn´epro vˇsechny uˇzivatele. Sou- ˇc´ast´ıkaˇzd´eho ˇr´adku je n´azev t´ym˚uvˇcetnˇejeho ˇclen˚u, um´ıstˇen´ı, podkategorie t´ymu, body, bonusov´ebody, fin´aln´ıbody, penalizace, startovn´ıˇcas, fin´aln´ı ˇcasa d´elka bˇehu z´avodu. Udaje´ lze filtrovat podle kategori´ınebo pouˇz´ıt fil- trov´an´ıpˇres vˇsechny sloupce a ˇr´adky. Jednotliv´esloupce lze ˇradit sestupnˇe a vzestupnˇe.Pro spr´avce a vlastn´ıky z´avodu je zde nav´ıc zobrazeno ID t´ymu a umoˇznˇeno exportovat aktu´alnˇevyfiltrovan´adata ve form´atu XLSX a CSV.

Obr´azek 20: Zobrazen´ıv´ysledk˚u

60 Spr´ava v´ysledk˚u

Spr´ava v´ysledk˚u(obr´azek 21) je dostupn´ajen pro spr´avce a vlastn´ıky z´avodu. Pro zad´av´an´ıstartovn´ıho ˇcasu v´ıce t´ym˚um je urˇceno textov´epole vedle tla- ˇc´ıtka Set start time. Po zad´an´ıstartovn´ıho ˇcasu a zm´aˇcknut´ıtohoto tlaˇc´ıtka se otevˇre mod´aln´ıokno (obr´azek 22). V tomto oknˇelze pˇriˇradit startovn´ıˇcas vˇsem t´ym˚um, dalˇs´ım deseti nebo t´ym˚um podle vybran´ekategorie.

Obr´azek 21: Spr´ava v´ysledk˚u

Obr´azek 22: Nastaven´ıstartovn´ıho ˇcasu pro v´ıce t´ym˚u

Vedle tlaˇc´ıtka Deadline time je nalevo textov´epole pro zad´an´ıˇcasu ur- ˇcen´eho pro dokonˇcen´ız´avodu v minut´ach. Po zad´an´ıhodnoty a zm´aˇcknut´ı tohoto tlaˇc´ıtka se otevˇremod´aln´ıokno (obr´azek 23), ve kter´em lze zvolit pˇriˇrazen´ıˇcasu pro dokonˇcen´ız´avodu vˇsemt´ym˚um nebo podle vybran´eka- tegorie.

61 Obr´azek 23: Nastaven´ıˇcasu pro dokonˇcen´ız´avodu

Pˇri zad´av´an´ıbod˚ut´ymu se mus´ına pˇr´ısluˇsn´eˇr´adce kliknout do sloupce s body. Po tomto kliknut´ıse zobraz´ımod´aln´ıokno (obr´azek 24), ve kter´em lze pˇriˇradit body. Zad´av´an´ıbod˚use neliˇs´ıod zad´av´an´ıbonusov´ych bod˚u. Vˇzdy se otevˇre stejn´eokno s dvˇema textov´ymi poli pro zad´an´ıobou typ˚u bod˚u.

Obr´azek 24: Nastaven´ıbod˚ut´ymu

Pˇri zad´av´an´ıstartovn´ıho a fin´aln´ıho ˇcasu se vˇzdy mus´ıkliknout v ˇr´adku na pˇr´ısluˇsnou pozici. U zad´av´an´ıstartovn´ıho ˇcasu se zobraz´ıpo kliknut´ımo- d´aln´ıokno (obr´azek 25), kde lze zadat startovn´ıˇcasa potvrdit ho tlaˇc´ıtkem Set time. K dispozici je i druh´etlaˇc´ıtko, kter´ese jmenuje Set global time. Po kliknut´ına toto tlaˇc´ıtko se nastav´ıjako startovn´ıˇcas t´ymu hodnota z texto- v´eho pole leˇz´ıc´ınalevo od tlaˇc´ıtka Set start time na obr´azku 21. Pˇrizad´av´an´ı fin´aln´ıho ˇcasu do mod´aln´ıho okna se zad´an´ıhodnoty potvrd´ıtlaˇc´ıtkem Set (obr´azek 26).

62 Obr´azek 25: Nastaven´ıstartovn´ıho ˇcasu

Obr´azek 26: Nastaven´ıˇcasu dokonˇcen´ız´avodu

Import ve form´atu XLSX

Souˇc´ast´ıseznamu t´ym˚uje moˇznost importov´an´ıt´ym˚uve form´atu XLSX. Na obr´azku 27 je vidˇetstruktura tabulky v Excelu pro importov´an´ıt´ym˚u o definovan´ev´ychoz´ıvelikosti t´ymu jedna. Tato struktura je nemˇenn´aa mus´ı se dodrˇzovat. List v tomto souboru mus´ım´ıt n´azev Contestants.

Obr´azek 27: Struktury tabulky pro importov´an´ıjednoˇclenn´eho t´ymu

Pˇri definovan´ev´ychoz´ıvelikosti t´ymu vˇetˇs´ıneˇzjedna je struktura sloˇzi- tˇejˇs´ı. Uk´azka je vidˇet na obr´azku 28. Struktura v Excelu se bude liˇsit pr´avˇe podle definovan´evelikosti t´ym˚u, kter´av tomto pˇr´ıpadˇemus´ıb´ytvˇetˇs´ıneˇz jedna. Atributy zaˇc´ınaj´ıc´ıˇc´ıslem pak pˇredstavuj´ıindex konkr´etn´ıho z´avod- n´ıka t´ymu. Z´avodn´ıci v t´ymu se indexuj´ı od 0 aˇzdo definovan´evelikosti t´ymu m´ınus jedna. Pro definovanou v´ychoz´ıvelikost t´ymu dva bude podle

63 obr´azku 28 nutn´epˇridat atributy s indexem jedna, kter´ebudou hned za atri- buty s indexem nula. Pro pˇr´ıpad importov´an´ız´avodn´ıka bez t´ymu mus´ıb´yt veps´ana hodnota YES do atributu SOLO a musej´ıb´yt vyplnˇen´ejen ´udaje z´avodn´ıka s indexem nula. Seznam t´ym˚uumoˇzˇnuje exportovat pˇredpˇripra- venou strukturu ve form´atu XLSX. List v tomto souboru mus´ım´ıt n´azev Teams.

Obr´azek 28: Struktura tabulky v Excelu pro importov´an´ıt´ym˚u

64 C Obsah DVD

Souˇc´ast´ıpr´aceje DVD, kter´eobsahuje:

• readme.txt - Textov´ysoubor, kter´ypopisuje kroky pro zprovoznˇen´ı webov´eaplikace.

• bptext - Sloˇzka, kter´aobsahuje zdrojov´esoubory pr´ace psan´ev LATEXu vˇcetnˇeobr´azk˚uve sloˇzce img.

• bp.pdf - Soubor ve form´atu PDF, kter´yobsahuje text pr´ace.

• selenium - Sloˇzka, kter´aobsahuje Selenium testy.

• webapp - Tento adres´aˇrobsahuje sloˇzku src, ve kter´ejsou zdrojov´e soubory aplikace. Uvnitˇr sloˇzky target je WAR soubor s n´azvem orienteering_races. Sloˇzka webapp tak´eobsahuje soubor pom.xml pro vytvoˇren´ıWAR souboru n´astroj .

• database.sql - Soubor, kter´yslouˇz´ıpro vytvoˇren´ıdatab´aze.

65