Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem diplomovou pr´aci vypracoval samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. V Plzni dne 10. kvˇetna 2014 Hung Duong Manh
Abstrakt Tato pr´ace popisuje rozˇs´ıˇren´ı funkˇcnosti validaˇcn´ıho serveru pomoc´ı modul˚ u. Validaˇcn´ı server je pouˇz´ıv´an na Z´apadoˇcesk´e univerzitˇe v Plzni. V prvn´ı kapitole je struˇcnˇe vysvˇetlen validaˇcn´ı server, jeho webov´e rozhran´ı a n´astroje pro ˇr´ızen´ı jeho v´ yvoje. Druh´a kapitola analyzuje n´amˇety na vylepˇsen´ı valid´atoru. V tˇret´ı kapitole se na z´akladˇe proveden´ ych anal´ yz vytv´aˇr´ı n´avrh ˇreˇsen´ı a popis implementace ˇreˇsen´ı. Nakonec jsou pops´any funkˇcn´ı testy modul˚ u.
Abstract This thesis describes how the validation server used at University of West Bohemia was enhanced with the help of extension plugins. The first chapter explains the validation server, its web interface and tools used for managing the development of validation server. The second chapter analyzes suggestions for improving the validation server. In the third chapter I propose a solution based on each analysis and describe the implementation of the solution. The last chapter describes functional tests for each extension plugin.
Podˇ ekov´ an´ı R´ad bych podˇekoval doc. Ing. Pavlu Heroutovi, Ph.D. za umoˇznˇen´ı vzniku ˇ ep´anovi Caisovi, vedouc´ımu pr´ace, za smˇerov´an´ı m´e ˇcint´eto pr´ace a Ing. Stˇ nosti.
´ 1 Uvod V r´amci pˇredmˇet˚ u vyuˇcovan´ ych na vysok´ ych ˇskol´ach studenti bˇeˇznˇe odevzd´avaj´ı sv´e pr´ace pro vyhodnocen´ı vyuˇcuj´ıc´ımi ˇci cviˇc´ıc´ımi. Charakter tˇechto prac´ı je nˇekdy takov´ y, ˇze by je ˇslo velmi jednoduˇse vyhodnotit automatizovanˇe. Automatizovan´e vyhodnocov´an´ı je nejen rychlejˇs´ı, takˇze uˇsetˇr´ı ˇcas, ale i spravedlivˇejˇs´ı v tom smyslu, ˇze vyhodnocuje vˇzdy stejnˇe. Pro tyto u ´ˇcely byl na Katedˇre informatiky a v´ ypoˇcetn´ı techniky Z´apadoˇcesk´e univerzity v Plzni vytvoˇren validaˇcn´ı server, kter´ y m´a slouˇzit k automatizovan´emu vyhodnocov´an´ı studentsk´ ych prac´ı. Do validaˇcn´ıho serveru lze pˇridat novou funkˇcnost pouh´ ym doprogramov´an´ım rozˇsiˇruj´ıc´ıho modulu. Tyto moduly pak umoˇzn ˇuj´ı nov´e zp˚ usoby validace a dohromady dok´aˇzou vytvoˇrit komplexn´ı test. V minul´ ych letech vznikalo postupnˇe mal´e mnoˇzstv´ı rozˇsiˇruj´ıc´ıch modul˚ u, ˇ abn´ı kultura kaˇzd´eho modulu kter´e nav´ıc byly vytvoˇreny r˚ uzn´ ymi autory. St´ se proto znaˇcnˇe liˇsila. S rostouc´ım poˇctem modul˚ u se uk´azalo, co vˇse by se dalo zlepˇsit, zjednoduˇsit a sjednotit. Nav´ıc se tak´e objevila nutnost lepˇs´ı spr´avy a organizace v´ yvoje modul˚ u. Doposud totiˇz zdrojov´e k´ody udrˇzoval kaˇzd´ y autor zvl´aˇst’, coˇz pak ˇcinilo probl´em pro jin´eho autora, kter´ y mˇel na pˇredchoz´ı pr´aci nav´azat. O valid´ator uˇz projevuj´ı z´ajem i jin´e pˇredmˇety z ostatn´ıch kateder. Bylo by proto vhodn´e m´ıt sepsan´e n´avody pro cel´ y v´ yvoj´aˇrsk´ y cyklus. C´ılem t´eto pr´ace je sjednotit programov´ y k´od st´avaj´ıc´ıch modul˚ u, zjednoduˇsit pro program´atory vytv´aˇren´ı nov´ ych modul˚ u, zdokumentov´an´ı postup˚ u pro v´ yvoj na valid´atoru a rozˇs´ıˇren´ı funkˇcnosti valid´atoru, at’ uˇz pomoc´ı nov´ ych modul˚ u nebo u ´pravou k´odu samotn´eho validaˇcn´ıho serveru.
1
2 Teoretick´a ˇc´ast 2.1 2.1.1
Validaˇ cn´ı server Co je validaˇ cn´ı server a k ˇ cemu slouˇ z´ı
Validaˇcn´ı server, neboli valid´ator, je webov´a aplikace napsan´a v programovac´ım jazyce Java. Aplikace bˇeˇz´ı na vlastn´ım serveru s Apache Tomcat pod Katedrou informatiky a v´ ypoˇcetn´ı techniky Z´apadoˇcesk´e univerzity v Plzni a slouˇz´ı k automatick´e kontrole elektronicky odevzd´avan´ ych soubor˚ u. Apache Tomcat je open source webov´ y server, do kter´eho se nasazuj´ı webov´e aplikace vyuˇz´ıvaj´ıc´ı technologii Java Servlet a JSP. Zˇrejm´e v´ yhody automatick´e kontroly jsou: sn´ıˇzen´ı doby reakce na odevzdanou u ´lohu, objektivnost kontroly, u ´spora ˇcasu pro studenta, masivn´ı u ´spora ˇcasu vyuˇcuj´ıc´ıho, jednotn´e odevzd´ avac´ı m´ısto s pˇr´ıstupem 24/7.
Nev´ yhodou vˇsak je, ˇze v´ ystupem automatick´e kontroly valid´atoru je pouze informace, zda pr´ace vyhovuje zadan´ ym krit´eri´ım nebo ne. Valid´ator tedy neum´ı odevzd´avanou pr´aci ohodnotit zn´amkou. St´ale vˇsak lze valid´ator pouˇz´ıt jako filtr pro splnˇen´ı form´aln´ıch poˇzadavk˚ u na pr´aci. Pˇr´ıkladem m˚ uˇze b´ yt esej, kter´a mus´ı splˇ novat minim´aln´ı poˇcet str´anek, aby mohla b´ yt v˚ ubec pˇrijata pro hodnocen´ı. Typ kontroly, kter´ y m˚ uˇze b´ yt valid´atorem proveden, je pouze limitov´an moˇznostmi jazyka Java. Zjednoduˇsenˇe by se dalo tedy ˇr´ıci, ˇze pokud si program´ator dok´aˇze danou kontrolu pˇredstavit algoritmizovanˇe, pak ji lze na valid´atoru prov´est [9].
2
Teoretick´a ˇc´ast
2.1.2
ˇ Validaˇ cn´ı server a Port´ al ZCU
Z´apadoˇcesk´a univerzita v Plzni provozuje pro sv´e studenty a zamˇestnance ˇ (obr. 2.1), coˇz je webov´e m´ısto, kter´e se snaˇz´ı poskytnout vˇsechny Port´al ZCU ˇ na relevantn´ı informace, t´ ykaj´ıc´ı se p˚ usoben´ı pˇrihl´aˇsen´eho uˇzivatele na ZCU, jednom m´ıstˇe. Pro pˇr´ıstup na Port´al je tˇreba se pˇrihl´asit Orion kontem. ˇ a Orion konto je elektronickou identitou studenta ˇci zamˇestnance ZCU ˇ umoˇzn ˇuje sv´emu majiteli pouˇz´ıvat elektronick´e informaˇcn´ı zdroje ZCU.
ˇ Obr´ azek 2.1: Port´al ZCU Kaˇzd´ y uˇzivatel v Port´alu m´a svoji nastavenou roli, kter´a mu poskytuje jin´a uˇzivatelsk´a pr´ava. Uˇzivatel, kter´ y m´a napˇr´ıklad roli student, nevid´ı a nem˚ uˇze dˇelat to sam´e, co uˇzivatel s rol´ı vyuˇcuj´ıc´ı. Na Port´alu si studenti mohou mimo jin´e prohl´ıˇzet sv˚ uj rozvrh, pr˚ ubˇeh sv´eho studia nebo prov´adˇet pˇredz´apis. Studenti maj´ı moˇznost na Port´alu 3
Teoretick´a ˇc´ast
odevzd´avat i sv´e studensk´e pr´ace pˇres odevzd´avac´ı portlet (obr. 2.2). Validaˇcn´ı server je plnˇe integrov´an do odevzd´avac´ıho portletu Port´alu ˇ V praxi to znamen´a, ˇze pokud se vyuˇcuj´ıc´ı rozhodne pro vyuˇzit´ı valiZCU. daˇcn´ıho serveru, pak vˇsechny pr´ace odevzdan´e studenty na dan´e t´ema proch´az´ı validaˇcn´ı dom´enou nastavenou pro toto t´ema.
ˇ Obr´ azek 2.2: Odevzd´avac´ı portlet v Port´alu ZCU Validaˇcn´ı dom´ena je nejvyˇsˇs´ı uˇzivatelsky manipulovateln´a jednotka valid´atoru a urˇcuje jako takov´a cel´ y proces validace. Kaˇzd´a dom´ena sest´av´a ze sekvence krok˚ u, kter´e se maj´ı prov´est (poˇcet krok˚ u nen´ı nijak omezen). Krok pˇredstavuje jednu vykonatelnou ˇcinnost validace (napˇr. zkompilov´an´ı adres´aˇre). V r´amci kroku lze vyuˇz´ıt rozˇs´ıˇriteln´ y modul neboli vlastn´ı akci (oba pojmy jsou zamˇeniteln´e). Dom´eny maj´ı tak´e sv´e nastaviteln´e parametry jako napˇr´ıklad typ souboru, kter´ y m˚ uˇze vstupovat do validace, nebo maxim´aln´ı velikost vstupn´ıho souboru. V pˇr´ıloze A jsou uvedeny vˇsechny pouˇz´ıvan´e parametry dom´en. Na obr´azku 2.3 je zobrazen vztah mezi validaˇcn´ım serverem, dom´enou a kroky.
4
Teoretick´a ˇc´ast
Obr´ azek 2.3: Sch´ema vztah˚ u mezi valid´atorem, dom´enou a kroky
2.1.3
Jak validace prob´ıh´ a
ˇ Jakmile Student nejprve odevzd´a pr´aci pˇres webov´ y prohl´ıˇzeˇc na Port´alu ZCU. je pr´ace nahr´ana na Port´al, odeˇsle se v z´apˇet´ı validaˇcn´ımu serveru ke kontrole. Validaˇcn´ı server nyn´ı zaˇcne aplikovat jednotliv´e kroky validace nastaven´e ve validaˇcn´ı dom´enˇe. Kaˇzd´a konkr´etn´ı instance validace m´a sv˚ uj v´ ystupn´ı v´ ysledek, kter´ y je pˇr´ıtomn´ y ve vˇsech kroc´ıch a do kter´eho mohou b´ yt v r´amci kroku generov´any 3 typy zpr´av: chyby, varovan´ı nebo zpr´avy informativn´ıho charakteru. Pokud pr´ace projde vˇsemi kroky bez chyb, je pˇrijata. V opaˇcn´em pˇr´ıpadˇe je pr´ace odm´ıtnuta a studentovi se v oknˇe Port´alu zobraz´ı zpr´ava o chybˇe (obr. 2.4). V oknˇe je tak´e odkaz na detailnˇejˇs´ı popis chyby, kter´ y je vygenerov´an transformac´ı v´ ystupn´ıho v´ ysledku validace do HTML str´anky (obr. 2.5).
Pˇr´ıstup na souborov´ y syst´em je d˚ uleˇzit´ y, protoˇze jenom tak lze restartovat validaˇcn´ı server, nahr´avat nov´e verze rozˇsiˇruj´ıc´ıch modul˚ u ˇci nasazovat novou verzi samotn´eho valid´atoru. Nehledˇe na to, ˇze obˇcas je to jedin´ y zp˚ usob jak ladit vlastn´ı akce ˇci chybu ve valid´atoru. 5
Teoretick´a ˇc´ast
Obr´ azek 2.5: Podrobnˇejˇs´ı v´ ypis v´ ysledku validace pˇri chybˇe Pˇ rihl´ aˇ sen´ı na validaˇ cn´ı server pˇ res SSH 1. nejprve je tˇreba se pˇripojit na eryx.zcu.cz pomoc´ı n´astroje putty, 2. po nav´azan´ı SSH spojen´ı n´as server vyzve, abychom se pˇrihl´asili – k tomu pouˇzijeme Orion konto, 3. nyn´ı je tˇreba se pˇripojit na samotn´ y validaˇcn´ı server. K tomu slouˇz´ı pˇr´ıkaz: > ssh −K [email protected]
Aby pˇripojen´ı probˇehlo u ´spˇeˇsnˇe, je tˇreba m´ıt povolen pˇr´ıstup od spr´avce valid´atoru. 4. u ´spˇeˇsn´e pˇripojen´ı pozn´ame podle indikace uˇzivatele: valid@valid:˜$
6
Teoretick´a ˇc´ast
2.1.5
Adres´ aˇ rov´ a struktura
Valid´ator m´a vˇzdy 3 sloˇzky: valid, valid-common a validrun. Z pohledu v´ yvoje rozˇsiˇruj´ıc´ıch modul˚ u jsou d˚ uleˇzit´e pouze valid a valid-common. Sloˇzky zaˇcin´aj´ıc´ı n´azvem validt jsou sloˇzky testovac´ıho valid´atoru, viz kapitola 2.2.3 na stranˇe 12. /opt valid valid-common validrun validt validt-common validtrun Adres´aˇrov´a struktura valid´atoru je celkem rozs´ahl´a a bylo by zbyteˇcn´e popisovat kaˇzd´ y adres´aˇr. N´asleduje popis podstatn´ ych adres´aˇr˚ u pro v´ yvoj rozˇsiˇruj´ıc´ıch modul˚ u.
valid Do sloˇzky logs se generuj´ı v´ ypisy konzolov´eho v´ ystupu Tomcatu a validaˇcn´ıho serveru. V´ ystup validaˇcn´ıho serveru se vypisuje konkr´etnˇe do souboru ZCU.log – vypisuj´ı se do nˇej jak lad´ıc´ı vypisy, tak neoˇsetˇren´e vyj´ımky. Sloˇzka lib obsahuje vˇsechny knihovny, kter´e validaˇcn´ı server potˇrebuje ke sv´emu fungov´an´ı. Nach´az´ı se zde samotn´ y validaˇcn´ı server VS.jar, rozˇsiˇruj´ıc´ı moduly a ostatn´ı potˇrebn´e knihovny. V auth se nach´az´ı .jsp str´anky, kter´e vyuˇz´ıv´a webov´e rozhran´ı validaˇcn´ıho serveru. Sloˇzky css a js obsahuj´ı CSS (Cascading Style Sheets) a javascriptov´e zdroje pro tyto str´anky. /opt/valid logs webapps vs WEB-INF lib auth css js 7
Teoretick´a ˇc´ast
valid-common Ve sloˇzce domains se nach´az´ı vˇsechny dom´eny. Kaˇzd´a dom´ena m´a sv˚ uj podadres´aˇr, ve kter´em se nach´az´ı soubor pro nastaven´ı parametr˚ u dom´eny – domain.xml, soubor pro nastaven´ı uˇzivatelsk´ ych pr´av pro danou dom´enu – run.policy a samotn´a definice validace pro dom´enu – webmodule.xml (viz uk´azka 2.2) Do sloˇzky workdir se generuj´ı pracovn´ı adres´aˇre validac´ı. Pracovn´ı adres´aˇr je doˇcasn´ y adres´aˇr, kter´ y je generov´an pro kaˇzdou novou instanci validace. V r´amci dan´eho pracovn´ıho adres´aˇre lze pak pracovat se soubory podle uˇzivatelsk´ ych pr´av definovan´ ych v souboru run.policy. V nastaven´ı dom´eny je pˇrep´ınaˇc, kter´ ym lze nastavit, zda se m´a pracovn´ı adres´aˇr po validaci smazat. Nesmaz´an´ı pracovn´ıho adres´aˇre se hod´ı, pokud lad´ıme dom´eny. Sloˇzka plugins obsahuje knihovny rozˇsiˇruj´ıc´ıch modul˚ u. Vztah mezi touto sloˇzkou a sloˇzkou valid/webapps/vs/WEB-INF/lib je takov´ y, ˇze pˇri kaˇzd´em restartu validaˇcn´ıho serveru se knihovny kop´ıruj´ı z prvn´ı sloˇzky do druh´e. Je to proto, aby nov´ y nezkuˇsen´ y uˇzivatel nepracoval hned s hlavn´ı sloˇzkou, kter´a obsahuje i dalˇs´ı knihovny, kter´e by zp˚ usobily p´ad aplikace v pˇr´ıpadˇe smaz´an´ı. /opt/valid-common data domains workdir lib plugins
2.2
Webov´ e rozhran´ı validaˇ cn´ıho serveru
2.2.1
Stav pˇ red vytvoˇ ren´ım webov´ eho rozhran´ı
Vˇsechna nastaven´ı dom´en a jejich krok˚ u byly v p˚ uvodn´ı verzi valid´atoru prov´adˇeny editac´ı xml souboru a jako takov´e byly nesrozumiteln´e pro nˇekoho, kdo valid´ator vidˇel poprv´e. Pro editaci musel m´ıt nav´ıc uˇzivatel pˇr´ıstup pˇr´ımo na souborov´ y syst´em validaˇcn´ıho serveru. Z tohoto pohledu byla pr´ace s valid´atorem uˇzivatelsky velmi nepˇrivˇetiv´a a z bezpeˇcnostn´ıho hlediska nebezpeˇcn´a. 8
Teoretick´a ˇc´ast
<param name=”file”>inputFile <script> var testOuput = new java.io.File(workDir, ' test .out ' ) ; var vzorOuput = new java.io.File(domainDir, ' vzor.out ' ) ; <param name=”file1”>vzorOutput <param name=”file2”>testOutput
Uk´ azka 2.1: P˚ uvodn´ı zp˚ usob nastaven´ı validaˇcn´ı dom´eny Validaˇcn´ı dom´ena z uk´azky 2.1 prov´ad´ı ˇctyˇri jednoduch´e ˇcinnosti: 1. ovˇeˇren´ı, ˇze odevzdan´ y soubor m´a koncovku .java, 2. kompilace zdrojov´eho souboru s ˇcasov´ ym limitem pˇet sekund, 9
Teoretick´a ˇc´ast
3. spuˇstˇen´ı pˇreloˇzen´eho souboru, 4. porovn´an´ı v´ ysledk˚ u. Z uk´azky je vidˇet, ˇze tento zp˚ usob nebyl moc srozumiteln´ y pro uˇzivatele bez technick´eho pozad´ı a ˇze nastavit ˇctyˇri jednoduch´e ˇcinnosti bylo celkem n´aroˇcn´e.
2.2.2
Vznik webov´ eho rozhran´ı
V´ yˇse zm´ınˇen´e d˚ uvody vedly k myˇslence vytvoˇrit k valid´atoru jednoduch´e uˇzivatelsk´e rozhran´ı, kde by si uˇzivatel mohl spravovat sv´e dom´eny a pˇrihlaˇ ˇsov´an´ı by prob´ıhalo pˇres jednotn´e Orion konto, kter´e pouˇz´ıv´a cel´a ZCU. Samotn´a realizace t´eto myˇslenky pˇriˇsla aˇz v roce 2010, kdy Veronika Dudov´a vytvoˇrila v r´amci sv´e bakal´aˇrsk´e pr´ace webov´e rozhran´ı pro validaˇcn´ı server [3] (obr. 2.6 – uk´azkov´e dom´eny na obr´azku jsou v´ ysledkem pozdˇejˇs´ıch prac´ı).
´ Obr´ azek 2.6: Uvodn´ ı obrazovka webov´eho rozhran´ı valid´atoru Webov´e rozhran´ı v´ yraznˇe zjednoduˇsilo pr´aci s v´alid´atorem a xml struktura pro definici dom´eny byla zcela pˇrepracov´ana – zavedly se kroky validace (uk´azka 2.2). Protoˇze se kaˇzd´a ˇcinnost formalizovala do kroku, bylo moˇzn´e 10
Teoretick´a ˇc´ast
z´avest rozˇsiˇruj´ıc´ı moduly jako extern´ı ˇcinnost, kterou lze jednoduˇse pˇridat a pˇriˇradit ke kroku. Kroky se prov´ad´ı tak, jak jdou v souboru za sebou. <domena> <userName>testUser <popis>Domena ukazka−spoctislovaastrany <popis>Spocte pocet slov a pocet stran v pdf nebo doc souboru <podminka> vzdyvlastniakce <param key=”nazevakce”>Spocti_slova_a_strany <param key=”Soubor”> <param key=”Pocet slov”>pocetSlov <param key=”Pocet stran”>pocetStran <popis>Vypise obsah promenne, ve ktere je ulozen pocet slov <podminka> vzdyvloz <param key=”co”>info <param key=”text”> <param key=”skript”>”Pocet slov:” +pocetSlov <popis>Vypise obsah promenne, ve ktere je ulozen pocet stran <podminka> vzdyvloz <param key=”co”> <param key=”text”> <param key=”skript”>”Pocet stran: ” +pocetStran
Uk´ azka 2.2: Souˇcasn´a podoba souboru defininuj´ıc´ı dom´enu V r´amci jednoho kroku lze prov´est tyto akce: nic, skok na jin´ y krok, vloˇzen´ı textu do v´ ystupu validace,
Jednotliv´e kroky mohou b´ yt tak´e nastaveny, aby se provedly podm´ınˇenˇe. K tomuto u ´ˇcelu slouˇz´ı javascriptov´e promˇenn´e a pˇrednastaven´e podm´ınky (obr. 2.7). Kombinace javascriptov´ ych promˇenn´ ych v podm´ınkach a moˇzn´ ych akc´ı poskytuje velmi siln´ y n´astroj, jak ˇr´ıdit pr˚ ubˇeh validace. Lze tak napˇr´ıklad vytvoˇrit smyˇcku krok˚ u.
Obr´ azek 2.7: Podm´ınky proveden´ı kroku ve validaˇcn´ı dom´enˇe
2.2.3
Testovac´ı validaˇ cn´ı server
Valid´ator je pouˇz´ıv´an t´emˇeˇr po cel´ y akademick´ y rok a bylo by problematick´e, kdyby studenti nemohli odevzdat svoj´ı pr´aci, protoˇze u ´prava ve zdrojov´ ych k´odech valid´atoru rozbila celou aplikaci. Pro u ´ˇcely v´ yvoje a testov´an´ı byla proto spuˇstˇena druh´a instance valid´atoru – testovac´ı valid´ator. Na tomto testovac´ım valid´atoru je nasazena zpravidla posledn´ı v´ yvojov´a verze. Nov´a verze valid´atoru se nasazuje aˇz po d˚ ukladn´em otestov´an´ı vˇsech nov´ ych funkˇcnost´ı na testovac´ım valid´atoru. Proces nasazen´ı nov´e verze prob´ıh´a v souˇcinnosti se spr´avcem serveru ostr´eho valid´atoru (CIV).
12
Teoretick´a ˇc´ast
Vyuˇcuj´ıc´ı, kteˇr´ı maj´ı z´ajem o vyuˇzit´ı validaˇcn´ıho serveru a chtˇej´ı si vyzkouˇset jeho moˇznosti, dost´avaj´ı pˇr´ıstup pouze na testovac´ı validaˇcn´ı server. Tot´eˇz plat´ı pro program´atory, kteˇr´ı se pod´ıl´ı na v´ yvoji valid´atoru. Webov´e rozhran´ı ostr´eho a testovac´ıho valid´atoru vypad´a identicky. Aby bylo jednoduˇse rozpoznateln´e, kterou instanci uˇzivatel upravuje, je v prav´em horn´ım rohu upozornˇen´ı (obr. 2.8).
Obr´ azek 2.8: Upozornˇen´ı na testovac´ı valid´ator v prav´em horn´ım rohu Webov´e rozhran´ı pro ostr´ y valid´ator bˇeˇz´ı na adrese: https://validator.kiv.zcu.cz/
Webov´e rozhran´ı pro testovac´ı valid´ator bˇeˇz´ı na adrese: https://validator−test.kiv.zcu.cz/
Pˇr´ıstup na souborov´ y syst´em testovac´ıho valid´atoru je pak > ssh −K [email protected]
2.3
Rozˇ siˇ ruj´ıc´ı moduly validaˇ cn´ıho serveru
Jak bylo naznaˇceno v kapitole 2.2.2, rozˇsiˇruj´ıc´ı moduly jsou akce, kter´e mohou b´ yt pouˇzity v r´amci kroku validace (obr. 2.9). Rozˇsiˇruj´ıc´ı modul je z implementaˇcn´ıho hlediska Java tˇr´ıda, kter´a mus´ı splˇ novat konkr´etn´ı rozhran´ı. T´ım, ˇze existuje jednotn´e rozhran´ı, pak mohou b´ yt nov´e rozˇsiˇruj´ıc´ı moduly jednoduˇse pˇrid´any do valid´atoru, aniˇz by se musel jak´ ymkoliv zp˚ usobem upravovat programov´ y k´od samotn´eho valid´atoru ˇci 13
Teoretick´a ˇc´ast
Obr´ azek 2.9: V´ ybˇer vlastn´ı akce – rozˇsiˇruj´ıc´ıho modulu webov´eho rozhran´ı. V OOP (objektovˇe orientovan´em programov´an´ı) se tento zp˚ usob ˇreˇsen´ı vyskytuje tak ˇcasto, ˇze vznikl samotn´ y n´avrhov´ y vzor - strategy pattern [4]. N´avrhov´ y vzor (ang. design pattern), je ovˇeˇren´e obecn´e ˇresen´ı nˇejak´eho n´avrhov´eho probl´emu v objektovˇe orientovan´em programov´an´ı. V n´avrhov´ ych vzorech se vyuˇz´ıvaj´ı vlastnosti OOP jako je dˇediˇcnost a polymorfismus, aby se zjednoduˇsil celkov´ y n´avrh aplikace. Pokud napˇr´ıklad architekt aplikace oˇcek´av´a, ˇze se bude prov´adˇet st´ale stejn´a ˇcinnost, ale bude se mˇenit jej´ı konkr´etn´ı implementace, pouˇzije strategy pattern. Existuj´ı r˚ uzn´e katalogy n´avrhov´ ych vzor˚ u, kde si program´atoˇri mohou naj´ıt, zda podobn´ y probl´em s n´avrhem aplikace neˇreˇsil uˇz nˇekdo pˇred nimi. Kaˇzd´ y n´avrhov´ y vzor m´a sv´e pro a proti – t´ım, ˇze nˇeco zjednoduˇs´ı, z´aroveˇ n i zavede komplexitu do jin´e ˇc´asti k´odu [4]. 14
Teoretick´a ˇc´ast
Obr´ azek 2.10: UML diagram tˇr´ıd pro strategy pattern Na obr´azku 2.10 je zn´azornˇen UML diagram tˇr´ıd pro strategy pattern. Kontext je tˇr´ıda, kter´a pracuje pouze s rozhran´ım Strategie. Tˇr´ıdy KonkretniStrategie pak implementuj´ı Strategie a v metodˇe do() maj´ı k´od, kter´ y vykon´av´a poˇzadovanou funkˇcnost. Kontext nepotˇrebuje vˇedˇet, co pˇresnˇe kter´a KonkretniStrategie prov´ad´ı, pouze staˇc´ı, ˇze m˚ uˇze volat metodu do(). Detaily si pak zajist´ı sama KonkretniStrategie.
2.3.1
Vytvoˇ ren´ı rozˇ siˇ ruj´ıc´ıho modulu – pˇ red prac´ı
Pro vytvoˇren´ı vlastn´ı akce bylo tˇreba implementovat rozhran´ı VlastniAkce spolu se sedmi metodami. 1. public String getHelp() Metoda vrac´ı ˇretˇezec, kter´ y obsahuje n´apovˇedu pro vlastn´ı akci (obr. ˇ 2.11). Retˇezec bylo tˇreba skl´adat programovˇe, tzn. bylo tˇreba ruˇcnˇe ps´at tagy HTML element˚ u a zalamovat text ˇretˇezce, coˇz nebylo moc pˇrehledn´e ani pˇr´ıjemn´e. 2. public String getId() Metoda vrac´ı n´azev pro akci. Tento n´azev se ukl´ad´a do XML souboru obsahuj´ıc´ı nastaven´ı dom´eny (viz uk´azka 2.2). 3. public String getKategorii() Metoda vrac´ı n´azev kategorie, pˇriˇcemˇz tato kategorie musela b´ yt nadefinov´ana v rozhran´ı VlastniAkce. 4. public String getNazev() Metoda vrac´ı n´azev akce pro zobrazen´ı ve webov´em rozhran´ı. Nemus´ı b´ yt totoˇzn´e s getId(). 15
Teoretick´a ˇc´ast
Obr´ azek 2.11: N´apovˇeda vlastn´ı akce ve webov´em rozhran´ı 5. public String getPopis() Metoda vrac´ı popis akce. 6. public List<ParametrAkce> getParametry() Na obr´azku 2.11 jsou vidˇet parametry akce. Moment´alnˇe existuj´ı pouze 3 druhy parametr˚ u: ˇretˇezec, checkbox a odkaz na nahr´an´ı souboru. 7. public void execute() V t´eto metodˇe se prov´ad´ı hlavn´ı k´od validace. Metoda nem´a ˇz´adnou n´avratovou hodnotu jako takovou, ale modifikuje objekt, kter´ y je parametrem metody. Vstupn´ımi parametry jsou: ValidationInfo info, FullValidationResult result, Scriptable scriptable, Collection<Parametr> parameters.
ValidationInfo je objekt, kter´ y poskytuje informace a data o konkr´etn´ı instanci validace popˇr. obecn´e informace o validaˇcn´ım serveru.
16
Teoretick´a ˇc´ast
Vˇetˇsinou se tento objekt pouˇz´ıv´a k z´ısk´an´ı nahran´eho souboru studentem a z´ısk´an´ı pracovn´ıho adres´aˇre validace. FullValidationResult pˇredstavuje v´ ysledek validace. Objekt je pˇred´av´an do vˇsech krok˚ u validace a ty do nˇeho maj´ı moˇznost generovat tˇri druhy zpr´av. Metodou result.addInfo() se pˇrid´av´a ˇretˇezec informativn´ıho charakteru. Informativn´ı zpr´ava se zobrazuje jako modr´ y pruh (obr. 2.12) a nem´a ˇzadn´ y vliv na validaci jako takovou, pouze slouˇz´ı k vyps´an´ı nˇejak´e informace pro uˇzivatele.
Obr´ azek 2.12: Informaˇcn´ı zpr´ava ve v´ ysledku validace Metodou result.addWarning() se pˇrid´av´a varovn´a zpr´ava. Varovn´a zpr´ava tak´e nem´a ˇza´dn´ y vliv na samotnou validaci. Zobrazuje se jako oranˇzov´ y pruh (obr. 2.13) a vˇetˇsinou se pouˇz´ıv´a pro pˇr´ıpady, kdyˇz se objev´ı nˇejak´ y probl´em, kter´ y nen´ı kritick´ y, ale student by ho mˇel opravit.
Obr´ azek 2.13: Varovn´a zpr´ava ve v´ ysledku validace Posledn´ı typ zpr´avy, chyba, se pˇrid´av´a metodou result.addError(). Chybov´a zpr´ava narozd´ıl od dvou pˇredchoz´ıch uˇz m´a vliv na validaci. Pokud po vykon´an´ı vˇsech krok˚ u validace obsahuje v´ ysledek validace chybu, validace bude vyhodnocena negativnˇe a studentova pr´ace bude odm´ıtnuta. Validace s chybou ve v´ ysledku pokraˇcuje aˇz na posledn´ı krok. Nˇekdy je vˇsak tˇreba validaci ukonˇcit uˇz dˇr´ıve, protoˇze dalˇs´ı akce 17
Teoretick´a ˇc´ast
jsou zpravidla z´avisl´e na pˇredchoz´ıch a nebudou tak m´ıt spr´avn´ y vstup. Pro tento pˇr´ıpad se vyuˇzije podm´ınka Validace jiˇz obsahuje chybu“ ” (obr. 2.7).
Obr´ azek 2.14: Chyba ve v´ ysledku validace Scriptable poskytuje pˇr´ıstup k javascriptov´ ym promˇenn´ ym, kter´e existuj´ı v rozsahu instance validace. Lze tak z´ısk´avat hodnoty promˇenn´ ych, ale i pˇrid´avat dalˇs´ı promˇenn´e. Pˇridan´e promˇenn´e budou pak viditeln´e v dalˇs´ım kroku, kde je lze pouˇz´ıt pro podm´ınku nebo parametr akce. Context pˇredstavuje kontext bˇehov´eho prostˇred´ı javascriptu a obsahuje informace o pr´avˇe prov´adˇen´em skriptu jako je napˇr´ıklad z´asobn´ık vol´an´ı funkc´ı. Collection<Parametr> parameters je kolekce, kter´a obsahuje vstupn´ı parametry akce. Jedn´a se o dvojice kl´ıˇc–hodnota. Implementaˇcnˇe je pouˇzito rozhran´ı Collection a ne Map, tud´ıˇz nelze hodnotu z´ıskat jedn´ım vol´an´ım, ale je tˇreba proj´ıt celou kolekci a explicitnˇe se pt´at, zda se jedn´a o deklarovan´ y parametr. Parametry se deklarovaly jako konstantn´ı ˇretˇezce vlastn´ı akce. Parametrem akce m˚ uˇze b´ yt bud’ ˇretˇezec, checkbox nebo speci´aln´ı nahr´avac´ı tlaˇc´ıtko. V pˇripadˇe checkboxov´eho parametru je chov´an´ı takov´e, ˇze pokud je checkbox uˇzivatelem zaˇskrtnut, pak je tento kl´ıˇc v kolekci a pokud nen´ı zaˇskrnut´ y, tak se v kolekci v˚ ubec nevyskytuje. Naopak ˇretˇezcov´ y parametr se v kolekci vyskytuje vˇzdy, pouze se jedn´a o pr´azdn´ y ˇretˇezec, pokud uˇzivatel nic nevypln´ı. Nahr´avac´ı parametr slouˇz´ı pro nahr´an´ı archivu do validaˇcn´ı dom´eny. Archiv se pak vˇzdy rozbal´ı do sloˇzky validation_data, kde m˚ uˇzou b´ yt soubory ˇcteny ve vlastn´ı akci. Tento parametr uˇz se tolik nevyuˇz´ıv´a, protoˇze pˇri nahr´an´ı dojde k pˇremaz´an´ı dosavadn´ıho obsahu sloˇzky validation_data.
18
Teoretick´a ˇc´ast
2.3.2
Apache Maven
Apache Maven je n´astroj pro spr´avu Java projekt˚ u, kter´ y vyuˇz´ıv´a projektovˇeobjektov´ y model, sadu standard˚ u, ˇzivotn´ı cyklus projektu, syst´em pro spr´avu z´avislost´ı a logiku pro vykon´av´an´ı c´ıle plugin˚ u v definovan´ ych f´az´ıch ˇzivotn´ıho cyklu projektu [2]. Rozˇsiˇruj´ıc´ı moduly se na server nasazuj´ı jako jar archiv, kter´ y obsahuje zkompilovan´e tˇr´ıdy vytvoˇren´e vlastn´ı akce. Tento jar archiv mus´ı splˇ novat jedinou podm´ınku, aby valid´ator byl schopn´ y modul naˇc´ıst – mus´ı obsahovat soubor MANIFEST.MF, ve kter´em je ˇra´dka: AKCE: cely.nazev.tridy.vcetne.Baliku
Pro zjednoduˇsen´ı a automatizaci vytv´aˇren´ı jar archiv˚ u se vˇsechny vlastn´ı akce vytv´aˇr´ı jako Maven projekty. Vˇsechny vlastn´ı akce maj´ı sv˚ uj adres´aˇr s n´asleduj´ıc´ı strukturou: Adresář vlastní akce src main java resources target pom.xml Sloˇzka java obsahuje zdrojov´e soubory. Sloˇzka resources obsahuje ostatn´ı vedlejˇs´ı zdroje jako napˇr´ıklad konfiguraˇcn´ı textov´e soubory. Do sloˇzky target se generuje tzv. artifakt, neboli v´ ysledek Maven sestaven´ı. Nejd˚ uleˇzitˇejˇs´ı pro cel´ y Maven projekt je soubor pom.xml. V tomto souboru se specifikuje projekt, jak´e z´avislosti se v projektu pouˇz´ıvaj´ı a jak´ ym zp˚ usobem m´a b´ yt projekt sestaven. V uk´azce 2.3 je pˇr´ıklad velmi prost´eho pom.xml.
Uk´ azka 2.3: Struktura pom.xml Maven prov´ad´ı svoji ˇcinnost pomoc´ı plugin˚ u. Ty se staraj´ı o kompilaci zdrojov´ ych k´od˚ u, vytv´aˇren´ı bal´ıˇck˚ u, nasazov´an´ı na servery a o ostatn´ı ˇcinnosti, kter´e jsou nutn´e pro sestaven´ı projektu. V uk´azce 2.3 je plugin, kter´ y se star´a o kompilaci zdrojov´ ych soubor˚ u. Do elementu dependecies se p´ıˇs´ı jednotliv´e z´avislosti projektu. Z´avislosti jsou jin´e knihovny, kter´e vyuˇz´ıv´a n´aˇs projekt, aby mohl fungovat. Pokud napˇr´ıklad v naˇs´ı vlastn´ı akci budeme cht´ıt pˇrev´est bin´arn´ı data do k´odov´an´ı base64, tak m˚ uˇzeme vyuˇz´ıt knihovnu Apache Commons Codec, kter´a poskytuje statickou metodu Base64.encodeBase64String(). V ele20
Teoretick´a ˇc´ast
mentu dependencies by pak pˇribyl z´aznam pro pˇrid´an´ı z´avislosti na knihovnˇe Apache Commons Codec (uk´azka 2.4). <dependency> commons−codec <artifactId>commons−codec 1.9
Uk´ azka 2.4: Z´avislost na knihovnˇe Apache Commons Codec Z´avislosti se pˇrid´avaj´ı z uloˇziˇstˇe z´avislost´ı – repository. Repository se dˇel´ı na dva typy: lok´aln´ı a vzd´alen´e. Maven se nejdˇr´ıve snaˇz´ı z´avislost naj´ıt v lok´aln´ım repository a pokud ji tam nenajde, pokus´ı se ji st´ahnout ze vzd´alen´eho. ˇ Sablonov´ y pom.xml pro vlastn´ı akce je moˇzn´e st´ahnout v souborech na Redmine provozovan´e KIV. V´ yvoj´aˇr vlastn´ı akce pak pouze zad´a pˇr´ıkaz pro sestaven´ı projektu a Maven uˇz s´am pro vlastn´ı akci vygeneruje nasaditeln´ y jar soubor. Tento soubor staˇc´ı pˇrekop´ırovat do sloˇzky /valid-common/libs/plugins na validaˇcn´ım serveru a restartovat server. Po restartu by novˇe pˇridan´a akce mˇela b´ yt vidˇet v seznamu vlastn´ıch akc´ı.
2.4 2.4.1
ˇ ızen´ı v´ R´ yvoje validaˇ cn´ıho serveru Syst´ em pro spr´ avu verz´ı
Syst´emy pro spr´avu verz´ı slouˇz´ı pro spr´avu zmˇen dokument˚ u, poˇc´ıtaˇcov´ ych program˚ u a jin´ ych druh˚ u informac´ı. Syst´em udrˇzuje v uloˇziˇsti (repository) seznam soubor˚ u, kter´e spadaj´ı pod jeho spr´avu (jsou verzov´any). Urˇcit´a konfigurace tˇechto soubor˚ u tvoˇr´ı dohromady revizi, kter´a je charakterizov´ana ˇc´ıslem ˇci p´ısmenem. Pokud dojde ke zmˇenˇe verzovan´eho souboru, revize se nav´ yˇs´ı ˇci zmˇen´ı. Revize mohou b´ yt porovn´av´any, obnovov´any ˇci sluˇcov´any [7]. Pˇri v´ yvoji software je takov´ y syst´em nepostradateln´ y, protoˇze v´ yraznˇe zjednoduˇsuje udrˇzov´an´ı verz´ı a v´ yvoj k´odu, zejm´ena pokud se na v´ yvoji pod´ıl´ı v´ıce program´ator˚ u. Verzovac´ı syst´emy umoˇzn ˇuj´ı vytv´aˇren´ı v´ yvojov´ ych vˇetv´ı 21
Teoretick´a ˇc´ast
(branch) a v´ yvojov´ ych ˇst´ıtk˚ u (tag). Hlavn´ı v´ yvojov´e vˇetvi se ˇr´ık´a kmen (trunk). Z kmene se pak vˇetv´ı dalˇs´ı verze, kdyˇz je tˇreba vyvinout paralelnˇe novou funkcionalitu nebo kdyˇz hroz´ı, ˇze prov´adˇen´e zmˇeny ponechaj´ı kmen delˇs´ı dobu v nefunkˇcn´ım stavu. Po dokonˇcen´ı v´ yvoje ve v´ yvojov´e vˇetvi se nov´a funkcionalita slouˇc´ı opˇet do kmene. Na obr´azku 2.15 je sch´ema vˇetven´ı a sluˇcov´an´ı zmˇen v pr˚ ubˇehu ˇcasu.
Obr´ azek 2.15: Vˇetven´ı a sluˇcov´an´ı zmˇen ve verzovac´ım syst´emu v pr˚ ubˇehu ˇcasu ˇ ıtkov´an´ı slouˇz´ı pro sn´aze zapamatovatelnˇejˇs´ı oznaˇcen´ı specifick´ St´ ych reviz´ı, napˇr´ıklad kdyˇz se jedn´a o verzi, kter´a bude uvolnˇena pro veˇrejnost. K oˇst´ıtkovan´e verzi se lze kdykoliv vr´atit. Syst´emy pro spr´avu verz´ı funguj´ı i jako z´alohy pro pˇr´ıpad, ˇze je tˇreba z´ıskat urˇcitou konfiguraci soubor˚ u z minulosti. Nejd˚ uleˇzitˇejˇs´ımi operacemi verzovac´ıho syst´emu jsou commit/check in a update/check out. Operace commit slouˇz´ı k nahr´an´ı lok´alnˇe upraven´ ych soubor˚ u do repository. Operace update je pˇresn´ ym opakem commit. Update prov´ad´ı aktualizaci lok´aln´ıch soubor˚ u porovn´an´ım se soubory v repository. V´ yvoj´aˇr na samotn´em zaˇc´atku v´ yvoje udˇel´a prvotn´ı update, ˇc´ımˇz vytvoˇr´ı lok´aln´ı kopie soubor˚ u. S tˇemito lok´aln´ımi nad´ale pracuje a prov´ad´ı v nich zmˇeny. Po dokonˇcen´ı v´ yvoje nebo na konci dne, pokud v´ yvoj bude trvat d´ele, provede v´ yvoj´aˇr commit, ˇc´ımˇz se nahrajou proveden´e zmˇeny do repository. Z repository pak z´ısk´avaj´ı ostatn´ı v´ yvoj´aˇri operac´ı update uˇz upraven´e soubory. Update prov´ad´ı kaˇzd´ y program´ator na zaˇca´tku kaˇzd´eho v´ yvojov´eho kola, aby mˇel aktu´aln´ı verzi soubor˚ u. Pokud to neudˇel´a nebo pokud se soubor v repository bˇehem lok´aln´ıho v´ yvoje zmˇen´ı, m˚ uˇze nastat konflikt. Konflikt je situace, kdy v´ yvoj´aˇr chce prov´est commit a lok´aln´ı verze souˇ sen´ı konfliktu jsou n´asleduj´ıc´ı [10]: boru se liˇs´ı od verze v repository. Reˇ
22
Teoretick´a ˇc´ast zahozen´ı lok´ aln´ıch zmˇen, pˇrijmut´ı verze z repository a proveden´ı zmˇen opˇetovnˇe, pˇrem´az´ an´ı verze v repository lok´aln´ı verz´ı, slouˇcen´ı obou verz´ı.
Pˇred touto prac´ı se verzovaly pouze zdrojov´e k´ody samotn´eho validaˇcn´ıho serveru. Uloˇziˇstˇe bylo spravov´ano CIV a pouˇz´ıval se verzovac´ı syst´em SVN. Vlastn´ı akce nebyly verzov´any a jejich k´od si udrˇzoval kaˇzd´ y program´ator valid´atoru individu´alnˇe. Na zaˇca´tku t´eto pr´ace se zaˇcali spoleˇcnˇe s validaˇcn´ım serverem verzovat i vlastn´ı akce. Pro verzov´an´ı se st´ale pouˇz´ıv´a syst´em SVN, tentokr´at je vˇsak syst´em uloˇzen na serveru spravovan´eho Katedrou informatiky a v´ ypoˇcetn´ı ˇ techniky ZCU. Nov´ y program´ator validaˇcn´ıho serveru ˇci vlastn´ıch akc´ı si m˚ uˇze kdykoliv pomoc´ı operace update st´ahnout aktualn´ı verzi zdrojov´ ych soubor˚ u z repository a zaˇc´ıt pracovat. Adresa repository pro tento projekt je: https://forge.kiv.zcu.cz/svn-validator.
2.4.2
Syst´ em pro spr´ avu poˇ zadavk˚ u
Syst´em pro sledov´an´ı poˇzadavk˚ u je n´astroj v softwarov´em inˇzen´ yrstv´ı, kter´ y slouˇz´ı pro sbˇer poˇzadavk˚ u, jejich spr´avu a sledov´an´ı jejich v´ yvoje [5]. Poˇzadavkem se rozum´ı jak´ ykoliv poˇzadavek na zmˇenu vyv´ıjen´eho software. Pro projekt validaˇcn´ıho serveru a jeho vlastn´ıch akc´ı se vyuˇz´ıv´a syst´em Redmine. Redmine je bezplatn´ y open source n´astroj na ˇr´ızen´ı projektu, kter´ y zahrnuje i syst´em pro spr´avu poˇzadavk˚ u. Redmine vzniknul v roce 2006 a je naprogramovan´ y pomoc´ı frameworku Ruby on Rails. Pˇrednost´ı Redmine je jednoduchost, pˇrehlednost a integrace s verzovac´ım syst´emem [8]. Na obr´azku 2.16 je u ´vodn´ı obrazovka pro tento projekt v Redmine. Pouˇzit´ı Redmine vede k tomu, ˇze v naˇsem projektu lze: vyhled´avat v cel´e historii u ´kol˚ u, dohledat jak byly u ´koly vyˇreˇseny, organizovat pl´anov´ an´ı do budoucna,
23
Teoretick´a ˇc´ast
´ Obr´ azek 2.16: Uvodn´ ı obrazovka v Redmine pro projekt Validaˇcn´ı server ” a jeho moduly“ zjistit, kter´e u ´koly se maj´ı moment´alnˇe ˇreˇsit, vytv´ aˇret a delegovat u ´koly na konkr´etn´ı ˇreˇsitele, m´ıt jednotn´e m´ısto s pˇr´ıstupem k informac´ım projektu, mˇeˇrit efektivitu.
Tato pr´ace byla v r´amci vˇsech prac´ı na valid´atoru prvn´ı, u kter´e byl pro ˇr´ızen´ı v´ yvoje pouˇzit syst´em pro spr´avu poˇzadavk˚ u. Pˇri ˇr´ızen´ı v´ yvoje projektu byl Redmine pouˇzit pro spr´avu poˇzadavk˚ u s integrac´ı na SVN a jako informaˇcn´ı b´aze. Adresa KIV Redmine je: http://students.kiv.zcu.cz:3000.
24
Teoretick´a ˇc´ast
Syst´ em pro spr´ avu poˇ zadavk˚ u v Redmine Vˇsechny u ´koly (v Redmine nazvan´e jako issue) souvisej´ıc´ı s v´ yvojem validaˇcn´ıho serveru a jeho modul˚ u jsou novˇe vedeny v Redmine. Na obr´azku 2.17 je obrazovka Redmine s v´ ypisem u ´kol˚ u. ´ Ukoly v projektu Validaˇcn´ı server a jeho moduly“ mohou b´ yt typu: ” bug, enhancement, task, support, feature.
Obr´ azek 2.17: Obrazovka Redmine s v´ ypisem u ´kol˚ u Rozd´ıly mezi jednotliv´ ymi typy jsou minim´aln´ı. Typy slouˇz´ı pro kategorizaci. Kaˇzd´ yu ´kol v projektu mus´ı m´ıt povinnˇe typ, pˇredmˇet, popis, stav a prioritu. Pro novˇe vytvoˇren´e u ´koly se pouˇz´ıv´a stav New. Pro u ´koly, kter´e maj´ı uˇz nekoho pˇriˇrazen´e pro vyˇreˇsen´ı, se pouˇz´ıv´a stav Assigned. Pokud je u ´kol vyˇreˇsen, ale je tˇreba ho jeˇstˇe ovˇeˇrit, pouˇzije se stav Resolved. Stav Verified 25
Teoretick´a ˇc´ast
oznaˇcuje u ´kol, kter´e jsou vyˇreˇseny a ovˇeˇreny. Posledn´ım stavem je Closed. ´ Ukoly v tomto stavu uˇz by se nemˇely mˇenit. Moˇzn´e pouˇziteln´e stavy jsou nastaviteln´e podle rol´ı v syst´emu. V´ yˇse uveden´e stavy se vztahuj´ı na pouˇzit´ı stav˚ u v tomto projektu. Redmine umoˇzn ˇuje integraci s verzovac´ım syst´emem SVN. Pˇri commitu lze do zpr´avy commitu ps´at kl´ıˇcov´a slova pomoc´ı kter´ ych lze pracovat s u ´koly. Obsahuje-li napˇr´ıklad zpr´ava commitu text: references #1
bude u u ´kolu s ˇc´ıslem 1 uveden odkaz na tento commit v sekci Souvisej´ıc´ı revize. Dalˇs´ım kl´ıˇcov´ ym slovem je napˇr´ıklad closes, kter´e automaticky u ´kolu nastav´ı stav Closed. Cel´ y ˇzivotn´ı cyklus jednoho u ´kolu v projektu Validaˇcn´ı server a jeho ” moduly“ vypad´a zhruba takto. Uˇzivatel vytvoˇr´ı u ´kol, kde pop´ıˇse n´amˇet na vylepˇsen´ı, nastav´ı prioritu a ohodnot´ı ˇcasovou n´aroˇcnost popˇr´ıpadˇe jeˇstˇe nastav´ı konkr´etn´ıho ˇreˇsitele (pokud v´ı, komu je tento u ´kol urˇcen). Aˇz se ˇreˇsitel dostane k tomuto u ´kolu a ovˇeˇr´ı, ˇze m´a smysl se zab´ yvat t´ımto u ´kolem, nastav´ı stav u ´kolu na Assigned. V pr˚ ubˇehu v´ yvoje/ˇreˇsen´ı u ´kolu ˇreˇsitel pr˚ ubˇeˇznˇe aktualizuje procentu´aln´ı stav dokonˇcen´ı a pokud je to tˇreba, p´ıˇse koment´aˇre k u ´kolu. Pokud je s u ´kolem spojena nˇejak´a zmˇena ve zdrojov´ ych k´odech, nap´ıˇse ˇreˇsitel do zpr´avy commitu odkaz na ˇc´ıslo u ´kolu. Pˇri dosaˇzen´ı 100 % dokonˇcen´ı nastav´ı ˇreˇsitel stav na Resolved a vyˇck´a na kontrolu zadavatelem. Pokud je zadavatel spokojen, zmˇen´ı stav na Resolved, v opaˇcn´em pˇr´ıpadˇe resetuje % dokonˇcen´ı a nastav´ı stav na Assigned, dokud nen´ı spokojen. Stav Closed nastav´ı zadavatel obvykle po ovˇeˇren´ı funkˇcnosti s novou verz´ı validaˇcn´ıho serveru.
Informaˇ cn´ı b´ aze v Redmine Redmine poskytuje k projektu tak´e wiki. Wiki je webov´a aplikace, kter´a umoˇzn ˇuje kolaborativn´ı u ´pravu obsahu. Wiki m˚ uˇze slouˇzit jako encyklopedie pojm˚ u pro projekt ˇci m´ısto pro sepisov´an´ı n´avod˚ u. Obecnˇe je to m´ısto, kter´e shromaˇzd’uje vˇsechny informace spojen´e s nˇejak´ ym t´ematem. Kolaborativn´ı pˇr´ıstup umoˇzn ˇuje jak´emukoliv ˇclenovi projektu upravovat obsah ostatn´ıch nebo tak´e vytv´aˇret nov´ y obsah. Pokud napˇr´ıklad bude v 26
Teoretick´a ˇc´ast
n´avodu chyba ˇci nˇejak´a nejasnost, staˇc´ı str´anku s n´avodem poupravit. Bˇehem pr´ace na tomto projektu bylo ve wiki seps´ano nˇekolik n´avod˚ u t´ ykaj´ıc´ıch se validaˇcn´ıho serveru a jeho modul˚ u. N´avody pokr´ yvaj´ı postup od pˇr´ıpravy lok´aln´ıho v´ yvojov´eho prostˇred´ı pro validaˇcn´ı server aˇz po nasazen´ı vlastn´ıch akc´ı a validaˇcn´ıho serveru. Na obr´azku 2.18 je u ´vodn´ı obrazovka pro wiki v Redmine. Redmine umoˇzn ˇuje fulltextov´e vyhled´av´an´ı v cel´em projektu. Tud´ıˇz cel´ y projekt spoleˇcnˇe s wiki a u ´koly tvoˇr´ı jednu velkou informaˇcn´ı b´azi.
Obr´ azek 2.18: Obrazovka wiki v Redmine pro projekt Validaˇcn´ı server a ” jeho moduly“
27
3 Anal´yza n´amˇet˚ u na vylepˇ sen´ı a pl´ an ˇ reˇ sen´ı Na zaˇca´tku t´eto pr´ace v l´etˇe 2013 bylo v Redmine seps´ano 17 u ´kol˚ u t´ ykaj´ıc´ıch se validaˇcn´ıho serveru a jeho modul˚ u. Bˇehem pr´ace poˇcet u ´kol˚ u v Redmine rostl. Celkem jsem stihnul dokonˇcit 34 u ´kol˚ u, pˇriˇcemˇz 17 u ´kol˚ u bylo pˇrid´ano bˇehem ˇreˇsen´ı. Tyto pˇridan´e u ´koly nebyly z poˇc´atku v pl´anu a pˇredstavuj´ı tak pr´aci nav´ıc z m´e strany. V tabulce 3.1 jsou pˇridan´e u ´koly oznaˇceny hvˇezdiˇc´ kou. Ukol 16 Rozmyslet poˇrad´ı plnˇen´ı u ´kol˚ u“ je obsaˇzen v kapitole 3.2. ” Tabulka 3.1: Seznam u ´kol˚ u v poˇrad´ı pˇrid´an´ı Poˇrad´ı pˇrid´ an´ı 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18* 19* 20* 21* 22* 23* 24* 25* 26* 27* 28* 29* 30* 31* 32* 33* 34*
N´ azev u ´kolu Parametrizace odkazem u vlastn´ıch akc´ı Refaktor akce Spuˇstˇ en´ı JUnit Vyzkouˇsen´ı a pops´ an´ı akce na kontrolu poˇ ctu str´ anek a slov Refaktorov´ an´ı akce SpustitPMD a SpustitUMLTestovani ´ Uprava souborov´ e struktury vlastn´ıch akc´ı ´ Uprava vlastn´ıch akc´ı na pouˇ zit´ı checkbox˚ u Zmˇ enit pouˇ zit´ı n´ apovˇ edy u vlastn´ıch akc´ı Vytvoˇren´ı akce Vymaˇ z soubory podle vzoru Pˇreddefinovan´ e hodnoty parametr˚ u Kategorizace vlastn´ıch akc´ı Doplnˇ en´ı serveru / util class o standardnˇ e pouˇ z´ıvan´ e akce ´ Uprava pom.xml souboru Vyˇreˇsit um´ıstˇ en´ı pomocn´ ych soubor˚ u pro jednotliv´ e uk´ azky Dom´ eny otestovateln´ e bez uk´ azkov´ ych soubor˚ u Doplnˇ en´ı Wiki o procesu pr´ ace s valid´ atorem Rozmyslet poˇrad´ı plnˇ en´ı u ´kol˚ u N´ apovˇ eda na vytv´ aˇren´ı akc´ı do Wiki Dynamick´ e pˇrid´ av´ an´ı dalˇs´ıch kategori´ı ukazka-kontrolanepovolenychsouboru ukazka-kopirovatslozkydoworkdir ukazka-najdisoubory ukazka-porovnanistrukturyadresaru Pˇrid´ an´ı nov´ ych poloˇ zek do rozhran´ı ValidationResult Pˇrejmenovat vlastn´ı akci spoctislova na spoctislovaastrany Vytvoˇren´ı nov´ e tˇr´ıdy AbstraktniVlastniAkce String index out of range: -86 Nejde vlastn´ı akce Velikost souboru Jak nastavit poˇ c´ ateˇ cn´ı adres´ aˇr pro Javadoc? OK hl´ aˇsen´ı JUnit testu metody Vlastn´ı akce Kop´ırov´ an´ı soubor˚ u Nov´ a vlastn´ı akce generovanijavadoc Nefungujici domena a prapodivne chovani validatoru Chyba pˇri rozbalov´ an´ı JAR Chybn´ e vyhodnocen´ı v´ ysledku duck-testu
28
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
3.1
Anal´ yza n´ amˇ et˚ u na vylepˇ sen´ı
3.1.1
Kategorizace vlastn´ıch akc´ı
C´ılem u ´kolu bylo zkontrolovat spr´avn´e pˇriˇrazen´ı vˇsech existuj´ıc´ıch vlastn´ıch akc´ı do pˇreddefinovan´ ych kategori´ı. Kaˇzd´a vlastn´ı akce spad´a kv˚ uli pˇrehlednosti do urˇcit´e kategorie. Na obr´azku 3.1 je zobrazen´ı kategori´ı ve webov´em rozhran´ı validaˇcn´ıho serveru.
Obr´ azek 3.1: Zobrazen´ı kategori´ı ve webov´em rozhran´ı valid´atoru Kategorie se u vlastn´ı akce nastavuje v metodˇe getKategorii(), kter´a vrac´ı ˇretˇezec s n´azvem kategorie. Tato metoda vˇsak m˚ uˇze vracet pouze pˇreddefinov´e ˇretˇezcov´e konstanty, kter´e jsou nadefinovan´e v tˇr´ıdˇe VlastniAkce (obr. 3.1). public public public public
final final final final
String String String String
KAT_DOKUMENT = ”Prace s dokumenty”; KAT_PROGRAM = ”Prace s programy”; KAT_SOUBOR = ”Prace se soubory”; KAT_DILCI = ”Dilci akce”;
Uk´ azka 3.1: Pˇreddefinov´e kategorie vlastn´ıch akc´ı Tyto ˇretˇezcov´e konstanty jsou pouˇzity pˇri generov´an´ı seznamu vlastn´ıch akc´ı na obrazovce Upravit krok“. ”
29
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
3.1.2
Zmˇ enit pouˇ zit´ı n´ apovˇ edy u vlastn´ıch akc´ı
C´ılem u ´kolu bylo pˇresunout text n´apovˇedy vlastn´ıch akc´ı do samostatn´eho souboru, aby nebylo tˇreba modifikovat zdrojov´ y k´od akce v pˇr´ıpadˇe u ´pravy n´apovˇedy. Pˇri implementanci mˇelo b´ yt zv´aˇzeno pouˇzit´ı knihovny z projektu Apache Commons. Apache Commons je projekt, kter´ y se zamˇeˇruje na vytv´aˇren´ı znovupouˇziteln´ ych knihoven v Javˇe [1]. Jednou takovou knihovnou je Apache Commons Configuration, kter´a je urˇcen´a pro naˇc´ıt´an´ı konfiguraˇcn´ıch soubor˚ u. Knihovna poskytuje obecn´e rozhran´ı, pˇres kter´e lze naˇc´ıtat parametry uloˇzen´e v r˚ uzn´ ych zdroj´ıch. Zdrojem m˚ uˇze b´ yt properties soubor, XML dokument ˇci Windows INI soubor. V uk´azce 3.2 je pˇredveden zp˚ usob pr´ace s knihovnou. Configuration config = new XMLConfiguration(new File(”config.xml”)); String parametrA = config.getString(”parametrA”);
Uk´ azka 3.2: Z´ısk´an´ı parametru z XML dokumentu N´apovˇeda k vlastn´ım akc´ım se z´ısk´av´a jako n´avratov´a hodnota metody getHelp(), jej´ıˇz hlaviˇcka je v rozhran´ı VlastniAkce. Metoda vrac´ı ˇretˇezec, ve kter´em je cel´a n´apovˇeda vˇcetnˇe HTML form´atov´an´ı.
3.1.3
Vytvoˇ ren´ı nov´ e tˇ r´ıdy AbstraktniVlastniAkce
C´ılem u ´kolu bylo vytvoˇrit novou abstraktn´ı tˇr´ıdu AbstraktniVlastniAkce, kter´a by umoˇznila definovat spoleˇcn´e chov´an´ı pro vˇsechny vlastn´ı akce, a implementovat do t´eto abstraktn´ı tˇr´ıdy naˇc´ıt´an´ı n´apovˇedy a ˇretˇezcov´ ych konstant ze souboru. Vˇsechny vlastn´ı akce pouˇz´ıvaj´ı rozhran´ı VlastniAkce, aby je validaˇcn´ı server byl schopen rozpoznat jako vlastn´ı akce a pouˇz´ıt v r´amci kroku validace. Rozhran´ı vˇsak umoˇzn ˇuje pouze definovat hlaviˇcky metod, ne jejich implemenentace. Na obr´azku 3.2 je zn´azornˇen diagram tˇr´ıd pro rozhran´ı VlastniAkce.
30
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
Obr´ azek 3.2: UML diagram tˇr´ıd pro rozhran´ı VlastniAkce
3.1.4
Refaktor akce Spuˇ stˇ en´ı JUnit“ ”
C´ılem u ´kolu bylo pˇrepsat vlastn´ı akci SpusteniVsechJunitTestu tak, aby prov´adˇela pouze samotn´e spuˇstˇen´ı JUnit test˚ u. Tato vlastn´ı akce byla p˚ uvodnˇe vytvoˇrena na m´ıru pro pˇredmˇetu KIV/OOP a prov´adˇela nˇekolik ˇcinnost´ı: 1. kop´ırov´an´ı JUnit adres´aˇre z adres´aˇre validaˇcn´ı dom´eny do pracovn´ıho adres´aˇre, 2. kop´ırov´an´ı Framework adres´aˇre z adres´aˇre validaˇcn´ı dom´eny do pracovn´ıho adres´aˇre, 3. kompilaci zdrojov´ ych soubor˚ u v pracovn´ım adres´aˇri, 4. spuˇstˇen´ı JUnit test˚ u v souborech, kter´e zaˇc´ınaly slovem Test“ a konˇcily ” pˇr´ıponou class. Pro ˇcinnosti 1, 2, 3 existuj´ı uˇz samostatn´e vlastn´ı akce - Kop´ırovat ad” res´aˇre do workdir“ a Kompilace adres´aˇre“. ”
31
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
3.1.5
N´ apovˇ eda na vytv´ aˇ ren´ı akc´ı do Wiki
C´ılem u ´kolu bylo sepsat do Redmine wiki n´apovˇedu, jak vytv´aˇret nov´e vlastn´ı akce vyuˇz´ıvaj´ıc´ı Maven. Redmine wiki je dostupn´a na adrese http://students.kiv.zcu.cz:3000/projects/validator/wiki. U tohoto u ´kolu se vyb´ızelo, aby byl proveden dˇr´ıv. Uznal jsem ale za vhodnˇejˇs´ı napsat n´apovˇedu aˇz po vˇetˇs´ım obezn´amen´ı se s celkov´ ym pracovn´ım postupem.
3.1.6
´ Uprava pom.xml souboru
C´ılem bylo poupravit u vˇsech vlastn´ıch akc´ı soubor pom.xml, aby se do generovan´eho, nasaditeln´eho jar souboru nedostaly nepotˇrebn´e vˇeci. Vu ´kolu zm´ınil zadavatel pouze, ˇze se do generovan´eho jar souboru pˇrid´avaj´ı soubory ze sloˇzky resources. Prvotn´ı anal´ yza neodhalila v generovan´ ych souborech ˇz´adn´e nepotˇrebn´e soubory nav´ıc. Moje hypot´eza je takov´a, ˇze probl´em byl zp˚ usoben nevhodn´ ym pojmenov´an´ım sloˇzky resources pro r˚ uzn´e pomocn´e soubory, a proto se jak´ ykoliv obsah sloˇzky resources pˇrid´aval do generovan´eho jar souboru. Po implementaci u ´kolu Vytvoˇren´ı nov´e tˇr´ıdy Abs” traktniVlastniAkce“ se vˇsak tato sloˇzka zaˇcala vyuˇz´ıvat korektn´ım zp˚ usobem pro pˇribalov´an´ı konfiguraˇcn´ıho souboru a n´apovˇedy, a ostatn´ı soubory kromˇe tˇechto dvou byly pˇresunuty do jin´ ych sloˇzek. Ve v´ ysledku se tak tento u ´kol vyˇreˇsil spoleˇcnˇe s u ´kolem Vytvoˇren´ı nov´e tˇr´ıdy AbstraktniVlastniAkce“. ”
3.1.7
Dom´ eny otestovateln´ e bez uk´ azkov´ ych soubor˚ u
C´ılem u ´kolu bylo umoˇznit testov´an´ı dom´en bez pos´ıl´an´ı souboru na server. Validaˇcn´ı dom´eny lze testovat ve webov´em rozhran´ı. K otestov´an´ı mus´ı uˇzivatel vˇzdy nahr´at soubor, kter´ y chce otestovat, coˇz odpov´ıd´a re´aln´emu vyuˇzit´ı – valid´ator se pouˇz´ıv´a pˇri odevzd´av´an´ı pr´ace studentem. Na obr´azku 3.3 je tlaˇc´ıtko pro otestov´an´ı dom´eny ve webov´em rozhran´ı. U nˇekter´ ych uk´azkov´ ych dom´en by byla uˇziteˇcn´a moˇznost otestovat dom´enu bez vybr´an´ı souboru, protoˇze dan´e dom´eny ˇza´dn´ y vstupn´ı soubor nepotˇrebuj´ı a pracuj´ı pouze s pˇredpˇripraven´ ymi soubory. 32
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
Obr´ azek 3.3: Testov´an´ı dom´eny ve webov´em rozhran´ı
3.1.8
Vytvoˇ ren´ı akce Vymaˇ z soubory podle vzoru
C´ılem u ´kolu bylo vytvoˇrit novou vlastn´ı akci, kter´a by umˇela smazat soubory v konkr´etn´ım adres´aˇri podle vzorov´eho adres´aˇre. V pˇredmetu KIV/OOP studenti ˇcasto odevzdv´avaj´ı archivy, kter´e obsahuj´ı jak jejich vlastn´ı zdrojov´e k´ody, tak jin´e zdrojov´e k´ody, kter´e potˇrebuj´ı v r´amci cel´e odevzd´avan´e pr´ace. Studenti maj´ı za u ´kol napˇr´ıklad vytvoˇrit jednotkov´e testy k poskytnut´ ym tˇr´ıd´am. Na validaˇcn´ım serveru se pak kompiluj´ı a testuj´ı vˇsechny zdrojov´e soubory obsaˇzen´e v odevzdan´em archivu. M˚ uˇze vˇsak nastat situace, ˇze by si student upravil zdrojov´e k´ody poskytnut´ ych tˇr´ıd tak, aby testy proˇsly. Z tohoto d˚ uvodu by se hodila vlastn´ı akce, kter´a by smazala pomocn´e soubory, kter´e pak mohou b´ yt nahrazeny soubory, o kter´ ych m´ame jistotu, ˇze nebyly upraveny.
3.1.9
Vyzkouˇ sen´ı akce na kontrolu poˇ ctu str´ anek a slov
C´ılem u ´kolu bylo vyzkouˇset funkˇcnost vlastn´ı akce Spoˇcti slova“ a napsat ” n´apovˇedu k t´eto vlastn´ı akci. Vlastn´ı akce Spoˇcti slova“ slouˇz´ı ke zjiˇstˇen´ı poˇctu slov a stran v doku” mentech typu doc a pdf. Akce m´a tˇri parametry. Prvn´ı parametrem – Soubor (JS)“ – je soubor, kter´ y se m´a analyzovat. ” Pokud parametr nen´ı zad´an, pouˇzije se jako hodnota odevzd´avan´ y soubor. V opaˇcn´em pˇr´ıpadˇe mus´ı b´ yt v parametru uvedena javascriptov´a promˇenn´a, kter´a v sobˇe obsahuje objekt typu java.io.File. Druh´ ym parametrem – Poˇcet slov (JS)“ – je v´ ystupn´ı javascriptov´a promˇenn´a, do kter´e se m´a ulo” ˇzit poˇcet slov nalezen´ ych v dokumentu. V´ ystupn´ı promˇenn´e se vytvoˇr´ı v 33
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
r´amci bˇehu akce. Tˇret´ım parametrem – Poˇcet stran (JS)“ – je v´ ystupn´ı ” javascriptov´a promˇenn´a, do kter´e se m´a uloˇzit poˇcet stran nalezen´ ych v dokumentu. Pro spr´avn´e fungov´an´ı vlastn´ı akce mus´ı b´ yt uveden alespoˇ n jeden z parametr˚ u Poˇcet stran (JS)“ nebo Poˇcet slov (JS)“. ” ”
3.1.10
´ Uprava souborov´ e struktury vlastn´ıch akc´ı
C´ılem u ´kolu bylo, aby vˇsechny existuj´ıc´ı vlastn´ı akce mˇely v SVN uloˇzen´e i texty a soubory z uk´azkov´ ych dom´en. Soubory, kter´e se vyuˇz´ıvaj´ı v uk´azkov´ ych dom´en´ach, a popisy krok˚ u uk´azkov´ ych dom´en nebyly nijak verzov´any. Pˇr´ıstup k uk´azkov´ ym dom´en´am dost´avaj´ı zpravidla vˇsichni uˇzivatel´e testovac´ıho valid´atoru. Kdyby se stalo, ˇze by nˇekdo uk´azkovou dom´enu smazal, byly by nen´avratnˇe smaz´any i tyto soubory a texty, a cel´a uk´azkov´a dom´ena by se musela tvoˇrit znovu. Proto by u sebe mˇely m´ıt vlastn´ı akce i tyto ostatn´ı zdroje souvisej´ıc´ı s uk´azkovou dom´enou, kter´a se k nim v´aˇze.
3.1.11
Refaktorov´ an´ı akce SpustitPMD a SpustitUMLTestovani
C´ılem u ´kolu bylo refaktorovat akce SpustitPMD“ a SpustitUMLTestovani“ ” ” do Maven form´atu. Tyto dvˇe vlastn´ı akce jako jedin´e jeˇstˇe nebyly pˇrevedeny do Maven form´atu. Net´ ykal se jich proto ani u ´kol Vytvoˇren´ı abstraktn´ı tˇr´ıdy Abstrakt” niVlastniAkce“, kdy se text n´apovˇedy a konfigurace vlastn´ı akce pˇresunuly do soubor˚ u v adres´aˇri resources (bez Maven form´atu by se do nasaditeln´eho jar souboru nepˇr´ıd´avaly automaticky soubory z resources a akce by nefungovala spr´avnˇe, protoˇze by se nenaˇcetl konfiguraˇcn´ı soubor).
3.1.12
Doplnˇ en´ı serveru / util class o standardnˇ e pouˇ z´ıvan´ e akce
C´ılem u ´kolu bylo vytvoˇrit na stranˇe serveru novou pomocnou tˇr´ıdu pro ˇcasto pouˇz´ıv´an´e ˇcinnosti ve vlastn´ıch akc´ıch. 34
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı ˇ Casto pouˇz´ıvanou ˇcinnost´ı je napˇr´ıklad z´ısk´an´ı objektu typu java.io.File z ˇretˇezce, kter´ y uˇzivatel zadal v parametru vlastn´ı akce ˇci pˇrevod regul´arn´ıho v´ yrazu zapsan´eho v DOS tvaru do tvaru, se kter´ ym m˚ uˇze pracovat standardn´ı Java metoda Pattern.matches().
3.1.13
Doplnˇ en´ı Wiki o procesu pr´ ace s valid´ atorem
C´ılem u ´kolu bylo napsat n´avody do wiki, kter´e popisuj´ı kompletnˇe cel´ y proces pr´ace s valid´atorem. Do wiki bylo tˇreba dopsat jeˇstˇe tyto n´avody: jak spustit valid´ ator na lok´aln´ım PC, jak prov´est build valid´ atoru na lok´aln´ım PC, jak nasadit na server novou verzi valid´ atoru.
3.1.14
Vyˇ reˇ sit um´ıstˇ en´ı pomocn´ ych soubor˚ u pro jednotliv´ e uk´ azky
C´ılem u ´kolu bylo prov´est anal´ yzu, kam by bylo nejlepˇs´ı uloˇzit soubory pouˇz´ıv´an´e v uk´azkov´ ych dom´en´ach pro veˇrejn´e staˇzen´ı. Uk´azkov´e soubory byly um´ıstˇeny ke staˇzen´ı na adrese home.zcu.cz/∼ scais, coˇz je univerzitou poskytnut´ y domovsk´ y adres´aˇr pro Orion uˇzivatele scais.
3.1.15
´ Uprava vlastn´ıch akc´ı na pouˇ zit´ı checkbox˚ u
C´ılem u ´kolu byla u ´prava parametr˚ u typu ano/ne na checkboxov´e parametry ve vˇsech vlastn´ıch akc´ıch a pˇrepsat odpov´ıdaj´ıc´ım zp˚ usobem n´apovˇedu k tˇemto parametr˚ um. Doposud byly ve vˇsech vlastn´ıch akc´ıch parametry typu ano/ne implementov´any tak, ˇze uˇzivatel musel do textov´eho pole zad´avat konkr´etn´ıho hodnotu – ano/true ˇci ne/false. Takto zadan´e hodnoty uˇzivatelem se n´aslednˇe jeˇstˇe ve 35
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
zdrojov´em k´odu validovaly a aˇz pot´e bylo moˇzn´e nastavit hodnotu boolevsk´e promˇenn´e. Textov´e zad´av´an´ı pro parametry typu ano/ne je uˇzivatelsky neintuitivn´ı a technicky nevhodn´e.
3.1.16
Pˇ reddefinovan´ e hodnoty parametr˚ u
C´ılem u ´kolu bylo umoˇznit u vˇsech parametr˚ u vlastn´ıch akc´ı nastavit pˇreddefinov´e hodnoty. Pˇri v´ ybˇeru vlastn´ı akce ve webov´em rozhran´ı se textov´e pole ˇci checkboxy vygeneruj´ı pr´azdn´e. U nˇekter´ ych parametr˚ u nen´ı vˇzdy zˇrejm´e, co m˚ uˇze uˇzivatel zadat bez toho, aniˇz by se pod´ıval do n´apovˇedy, nebo se ve vˇetˇsinˇe pˇr´ıpad˚ u pouˇz´ıv´a stejn´a hodnota, takˇze uˇzivatel je nucen ji opakovanˇe zad´avat. Pˇreddefinovan´e hodnoty parametr˚ u by toto vyˇreˇsily.
3.1.17
Parametrizace odkazem u vlastn´ıch akc´ı
C´ılem u ´kolu bylo umoˇznit u vybran´ ych parametr˚ u vlastn´ıch akc´ı referencovat hodnoty javaskriptov´ ych promˇenn´ ych, pˇriˇcemˇz referencovat by bylo moˇzn´e pouze javaskriptov´e promˇenn´e, kter´e v sobˇe maj´ı uloˇzen objekt typu java.io.File. Pˇr´ıkladem takov´e akce je Najdi soubory“, kter´a slouˇz´ı pro ” vyhled´an´ı soubor˚ u v samotn´em pracovn´ım adres´aˇri ˇci jeho podadres´aˇri. Nˇekter´e vlastn´ı akce potˇrebuj´ı v parametru uv´est cestu ke konkr´etn´ımu souboru. Cestu ale nelze uv´est napevno, protoˇze n´azev pracovn´ı sloˇzky se mˇen´ı s kaˇzdou novou validac´ı. Existuj´ı vlastn´ı akce, jejichˇz v´ ystupem je javaskritpov´a promˇenn´a, kter´a obsahuje objekt typu java.io.File – napˇr´ıklad Rozbal ZIP / JAR“ ˇci Najdi soubory“. ” ”
3.1.18
Dynamick´ e pˇ rid´ av´ an´ı dalˇ s´ıch kategori´ı
C´ılem u ´kolu byla moˇznost dynamicky definovat kategorie vlastn´ıch akc´ı. Tento u ´kol navazuje na u ´kol Kategorizace vlastn´ıch akc´ı“. ”
36
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
3.1.19
ukazka-kontrolanepovolenychsouboru
C´ılem u ´kolu bylo pˇridat do uk´azkov´eho archivu pro dom´enu ukazka-kontrola” nepovolenychsouboru“ soubor nazdar.txt, kter´ y m´a ovˇeˇrit, ˇze akce rozliˇsuje velikost p´ısmen. Vlastn´ı akce Kontrolovat nepovolen´e soubory“ funguje tak, ˇze prohle” d´av´a v zadan´em adres´aˇri v´ yskyt nepovolen´ ych typ˚ u souboru, kter´e jsou zad´any parametrem. Pokud akce nalezne nepovolen´ y typ, pˇrid´a do v´ ysledku validace chybu. Prohled´av´an´ı soubor˚ u rozliˇsuje velikost p´ısmen. Uk´azkov´a dom´ena m´a v parametru uvedeno TXT. Pˇri bˇehu uk´azkov´e dom´eny by proto soubor nazdar.txt mˇel b´ yt ignorov´an.
3.1.20
ukazka-kopirovatslozkydoworkdir
C´ılem u ´kolu bylo upravit text, kter´ y se vypisuje pˇri u ´spˇeˇsn´em zkop´ırov´an´ı sloˇzek akc´ı Kop´ırovat sloˇzky do workdir“. ” Akce pˇri u ´spˇeˇsn´em zkop´ırov´an´ı sloˇzek vypisovala text: Adres´aˇre byly ” u ´spˇeˇsnˇe zkop´ırov´any“. Spr´avnˇe by vˇsak mˇela vypisovat: Sloˇzky byly u ´spˇeˇsnˇe ” zkop´ırov´any“.
3.1.21
ukazka-najdisoubory
Pˇri pouˇzit´ı akce Najdi soubory“ se do JS promˇenn´e uklad´a pln´a cesta sou” boru. Pˇri pouˇzit´ı akce Najdi adres´aˇre“ se do JS promˇenn´e ukl´ad´a pouze ” n´azev adres´aˇre. C´ılem u ´kolu bylo rozhodnout, kter´ y z pˇr´ıstup˚ u je vhodnˇejˇs´ı a upravit podle rozhodnut´ı druhou akci.
3.1.22
ukazka-porovnanistrukturyadresaru
C´ılem u ´kolu bylo pˇridat do ukazkov´e dom´eny ukazka-porovnanistruktury” adresaru“ soubor nav´ıc, aby bylo moˇzn´e otestovat funkˇcnost pˇrep´ınaˇce Jsou ” extra soubory chyba?“.
37
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
Dom´ena ukazka-porovnanistrukturyadresaru“ m´a dva kroky. V prvn´ım ” kroku se z adres´aˇre dom´eny zkop´ıruj´ı do pracovn´ıho adres´aˇre dva podadres´aˇre: vzorovyAdresar a porovnavanyAdresar. V druh´em kroku je pouˇzita vlastn´ı akce Porovnat strukturu adres´aˇr˚ u“. Akce m´a tˇri parametry: ” Vzorov´ y adres´aˇr (JS)“, Porovn´avan´ y adres´aˇr“ a Jsou extra soubory chyba?“. ” ” ” Parametry Vzorov´ y adres´aˇr (JS)“ a Porovn´avan´ y adres´aˇr“ maj´ı hodnotu ” ” vzorovyAdresar a porovnavanyAdresar. Pokud bude v adres´aˇri porovnavanyAdresar soubor nav´ıc, mˇela by vlastn´ı akce Porovnat struktury adres´aˇr˚ u“ pˇri zaˇskrtnut´ı parametru Jsou extra ” ” soubory chyba?“ vypsat do v´ ysledku validace chybu.
3.1.23
Pˇ rid´ an´ı nov´ ych poloˇ zek do rozhran´ı ValidationResult
C´ılem u ´kolu bylo pˇrid´an´ı dalˇs´ı poloˇzky VR_TEST_NOT_PASSED do seznamu stav˚ u, kter´ ymi m˚ uˇze validace skonˇcit. Validace m˚ uˇze konˇcit r˚ uzn´ ymi stavy. Implicitnˇe se pouˇz´ıv´a obecn´ y stav VR_OK, kter´ y je urˇcen pro validaci bez chyb, a VR_BAD_RESULTS, kter´ y nast´av´a kdyˇz se ve v´ ysledku validace vyskytne chyba. Nov´ y stav VR_TEST_NOT_PASSED by mˇel slouˇzit pro indikaci situace, kdy odevzdan´ y soubor neproˇsel automatick´ ymi testy.
3.1.24
Pˇ rejmenovat vlastn´ı akci spoctislova na spoctislovaastrany
C´ılem u ´kolu bylo pˇrejmenovat vlastn´ı akci spoctislova“ na spoctislova” ” astrany“, aby v´ıce odr´aˇzela jej´ı funkcionalitu.
3.1.25
String index out of range: -86
C´ılem u ´kolu bylo vyˇreˇsit bug, kter´ y nast´aval pˇri testov´an´ı dom´eny. Bug se projevoval v prohl´ıˇzeˇc´ıch Chrome 28 a Opera 15. V prohl´ıˇzeˇci Firefox 22 se tento bug neprojevoval. V´ ypis chyby indikoval pouˇzit´ı ˇspatn´eho 38
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
indexu, kter´ y byl mimo velikost zpracov´avan´eho ˇretˇezce, a odkazoval do souboru FileInput.java na ˇra´dku 104. Na t´eto ˇra´dce se prov´adˇel kus k´odu metody getParameter(), kter´ y je uveden v uk´azce 3.3. int end = content.indexOf(”−−−−−−−−−−”, pos);
Uk´ azka 3.3: Bug v metodˇe getParameter() Metoda getParameter() slouˇz´ı k z´ısk´an´ı parametru pˇri posl´an´ı formul´aˇre z klienta na server a funguje tak, ˇze v HTTP poˇzadavku najde index v´ yskytu ˇretˇezce Content-disposition: form-data; name="nazevParametru", od tohoto indexu hled´a oddˇelovaˇc dalˇs´ıho parametru a nakonec vr´at´ı hodnotu, kter´a je o jednu ˇr´adku nad oddˇelovaˇcem. Uk´azalo se, ˇze vykreslovac´ı j´adro pouˇz´ıvan´e prohl´ıˇzeˇcem Chrome – WebKit (nyn´ı uˇz Blink), pouˇz´ıv´a pro oddˇelov´an´ı parametr˚ u menˇs´ı poˇcet pomlˇcek neˇz ostatn´ı j´adra. Zat´ımco j´adra ostatn´ıch prohl´ıˇzeˇc˚ u pouˇz´ıv´aj´ı 10 pomlˇcek, Webkit pouˇz´ıv´a pouze 6.
3.1.26
Nejde vlastn´ı akce Velikost souboru
C´ılem u ´kolu bylo vyˇreˇsit bug, kter´ y se vyskytnul v kroku 3 dom´eny oop03“. ” Popis bugu byl takov´ y, ˇze pˇri editov´an´ı kroku 3 se nezobrazily ˇza´dn´e parametry akce. Pˇri pokusu o uloˇzen´ı kroku nastala vyj´ımka java.lang.NullPointerException. Kdyˇz jsem se snaˇzil bug reprodukovat editov´an´ım kroku 3 v dom´enˇe oop03“, nenarazil jsem na ˇza´dn´e probl´emy. Uloˇzen´ı tak´e probˇehlo v po” ˇra´dku. Bug se n´aslednˇe jiˇz neprojevil. Po konzultaci s vedouc´ım pr´ace byl bug uzavˇren s t´ım, ˇze probl´emy byly zˇrejmˇe zp˚ usoben´e soubˇehem nˇekolika ud´alost´ı (restartov´an´ı serveru, spouˇstˇen´ı uk´azkov´e dom´eny).
3.1.27
Jak nastavit poˇ c´ ateˇ cn´ı adres´ aˇ r pro Javadoc?
C´ılem u ´kolu bylo poskytnout pomoc pˇri nastavov´an´ı vlastn´ı akce Kontrolovat ” Javadoc koment´aˇre“. Pˇri testov´an´ı dom´eny oop03“ vyskoˇcila zadavateli vy” j´ımka org.mozilla.javascript.EvaluatorException. 39
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
U tohoto u ´kolu jsem opˇet nedok´azal chybu reprodukovat. V logu jsem naˇsel, ˇze k vyj´ımce doˇslo, ale pˇri spuˇstˇen´ı stejn´e dom´eny probˇehlo vˇse v poˇra´dku. Tento u ´kol i u ´kol Nejde vlastn´ı akce Velikost souboru“ byly v logu ” zaznamen´any kr´atce po sobˇe, z ˇcehoˇz usuzuji, ˇze vyj´ımky pˇri testov´an´ı byly n´asledkem nespr´avn´eho bˇehu cel´eho valid´atoru a po restartu uˇz vˇse fungovalo jak mˇelo.
3.1.28
OK hl´ aˇ sen´ı JUnit testu metody
C´ılem u ´kolu bylo zmˇenit v´ ystup akc´ı Spustit konkr´etn´ı JUnit test“ a Spustit ” ” vˇsechny JUnit testy“ tak, aby pˇri u ´spˇeˇsn´em pr˚ ubˇehu test˚ u vypsaly hl´aˇsku OK“ a OK xy tests“. ” ” V´ ystupem obou akc´ı jsou 2 soubory – jeden soubor pro chybov´ y v´ ystup a jeden soubor pro standardn´ı v´ ystup. Do standardn´ıho v´ ystupu se pˇri u ´spˇeˇsn´em pr˚ ubˇehu vˇsech test˚ u nevypisoval ˇza´dn´ y text.
3.1.29
Vlastn´ı akce Kop´ırov´ an´ı soubor˚ u
C´ılem u ´kolu bylo pˇridat do vlastn´ı akce Kop´ırovat soubory do workdir“ ” moˇznost kop´ırovat soubory z podsloˇzky dom´eny a moˇznost u ´vest soubory, kter´e se maj´ı zkop´ırovat, regul´arn´ım v´ yrazem. Vlastn´ı akce Kop´ırovat soubory do workdir“ mˇela pouze jeden parametr ” Seznam soubor˚ u pro zkop´ırov´an´ı“. Do tohoto parametru se uv´adˇely kon” kr´etn´ı soubory, kter´e se mˇely zkop´ırovat ze sloˇzky dom´eny.
3.1.30
Nov´ a vlastn´ı akce generovanijavadoc
C´ılem u ´kolu bylo dokonˇcit vlastn´ı akci Generov´an´ı Javadoc“ tak, aby fun” govala. Vlastn´ı akce Generov´an´ı Javadoc“ mˇela slouˇzit k vygenerov´an´ı Javadoc ” dokumentace zdrojov´ ych soubor˚ u na stranˇe serveru a mˇela pouze jedin´ y parametr. Tento parametr mˇel slouˇzit jako ˇretˇezec, kter´ y se pˇresnˇe tak, jak je zaps´an, pˇred´a pˇr´ıkazu javadoc, aby vygeneroval dokumentaci.
40
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
Akce nebyla dokonˇcena a generov´an´ı dokumentace nefungovalo pˇri zad´an´ı parametru -d / /*.java – pˇr´ıkaz javadoc vypsal chybu, ˇze soubor nelze naj´ıt. Anal´ yzou chyby jsem doˇsel k z´avˇeru, ˇze pˇr´ıkaz javadoc se snaˇzil naj´ıt soubor * m´ısto aby interpretoval hvˇezdiˇcku jako vˇsechny soubory. Zkoum´an´ım Linuxovsk´eho programu shell jsem zjistil, ˇze pˇri pouˇzit´ı hvˇezdiˇcky program shell automaticky dosazuje za hvˇezdˇciku cestu ke vˇsem soubor˚ um v dan´em adres´aˇri.
3.1.31
Nefunguj´ıc´ı dom´ ena a prapodivn´ e chov´ an´ı valid´ atoru
C´ılem u ´kolu bylo zjistit, co bylo pˇr´ıˇcinou divn´eho chov´an´ı valid´atoru, kdyˇz s n´ım zadavatel pracoval. Zadavatel popisuje, ˇze pˇri pr´aci s valid´atorem najednou zmizela dom´ena oop01“. Zmizen´ı nastalo po tom, co se zadavatel snaˇzil pˇridat dalˇs´ı krok do ” dom´eny. Pˇri anal´ yze jsem zjiˇst’oval, jestli dom´ena zmizela i z adres´aˇrov´e struktury serveru. Adres´aˇr pro dom´enu oop01“ st´ale existoval, pouze se nezobrazoval. ” Jedin´ y soubor, kter´ y se bˇehem u ´pravy dom´eny mohl zmˇenit a kter´ y mohl m´ıt vliv na zobrazen´ı dom´eny ve webov´em rozhran´ı, je soubor webmodule.xml. Nevˇedˇel jsem, kde konkr´etnˇe chyba byla, takˇze jsem si udˇelal z´alohu souboru webmodule.xml a zkouˇsel upravovat soubor, abych lokalizoval chybu. Chyba byla v tom, ˇze v jednom z krok˚ u zadavatel zvolil moˇznost vloˇzen´ı ” do v´ ystupu validace“ a vlastn´ım skriptem“ a do vlastn´ıho skriptu zadal ” nevalidn´ı hodnotu. Tato nevalidn´ı hodnota byla statick´ y text bez uvozovek.
3.1.32
Chyba pˇ ri rozbalov´ an´ı JAR
C´ılem u ´kolu bylo pˇri rozbalov´an´ı archivu akc´ı Rozbalit ZIP / JAR“ odchy” tit vyj´ımku, kter´a nastane pˇri pokusu o rozbalen´ı archivu s akcentovan´ ymi znaky. Pokud byl vlastn´ı akci pˇred´an archiv obsahuj´ı soubor nebo podsloˇzku s akcentovan´ ymi znaky, byl tento soubor ˇci sloˇzka pˇri rozbalov´an´ı ignorov´an. Archiv se rozbalil, ale defacto ˇspatnˇe a uˇzivatel se to nemˇel moˇznost dozvˇedˇet, 41
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
dokud se nepod´ıval do souborov´e struktury valid´atoru. Vlastn´ı akce Rozbalit ZIP / JAR“ vyuˇz´ıv´a pro rozbalov´an´ı pomocnou ” statickou metodu ZipExtractor.extractZipArchive() na stranˇe serveru. Tato pomocn´a metoda uˇz mˇela catch sekci, ktera odchyt´avala veˇsker´e chyby bˇehem rozbalov´an´ı a pouze vypsala chybu na chybov´ y v´ ystup.
3.1.33
Chybn´ e vyhodnocen´ı v´ ysledku duck-testu
C´ılem u ´kolu bylo upravit akci Spustit Duck Testy“ tak, aby mohly main() ” metody test˚ u vypisovat do standardn´ıho v´ ystupu jin´ y text. Akce Spustit Duck Testy“ funguje n´asleduj´ıc´ım zp˚ usobem: ” 1. rozbalen´ı odevzdan´eho archivu, 2. spuˇstˇen´ı main metod u vˇsech soubor˚ u zaˇc´ınaj´ıc´ı slovem TestDuck, 3. vyhodnocen´ı v´ ystup˚ u po spuˇsten´ı main metod. Tˇr´ıdy zaˇc´ınaj´ıc´ı TestDuck jsou JUnit testy naps´any tak, ˇze maj´ı main() metodu, ve kter´e prov´ad´ı samotn´e testov´an´ı. Pˇri validaci je valid´ator pouze vol´a. V kroku ˇc´ıslo 3 pak vyhodnocov´an´ı prob´ıh´a tak, ˇze se kontroluje poˇcet ˇra´dek v´ ystupn´ıho souboru. Pokud se tedy v r´amci main() metody vyp´ıˇse do standardn´ıho v´ ystupu nˇejak´ y test dalˇs´ı text, zv´ yˇs´ı se poˇcet ˇr´adek a validace vr´at´ı ˇspatn´ y v´ ysledek. Aby mohly testy vypisovat do standardn´ıho v´ ystupu dalˇs´ı text, bude tˇreba zmˇenit zp˚ usob vyhodnocov´an´ı v´ ystupn´ıho souboru.
3.2
Pl´ an ˇ reˇ sen´ı
Rozmyslet poˇrad´ı plnˇen´ı u ´kol˚ u byl poˇzadavek ze zad´an´ı diplomov´e pr´ace a z´aroveˇ n i u ´kol v Redmine. Proto tento u ´kol nen´ı uveden samostatnˇe pˇri anal´ yze n´amˇet˚ u na vylepˇsen´ı v kapitole 3.1, ale je mu vˇenov´ana samostatn´a kapitola. Nˇekter´e u ´koly spolu souvisely nebo na sobˇe z´avisely a bylo nutn´e dopˇredu urˇcit poˇrad´ı vykon´an´ı, aby se vz´ajemnˇe negativnˇe neovlivˇ novaly a aby nebylo tˇreba dˇelat nˇejak´e ˇcinnosti v´ıcekr´at. Pl´an musel tak´e br´at v potaz vyˇsˇs´ı 42
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı
prioritu u ´kol˚ u souvisej´ıc´ıch s pˇredmˇetem KIV/OOP, protoˇze tento pˇredmˇet je vyuˇcov´an bˇehem zimn´ıho semestru a vyuˇz´ıv´a pro kontrolu samostatn´ ych prac´ı student˚ u validaˇcn´ı server. V´ ysledkem anal´ yzy vˇsech poˇc´ateˇcn´ıch u ´kol˚ u byla tabulka 3.2. Tabulka 3.2: Poˇc´ateˇcn´ı pl´an ˇreˇsen´ı Poˇrad´ı vykon´ an´ı N´ azev u ´kolu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Rozmyslet poˇrad´ı plnˇen´ı u ´kol˚ u Kategorizace vlastn´ıch akc´ı Zmˇenit pouˇzit´ı n´apovˇedy u vlastn´ıch akc´ı Refaktor akce Spuˇstˇen´ı JUnit N´ apovˇeda na vytv´aˇren´ı akc´ı do Wiki ´ Uprava pom.xml souboru Dom´eny otestovateln´e bez uk´azkov´ ych soubor˚ u Vytvoˇren´ı akce Vymaˇz soubory podle vzoru Vyzkouˇsen´ı a pops´an´ı akce na kontrolu poˇctu str´anek a slov ´ Uprava souborov´e struktury vlastn´ıch akc´ı Refaktorov´ an´ı akce SpustitPMD a SpustitUMLTestovani Doplnˇen´ı serveru / util class o standardnˇe pouˇz´ıvan´e akce Doplnˇen´ı Wiki o procesu pr´ace s valid´atorem Vyˇreˇsit um´ıstˇen´ı pomocn´ ych soubor˚ u pro jednotliv´e uk´azky ´ Uprava vlastn´ıch akc´ı na pouˇzit´ı checkbox˚ u Pˇreddefinovan´e hodnoty parametr˚ u Parametrizace odkazem u vlastn´ıch akc´ı
´ Ukoly bˇehem pr´ace pˇrib´ yvaly. Nov´e u ´koly jsem se snaˇzil zaˇradit do souˇcasn´e pr´ace tak, jak bylo nejvhodnˇejˇs´ı. Koneˇcn´e poˇrad´ı vykon´an´ı u ´kol˚ u je v tabulce 3.3
43
Anal´yza n´amˇet˚ u na vylepˇsen´ı a pl´an ˇreˇsen´ı Tabulka 3.3: Koneˇcn´ y seznam u ´kol˚ u v poˇrad´ı vykon´an´ı Poˇrad´ı vykon´ an´ı 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
N´ azev u ´kolu Rozmyslet poˇrad´ı plnˇ en´ı u ´kol˚ u Kategorizace vlastn´ıch akc´ı Zmˇ enit pouˇ zit´ı n´ apovˇ edy u vlastn´ıch akc´ı Vytvoˇren´ı nov´ e tˇr´ıdy AbstraktniVlastniAkce Refaktor akce Spuˇstˇ en´ı JUnit N´ apovˇ eda na vytv´ aˇren´ı akc´ı do Wiki ´ Uprava pom.xml souboru Dom´ eny otestovateln´ e bez uk´ azkov´ ych soubor˚ u Vytvoˇren´ı akce Vymaˇ z soubory podle vzoru Vyzkouˇsen´ı a pops´ an´ı akce na kontrolu poˇ ctu str´ anek a slov ´ Uprava souborov´ e struktury vlastn´ıch akc´ı Refaktorov´ an´ı akce SpustitPMD a SpustitUMLTestovani Doplnˇ en´ı serveru / util class o standardnˇ e pouˇ z´ıvan´ e akce Doplnˇ en´ı Wiki o procesu pr´ ace s valid´ atorem Vyˇreˇsit um´ıstˇ en´ı pomocn´ ych soubor˚ u pro jednotliv´ e uk´ azky ´ Uprava vlastn´ıch akc´ı na pouˇ zit´ı checkbox˚ u Pˇreddefinovan´ e hodnoty parametr˚ u Parametrizace odkazem u vlastn´ıch akc´ı Dynamick´ e pˇrid´ av´ an´ı dalˇs´ıch kategori´ı ukazka-kontrolanepovolenychsouboru ukazka-kopirovatslozkydoworkdir ukazka-najdisoubory ukazka-porovnanistrukturyadresaru Pˇrid´ an´ı nov´ ych poloˇ zek do rozhran´ı ValidationResult Pˇrejmenovat vlastn´ı akci spoctislova na spoctislovaastrany String index out of range: -86 Nejde vlastn´ı akce Velikost souboru Jak nastavit poˇ c´ ateˇ cn´ı adres´ aˇr pro Javadoc? OK hl´ aˇsen´ı JUnit testu metody Vlastn´ı akce Kop´ırov´ an´ı soubor˚ u Nov´ a vlastn´ı akce generovanijavadoc Nefunguj´ıc´ı dom´ ena a prapodivn´ e chov´ an´ı valid´ atoru Chyba pˇri rozbalov´ an´ı JAR Chybn´ e vyhodnocen´ı v´ ysledku duck-testu
44
4 N´avrh ˇreˇsen´ı a implementace n´ amˇ et˚ u na vylepˇ sen´ı V t´eto kapitole navrhu pro kaˇzd´ y u ´kol ˇreˇsen´ı na z´akladˇe anal´ yzy a pop´ıˇsu implementaci ˇreˇsen´ı. Sekci pˇr´ıklady pouˇzit´ı maj´ı pouze u ´koly, kter´e mˇen´ı st´avaj´ıc´ı funkˇcnost nebo zav´ad´ı novou. U u ´kol˚ u typu oprava chyby nebo zmˇena vypsan´e zpr´avy by tato sekce ned´avala smysl. Dokumentace k jednotliv´ ym ˇreˇsen´ım je v pˇr´ıpadˇe vlastn´ıch akc´ı obsaˇzena v jejich HTML n´apovˇedˇe a v ostatn´ıch pˇr´ıpadech v u ´kolech na Redmine.
4.1 4.1.1
Kategorizace vlastn´ıch akc´ı N´ avrh ˇ reˇ sen´ı
Pro spr´avnou kategorizaci vlastn´ıch akc´ı je potˇreba proj´ıt souˇcasn´e existuj´ıc´ı vlastn´ı akce a zamyslet se nad jejich zaˇrazen´ım do konkr´etn´ı kategorie. Pokud vlastn´ı akce nezapad´a do dan´e kategorie, akci je nutno pˇreˇradit. Nejlepˇs´ı zp˚ usob, jak toto prov´est, je otevˇr´ıt si seznam vlastn´ıch akc´ı ve webov´em rozhran´ı a zkontrolovat, zda je vlastn´ı akce zaˇrazena do spr´avn´e ˇ kategorie. Spatnˇ e zaˇrazen´e vlastn´ı akce se sep´ıˇsou a pot´e se uprav´ı jejich kategorie v metodˇe getKategorii().
4.1.2
Implementace ˇ reˇ sen´ı
U vˇsech vlastn´ıch akc´ı jsem zkontroloval, jestli patˇr´ı do odpov´ıdaj´ıc´ıch kategori´ı. Pokud byly ve ˇspatn´e kategorii, nastavil jsem jim spr´avnou. Nov´e kategorie jsem nepˇrid´aval, protoˇze bych musel prov´adˇet zmˇenu k´odu na dvou m´ıstech a vˇedˇel jsem, ˇze v dalˇs´ım u ´kolu budu implementovat dynamick´e pˇrid´av´an´ı kategori´ı, viz u ´kol Dynamick´e pˇrid´av´an´ı dalˇs´ıch kategori´ı“. V tabulce ” 4.1 je seznam akc´ı, kter´e byly pˇrekategorizov´any.
45
N´avrh ˇreˇsen´ı a implementace n´amˇet˚ u na vylepˇsen´ı Tabulka 4.1: Pˇrehled pˇrekategorizovan´ ych vlastn´ıch akc´ı
Pokud bychom v metodˇe getHelp() pouˇzili mechanismus naˇcten´ı parametr˚ u z knihovny Apache Commons Configuration, bude moˇzn´e text n´apovˇedy pˇrepsat do souvisl´eho bloku textu a pˇresunout jej do souboru. Apache Commons Configuration pracuje prim´arnˇe s parametry jako dvojic´ı kl´ıˇc–hodnota. Protoˇze text n´apovˇedy m˚ uˇze b´ yt libovoln´ y dlouh´ y text s HTML znaˇckami, je vhodn´ ym ˇreˇsen´ım pouˇzit´ı XML dokumentu s t´ım, ˇze text n´apovˇedy bude zasazen do CDATA bloku, aby se nemusely pouˇz´ıvat HTML entity. Properties soubory nejsou uzp˚ usoben´e pro dlouh´ y souvisl´ y text v hodnot´ach. Nejprve zkus´ım naˇc´ıt´an´ı n´apovˇedy ze souboru implementovat a odladit v jedn´e vlastn´ı akci. Pokud se bude n´apovˇeda u zvolen´e vlastn´ı akce zobrazovat v poˇr´adku, implementuji naˇc´ıt´an´ı ze souboru i u ostatn´ıch vlastn´ıch akc´ıch.
4.2.2
Implementace ˇ reˇ sen´ı
Vybral jsem si jednu konkr´etn´ı akci – RozbalZipJar, abych mohl otestovat pouˇzit´ı knihovny Apache Commons Configuration. Do metody getHelp() t´eto akce jsem implementoval naˇc´ıt´an´ı konfiguraˇcn´ıho souboru s n´apovˇedou pˇres knihovnu Apache Commons Configuration. N´apovˇedu jsem se rozhodnul uloˇzit souboru do config.xml a tento soubor um´ıstit do sloˇzky src/main/resources. Akce RozbalZipJar spr´avnˇe naˇc´ıtala konfiguraˇcn´ı soubor s n´apovˇedou. Narazilo se vˇsak na dvˇe komplikace. Prvn´ı komplikace byla, ˇze ˇc´ast k´odu pro 46
N´avrh ˇreˇsen´ı a implementace n´amˇet˚ u na vylepˇsen´ı
naˇc´ıt´an´ı konfiguraˇcn´ıho souboru by se musela opakovat beze zmˇeny ve vˇsech ostatn´ıch vlastn´ıch akc´ıch. Mnohem vhodnˇejˇs´ı by bylo nadefinovat tuto ˇca´st spoleˇcnˇe pro vˇsechny akce. Do spoleˇcn´eho rozhran´ı VlastniAkce konkr´etn´ı implementaci ale pˇridat neˇslo. Aby bylo moˇzn´e nadefinovat standardn´ı chov´an´ı spoleˇcn´e pro vˇsechny vlastn´ı akce, musel b´ yt proveden refaktoring st´avaj´ıc´ı hiearchie vlastn´ıch akc´ı. Druhou komplikac´ı bylo, ˇze pro text n´apovˇedy knihovna Apache Commons Configuration vlastnˇe v˚ ubec nebyla tˇreba. Text n´apovˇedy mohl b´ yt v prost´em textov´em souboru a naˇc´ıt´an bˇeˇznˇe jako ˇretˇezec. Avˇsak s ohledem na moˇznosti knihovny Apache Commons Configuration a potˇrebou pro definov´an´ı standardn´ıho spoleˇcn´eho chov´an´ı pro vˇsechny vlastn´ı akce vyplynulo na povrch jin´e pouˇzit´ı pro tuto knihovnu. Konfiguraˇcn´ı soubory ˇslo vyuˇz´ıt pro definov´an´ı ˇretˇezc˚ u, kter´e se pouˇz´ıv´aj´ı v metod´ach getId(), getKategorii(), getNazev(), getPopis() a getParametry(). Popsan´e dvˇe komplikace vedly k tomu, ˇze tento u ´kol byl nakonec uzavˇren a m´ısto nˇej vytvoˇren u ´kol Vytvoˇren´ı nov´e tˇr´ıdy AbstraktniVlastniAkce“, ” kde se snaˇz´ım tyto dvˇe komplikace vyˇreˇsit.
Prvn´ım c´ılem je m´ıt tˇr´ıdu AbstraktniVlastniAkce, kter´a bude implementovat spoleˇcn´e metody pro vˇsechny vlastn´ı akce a bude kompatibiln´ı s pouˇz´ıvan´ ym rozhran´ım. Tato tˇr´ıda bude proto dˇedit od rozhran´ı VlastniAkce. Naopak samotn´e vlastn´ı akce uˇz nebudou pouˇz´ıvat rozhran´ı VlastniAkce a m´ısto toho budou dˇedit od abstraktn´ı tˇr´ıdy AbstraktniVlastniAkce. Zdrojov´ y k´od vlastn´ıch akc´ı se po tomto refaktoringu v´ yraznˇe zpˇrehledn´ı, protoˇze vlastn´ı akce budou muset implementovat pouze metodu execute(). Na obr´azku 4.1 je zn´azornˇen diagram tˇr´ıd po refaktoringu a pouˇzit´ı AbstraktniVlastniAkce. Druh´ ym c´ılem je implementovat naˇc´ıt´an´ı n´apovˇedy a hodnot ze souboru v metod´ach getHelp(), getId(), getKategorii(), getNazev(), getPopis() a getParametry(). Naˇc´ıt´an´ı obou soubor˚ u m˚ uˇze b´ yt provedeno uˇz v konstruktoru AbstraktniVlastniAkce a v metod´ach getHelp(), getId(), getKate47
N´avrh ˇreˇsen´ı a implementace n´amˇet˚ u na vylepˇsen´ı
Obr´ azek 4.1: UML diagram tˇr´ıd pro abstraktn´ı tˇr´ıdu AbstraktniVlastniAkce gorii(), getNazev(), getPopis() a getParametry() se bude pouze vracet naˇcten´ y ˇretˇezec ˇci seznam parametr˚ u. Cel´a n´apovˇeda vlastn´ı akce je ps´ana pomoc´ı HTML. Tud´ıˇz staˇc´ı n´apovˇedu pˇrepsat do prost´eho souvisl´eho textu, odstranit Java escape znaky a tento text uloˇzit do souboru. Do konfiguraˇcn´ıho souboru lze bez pot´ıˇz´ı pˇresunout id, n´azev, popis a kategorii akce. Zpracov´an´ı parametr˚ u bude o nˇeco komplikovanˇejˇs´ı. Metoda getParametry() vrac´ı List<ParametrAkce>, coˇz je seznam vˇsech parametr˚ u vlastn´ı akce. Kaˇzd´ y parametr se do seznamu vkl´ad´a jako nov´ y objekt tˇr´ıdy ParametrAkce v jehoˇz konstruktoru se mus´ı uv´est id, n´azev, popis a typ parametru. V uk´azce 4.1 je pˇr´ıklad metody getParametry() s dvˇema parametry. @Override public List<ParametrAkce> getParametry() { ArrayList<ParametrAkce> list = new ArrayList<ParametrAkce>(); list.add(new ParametrAkce(PARAM_ZIP, ”ZIP/JAR archiv (JS)”, ”ZIP/JAR archiv zadany JS promennou typu java.io.File, defaultne odevzdavany soubor.”, ””)); list.add(new ParametrAkce(PARAM_DEST, ”Cilovy adresar (JS)”, ”Promenna, kam se ulozi adresar s extrahovanymi soubory.”, ””)); return list; }
48
N´avrh ˇreˇsen´ı a implementace n´amˇet˚ u na vylepˇsen´ı
Uk´ azka 4.1: Metoda getParametry() s dvˇema parametry Kaˇzd´ y parametr mus´ı m´ıt v konfiguraˇcn´ım souboru jin´ y kl´ıˇc. Aby bylo moˇzn´e pˇri naplˇ nov´an´ı seznamu parametr˚ u akce naˇc´ıst texty pro tyto parametry, je nutn´e dopˇredu zn´at, pod jak´ ymi kl´ıˇci je hledat. V konfiguraˇcn´ım souboru tedy mus´ı b´ yt pˇred samotn´ ymi texty parametr˚ u jeˇstˇe uvedena deklarace vˇsech parametr˚ u. Aˇz pot´e mohou b´ yt uvedeny hodnoty pro jednotliv´e parametry vlastn´ıch akc´ı. V uk´azce 4.2 je pˇr´ıklad cel´eho konfiguraˇcn´ıho souboru pro vlastn´ı akci ˇ arky mus´ı b´ Rozbal_ZIP. C´ yt zaps´any s escape lom´ıtkem, jinak by se ˇca´rka interpretovala jako oddˇelovaˇc v seznamu hodnot, viz parametr parameters a parametr param_zip.description v uk´azce. id = Rozbal_ZIP name = Rozbalit ZIP / JAR description = Rozbalen´ı ZIP / JAR archivu category = D´ılˇ c´ı akce parameters = param_zip, param_dest param_zip.id = ZIP archiv param_zip.name = ZIP / JAR archiv (JS) param_zip.description = ZIP / JAR archiv zadan´ y JS promˇ ennou typu java.io.File\, defaultnˇ e odevzd´ avan´ y soubor. param_zip.type = param_dest.id = C´ılov´ y adres´ aˇr param_dest.name = C´ılov´ y adres´ aˇr (JS) param_dest.description = Promˇ enn´ a\, kam se uloˇ z´ı adres´ aˇre s extrahovan´ ymi soubory. param_dest.type =
Uk´ azka 4.2: Pˇr´ıklad konfiguraˇcn´ıho souboru
4.3.2
Implementance ˇ reˇ sen´ı
Vytvoˇril jsem abstraktn´ı tˇr´ıdu AbstraktniVlastniAkce v bal´ıˇcku cz.zcu.validationserver.webmodule.actions, kter´a implementuje rozhran´ı VlastniAkce. V t´eto tˇr´ıdˇe jsem vytvoˇril konstruktor, kter´ y vol´a private metody nactiNapovedu a nactiKonfiguraci. V metodˇe nactiNapovedu naˇc´ıt´am n´apovˇedu uloˇzenou v souboru src/main/resources/NazevVlastniAkce-help.html. V metodˇe nactiKonfiguraci naˇc´ıt´am cel´ y konfiguraˇcn´ı soubor uloˇzen´ y v souboru src/main/resources/NazevVlastniAkce-text.properties. 49
N´avrh ˇreˇsen´ı a implementace n´amˇet˚ u na vylepˇsen´ı
Pot´e jsem implementoval metody getId(), getKategorii(), getNazev(), getPopis() a getParametry(). V uk´azce 4.3 je samotn´a implementace naˇc´ıt´an´ı n´apovˇedy. private void nactiNapovedu(String helpFilename) { InputStream helpResource = getClass().getResourceAsStream(”/” + helpFilename); try { help = IOUtils.toString(helpResource, ”UTF−8”); } catch (IOException e) { throw new ValidationError(”Chyba pri zpracovani souboru s napovedou vlastni akce ” + getClass().getSimpleName(), ValidationResult.VR_SERVER_ERROR, e); } }
Uk´ azka 4.3: Metoda pro naˇc´ıt´an´ı n´apovˇedy V metodˇe nactiNapovedu() vyuˇz´ıv´am statickou metodu IOUtils.toString() z knihovny Apache Commons IO pro z´ısk´an´ı obsahu n´apovˇedy jako ˇretˇezce. Vr´acen´ı n´apovˇedy v metodˇe getHelp() se pak zkr´at´ı na jednu ˇr´adku. V uk´azce 4.4 je implementace metody nactiKonfiguraci(). private void nactiKonfiguraci(String configFilename) { InputStream configResource = getClass().getResourceAsStream(”/” + configFilename); try { config = new PropertiesConfiguration(); ((PropertiesConfiguration) config).setEncoding(”UTF−8”); ((PropertiesConfiguration) config).load(configResource) } catch (ConfigurationException e) { throw new ValidationError(”Chyba pri zpracovani souboru s nastavenim vlastni akce ” + getClass().getSimpleName(), ValidationResult.VR_SERVER_ERROR, e); } }
Uk´ azka 4.4: Metoda pro naˇc´ıt´an´ı konfiguraˇcn´ıho souboru V metodˇe nactiKonfiguraci() nejprve vytvoˇr´ım instanci tˇr´ıdy PropertiesConfiguration(), kterou pˇriˇrad´ım do instaˇcn´ı promˇenn´e Configuration config. Pot´e je nutn´e explicitnˇe nastavit k´odov´an´ı naˇc´ıtan´eho properties souboru, protoˇze standardnˇe je nastaveno k´odov´an´ı ISO-8859-1. Standardn´ı k´odov´an´ı by vyˇzadovalo, aby ˇcesk´e znaky byly uvedeny ve form´atu \uXXXX, coˇz by bylo uˇzivatelsky nepˇr´ıvˇetiv´e, a proto bylo zvoleno k´odov´an´ı UTF-8, 50
N´avrh ˇreˇsen´ı a implementace n´amˇet˚ u na vylepˇsen´ı
kter´e je univerz´alnˇejˇs´ı. Posledn´ım pˇr´ıkazem metody nactiKonfiguraci() je pak samotn´e naˇcten´ı konfiguraˇcn´ıho souboru. Metody getId(), getKategorii(), getNazev(), getPopis() pak vrac´ı hodnotu kl´ıˇce v konfiguraˇcn´ım souboru. Metoda getParametry() nejprve z´ısk´a seznam hodnot v kl´ıˇci parameters konfiguraˇcn´ıho souboru a po t´e vytv´aˇr´ı pro kaˇzd´ y parametr novou instanci tˇr´ıdy ParametrAkce, viz uk´azka 4.5 @Override public List<ParametrAkce> getParametry() { List