M A S A R Y K O V A U N I V E R Z I T A F A K U L T A I N F O R M A T I K Y Aplikace pro správu kvalifikačních prací průmyslového partnera Red Hat B A K A L Á Ř S K Á P R Á C E Jakub Čecháček Brno, p o d z i m 2013 Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. Jakub Čecháček Vedoucí práce: Mgr. Jiří Kolář ii Poděkování Rád bych poděkoval vedoucímu práce Ing. Jiřímu Pechancovi a Mgr. Marku Grácovi za poskytnuté konzultace a zpětnou vazbu. Dále bych rád poděkoval zbylým členům vývojového týmu, Pavlu a Václavovi Dedíkovým. iii Shrnutí Práce se v první části zabývá architekturou a vývojem aplikací s využitím webového rámce Grails. Část druhá se zaměřuje na vývoj informačního systému pro správu závěrečných prací, popis využitých technologií a vybrané implementační detaily. iv Klíčová slova informační systém, správa diplomových prací, správa souborů, Grails, MongoDB, M V C v Obsah 1 Úvod 3 2 Informační systém pro správu diplomových prací 4 2.1 Diplomová práce 4 2.2 Informační systémy 4 2.3 Návrh systému pro správu diplomových prací 5 2.4 Použité technologie 5 2.4.1 Groovy 5 2.4.2 Aplikační rámec Grails 6 2.4.3 MongoDB 6 2.4.4 Technologie prezentační vrstvy 7 3 Groovy Grails 8 3.1 Technologie v pozadí 8 3.1.1 Aplikační rámec Spring 8 3.1.2 Groovy 8 3.1.3 Hibernate 9 3.1.4 Groovy Server Pages a SiteMesh 9 3.2 Convention over confíguration 10 3.3 Ekosystém zásuvných modulů 10 3.3.1 Instalace zásuvných modulů 11 3.4 Podobné platformy 11 3.4.1 RubyonRails 11 3.4.2 Django 12 4 Architektura aplikací na platformě Grails 13 4.1 Adresářová struktura 14 4.2 Aplikační model 15 4.2.1 Doménové třídy 15 4.2.2 Mapování doménových tříd do databáze 15 4.2.2.1 Persistenční logika 16 4.2.3 Servisní třídy 16 4.3 Prezentační vrstva 17 4.3.1 Knihovny značek 17 4.4 Komponenta Controller 18 5 Práce se soubory v systému pro správu diplomových prací . . . 20 5.1 Použité technologie 20 5.1.1 FineUploader 20 5.1.2 MongoGridFS 21 5.1.2.1 Kolekce f i l e s 21 1 5.1.2.2 Kolekce chunks 22 5.1.3 Dostupné moduly pro práci s Mongo GridFS 22 6 Implementace správy souborů 24 6.1 Archivace souborů 24 6.1.1 Servisní třída MongoFile 24 6.1.1.1 Uložení souboru do databáze 25 6.1.1.2 Získání souboru z databáze 26 6.1.2 Zasílání souborů klientovi 27 6.1.2.1 Knihovna značek pro práci s GridFile . . . 28 6.2 Nahrávání souborů 28 6.2.1 Přijetí a zpracování nahrávaných dat 28 6.2.1.1 Příjem souborů 29 6.2.1.2 Knihovna značek 30 7 Nasazení systému a budoucí vývoj 31 7.1 Budoucí vývoj 32 8 Závěr 34 A Doplňující informace 36 A. l Rozšíření pro práci s Mongo GridFS 36 B Diagramy 37 B.l Domain Model 37 C Odkazy 38 C l Zdrojový kód projektu 38 C.2 Adresa nasazeného systému 38 2 1 Úvod Bakalářské a diplomové práce představují tradiční součást akademické sféry. Nejspíše každý z nás s nimi má zkušenost jako student, někteří jako zadavatelé či vedoucí. Ne každý si však uvědomuje složitost agendy související s jejich správou a množství subjektů, které se celého procesu účastní, obzvláště v případě, kdy je do procesu zahrnuto více univerzit. Cílem této práce je vytvoření informačního systému pro správu diplomových a bakalářských prací pro společnost Red Hat, průmyslové partnera Fakulty informatiky Masarykovy univerzity. Systém nahradí stávající agendu správy závěrečných prací prostřednictvím firemní wiki stránky, která je s rostoucím počtem vypisovaných témat nedostačující. Hlavním přínosem nového systému oproti stávající agendě by mělo být značné zjednodušení a zpřehlednění distribuce vypisovaných témat jednotlivým uni­ verzitám. První část práce se věnuje vysvětlení základních pojmů a představení použitých technologií. V následující části je čtenář blíže seznámen s rámcem Grails, architekturou a vývojem aplikací na této platformě. Poslední dvě části popisují vybrané implementační detaily práce se soubory ve vyvíjeném systému a jeho nasazení. 3 2 Informační systém pro správu diplomových prací 2.1 Diplomová práce Diplomová práce představuje finální studii, jejíž vypracování je požadováno pro získání vysokoškolského diplomu. Většina studentů si oblast své diplomové práce vybírá přibližně ve druhé polovině studia. Celý proces obvykle vypadá nějak takto: 1. Student si vybere pro něj zajímavé téma diplomové práce. 2. Student kontaktuje vedoucího práce a po domluvě s ním se k danému tématu přihlásí. 3. Student pracuje na své závěrečné práci a průběh konzultuje s ve­ doucím. 4. Jsou vypracovány dva posudky hodnotící kvalitu práce. Autorem prvního je vždy vedoucí. Druhý posudek je pak vypracován nezávislou osobou 5. Studen musí práci obhájit před komisí, která s přihlédnutím k posudkům udělí známku. Obvykle existuje několik zdrojů, ze kterých mají studenti možnost vybírat téma své budoucí diplomové práce. První možností je vybrat si ze seznamu témat dostupných na dané univerzitě, v takovém případě se většinou jedná o oblast blízkou vedoucímu daného tématu. Další možností je vymyslet si téma vlastní a domluvit se s některým z vyučujících na jeho oficiálním vypsání. V neposlední řadě si pak studenti mohou vybrat téma nabízené nějakou třetí stranou - například společností Red Hat. V tomto případě se často do výše zmíněného procesu zapojuje druhý vedoucí, například člověk z firmy zadávající dané téma, který přebírá roli konzultanta. 2.2 Informační systémy Informační systém představuje soubor lidí, prostředků a procesů pro sběr, přenos, uchování a zpracování dat[l]. Ačkoliv příkladem takového systémů může být i dobře vedená kartotéka, v kontextu této práce uvažuji vždy informační systémy elektronické. 4 2. I N F O R M A Č N Í S Y S T É M P R O S P R Á V U D I P L O M O V Ý C H P R A C Í 2.3 Návrh systému pro správu diplomových prací Návrh informačního systému pro správu bakalářských prací probíhal ve spolupráci se zástupci společnosti Red Hat. V průběhu prvních setkání byly určeny funkční požadavky na systém a vypracován základní doménový model celého systému, který byl následně během vývoje upravován. Mezi hlavní funkční požadavky patří: • uživatelské účty s různou úrovní oprávnění • správa závěrečných prací dle definovaného procesu • možnost nahrávat přílohy • diskuse v podobě komentářů • nástroje pro univerzitní vedoucí Dále byly na základě požadavků společnosti Red Hat a zkušeností vývojářů stanoveny nefunkční požadavky. Mezi nejdůležitější patří: • Grails jako vývojová platforma. • nasazení systému na OpenShift • otevřený zdrojový kód Pro bližší informace o návrhu systému a použitých procesech doporučuji přečíst bakalářskou práci Václava Dedíka[2]. 2.4 Použité technologie 2.4.1 Groovy Groovy je dynamický objektově orientovaný programovací jazyk pro platformu Java, který přináší spoustu vlastností a konstrukcí známých z jazyků jako Python, Ruby a Smalltalk. Jednou z řady výhod jazyka Groovy patří díky totožné syntaxi téměř nulová učící křivka pro stávající Java programátory [3]. Mezi nejvýznamnější charakteristiky tohoto jazyka patří[4]: • rozumné výchozí hodnoty a nastavení • uzávěry • syntaxe pro podporu návrhového vzoru Stavitel 5 2. I N F O R M A Č N Í S Y S T É M P R O S P R Á V U D I P L O M O V Ý C H P R A C Í • podpora doménových jazyků Díky přímé kompilaci do java byte kódu mohou programy napsané v Groovy využívat řadu existujících knihoven napsaných v jazyce Java a běžet všude tam, kde je k dispozici Java Runtime Environment[3]. 2.4.2 Aplikační rámec Grails Grails je aplikační rámec a platforma pokrývající všechny aspekty vývoje webových aplikací využívající programovací jazyk Groovy[5]. Díky systému zásuvných modulů lze aplikace vyvíjené na této platformě relativně snadno obohatit o nové funkce nebo upravit výchozí chování aplikačního rámce. Detailněji se celou platformou zabývají následující kapitoly. 2.4.3 MongoDB MongoDB je dokumentově orientovaná databáze, a jedna z předních NoSQL databází na trhu, s otevřeným zdrojovým kódem[6]. V dokumentově orientovaných databázích se jednotlivé záznamy ukládají do souborů, které jsou následně seskupovány do takzvaných kolekcí. Pokud bychom se pokusili o přirovnání k relační databázi, pak kolekce představuje tabulku a dokumenty jednotlivé řádky. V případě MongoDB jsou data ukládána ve formátu B S O N 1 a mohou být plně dynamická - nemusí dodržovat žádné definované schéma. NoSQL databáze nabývají v posledních letech na popularitě právě díky možnosti ukládat dynamická data a jejich vysoké škálovatelnosti. Mezi nejvýznamnější vlastnosti této databáze patří: • převod objektových struktur do jazyka JSON je přirozenější než jejich mapování do tabulek relační databáze • implementace návrhového vzoru Map/Reduce pro zpracování velkého množství dat • dotazovací jazyk • GridFS Systém pro správu závěrečných prací využívá MongoDB primárně ke dvěma účelům. Prvním je ukládání dynamických dat (jako například konfigurace systému). Druhým případem je využití GridFS pro ukládání souborů nahrávaných studenty k jednotlivým diplomovým pracím a podobenek uživatelů. 1. Binary JavaScript Object Notation 6 2. I N F O R M A Č N Í S Y S T É M P R O S P R Á V U D I P L O M O V Ý C H P R A C Í 2.4.4 Technologie prezentační vrstvy Prezentační vrstva je implementována za použití řady moderních značkovacích a stylovacích jazyků. Dynamická části jsou skriptovány pomocí jazyka JavaScript a technologie AJAX. Mezi nejvýznamnější použité technologie, nástroje a jazyky dále patří: • Groovy Server Pages (GSP) • H T M L a H T M L 5 • CSS a LESS • Twitter Bootstrap Pro bližší informace o použitých technologiích a návrhu uživatelského rozhraní doporučuji přečíst bakalářskou práci Pavla Dedíka[7]. 7 3 Groovy Grails 3.1 Technologie v pozadí Platforma programovacího jazyka Java je s námi již skoro 15 let. Pravděpodobně nikoho proto nepřekvapí, že během této doby vznikla spousta kvalitních knihoven řešících různé potřeby softwarového inženýrství. Této skutečnosti si byli dobře vědomi v roce 2005 i vývojáři vůbec první verze rámce Grails. Místo startu na zelené louce a vynalézání kola proto Grails staví na existujících a v praxi prověřených technologiích[8]. r Grails Zásuvné ( Spring ) Hibernate v ) Ostatní j moduly 0 0 v Java V i r t u a l Machine Obrázek 3.1: Platforma Grails 3.1.1 Aplikační rámec Spring Aplikační rámec Spring tvoří základ platformy Grails. Jedná se o rámec poskytující prostředky pro vývoj moderních enterprise aplikací, jehož první verzi vyvinul Rod Johnson jako součást své knihy „Expert One-on-One J2EE Design" pojednávající o návrhu a principech vývoje Java EE aplikací. Primárním cílem tohoto rámce je maximálně usnadnit vývoj enterprise aplikací. Díky tomu se dnes jedná o jednu z nejrozšířenějších platforem pro vývoj Java EE aplikací a alternativu k tradičním Enterprise Java Beans[9]. Grails využívá podstatnou část funkcionality poskytované platformou Spring - počínaje „Inversion of Control" kontejnerem, přes integrační vlastnosti Springu, až po Aspektově orientované programování a podporu transakcí. S Grails lze navíc velmi snadno použít i libovolný z modulů rozšiřující jádro platformy Spring, jako je například Spring Security. 3.1.2 Groovy V kontextu platformy Grails představuje Groovy nejen jazyk používaný k vývoji aplikací. Jedná se také o pomyslné „lepidlo " spojující použité tech- 8 3. G R O O V Y G R A I L S nologie a knihovny. Vlastnosti programovacího jazyka Groovy jako například „buildery", jej dělají ideálním prostředkem pro vývoj doménově specifických jazyků (dále jen DSL). Díky tomu vytváří Groovy uživatelsky přívětivá rozhraní zastřešující jednotlivé části platformy. Velmi časté je například využití DSL v konfiguračních souborech, jenž umožňuje uživatele odstínit od komplexity celé konfigurace a minimalizuje množství opakujícího se kódu. 1 2 4 < p r o p e r t y name="povider" ref="mongoProvider"/> 5 6 1 beans = { 2 c o n f i g u r a t i o n ( C o n f i g u r a t i o n ) { 3 p o v i d e r = r e f ( " m o n g o P r o v i d e r " ) 4 } 5 } Příklad 1: definice Spring bean - X M L (nahoře) a Grails DSL (dole) 3.1.3 Hibernate Hibernate je populární knihovna pro objektově-relační mapování (dále jen ORM), řešící problém rozdílné reprezentace dat v objektovém světě a relačních úložištích. Hibernate se také snaží odstínit uživatele od rozdílných dialektů jazyka SQL používaných v různých databázích. V kontextu platformy Grails představuje Hibernate součást řešení vrstvy persistence dat poskytované v základní distribuci. 3.1.4 Groovy Server Pages a SiteMesh Groovy Server Pages (dále jen GSP) představují značkovací jazyk určený pro vývoj aplikací prezentační vrstvy. Obdobně jako syntakticky podobné Java Server Pages (dále jen JSP) umožňují GSP kombinovat statický a dynamický obsah. GSP však přináší drobná vylepšení vyplývající z dynamické podstaty jazyka Groovy. Lze tak například využít speciální textové řetězce 9 3. G R O O V Y G R A I L S ( G S t r i n g ) vyhodnocované přímo groovy interpretem, což minimalizuje potřebu definovat knihovny značek. SiteMesh pak představuje flexibilní šablonovací systém založený na návrhovém vzoru „dekorátor". Mezi nevýhody samostatného použití šablon SiteMesh patří zejména nutnost deklarovat každou šablonu, takzvaný „dekorátor", v konfiguračním X M L souboru. Grails použití tohoto šablonovacího systému usnadňuje pomocí přidaných značek pro práci se šablonami a automatickým generováním konfiguračního souboru. 3.2 Convention over configuration Princip „Convention over configuration" reprezentuje myšlenku poskytnutí rozumných výchozích hodnot a konfigurace za účelem maximálně usnadnit práci vývojáře. Cílem je jednak udělat vývoj aplikací zábavnějším a hlavně umožnit vývojáři aby se soustředil na samotnou funkcionalitu vyvíjeného systému místo přípravy prostředí. Jak jsem již zmínil, platforma Grails staví na řadě jiných aplikačních rámců, z nichž většina vyžaduje určitou formu konfigurace - ať už je to nastavení prostřednictví X M L souboru nebo využití anotací. Dodržování stanovených zásad, jako například jména proměnných, proto značným způsobem sníží množství potřebné konfigurace. Ačkoliv princip využívání konvencí je nedílnou součásti Grails, samotný rámec však vývojáře nijak k jejich dodržování nenutí a možnosti konfigurace nejsou nijak omezeny [10]. 3.3 Ekosystém zásuvných modulů Existuje mnoho typů aplikací, určených pro různé oblasti naší společnosti, které mají mnohdy velice rozdílné požadavky. Ačkoliv se Grails snaží poskytnout komplexní řešení pro vývoj informačních systémů a webových aplikací, nelze uspokojit požadavky na vývoj všech možných projektů. Místo rozšiřování základní distribuce proto Grails nabízí možnost do vyvíjených aplikací doinstalovat zásuvné moduly, které rozšíří možnosti rámce o požadovanou funkci. Současné verze platformy Grails se snaží o modularizaci základní distribuce a vlastnosti, které nejsou nezbytně nutné, přesouvat právě do zásuvných modulů. Příkladem tohoto vývoje je plánované přesunutí podpory Hibernate do zásuvného modulu, související s rozvojem používání NoSQL databází. Základní distribuce platformy Grails aktuálně obsahuje 23 zásuvných modulů - 16 modulů tvořících jádro rámce a 7 doplňkových modulů, které lze v případě potřeby odinstalovat. Průměrně 10 3. G R O O V Y G R A I L S používá každá aplikace postavená na této platformě 30 rozšíření, včetně modulů jádra. [10] 3.3.1 Instalace zásuvných modulů V současné době lze do aplikace vyvíjené na platformě Grails nainstalovat zásuvný modul dvěma způsoby. První způsobem je použití příkazu g r a i l s i n s t a l l - p l u g i n < j m é m o m o d u l u x V aktuální verzi platformy je však tento způsob označen jako zastaralý a do budoucna se počítá s jeho odstraněním. Preferovaným způsobem je nyní přidat definici rozšíření do sekce p l u g i n s v konfiguračního souboru B u i l d C o n f i g . g r o o v y [ l l ] . Ačkoliv se toto může zdát krokem zpět, důvodem k této změně je sjednocení instalace zásuvných modulů a definice ostatních závislostí projektu. 1 p l u g i n s { 2 b u i l d " : t o m c a t : $ g r a i l s V e r s i o n " 3 c o m p i l e " : p l a t f o r m - c o r e : 1 . 0 . R C 5 " 4 c o m p i l e ":markdown:1.1.1" 5 c o m p i l e " : m a i l : 1 . 0 . 1 " 6 } Příklad 2: instalace zásuvného modulu 3.4 Podobné platformy 3.4.1 Ruby on Rails Ruby on Rails je webovým rámcem, který začal jako první silně propagovat princip „Convention over configuration". Jak název napovídá, jedná se o rámec pro programovací jazyk Ruby a právě Rails je příčinou dnešní popularity tohoto dynamického jazyka. Vlastnostmi se Ruby on Rails velmi podobá rámci Grails, neboť bylo jeho předlohou - v obou případech se jedná o vysoce produktivní webové rámce využívající konvence a rozumné výchozí hodnoty. Hlavním rozdílem mezi oběma rámci je přístup k doménovým třídám a databázi. Grails využívá princip objektově-relačního mapování založeného na návrhovém vzoru „Data Mapper", který kromě doménových tříd využívá i takzvaný „mapovací objekt" zodpovědný za mapování dat z databáze do konkrétní instance doménové třídy. Rails naproti tomu řeší persistencí pomocí návrhového vzoru „Active Record", který Martin Fowler definuje jako „Objekt, který obaluje řádek v databázové tabulce, zapouzdřuje 11 3. G R O O V Y G R A I L S přístup k databázi, a přidává doménovou logiku". [12] Z pohledu vývojáře představuje „Active Record" transparentnější spojení objektu a databáze, cenou je však nižší flexibilita takového mapování. 3.4.2 Django Django představuje alternativu ze světa jazyka Python. Stejně jako v případě Grails a Rails se jedná o webový rámec s vysokou produktivitou. Co se technických možností týče, je Django srovnatelné s oběma předchozími. Hlavní odlišnosti této platformy jsou především filosofické a vycházejí přímo z návrhu samotného Pythonu. Django se tak snaží mnohem méně využívat takzvané „magie" v podobě implicitně definovaných atributů, metod a výchozích hodnot. V důsledku tohoto chování jsou aplikace vyvíjené s použitím tohoto rámce přehlednější. Právě přehlednost je Django komunitou vyzdvihována jako velká výhoda této platformy, která je však vykoupena nutností napsat více kódu. 12 4 Architektura aplikací na platformě Grails Grails, stejně jako řada jiných rámců pro vývoj aplikací obsahujících nějakou formu uživatelského rozhraní, využívá návrhového vzoru Model, View, Controller1 (dále jen MVC). Ačkoliv jednotná definice tohoto vzoru prakticky neexistuje a mírně se liší mezi jednotlivými implementaci, obecně se vždy jedná o formu oddělení aplikační a prezentační logiky. Jak je patrné z názvu, aplikace postavené na architektuře M V C lze rozdělit do tří komponent (vrstev): • Model Zahrnuje aplikační logiku systému včetně doménových tříd. • View Tvoří základ prezentační vrstvy. Hlavním účelem této komponenty je zobrazení informací uživateli. • Controller Zajišťuje komunikaci s uživatelem a prostřednictvím view zobrazuje požadované informace. ^ MODEL UPDATES MANIPULATES I I VIEW CONTROLLER \ /\ USER Obrázek 4.1: Architektura M V C Poprvé tento návrhový vzor popsal v roce 1979 norský profesor Trygve Reenskaug. O rok později vznikla jako součást programovacího jazyka Smalltalk-80 první implementace této architektury. Specifické pro tuto implementaci bylo spojení komponent view a controller. Tento typ M V C se i 1. V průběhu práce se uvádí anglická terminologie, běžně rozšířená v oboru. 13 4. A R C H I T E K T U R A A P L I K A C Í N A P L A T F O R M Ě G R A I L S dnes používá u rámců pro GUI, kde ovládací prvky nejen zobrazují informace, ale také přijímají uživatelský vstup. Rozdělení všech tří komponent je pak běžnou praxí u rámců pro vývoj webových aplikací, jakým je například Grails. 4.1 Adresářová struktura Stejně jako v aplikační rámec Spring umožňuje i Grails definovat jednotlivé komponenty aplikace více způsoby. Dostupná je tedy možnost přímé registrace komponenty v konfiguračním souboru nebo anotace jednotlivých tříd, avšak tyto postupy nejsou příliš používané. V předchozí kapitole byl popsán princip „Convention over Configuration" a jedním ze způsobu uplatnění tohoto přístupu je dodržování stanovené adresářové struktury. Všechny aplikace na této platformě proto využívají jednotnou adresářovou strukturu s adresáři vyhrazenými pro příslušné komponenty. Následující výčet uvádí vybrané adresáře.[11] • grails-app/conf Adresář conf je určen pro veškeré konfigurační soubory aplikace. • grails-app/controllers Adresář C o n t r o l l e r s je určen pro controllery. • grails-app/domain Adresář doma i n je určen pro doménové třídy • grails-app/il8n Adresář i 18 n je určen pro soubory s texty jednotlivých jazykových mutací aplikace. • grails-app/services Adresář s e r v i ce s je určen pro servisní třídy • grails-app/taglib Adresář t a g l i b je určen pro knihovny značek. • grails-app/views Adresář v i e w s je určen pro pohledy prezentační vrstvy. 14 4. A R C H I T E K T U R A A P L I K A C Í N A P L A T F O R M Ě G R A I L S 4.2 Aplikační model Aplikační model představuje jednu ze tří komponent M V C . V kontextu platformy Grails se jedná o souhrnné označení doménových a servisních tříd. 4.2.1 Doménové třídy Doménové třídy představují v rámci aplikace reprezentaci doménového modelu. Doménový model popisuje jednotlivé entity vyvíjeného systému a vztahy mezi nimi. Novou doménou třídu lze založit buďto manuálním vytvoření * .groovy souboru v adresáři g r a i l s - a p p / d o m a i n nebo pomocí grails příkazu c r e a t e - d o m a i n - c l a s s zpříkazové řádky. V případě první možnosti je potřeba ručně vytvořit také případnou hierarchii balíčků. Systém pro správu diplomových prací obsahuje celkem 14 doménových tříd, za „základní" lze označit tyto entity: • User: uživatel registrovaný v systému. • University: univerzita evidovaná v systému. • Topič: téma závěrečné práce. • Thesis: konkrétní práce konkrétního studenta. • Application: přihláška studenta k tématu závěrečné práce. Detailní popis celého doménového modelu je obsažen v práci Václava Dedíka[2], v příloze lze najít U M L diagram modelu [2]. 4.2.2 Mapování doménových tříd do databáze Platforma Grails využívá pro persistenci doménových tříd do databáze nástroj G O R M (Grails Object Relational Mapping). Označení „objektově-relační mapování" v názvu je lehce matoucí, neboť dnes existují i implementace G O R M API pro řadu nerelačních databází. Systém pro správu diplomových prací využívá rozhraní G O R M pro práci s databázemi MongoDB a PostgreSQL. Ačkoliv všechny implementace rozhraní G O R M poskytují stejné API, liší se v rozsahu a poskytovaných funkcích (v případě NoSQL databází například nemá smysl konfigurace tabulek). V rámci této kapitoly proto uvažuji výchozí implementaci určenou pro relační databáze, kam je mapována 15 4. A R C H I T E K T U R A A P L I K A C Í N A P L A T F O R M Ě G R A I L S i převážná většina doménových tříd ve vyvinutém systému. V souladu s filosofií platformy Grails o využívání existujících knihoven se ani v případě G O R M nejedná o zcela nové řešení a základ výchozí implementace je tvořen aplikačním rámcem Hibernate. 4.2.2.1 Persistenční logika Jedním z principů popisovaným návrhovým vzorem „Data Mapper " je oddělení persistenční logiky a doménové třídy - tento návrh přispívá ke snížení závislosti na konkrétním řešení persistence. Ve srovnání s „Active Record", kde je persistenční logika přímo součásti doménových tříd, je však použití tohoto řešení méně přehledné a pohodlné. G O R M , jakožto řešení využívající Hibernate je samozřejmě také založen na vzoru „Data Mapper ", avšak díky dynamické podstatě programovacího jazyka Groovy umožňuje využit přístup podobný „Active Record". Persistenční CRUD operace jsou na jednotlivých entitách zpřístupněny pomocí „magických" metod, což jsou metody přidané objektu mimo definici třídy pomocí metaprogramo' 'ivanr. 1 // získaní tématu s íd=l z databáze 2 d e f t o p i c = T o p i c . g e t ( 1 ) 3 // vyhledaní tématu s názvem foo 4 t o p i c = T o p i c . f i n d B y T i t l e ( ' f o o ' ) 5 6 / / editace tématu 7 t o p i c . t i t l e = " b a r " 8 t o p i c . s a v e ( ) 9 / / smazáni tématu 10 t o p i c . remove () 11 12 // vyhledáni vice záznamu 13 d e f t o p i c s = T o p i c . f i n d A H B y T i t l e L i k e (' buz z ' ) Příklad 3: Příklad C R U D operací 4.2.3 Servisní třídy Účelem servisních tříd je zapouzdření komplexní aplikační logiky - tedy takové logiky, která jde nad rámec základních C R U D operací nebo pracuje s více zdroji zároveň. Při dodržení stanovených konvencí přináší servisní třídy několik funkcí, které běžné třídy neposkytují. 2. Princip úpravy kódu programu za běhu 16 4. A R C H I T E K T U R A A P L I K A C Í N A P L A T F O R M Ě G R A I L S • Vkládání závislostí V rámci servisních tříd funguje na základě jména třídy a jména atributu automatické vkládání závislosti. • Transakce Jednotlivé metody probíhají vždy v rámci aktuální transakce. Pokud žádná při volání metody neexistuje, zahájí se transakce nová. Servisní třídy jsou v rámci kódu vyvinutého systému rozděleny do několika balíčků: • com.redhat.theses Práce s doménovými třídami. • com.redhat.theses.auth Servisní třídy zajišťující autentizaci • com.redhat.theses.config Servisní třídy obsahující logiku pro práci s konfigurací. • com.redhat.theses.listeners Správa asynchronních událostí • com.redhat.grails Logika práce se soubory. 4.3 Prezentační vrstva Základem prezentační vrstvy jsou takzvaná views. Jedná se v podstatě o šablony, jejichž jediným účelem po naplnění daty je prezentace těchto data uživateli. Ačkoliv lze tuto komponentu v rámci Grails implementovat pomocí řady prezentačních rámců (Velocity, Freemarker, Thymeleaf), doporučuji použít výchozí řešení založeném na GSP a šablonách SiteMesh - důvodem je hluboká integrace s ostatními částmi platformy. 4.3.1 Knihovny značek Jedním ze základních principů M V C je oddělení prezentační vrstvy a modelu. V případě implementací s oddělenou komponentou controller to znamená i omezení přímé komunikace mezi modelem a view - ideálně by měla být všechna potřebná data předána view z controlleru. V praxi je však 17 4. A R C H I T E K T U R A A P L I K A C Í N A P L A T F O R M Ě G R A I L S striktní oddělení view a modelu velmi obtížné, neboť v moderních aplikacích jsou jednotlivá view často dynamická. Důsledkem tak může být přenášení nepotřebných dat nebo zanášení aplikační logiky do implementace daného view. Volání metod obsahujících aplikační logiku přímo z view však také není žádoucí, neboť na prezentační vrstvě často pracují programátoři zaměření na prezentační vrstvu, bez znalosti aplikačního modelu. Grails řeší tento problém možností definovat doplňující knihovny značek (anglicky „tag libraries"), které umožní používat požadovanou logiku prostřednictvím GSP značek. Novou knihovnu lze vytvořit manuálním založením třídy v adresáři g r a i l s - a p p / t a g l i b nebo pomocí příkazu grails c r e a t e - t a g - l i b V rámci vyvíjeného systému vzniklo těchto knihoven několik, následující seznam uvádí některé z nich (jednotlivé položky seznamu jsou ve tvaru „tříd - jmenný prostor") • Ajax4GSPTagLib - a4g Knihovna značek pro práci s technologií A J A X . • RichGSPTagLib - richg Knihovna rozšiřující standardní sadu GSP značek. • NotificationTagLib - notification Značky pro práci se systémovými notifikacemi. • GridFileTagLib - file Knihovna pro přímý přístup k souborům uloženým v databázi Mon- goDB. • UploaderTagLib - u Knihovna pro nahrávání souborů 4.4 Komponenta controller Jak jsem již zmínil, controller slouží k propojení view a příslušného modelu. Tato Komponenta však zajišťuje také komunikaci uživatele s modelem. V případě webových rámců je tato funkce zajištěna pomocí mapování metod controlleru, nazývaných akce, na jednotlivé URL aplikace. Obdobně jako servisní třídy, controllery nabízí možnost automatického vkládání závislostí při dodržení konvencí. Příklad níže uvádí akci dostupnou na U R L / t o p i c / l i s t pomocí metody GET protokolu HTTP. 18 4. A R C H I T E K T U R A A P L I K A C Í N A P L A T F O R M Ě G R A I L S 1 c l a s s T o p i c C o n t r o l l e r { 2 // prístup pouze pres GET 3 s t a t i c allowedMethods = [ l i s t : GET"] 4 def l i s t O { 6 8 7 // predaní dat príslušnému view [ t o p i c I n s t a n c e L i s t : t o p i c s ] 9 10 }) Příklad 4: Definice controlleru Systém pro správu diplomových prací obsahuje řadu controlleru rozdělených do několika balíčků: • com.redhat.theses Obsluha požadavků pracujících se základními doménovými třídami. • com.redhat.theses.auth Obsluha požadavků souvisejících s uživateli a autentizací - například přihlášení. • com.redhat.theses.ajax Obsluha požadavků zaslaných pomocí technologie A J A X . • com.redhat.grails Obsluha požadavků souvisejících se správou souborů. 19 5 Práce se soubory v systému pro správu diplomových prací Výstupem bakalářské práce bývá zpravidla zpráva v podobně textového dokumentu (nejčastěji ve formátu PDF), často doplněna o množství příloh jako implementace konkrétního řešení nebo vzorek použitých dat. Jedná se o důležitou součást hodnocení práce a například konkrétní technické řešení mnohdy bývá hlavním důvodem vypsání práce. Tyto soubory je proto nutné archivovat. V této kapitole popisuji použité technologie a technické řešení nahrávání a archivace souboru v systému pro správu závěrečných 5.1 Použité technologie 5.1.1 Fine Uploader Fine Uploader je moderní nástroj pro nahrávání souborů prostřednictvím webových aplikací. Jedná se o projekt s otevřeným zdrojovým kódem, implementovaný v jazyce JavaScript bez jakýchkoliv závislostí[13]. K dispozici je také verze využívající široce využívanou JavaScriptovou knihovnu jQuery, jež poskytuje výrazně kompaktnější syntaxi. Právě tato varianta byla použita i v systému pro správu diplomových prací. 1 2 3
prací. 4 10 6 9 8 7 < s c r i p t > $ ( d o c u m e n t ) . r e a d y ( f u n c t i o n () { $('#upload_wrapper' ) . f i n e U p l o a d e r ( { r e q u e s t : { e n d p o i n t : '/upload' n 12 } ) ; 14 13 }) ; < / s c r i p t > is Příklad 5: základní použití nástroje Fine Uploader 20 5. P R Á C E SE S O U B O R Y V S Y S T É M U P R O S P R Á V U D I P L O M O V Ý C H P R A C Í Soubory jsou na server zaslány zakódované v těle vícedílných požadavků HTTP1 protokolu s využitím technologie AJAX. Fine Uploader poskytuje široké možnosti konfigurace a několik rozšiřujících bodů v různých fázích procesu nahrávání souboru. 5.1.2 Mongo GridFS Pro ukládání souborů ve vyvinutém systému byla použita databáze MongoDB. Využití databáze oproti přímému ukládání na disk přináší možnost zaznamenat spolu se souborem i metadata poskytující doplňující informace. GridFS je specifikace popisující způsob ukládání a získávání souboru z databáze MongoDB, které přesahují maximální povolenou velikost BSON dokumentu, stanovenou na 16 MB[14]. Data ukládána do hierarchie kolekcí ve tvaru „ < b u c k e t > . < k o l e k c e > . ", kde: • < b u c k e t > ( k y b l í č e k ) představuje kořenovou kolekci pro daný GridFS • < k o l e k c e > jedna z kolekcí f i l e s nebo c h u n k s (viz. následující podkapitoly) • samotný dokument 5.1.2.1 Kolekce f i l e s Dokumenty v kolekci f i l e s reprezentují jednotlivé soubory v úložišti GridFS. Obsah těchto dokumentů tvoří jednak základní informace o souboru (jméno, typ, kontrolní součet, čas a datum uložení) a dále také souborová metadata poskytující doplňující informace. i { 2 " _ i d " : O b j e c t I d ( " 5 2 8 5 f c 9 4 9 3 f 4 7 d 2 c 7 7 e 4 c 2 d b " ) , 3 " c h u n k S i z e " : NumberLong(262144), 4 " l e n g t h " : NumberLong(11448), 5 "md5" : "109dcd47fadda95f6b9adl12faO06adl", 6 " f i l e n a m e " : " a v a t a r . p n g " , 7 "contentType" : "image/png", s "uploadDate" : ISODate("2013-11-15T10:51:00.821Z"), 9 " a l i a s e s " : n u l l io } Příklad 6: dokument v kolekci f i l e s 1. Hypertext Transfer Protocol 21 5. P R Á C E SE S O U B O R Y V S Y S T É M U P R O S P R Á V U D I P L O M O V Ý C H P R A C Í 5.1.2.2 Kolekce chunks Samotná data tvořící soubor jsou rozdělena na bloky a následně po částech ukládána v kolekci c h u n k s . Díky tomuto rozdělení lze číst pouze část uložených dat, čehož lze využít při čtení velkých souborů - jako je například streamování videa. 1 { 2 " _ i d " : O b j e c t I d ( " 5 2 8 5 f c 9 5 9 3 f 4 7 d 2 c 7 7 e 4 c 2 d c " ) , 3 " f i l e s _ i d " : O b j e c t I d ( " 5 2 8 5 f c 9 4 9 3 f 4 7 d 2 c 7 7 e 4 c 2 d b " ) , 4 "n" : 0, 5 " d a t a " : 6 } Příklad 7: dokument v kolekci c h u n k s Na příkladu výše lze vidět, že každý dokument uložený v této kolekci obsahuje kromě standardního atributu _ i d a samotných dat také atributy s pořadovým číslem bloku a id „rodičovského" souboru v kolekci f i l e s . 5.1.3 Dostupné moduly pro práci s Mongo GridFS Repozitář zásuvných modulů platformy Grails nabízí hned několik implementací technického řešení komunikace s databází MongoDB potažmo s její nadstavbou GridFS. Pro výběr vyhovujícího řešení jsem proto stanovil následující požadavky: • Údržba modulu ze strany autora, alespoň v podobě opravy chyb. • Alespoň stručná dokumentace k aktuální verzi modulu. • Nejlépe žádné změny v entitách mapovaných na relační databázi. • Zvolený zásuvný modul by měl řešit pouze ukládání souborů a to dostatečně pružně pro budoucí rozvoj systému. Hned první dva z požadavků však dokázaly vyřadit většinu dostupných modulů. Ukázalo se, že velká část z nich postrádá dokumentaci, případně to jsou jednorázově vyvinuté projekty bez jakékoliv údržby. Další požadavky pak spolehlivě vyřadily i zbylé kandidáty. Seznam zvažovaných možností lze najít v příloze, za zmínku stojí zejména dva z dostupných modulů. MongoDB G O R M je, jak název napovídá, implementací rozhraní G O R M pro databází MongoDB. Tento modul se však hodí spíše, ob- 22 5. P R Á C E SE S O U B O R Y V S Y S T É M U P R O S P R Á V U D I P L O M O V Ý C H P R A C Í dobně jako výchozí O R M implementace, pro persistenci kompletních doménových tříd. Mongo G O R M jsem se proto rozhodl použít k persistenci objektů dynamického charakteru, jakým je například konfigurace systému, ukládaných do databáze MongoDB. Druhým modulem, který se ukázal být přínosným, je projekt Mongodb Gridfs. Ačkoliv tento modul obsahuje spoustu drobných chyb a jeho vývoj byl s největší pravděpodobností ukončen, zdrojový kód se ukázal jako výborný studijní materiál pro vývoj vlastní aplikační logiky řešící ukládání souborů do GridFS. 23 6 Implementace správy souborů 6.1 Archivace souborů Jelikož žádný z dostupných modulů pro práci s Mongo GridFS nevyhovoval ani základním stanoveným požadavkům, vyvinul jsem jako součást systému pro správu bakalářských prací s využitím získaných poznatků rozhraní vlastní - pracovně nazvané MongoFile. Aktuálně se jedná o součást vyvinutého informačního systému, avšak implementace umístěná v balíku com. r e d h a t . g r a i l s . m o n g o d b počítá s budoucím osamostatnění projektu v podobně zásuvného modulu platformy Grails. 6.1.1 Servisní třída MongoFile Hlavní část implementace je tvořena servisní třídou G r i d F i l e S e r v i c e poskytující rozhraní pro manipulaci se soubory. Při návrhu MongoFile jsem zohlednil dva typy souborů: • Soubory vázané na doménovou třídu • Soubory bez doménových vazeb Pro rozlišení mezi těmito soubory využívá navržené rozhraní možnost definovat několik kořenových kyblíčku GridFS v rámci jedné databáze. Soubory jsou ukládány do kyblíčku odvozeného z názvu vázané doménové třídy, případně lze toto jméno změnit definováním statického atributu b u c k e t M a p p i n g v dané doménové třídě. Soubory bez doménové vazby jsou ukládány do kyblíčku výchozího, nazvaného f s. Vazba na konkrétní instanci doménové třídy je tvořena pomocí následujících atributů v souborových metadatech: • i d slouží jako identifikátor vázané entity. • g r o u p klasifikuje soubory v rámci jedné doménové třídy. Jako identifikátor může sloužit hodnota libovolného atributu vázané entity. Ve výchozím nastavení je použita hodnota atributu i d. 24 6. I M P L E M E N T A C E SPRÁVY S O U B O R Ů 2 { 3 "metadata" : { "group" : " a v a t a r " , " i d " : NumberLong(6) } 4 } Příklad 8: metadata souboru v kolekci u s e r . f i l e s 6.1.1.1 Uložení souboru do databáze Rozhraní MongoFile poskytuje několik metod pro uložení souboru do databáze. Základem je metoda s ave obsahující hlavní logiku vkládání nového souboru. Při volání této metody je potřeba uvést následující parametry: 1. c o n t e n t Obsah ukládaného souboru. Zdrojem dat může být instance třídy F i l e , M u l t i p a r t F i l e , I n p u t S t r e a m nebo pole bytů. 2. i d Identifikátor vázané entity nebo nu 11 v případě souboru bez vazby. 3. b u c k e t Kořenový kyblíček použitého GridFS. V případě hodnoty nu 11 se použije výchozí kyblíček. 4. g r o u p Zařazení souboru do skupiny. 5. m e t a d a t a Doplňující informace o souboru. 6. f i l e n a m e Jméno ukládaného souboru. Pokud je to možné, je jako výchozí hodnota použito jméno původního souboru. 7. d e l e t e Způsob jakým postupovat v případě již existujícího souboru se stejným m o n g o l d nebo kombinací atributů i d a g r o u p . V případě hodnoty t r u e budou existující soubory smazány. 8. m o n g o l d Unikátní identifikátor dokumentu uloženého v kolekci f i l e s . 25 6. I M P L E M E N T A C E SPRÁVY S O U B O R Ů Z množství parametrů metody s ave je zřejmé, že její použití není příliš pohodlné. Metoda navíc umožňuje libovolnou kombinaci hodnot a uživatele nijak nenutí dodržovat stanovené konvence pro jména kyblíčků či nastavení metadat. Z tohoto důvodu obsahuje třída G r i d F i l e S e r v i c e také přetíženou variantu s ave umožňující použití jmenných parametrů v kombinaci s výchozími hodnotami. 1 d e f t h e s i s = T h e s i s . g e t ( 1 ) 2 d e f f i l e = new F i l e ( ' / h o m e / j c e c h a c e / f i l e . z i p ' ) 3 4 / / uloženi souboru bez doménové vazby 5 g r i d F i l e S e r v i c e . s a v e ( f i l e , n u l l , n u l l , n u l l , n u l l , " s t a n d a l o n e _ f i l e . z i p " , f a l s e , n u l l ) 6 7 // s použitím jmenych atributu 8 g r i d F i l e S e r v i c e . s a v e ( c o n t e n t : f i l e , f i l e n a m e : " s t a n d a l o n e _ f i l e . z i p " ) 9 10 n / / uloženi souboru s doménovou vazbou 12 g r i d F i l e S e r v i c e . s a v e ( f i l e , 1, " t h e s i s " , " a r c h i v e s " , n u l l , " b o u n d _ f i l e . z i p " , f a l s e , n u l l ) 13 14 // s použitím jmenych atributu is g r i d F i l e S e r v i c e . s a v e ( c o n t e n t : f i l e , f i l e n a m e : " b o u n d _ f i l e " , o b j e c t : t h e s i s ) Příklad 9: uložení souboru do databáze 6.1.1.2 Získání souboru z databáze Rozhraní MongoFile umožňuje uložené soubory z GridFS získat buďto na základě informací uložených v metadatech, nebo přímo pomocí _ i d dokumentu v kolekci f i l e s . 26 6. I M P L E M E N T A C E SPRÁVY S O U B O R Ů 1 d e f t h e s i s = T h e s i s . g e t ( 1 ) 2 3 / / získaní souboru z kyblíčku "thesis" podle _íd dokumentu 4 d e f f i l e = g r i d F i l e S e r v i c e . g e t F i l e B y U n i v e r s a l M o n g o I d ( mongold, " t h e s i s " ) 5 6 // získaní souboru z kyblíčku podle metadat 7 d e f f i l e = gridFileService.getFile(['iď: 1, group: " a r c h i v e s " ] , " t h e s i s " ) * 9 // místo konkreního kyblíčku lze uvést doménovou třídu ío d e f f i l e = g r i d F i l e S e r v i c e . g e t F i l e (['iď : 1, group: " a r c h i v e s " ] , T h e s i s . c l a s s ) Příklad 10: získání souboru z databáze V případě vyhledávání souboru na základě metadat vrátí volání metody g e t A U F i l e s pouze jednu instanci G r i d F S D B F i l e reprezentující soubor s nejnižším _ i d . Pro získání všech vyhovujících souborů jsou k dispozici přetížené varianty vracející seznam objektů typu G r i d F S D B F i l e . 6.1.2 Zasílání souborů klientovi Poslední, avšak neméně důležitou, schopností MongoFile je zaslání získaného souboru klientské aplikaci. Metoda s e r v e F i l e třídy G r i d F i l e S e r v i c e nastaví potřebné hlavičky, jako například c o n t e n t - t y p e , a zapíše požadovaný soubor do výstupního proudu HTTP odpovědi. 1 // získaní souboru z databáze 2 d e f f i l e = gridFileService.getFile(['iď: 1, group: " a r c h i v e s " ] , T h e s i s . c l a s s ) 3 4 / / zapsaní souboru do http odpovedí 5 g r i d F i l e S e r v i c e . s e r v e F i l e ( r e s p o n s e , f i l e , t r u e ) Příklad 11: zaslání souboru klientovi Na příkladu lze vidět, že volání metody s e r v e F i l e vyžaduje tři para­ metry: 1. R e s p o n s e : objekt reprezentující odpovědi HTTP protokolu. 2. F i l e : instanci třídy G r i d F S D B F i l e zasílanou klientovi. 27 6. I M P L E M E N T A C E SPRÁVY S O U B O R Ů 3. S a v e : vynucení stažení souboru webovým prohlížečem. Pravděpodobně nejčastější použití této metody bude jako součást akce v Controllern. Proto jsem v rámci implementace MongoFile vytvořil jednoduchý Controller G r i d F i l e C o n t r o l l e r , schopný při volání akce s e r v e F i l e zaslat soubor s požadovaným identifikátorem. 6.1.2.1 Knihovna značek pro práci s GridFile Pro usnadnění přístupu k souborům z prezentační vrstvy jsem implementoval také knihovnu značek G r i d F i l e T a g L i b . Knihovna využívá jmenný prostor g r i d a obsahuje modifikované verze značek l i n k a c r e a t e L i n k ze standardní knihovny Grails. První značka slouží pro vytvoření hypertextového odkazu na soubor, druhá pak pouze pro sestavení adresy využitelné například v html značce . 6.2 Nahrávání souborů Implementace funkcionality pro nahrávání souborů se skládá ze dvou částí. Klienta umožňujícího zaslat soubory na server, který následně interpretuje výsledek provedené operace v uživateli přívětivé podobně. Právě tuto část řeší použití nástroje Fine Uploader[13]. Implementací serverové části, zajišťující zpracování přijatých dat, a její spolupráci s klientskou části aplikace se zabývají následující podkapitoly. 6.2.1 Přijetí a zpracování nahrávaných dat Celý proces nahrání souboru od uživatele na server lze rozdělit do 4 kroků 1. Uživatel vybere soubor. 2. Klientská aplikace zašle data na server. 3. Server příjme zaslaná data, zpracuje je a zašle zpět odpověď. 4. Uživateli je zobrazen výsledek. Jak bylo zmíněno na začátku kapitoly, Fine Uploader se z vetší části postará o všechny body s výjimkou čísla tři. Příjem a zpracování dat se při použití architektury M V C běžně provádí vytvořením akce v příslušném Controllern. V informačních systémech je však nezřídka potřeba zpracovávat soubory určené pro různé části systému různým způsobem. Definování 28 6. I M P L E M E N T A C E SPRÁVY S O U B O R Ů akce pro každý druh souboru však často povede k množství opakujícího se kódu. 1 d e f uploadToMongo() { 2 t r y { 3 M u l t i p a r t F i l e f i l e = (( M u l t i p a r t H t t p S e r v l e t R e q u e s t ) r e q u e s t ) . g e t F i l e ( ' q q f i l e ' ) 4 5 // ulozeni souboru 6 d e f saved = g r i d F i l e S e r v i c e . s a v e ( f i l e , o b j e c t : s p r i n g S e c u r i t y S e r v i c e . c u r r e n t U s e r , group: ' f i l e s ' ) 7 8 / / vraceni vysledku 9 r e t u r n r e n d e r ( t e x t : [ s u c c e s s : t r u e ] as JSON, c o n t e n t T y p e : ' t e x t / j s o n ' ) 10 } c a t c h ( E x c e p t i o n e) { n / / nastala chyba 12 l o g . e r r o r ( " E r r o r ^ d u r i n g ^ f ile,_,upload" , e) 13 d e f e r r o r M e s s a g e = message(code: 'uploader. e r r o r . u p l o a d ' ) 14 15 r e t u r n r e n d e r ( t e x t : [ s u c c e s s : f a l s e , message: e r r o r M e s s a g e ] as JSON, c o n t e n t T y p e : ' t e x t / json') 16 } 17 } Příklad 12: akce pro zpracování přijatého souboru Na příkladu výše lze vidět, že samotné uložení souboru do databáze tvoří jen minimální část celé akce. Zbytek kódu se proto bude nejspíš opakovat ve většině podobných metod. V systému pro správu diplomových prací minimalizuji množství takového kódu pomocí návrhového vzoru Pozorovatel a reaktivního přístupu1 . 6.2.1.1 Příjem souborů V rámci vyvinutého systému jsem vytvořil controller c o m . r e d h a t . g r a i l s . u p l o a d . U p l o a d C o n t r o l l e r , jehož akce u p l o a d slouží jako jediný kon- 1. Různé akce vyvolávají v systému tzv. události (anglicky events). Reakce na tyto události je pak přesunuta do speciálních metod nazývaných pozorovatel (anglicky observer). 29 6. I M P L E M E N T A C E SPRÁVY S O U B O R Ů cový bod pro příjem souborů v celém systému. Místo zpracování přijatého souboru však tato akce za použití servisní třídy U p l o a d S e r v i c e v systému vyvolá událost obsahující data potřebná ke zpracování. Konkrétní vyvolané události lze specifikovat pomocí parametru t o p i č zaslaného jako součást HTTP požadavku spolu se souborem. Logika pro zpracování přijatého souboru je potom součástí metody reagující na vyvolanou událost. Systém pro správu diplomových prací používá události a v a t a r a t h e s i s . První slouží k archivaci profilových obrázků uživatelů, druhý k archivaci souborů asociovaných s pracemi studentů. Obsluhu těchto událostí lze najít ve třídě com. r e d h a t . t h e s e s . l i s t e n e r s . U p l o a d L i s t e n e r S e r v i c e 6.2.1.2 Knihovna značek Pro snadnější použití nástroje Fine Uploader a eliminaci redundantního kódu jsem vytvořil knihovnu značek U p l o a d e r T a g l i b , která slouží k zapouzdření konfigurace a integraci s platformou Grails - včetně podpory internacionalizace nástroje. 1 2 < u : t r i g g e r i d = " t r i g g e r U p l o a d " c l a s s = " t m s - b t n " > 3 < i c l a s s = " i c o n - u p l o a d " x / i > 4 5 < / u : t r i g g e r > 6 Příklad 13: použití nástroje Fine Uploader pomocí definovaných značek 30 7 Nasazení systému a budoucí vývoj Po ukončení vývoje základních funkcí stanovených funkčními požadavky byl systém pro správu diplomových prací nasazen do cloudového prostředí OpenShift. OpenShift je „Platform as a Service" řešení vyvíjené společností Red Hat, které umožňuje nasazení webových aplikací bez nutnosti správy vlastních serverů. Základní stavební jednotkou v rámci prostřední OpenShift je takzvaný „gear", reprezentující množství zdrojů (hardwarových i softwarových) dostupných konkrétní aplikaci. V současné době jsou k dispozici tři druhy gearů, v základu všechny poskytují 1GB diskového prostoru [15]: • Small gear (512 M B RAM): vhodný pro skriptovací jazyky • Medium gear (1 GB RAM): vhodný pro JVM a provoz databází • Large gear (2 GB RAM): vhodný pro vysoce náročné aplikace V rámci jednotlivých gearů pak lze provozovat takzvané „cartridges", což jsou nástroje připravené k nasazení v prostředí OpenShift - v podstatě se jedná o ekvivalent linuxových balíčků. K dispozici je řada připravených technologií - například aplikační servery či různé databáze. Pro nasazení vyvinutého systému byl použit střední gear s diskovou kapacitou navýšenou na hodnotu 10 GB, aplikace běží na JBoss EWS 2.01 a využívá také cartridge s databázemi PostgreSQL a MongoDB. Celý proces nasazení aplikace je velmi jednoduchý a zahrnuje tyto kroky: 1. Vytvoření cartridge pro Jboss EWS a databáze. 2. Přidání vzdáleného OpenShift repozitáře do nastavení lokálního git repozitáře 3. Vytvoření souboru .my en v a export proměnných prostředí s nastavením emailového serveru e x p o r t O P E N S H I F T _ E M A I L _ H O S T = " s m t p . e x a m p l e . c o m " e x p o r t O P E N S H I F T _ E M A I L _ P O R T = 4 65 e x p o r t O P E N S H I F T _ E M A I L _ U S E R N A M E = " e @ e x m p l . c o m " e x p o r t O P E N S H I F T _ E M A I L _ P A S S W O R D = " p a s s w o r d " 4. Synchronizace vzdáleného a lokálního repozitáře příkazem g i t p u s h 1. Jboss Enterprise Web Server 31 7. N A S A Z E N Í S Y S T É M U A B U D O U C Í V Ý V O J < < d e v i c e > > OpenShift Gear : < d a t a b a s e > ; PostgreSQL < d a t a b a s e > MongoDB JDBC JDBC ~7\ JBoss EWS 2.0 1 < < e x e c u t i o n E n v í r o n m e n t » Java Virtual Machine j < < a r t i f a c t > > thesismanagementsystem.war Ď << < d e v í c e > > Client Computer < c o m p o n e n t > > ^ Browser Obrázek 7.1: Diagram nasazení[2] 7.1 Budoucí vývoj Vývoj systému pro správu diplomových prací jeho nasazením neskončil. Testovací provoz systému v semestru podzim 2013 již přinesl hodnotnou zpětnou vazbu zástupců firmy Red Hat i vedoucích z Masarykovy univerzity a Vysokého učení technického v Brně. Mezi nejčastější požadavky zástupců obou stran patří 1. seznam vypsaných témat určený k tisku 2. export vypsaných témat 3. podpora školních projektů První položku seznamu se podařilo implementovat již v průběhu testovacího provozu. Export vypsaných témat předneslo jako návrh několik zástupců M U a VUT. Tento požadavek je pochopitelný, jelikož možnost importovat data (nebo automatizace jejich zadávání) zásadním způsobem sníží množství práce vedoucích. V následujícím semestru proto plánujeme vyvinutý systém rozšířit o export témat ve formátu X M L 2 a CSV3 . 2. Extensible Markup Language 3. Comma-separated values 32 7. N A S A Z E N Í S Y S T É M U A B U D O U C Í V Ý V O J Kromě spolupráce v oblasti diplomových prací vyučuje společnost Red Hat na partnerských univerzitách několik kurzů4 . Požadavek na rozšíření systému o správu těchto kurzů byl očekávaný, avšak implementace požadované funkcionality bude časově náročná. Správa kurzů se totiž od diplomových prací výrazně liší. V rámci budoucího vývoje je v plánu také vyčlenit funkcionalitu pro práci s GridFS a nahrávání souborů do samostatných zásuvných modulu. Zatímco v případě GridFS se jedná pouze o „formality" v podobě vyčlenění kódu,v případě modulu pro nahrávání souborů je situace složitější. Během uplynulého půl roku došlo k vydání nové verze nástroje Fine Uploader, jenž rozšiřuje možnosti konfigurace a řeší problém oddělení prezentační vrstvy, se kterým se tento nástroj dlouhodobě potýkal. V důsledku těchto změn si tak vyčlenění modulu vyžádá rozsáhlý refaktoring. Rád bych také zmínil chystanou změnu webové adresy, na které je systém dostupný. Současná adresa5 je příliš komplikovaná a nepřehledná. Aktuálně proto připravujeme přesunutí systému pod doménu společnosti Red Hat, na adresu h t t p s : / / d i p l o m k y . r e d h a t . com. 4. Na FI se jedná například o kurz programovacího jazyka Python nebo enterprise Java technologií 5. https:/ / thesis-managementsystem.rhcloud.com 33 8 Závěr Hlavním cílem této práce bylo implementovat nový systém správy diplomových prací pro průmyslové partnera Fakulty informatiky společnost Red Hat. První část tohoto dokumentu poskytla základní informace o vyvinutém systému a stručně představila použité technologie. Následovalo podrobnější seznámení s aplikačním rámcem Grails, architekturou a vývojem aplikací na této platformě. Třetí část byla věnována práci se soubory ve vyvinutém systému se zaměřením na detaily vlastní implementace. V závěru jsem popsal nasazení vyvinuté aplikace do cloudu OpenShift. Systém se podařilo implementovat a úspěšně nasadit do produkčního prostředí. Aktuálně tak probíhá první semestr testovacího provozu, v rámci kterého se zaměřujeme na připomínky uživatelů, primárně studentů a vyučujících z jednotlivých univerzit. Spolu s odstraňováním případně nalezených chyb je systém průběžně upravován podle získaných ohlasů. 34 Literatura [1] J. A. O'Brien, Introduction to Information Systems, eleventh ed. McGraw-Hill, June 2003. [2] V. Dedik, Thesis management system for industrial partner Red Hat, Brno, 2013. [3] D. Koenig, A . Glover, P. King, G. Laforge, J. Skeet, and J. Gossling, Groovy in Action. Manning Publications, January 2007. [4] Groovy homepage. [Online]. Available: http://groovy.codehaus.org [5] Grails homepage. [Online]. Available: http://grails.org [6] Mongodb homepage. [Online]. Available: http://www.mongodb. org/ [7] P. Dedík, Grafické uživatelské rozhraní systému pro správu záverečných prací, Brno, 2013. [8] G. Smith and P. Ledbrook, Grails in Action. Manning Publications, May 2009. [9] Spring framwork homepage. [Online]. Available: http://spring.io/ [10] D. Koenig, A . Glover, P. King, G. Laforge, J. Skeet, and J. Gossling, Programming Grails. Manning Publications, May 2013. [11] Grails framework. [Online]. Available: http://grails.org/doc/latest/ [12] M . Fowler, Patterns of Enterprise Application Architecture. AddisonWesley Professional, November 2002. [13] Fineuploader homepage. [Online]. Available: http://fineuploader, com/ [14] Mongodb. [Online]. Available: http://docs.mongodb.org/manual/ [15] Openshift online pricing. [Online]. Available: https://www.openshift. com/products/ pricing 35 A Doplňující informace A . l Rozšíření pro práci s Mongo GridFS • MongoDB Tools • Mongodb Gridfs Plugin • MongoDB G O R M • MongoDB G O R M - Morphia • MongoFile Plugin B Diagramy B.l Domain Model Supervision feed 1 content dateCreated privateComment V messageCode args dateCreated User fullName password email dateCreated enabled accountLocked sendMail roles 1 assignei 1 subscriber Topic secondaryTitle lead description secondary Description dateCreated enabled types T~K—:— topic categories ^> University university 1 *^> 1 university Fag question answer locale 37 C Odkazy C . l Zdrojový kód projektu Repozitář se zdrojovými kódy projektu (Thesis Management System) je hostován službou GitHub: h t t p s : / / g i t h u b . c o m / j c e c h a c e / T h e s i s - m a n a g e m e n t - s y s t e m C.2 Adresa nasazeného systému h t t p s : / / t h e s i s - m a n a g e m e n t s y s t e m . r h c l o u d . c o m / 38