ˇ e vysok´e uˇcen´ı technick´e v Praze Cesk´ Fakulta elektrotechnick´a Katedra poˇc´ıtaˇc˚ u
Diplomov´a pr´ace
Serverov´ y modul informaˇ cn´ıho syst´ emu s rozhran´ım pro vzd´ alen´ e vol´ an´ı procedur Bc. Jan Suchan
Vedouc´ı pr´ace: Ing. Tom´aˇs Richta
Studijn´ı program: Elektrotechnika a informatika, strukturovan´ y, Navazuj´ıc´ı magistersk´ y Obor: V´ ypoˇcetn´ı technika 19. prosince 2010
iv
v
Podˇ ekov´ an´ı Chtˇel bych podˇekovat zejm´ena m´e snoubence za celkovou podporu nejen pˇri tvorbˇe t´eto pr´ace. D´ ale bych chtˇel podˇekovat vedouc´ımu pr´ace za cenn´e rady a pˇripom´ınky. V neposledn´ı ˇradˇe bych pak r´ad podˇekoval m´ ym rodiˇc˚ um, kteˇr´ı mˇe cel´a studentsk´a l´eta velmi podporovali, a tak´e m´emu dobr´emu pˇr´ıteli a spoluˇz´akovi, Petru Horsk´emu, bez kter´eho ˇ by byl posledn´ı semestr na CVUT o mnoho obt´ıˇznˇejˇs´ı.
vi
vii
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem pr´ aci vypracoval samostatnˇe a pouˇzil jsem pouze podklady uveden´e v pˇriloˇzen´em seznamu. Nem´am z´ avaˇzn´ y d˚ uvod proti uˇzit´ı tohoto ˇskoln´ıho d´ıla ve smyslu S60 Z´akona ˇc. 121/2000 Sb., o pr´ avu autorsk´em, o pr´ avech souvisej´ıc´ıch s pr´avem autorsk´ ym a o zmˇenˇe nˇekter´ ych z´akon˚ u (autorsk´ y z´ akon).
V Praze dne 19. 12. 2010
.............................................................
viii
Abstract Remote procedure call is a technology used from the very beginning of computer networks. This paper describes the principles, history and current importance of this technology in the first purely theoretical part. The goal of the second part is a design and an implementation of the server module of the information system, which uses remote procedure call for clientserver communication. This information system is used for the apartment buildings management. It is also possible to browse the state of the data to any date in the past or in the future. This function does not have any competing solution. Server module is implemented using Java Enteprise Edition platform, while at the database layer, the Hibernate framework as an implementation of Java Persistence API is used.
Abstrakt Vzd´alen´e vol´ an´ı procedur je technologie pouˇz´ıvan´a od sam´eho poˇc´atku poˇc´ıtaˇcov´ ych s´ıt´ı. Tato pr´ ace v prvn´ı ˇc´ asti, kter´ a je ryze teoretick´a, popisuje princip, historii i dneˇsn´ı v´ yznam t´eto technologie. V ˇc´ asti druh´e se pak nach´az´ı n´avrh a implementace serverov´eho modulu informaˇcn´ıho syst´emu, kter´ y pro komunikaci s modulem klientsk´ ym vyuˇz´ıv´a pr´avˇe vzd´alen´eho vol´an´ı procedur. Tento informaˇcn´ı syst´em slouˇz´ı ke spr´avˇe bytov´ ych dom˚ u veden´ ych samotn´ ymi majiteli, sdruˇzen´ımi vlastn´ık˚ u ˇci druˇzstvy. Umoˇzn ˇuje nav´ıc proch´azet stav dat syst´emu k libovoln´emu dni v minulosti i v budoucnosti. Touto funkc´ı ˇz´adn´e konkurenˇcn´ı ˇreˇsen´ı nedisponuje. Serverov´ y modul je implementov´ an na platformˇe Java Enterprise Edition, pˇriˇcemˇz na u ´rovni datab´azov´e vrstvy je pouˇzit framework Hibernate jakoˇzto implementace Java Persistence API.
ix
x
Obsah ´ 1 Uvod 1.1 C´ıl pr´ ace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Struktura textu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Vzd´ alen´ e vol´ an´ı procedur 2.1 Princip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Historie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Prvn´ı zm´ınka o vzd´alen´em vol´an´ı procedur . . . . . . . . . . . 2.2.2 Vyuˇzit´ı distribuovan´ ych prostˇredk˚ u pomoc´ı RPC . . . . . . . . 2.2.3 Implementace RPC v r´amci Xerox research internetwork . . . . 2.2.3.1 N´ avrh komponent RPC syst´emu . . . . . . . . . . . . 2.2.3.2 S´emantika v pˇr´ıpadˇe selh´an´ı komunikace ˇci algoritmu 2.2.3.3 Zajiˇstˇen´ı bezpeˇcnosti komunikace . . . . . . . . . . . 2.2.4 Dalˇs´ı v´ yvoj RPC . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.4.1 Sun Microsystems . . . . . . . . . . . . . . . . . . . . 2.2.4.2 Ostatn´ı firmy . . . . . . . . . . . . . . . . . . . . . . . 2.3 Dneˇsn´ı v´ yznam vzd´ alen´eho vol´an´ı procedur . . . . . . . . . . . . . . . 2.3.1 Rich Internet Applications . . . . . . . . . . . . . . . . . . . . . 2.3.2 Software jako sluˇzba . . . . . . . . . . . . . . . . . . . . . . . . 2.4 Dalˇs´ı technologie a protokoly vych´azej´ıc´ı z RPC . . . . . . . . . . . . . 2.5 Java Remote Method Invocation . . . . . . . . . . . . . . . . . . . . . 2.5.1 Princip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.2 Pouˇzit´ı RMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Anal´ yza 3.1 Informaˇcn´ı syst´em pro spr´avu nemovitost´ı 3.2 St´ avaj´ıc´ı ˇreˇsen´ı . . . . . . . . . . . . . . . 3.2.1 Desktopov´e aplikace . . . . . . . . 3.2.1.1 Popis vybran´ ych aplikac´ı 3.2.1.2 Z´ avˇer z porovn´an´ı . . . . 3.2.2 Webov´e aplikace . . . . . . . . . . 3.2.2.1 Popis vybran´ ych aplikac´ı 3.2.2.2 Z´ avˇer z porovn´an´ı . . . . 3.3 Poˇzadavky na syst´em . . . . . . . . . . . . 3.3.1 Funkˇcn´ı poˇzadavky . . . . . . . . .
xi
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . .
1 1 2
. . . . . . . . . . . . . . . . . .
3 3 5 6 7 7 8 9 10 10 10 11 11 11 12 13 20 20 22
. . . . . . . . . .
25 25 25 26 26 30 30 30 33 33 33
xii
OBSAH
3.4
3.3.1.1 Prostˇredky pro spr´avu bytov´ ych dom˚ u . . 3.3.1.2 Funkce ˇcasov´ ych ˇrez˚ u . . . . . . . . . . . . 3.3.2 Nefunkˇcn´ı poˇzadavky . . . . . . . . . . . . . . . . . 3.3.3 Poˇzadavky klientsk´eho modulu . . . . . . . . . . . . Sc´en´aˇre pouˇzit´ı . . . . . . . . . . . . . . . . . . . . . . . . . 3.4.1 Popis akt´er˚ u . . . . . . . . . . . . . . . . . . . . . . 3.4.2 Podrobn´ y popis pˇr´ıpad˚ u uˇzit´ı . . . . . . . . . . . . . 3.4.2.1 Pˇr´ıpady uˇzit´ı modulu Building . . . . . . . 3.4.2.2 Pˇr´ıpady uˇzit´ı modulu Space . . . . . . . . 3.4.2.3 Pˇr´ıpady uˇzit´ı modulu Application . . . . . 3.4.2.4 Pˇr´ıpady uˇzit´ı v r´amci pr´ace s dynamick´ ymi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . daty
4 V´ ybˇ er a popis technologi´ı 4.1 Vzd´alen´e vol´ an´ı procedur (RPC) . . . . . . . . . . . . . . . . . 4.1.1 Popis a porovn´ an´ı technologi´ı . . . . . . . . . . . . . . . 4.1.2 Vybran´ a technologie: Java Enterprise Edition . . . . . . 4.1.2.1 Popis platformy Java EE . . . . . . . . . . . . 4.1.2.2 Enterprise Java Beans . . . . . . . . . . . . . . 4.1.2.3 Zabezpeˇcen´ı Java EE . . . . . . . . . . . . . . 4.2 Funkce ˇcasov´ ych ˇrez˚ u. . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Moˇznosti n´ avrhu tempor´arn´ı funkˇcnosti . . . . . . . . . 4.2.2 Popis zvolen´e moˇznosti pro n´avrh tempor´arn´ı funkˇcnosti 4.3 Datab´ azov´ a vrstva v r´ amci Java EE . . . . . . . . . . . . . . . 4.3.1 Java Persistence API . . . . . . . . . . . . . . . . . . . . 4.3.2 Popis a porovn´ an´ı implementac´ı Java Persistence API . 4.3.3 Vybran´ a implementace: Hibernate . . . . . . . . . . . . 4.3.4 Datov´e u ´loˇziˇstˇe . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
5 N´ avrh ˇ reˇ sen´ı 5.1 Datov´ y model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 Modul Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.2 Modul Personal . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.3 Modul Building . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.4 Modul Space . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.5 Modul Application . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Aplikaˇcn´ı vrstva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 Z´ akladn´ı operace v tempor´arn´ı datab´azi . . . . . . . . . . . . . 5.2.1.1 Operace s klasick´ ymi objekty obsahuj´ıc´ımi dynamick´a 5.2.1.2 Operace s M:N vztahov´ ymi entitami . . . . . . . . . . 5.2.2 Zabezpeˇcen´ı funkc´ı syst´emu dle uˇzivatelsk´ ych pr´av . . . . . . . 5.2.2.1 Aspektovˇe orientovan´e programov´an´ı . . . . . . . . . 5.2.2.2 Pouˇzit´ı AOP pro kontrolu uˇzivatelsk´ ych pr´av . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . data . . . . . . . . . . . .
. . . . . . . . . . .
33 35 36 37 37 37 38 40 41 42 42
. . . . . . . . . . . . . .
45 45 45 46 47 48 49 50 50 51 53 54 54 55 55
. . . . . . . . . . . . .
57 57 57 58 59 60 61 63 63 63 65 67 67 67
OBSAH
xiii
6 Implementace 6.1 Struktura projektu . . . . . . . . . . . . . . . . . . . . 6.2 Datab´ azov´ a vrstva . . . . . . . . . . . . . . . . . . . . 6.2.1 Implementaˇcn´ı rozd´ıly v entit´ach oproti n´avrhu ´ 6.2.2 Upravy dle poˇzadavk˚ u klientsk´eho modulu . . 6.2.3 Spring ROO . . . . . . . . . . . . . . . . . . . . 6.3 Aplikaˇcn´ı logika . . . . . . . . . . . . . . . . . . . . . . 6.3.1 Uk´ azka funkˇcn´ıch metod EJB . . . . . . . . . . 6.3.2 Zabezpeˇcen´ı funkc´ı dle uˇzivatelsk´ ych pr´av . . . 6.3.3 Ostatn´ı funkce aplikaˇcn´ı logiky . . . . . . . . . 6.3.4 V´ yjimky . . . . . . . . . . . . . . . . . . . . . . 6.4 Napojen´ı rozd´ıln´ ych klientsk´ ych modul˚ u . . . . . . . . 6.5 Spr´ ava projektu . . . . . . . . . . . . . . . . . . . . . . 6.5.1 Subversion . . . . . . . . . . . . . . . . . . . . 6.5.1.1 Z´ akladn´ı pojmy . . . . . . . . . . . . 6.5.1.2 Pouˇz´ıv´ an´ı Subversion . . . . . . . . . 6.5.2 Apache Maven . . . . . . . . . . . . . . . . . . 6.5.2.1 Project Object Model . . . . . . . . . 6.5.2.2 Struktura Maven projektu . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
69 69 70 70 70 71 72 72 72 72 73 74 77 77 77 78 79 80 81
7 Testov´ an´ı 7.1 R˚ uzn´e zp˚ usoby testov´ an´ı Enterprise Java Beans 7.1.1 Moˇznosti out-of-container testov´an´ı . . . 7.1.2 Moˇznosti in-container testov´an´ı . . . . . 7.2 Vybran´ y zp˚ usob testov´ an´ı . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
83 83 84 87 89
8 Z´ avˇ er 8.1 Zhodnocen´ı v´ ysledk˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Dalˇs´ı v´ yvoj aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91 91 92
Literatura
93
A Seznam zkratek
99
B Popis instalace B.1 Java Runtime Environment B.2 Server Glassfish . . . . . . . B.3 Nasazen´ı EJB modulu . . . B.4 Spuˇstˇen´ı serveru . . . . . . B.5 Pˇripraven´ y EJB modul . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
103 103 103 103 103 104
C Uk´ azky k´ odu 105 C.1 Funkˇcn´ı metody EJB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 C.2 Interceptor na kontrolu uˇzivatelsk´ ych pr´av . . . . . . . . . . . . . . . . . . . . 108 D Obsah pˇ riloˇ zen´ eho CD
109
xiv
OBSAH
Seznam obr´ azk˚ u 2.1 2.2
2.3 2.4 2.5 2.6 2.7
Z´ akladn´ı princip komunikace pomoc´ı vzd´alen´eho vol´an´ı procedur. . . . . . . . Komponenty RPC syst´emu v implementaci v r´amci Xerox research internetwork a jejich vz´ ajemn´ a komunikace. Obr´azek je pˇrevzat´ y z [9] a z´amˇernˇe je ponech´ an v angliˇctinˇe z d˚ uvodu pouˇzit´ı zaveden´e anglick´e terminologie. . . . Architektura nasazen´ı softwaru jako sluˇzby. Obr´azek je pˇrevzat´ y z [63]. . . . . Struktura XML zpr´ avy protokolu SOAP. . . . . . . . . . . . . . . . . . . . . . Architektura protokolu DCOM. Obr´azek je pˇrevzat´ y z [1]. . . . . . . . . . . . Pouˇzit´ı n´ avrhov´eho vzoru Proxy pˇri RMI komunikaci mezi klientem a serverem. Obr´ azek je pˇrevzat´ y z [66]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vrstevnat´ a architektura RMI. Obr´azek je pˇrevzat´ y z [66]. . . . . . . . . . . .
3.1 3.2 3.3 3.4 3.5 3.6 3.7
Uk´ azka z programu SSB2000 od firmy STARLIT s.r.o. . . . . . . . . . . . . . Uk´ azka z programu SOFTWARE 5P od firmy Ing. Oldˇrich Florian. . . . . . . Uk´ azka z programu Cactus Domus od firmy C´IGLER SOFTWARE, a.s. . . . Uk´ azka z aplikace SSBnet od firmy STARLIT s.r.o. . . . . . . . . . . . . . . . Uk´ azka z webov´e nadstavby aplikace WinDomy od firmy O.K. Soft. . . . . . Uk´ azka z aplikace Building manager od firmy Ikon s.r.o. . . . . . . . . . . . . Historick´ a oprava dynamick´e informace - ˇreknˇeme, ˇze zpˇetnˇe ukl´ad´ame do syst´emu typy jedn´e m´ıstnosti v bytˇe tak, jak byly postupnˇe rekonstruov´any. Pˇri zad´ av´ an´ı ale udˇel´ ame chybu (1), kterou potˇrebujeme n´aslednˇe opravit (2). 3.8 Smaz´ an´ı historick´e zmˇeny - do syst´emu jsme omylem zadali rekonstrukci m´ıstnosti, kter´ a vˇsak nebyla provedena, proto ji potˇrebujeme smazat (1) a n´aslednˇe urˇcit, jak´ a sousedn´ı hodnota vypln´ı dan´ y ˇcasov´ yu ´sek (2). . . . . . . . . . . . 3.9 Dˇediˇcnost akt´er˚ u. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.10 Pˇr´ıpady uˇzit´ı zohledˇ nuj´ıc´ı funkce priority (1). . . . . . . . . . . . . . . . . . . ´ 3.11 Pˇr´ıpady uˇzit´ı v pˇr´ıpadˇe u ´pravy“objektu. Upravou se mysl´ı jak u ´prava jiˇz ” vytvoˇren´eho objektu, tak i pˇrid´an´ı nov´eho ˇci smaz´an´ı st´avaj´ıc´ıho. . . . . . . . 3.12 Pˇr´ıpady uˇzit´ı pro pr´ aci s dynamick´ ymi daty. . . . . . . . . . . . . . . . . . . .
4
9 12 15 18 21 22 26 28 29 31 31 32
36
37 38 39 40 43
4.1 4.2 4.3
Vrstevnat´ a architektura Java Enterprise Edition. . . . . . . . . . . . . . . . . Entita se statick´ ymi a dynamick´ ymi informacemi. . . . . . . . . . . . . . . . . M:N historick´ a entita. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48 52 52
5.1 5.2 5.3
Datov´ y model modulu Type. . . . . . . . . . . . . . . . . . . . . . . . . . . . Datov´ y model modulu Personal. . . . . . . . . . . . . . . . . . . . . . . . . . Datov´ y model modulu Building. . . . . . . . . . . . . . . . . . . . . . . . . .
58 59 60
xv
´ U ˚ SEZNAM OBRAZK
xvi
5.4 5.5 5.6
Datov´ y model modulu Space. . . . . . . . . . . . . . . . . . . . . . . . . . . . Datov´ y model modulu Application. . . . . . . . . . . . . . . . . . . . . . . . . Aspektovˇe orientovan´e programov´an´ı pˇri pouˇzit´ı s Enterprise Java Bean metodou. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagram aktivit pro funkci, kter´a kontroluje opr´avnˇen´ı uˇzivatele ke spuˇstˇen´ı EJB metody. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61 62
6.1 6.2 6.3
Nepˇredv´ıdateln´e v´ yjimky serverov´eho modulu, kter´e znaˇc´ı selh´an´ı programu. . V´ yjimky serverov´eho modulu, kter´e jsou propagov´any do modulu klientsk´eho. Struktura adres´ aˇre Maven projektu. . . . . . . . . . . . . . . . . . . . . . . .
74 75 81
7.1
Diagram fungov´ an´ı testovac´ıho frameworku Cactus. Obr´azek je pˇrevzat´ y z [15]. 87
5.7
68 68
Seznam tabulek 6.1 6.2
Bal´ıˇcky serverov´eho modulu. . . . . . . . . . . . . . . . . . . . . . . . . . . . Dˇediˇcnost v JPA entit´ ach. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69 70
7.1
Srovn´ an´ı testov´ an´ı EJB mimo J2EE kontejner a uvnitˇr J2EE kontejneru. . .
84
xvii
xviii
SEZNAM TABULEK
Kapitola 1
´ Uvod Na konci ˇsedes´ at´ ych let dvac´ at´eho stolet´ı se na svˇetˇe objevily prvn´ı osobn´ı poˇc´ıtaˇce. Mimo nich vˇsak st´ ale jeˇstˇe existovaly velk´e laboratorn´ı poˇc´ıtaˇce, tzv. Mainframe1 . Probl´em byl v tom, ˇze pˇres vˇsechny v´ yhody plynouc´ı z mal´e velikosti osobn´ıch poˇc´ıtaˇc˚ u nebyly tyto natolik v´ ykonn´e, aby mohly zpracov´ avat sloˇzit´e v´ ypoˇcty. Pˇredstavovaly sp´ıˇse jak´esi komunikaˇcn´ı termin´ aly. Bylo proto nutno vytvoˇrit nˇejak´ y mechanismus, kter´ ym by mohly tyto termin´ aly delegovat sloˇzitˇejˇs´ı nebo dokonce vˇsechny v´ ypoˇcty v´ ykonn´ ym poˇc´ıtaˇc˚ um. V devades´ at´ ych letech zaˇcaly osobn´ı poˇc´ıtaˇce dosahovat takov´eho v´ ykonu, ˇze se od tohoto principu komunikace postupnˇe upouˇstˇelo. S rozvojem internetu a se st´ale se zvyˇsuj´ıc´ımi n´aroky na v´ ykon by se vˇsak dalo ˇr´ıci, ˇze se nyn´ı vrac´ıme k p˚ uvodn´ı myˇslence. Jako pˇr´ıklad m˚ uˇzeme uv´est operaˇcn´ı syst´em Chrome OS vyv´ıjen´ y firmou Google, kter´ y bude slouˇzit jen jako termin´ al pro internetov´e aplikace.
1.1
C´ıl pr´ ace
Tato pr´ ace m´ a za u ´kol popsat princip vzd´alen´eho vol´an´ı procedur2 , kter´ y byl (a st´ale je) pouˇz´ıv´ an v kontextu v´ yˇse zm´ınˇen´e komunikace dvou poˇc´ıtaˇc˚ u. Tento zp˚ usob se v dobˇe rozvoje distribuovan´ ych v´ ypoˇct˚ u uk´ azal jako nejlepˇs´ı a nyn´ı se vyuˇz´ıv´a pro bˇeˇznou klient-server komunikaci (jmenujme napˇr´ıklad implementaci Java RMI, kter´a je souˇc´ast´ı Enterprise Java aplikac´ı). Pr´ ace d´ ale obsahuje n´ avrh a implementaci informaˇcn´ıho syst´emu (resp. jeho serverov´e ˇc´asti) pro spr´ avu bytov´ ych dom˚ u. Tento IS mus´ı splˇ novat n´ asleduj´ıc´ı poˇzadavky: ∙ pouˇzit´ı platformy Java 5 nebo vyˇsˇs´ı, ∙ poskytnut´ı prostˇredk˚ u pro spr´avu bytov´ ych dom˚ u s r˚ uzn´ ymi typy majitel˚ u (napˇr. druˇzstvo ˇci spoleˇcenstv´ı vlastn´ık˚ u), 1
Dnes si m˚ uˇzeme pod pojmem Mainframe pˇredstavit poˇc´ıtaˇcov´ y syst´em pouˇz´ıvan´ y velk´ ymi firmami zejm´ena pro urˇcit´e kritick´e aplikace. 2 Pro vzd´ alen´e vol´ an´ı procedur se pouˇz´ıv´ a zaveden´ y anglick´ y n´ azev Remote Procedure Call, jehoˇz zkratku (RPC) budeme nad´ ale v textu pouˇz´ıvat.
1
´ KAPITOLA 1. UVOD
2
∙ moˇznost proch´ azet stav syst´emu k libovoln´emu dni v minulosti, ∙ komunikace s klientsk´ ym modulem mus´ı b´ yt zajiˇstˇena pomoc´ı vzd´alen´eho vol´an´ı procedur. Jeden z moˇzn´ ych klientsk´ ych modul˚ u (webovou aplikaci) implementoval kolega Petr Horsk´ y ve sv´e diplomov´e pr´ aci Klientsk´ y modul informaˇcn´ıho syst´emu jako plnohodnotn´a ” webov´a aplikace“. V pr˚ ubˇehu v´ yvoje bylo tedy napojen´ı klientsk´eho modulu testov´ano pr´avˇe t´ımto prototypem.
1.2
Struktura textu
Pr´ace obsahuje mimo u ´vodu n´ asleduj´ıc´ı kapitoly: ∙ Vzd´ alen´ e vol´ an´ı procedur (kapitola 2) - tato kapitola pˇredstavuje teoretickou ˇc´ast pr´ace. Vysvˇetl´ıme si nejprve princip a fungov´an´ı RPC, pot´e pop´ıˇseme vzd´alen´e vol´an´ı procedur z historick´eho i souˇcasn´eho hlediska a na z´avˇer uvedeme nˇekter´e implementace RPC s d˚ urazem na implementaci v jazyce Java (Java RMI), kterou budeme pouˇz´ıvat v naˇsem programu. ∙ Anal´ yza (kapitola 3) - v t´eto kapitole podrobnˇe probereme poˇzadavky na informaˇcn´ı syst´em, vˇcetnˇe porovn´ an´ı st´ avaj´ıc´ıch ˇreˇsen´ı. ∙ V´ ybˇ er technologi´ı (kapitola 4) - pˇred samotn´ ym n´avrhem je d˚ uleˇzit´e porovnat technologie, jejichˇz pouˇzit´ı pˇripad´ avu ´vahu, a vybrat z nich ty nejlepˇs´ı. ∙ N´ avrh ˇ reˇ sen´ı (kapitola 5) - tato kapitola obsahuje n´avrh ˇreˇsen´ı s pouˇzit´ım vybran´ ych technologi´ı. ∙ Implementace (kapitola 6) - zde pop´ıˇseme implementaci navrˇzen´ ych ˇreˇsen´ı z kapitoly 6. ∙ Testov´ an´ı (kapitola 7) - kaˇzd´ a aplikace mus´ı b´ yt pˇred nasazen´ım otestov´ana, v t´eto kapitole tedy pop´ıˇseme zp˚ usob testov´an´ı, kter´ y jsme si zvolili. ∙ Z´ avˇ er (kapitola 8) - zde pak zhodnot´ıme celkov´ y v´ ysledek a pˇr´ınos pr´ace. Pˇr´ılohy: ∙ A - Seznam zkratek ∙ B - Popis instalace ∙ C - Uk´azky k´ odu ∙ D - Obsah pˇriloˇzen´eho CD
Kapitola 2
Vzd´ alen´ e vol´ an´ı procedur Vzd´alen´e vol´ an´ı procedur neboli Remote Procedure Call (RPC) je technologie, kter´a m˚ uˇze b´ yt pouˇzita mnoha zp˚ usoby z d˚ uvodu jej´ı obecnosti. Prvn´ı implementace RPC byla pouˇzita v´ yhradnˇe pro distribuovan´e v´ ypoˇcty, dnes je naopak bˇeˇzn´e pouˇzit´ı v internetov´ ych aplikac´ıch.
2.1
Princip
Je vidˇet, ˇze r˚ uznost implementac´ı RPC m˚ uˇze b´ yt tedy opravdu velk´a, popiˇsme si vˇsak nyn´ı z´akladn´ı princip, kter´ y maj´ı vˇsechny implementace spoleˇcn´ y. Tento princip se totiˇz v z´asadˇe nezmˇenil od poˇc´ atku t´eto technologie v osmdes´at´ ych letech dvac´at´eho stolet´ı, coˇz je v oblasti v´ ypoˇcetn´ı techniky sp´ıˇse neobvykl´e. V´ıce o historii RPC se dozv´ıte v ˇc´asti 2.2. Na obr´ azku 2.1 je zn´ azornˇena komunikace klientsk´eho poˇc´ıtaˇce (ten, kter´ y vol´a vzd´alenou proceduru) a serverov´eho poˇc´ıtaˇce (ten, kter´ y vzd´alenou proceduru vykon´av´a). 1. Klientsk´ y program (pˇr´ıpadnˇe pˇr´ımo uˇzivatel) nejprve stanov´ı n´azev vzd´alen´e procedury spolu s parametry, se kter´ ymi chce proceduru vykonat, 2. tato informace je pˇrenesena pˇres s´ıt’ na server (jak´ ym zp˚ usobem, to uˇz z´avis´ı na konkr´etn´ı implementaci), 3. server vykon´ a proceduru se zadan´ ymi parametry (coˇz je standardn´ı lok´aln´ı vol´an´ı), 4. v´ ysledek procedury je posl´ an zpˇet pˇres s´ıt’ klientsk´emu poˇc´ıtaˇci, 5. kter´ y v´ ysledek zpracuje obvykl´ ym zp˚ usobem, jako by poch´azel z vol´an´ı lok´aln´ı procedury. V´ yˇse popsan´ y zp˚ usob komunikace mezi klientem a serverem je velmi obecn´ y, avˇsak pr´ avˇe proto je platn´ y pro vˇsechny implementace. Nyn´ı zm´ın´ıme nˇekter´e principy protokolu a poˇzadavky na nˇej tak, jak je uv´ ad´ı RFC (Request for Comments1 ) 1050 [79], coˇz je v˚ ubec prvn´ı RFC uv´ adˇej´ıc´ı specifikaci protokolu RPC. Jak´e byly dalˇs´ı dokumenty popisuj´ıc´ı protokol se 1
Request for Comments jsou neform´ aln´ı standardy z oblasti internetu vyd´ avan´e r˚ uzn´ ymi firmami ˇci skupinami lid´ı.
3
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
4
Klient Název vzdálené procedury + argumenty Zpracování výsledku
Síť Paket(y) s voláním
Paket(y) s výsledkem
Server Provedení procedury se zadanými argumenty Vytvoření odpovědi (výsledku)
Obr´azek 2.1: Z´ akladn´ı princip komunikace pomoc´ı vzd´alen´eho vol´an´ı procedur. dozv´ıte v ˇc´asti 2.2. N´ıˇze uveden´e principy a poˇzadavky se vˇsak od roku 1988 aˇz do posledn´ı specifikace z roku 2009 nezmˇenily. Je d˚ uleˇzit´e si uvˇedomit, ˇze aˇckoli byl protokol RPC zaveden pr´avˇe proto, aby byl co nejbliˇzˇs´ı standardn´ımu lok´ aln´ımu vol´ an´ı procedur, je zde nˇekolik podstatn´ ych rozd´ıl˚ u: 1. Oˇ setˇ ren´ı chyb: oproti lok´ aln´ım procedur´am mus´ıme zajistit oˇsetˇren´ı chyb plynouc´ıch ze selh´an´ı komunikace nebo serveru. 2. Probl´ em s ukazateli: nelze pos´ılat ukazatele jako parametr, protoˇze nemaj´ı v serverov´em adresn´ım prostoru smysl, nam´ısto ukazatel˚ u se pouˇz´ıvaj´ı glob´aln´ı identifik´atory (promˇenn´e). 3. Glob´ aln´ı promˇ enn´ e: z d˚ uvodu zm´ınˇen´eho v pˇredchoz´ım bodˇe (server nem´a pˇr´ıstup do adresn´ıho prostoru klienta) procedura nesm´ı mˇenit tyto glob´aln´ı promˇenn´e ani jinak ovlivˇ novat program mimo n´ avratov´e hodnoty. 4. Rychlost: vol´ an´ı vzd´ alen´ ych procedur je v´ yraznˇe pomalejˇs´ı neˇz vol´an´ı tˇech lok´aln´ıch. 5. Autentizace: Specifikace neuv´ ad´ı nutnost komunikovat pomoc´ı RPC pˇres zabezpeˇcenou s´ıt’, m˚ uˇze b´ yt tedy vyˇzadov´ ano ovˇeˇren´ı pravosti klienta i serveru. Vzhledem k tomu, ˇze pˇred zaveden´ım RPC nebyly ˇz´adn´e pˇredchoz´ı zp˚ usoby vol´an´ı vzd´alen´ ych operac´ı na jin´em poˇc´ıtaˇci nijak standardizov´any, RFC 1050 [79] uv´ad´ı d˚ uleˇzit´e poˇzadavky na protokol vzd´ alen´eho vol´ an´ı procedur: 1. volan´a procedura mus´ı b´ yt jednoznaˇcnˇe identifikov´ana, 2. pˇri pˇr´ıchodu odpovˇedi od serveru mus´ı klient jednoduˇse zjistit, ke kter´emu vol´an´ı procedury odpovˇed’ patˇr´ı, 3. protokol mus´ı poskytnout prostˇredky pro autentizaci klienta serveru a naopak. Mimo tˇechto poˇzadavk˚ u je vhodn´e, aby implementace protokolu obsahovala funkce, kter´e zajist´ı oˇsetˇren´ı tˇechto chyb: 1. nekompatibilita RPC protokolu,
2.2. HISTORIE
5
2. rozd´ıln´e verze protokolu, kter´ y pouˇz´ıv´a klient a server, 3. chyby na u ´rovni vol´ an´ı procedury (napˇr. zad´an nepodporovan´ y typ parametru), 4. selh´ an´ı autentizace, 5. jak´ akoli dalˇs´ı chyba, kter´ a zp˚ usob´ı, ˇze nen´ı poˇzadovan´a vzd´alen´a procedura zavol´ ana. Uvedli jsme tedy z´ akladn´ı princip a sch´ema komunikace pomoc´ı RPC a popsali jsme d˚ uleˇzit´e poˇzadavky na protokol, kter´e se od jeho prvn´ı pˇredstaven´e specifikace nezmˇenily. N´asleduj´ıc´ı text popisuje v´ yvoj protokolu RPC od v˚ ubec prvn´ı zm´ınky o t´eto technice pˇres prvn´ı re´ alnou implementaci, kter´ a poloˇzila z´aklad nˇekter´ ym implementac´ım v dneˇsn´ıch modern´ıch programovac´ıch jazyc´ıch, aˇz po v´ yznam RPC v souˇcasnosti.
2.2
Historie
V roce 1969 vznikla poˇc´ıtaˇcov´ a s´ıt’ ARPANET2 , kter´a poloˇzila z´aklady dneˇsn´ıho internetu. Tato s´ıt’ byla vytvoˇrena kv˚ uli potˇrebˇe sd´ılet r˚ uzn´e prostˇredky a informace mezi poˇc´ıtaˇci vzd´alen´ ymi mnoho des´ıtek ˇci stovek kilometr˚ u. Distribuovan´e prostˇredky se v t´e dobˇe pouˇz´ıvaly v z´asadˇe dvˇema r˚ uzn´ ymi zp˚ usoby, bud’ ∙ pˇr´ımo ˇclovˇekem u dan´eho poˇc´ıtaˇce, kter´ y zad´aval konkr´etn´ı pˇr´ıkazy a z´ıskal od vzd´ alen´eho poˇc´ıtaˇce nˇejakou odpovˇed’, nebo ∙ samotn´ ymi programy, kter´e k nˇejak´emu v´ ypoˇctu pouˇzili v´ ypoˇcetn´ı kapacitu vzd´alen´eho poˇc´ıtaˇce. Pokud chtˇel aplikaˇcn´ı program´ator pouˇz´ıt ve sv´em programu nˇejak´e vzd´alen´e prostˇredky, musel pouˇz´ıt protokol, kter´ y k tomu byl urˇcen - napˇr´ıklad FTP (File Transfer Protocol) ˇci RJE (Remote Job Entry Protocol). Komunikace se vzd´alen´ ym poˇc´ıtaˇcem byla definov´ ana pomoc´ı pˇr´ıkazu a odpovˇedi, tedy Command a Response. Takto vypadala syntaxe t´eto komunikace: command-name <SP> parameter
response-number <SP> text Pˇr´ıkaz se tedy skl´ adal z n´ azvu a textov´eho parametru a odpovˇed’ obsahovala tˇr´ıˇc´ıseln´ y k´od (pro volaj´ıc´ı program) a textov´ y v´ ysledek (pro pˇr´ıpadn´e zobrazen´ı uˇzivateli). Kaˇzd´ y protokol mˇel samozˇrejmˇe pˇr´ıkazy a odpovˇedi r˚ uzn´e, syntaxi vˇsak zachov´avaly stejnou. Syst´em Command/Response nicm´enˇe nebyl ide´aln´ı, mˇel nˇekolik nev´ yhod zejm´ena pro program´ atory, kteˇr´ı ho ve sv´ ych aplikac´ıch chtˇeli pouˇz´ıt: ∙ neexistoval ˇz´ adn´ y standard tohoto syst´emu, 2 Advanced Research Projects Agency Network (zkr´ acenˇe ARPANET) byla v´ yzkumn´ a s´ıt’, kter´ a ze zaˇca ´tku propojovala nˇekolik univerzit, ale postupnˇe se rozrostla na des´ıtky tis´ıc poˇc´ıtaˇc˚ u po cel´em svˇetˇe. Nab´ızela pouˇzit´ı r˚ uzn´ ych protokol˚ u, napˇr´ıklad pˇredch˚ udce dneˇsn´ıho e-mailu [23].
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
6
∙ program´ atoˇri tak museli sami implementovat vˇzdy znovu knihovny pro pouˇzit´ı distribuovan´ ych prostˇredk˚ u, ∙ jak je patrno ze syntaxe, nebylo moˇzn´e poslat v jednom okamˇziku v´ıce parametr˚ u, napˇr´ıklad pˇrejmenov´ an´ı souboru (kde potˇrebujeme zn´at p˚ uvodn´ı a nov´ y n´azev) muselo b´ yt provedeno dvˇema pˇr´ıkazy, ∙ parametry byly pouze textov´e, ˇz´ adn´e jin´e typy nebyly povoleny.
2.2.1
Prvn´ı zm´ınka o vzd´ alen´ em vol´ an´ı procedur
Zm´ınˇen´e nev´ yhody vedly k v˚ ubec prvn´ı myˇslence o vzd´alen´em vol´an´ı procedur v RFC 707 [89] z roku 1975. Tato myˇslenka vych´ az´ı z faktu, ˇze je pro program´atora nejpˇrirozenˇejˇs´ı pouˇzit´ı procedur, kter´e vyuˇz´ıv´ a k lok´ aln´ım u ´kon˚ um. Aby byly tedy vzd´alen´e prostˇredky stejnˇe dostupn´e, bylo by ide´ aln´ı m´ıt moˇznost obsluhovat je stejn´ ym zp˚ usobem jako ty lok´aln´ı. V RFC 707 byly definov´ any poˇzadavky, kter´e by mˇel nov´ y protokol, nahrazuj´ıc´ı syst´em Command/Response, splˇ novat: ∙ Podpora stejn´ ych funkc´ı jako v syst´emu Command/Response: 1. vyvol´ an´ı jak´ehokoli pojmenovan´eho pˇr´ıkazu ˇci funkce implementovan´eho vzd´alen´ ym procesem, 2. z´ısk´ an´ı v´ ysledk˚ u jak pro uˇzivatele, kter´emu budou zobrazeny, tak pro volaj´ıc´ı lok´aln´ı program, kter´ y je m˚ uˇze d´al zpracovat. ∙ Odstranˇen´ı zn´ am´ ych nedostatk˚ u p˚ uvodn´ıho protokolu“: ” 3. libovoln´ y poˇcet parametr˚ u jako vstup pro jeden pˇr´ıkaz, 4. podpora r˚ uzn´ ych typ˚ u, nejen textov´ ych ˇretˇezc˚ u, 5. procedura mus´ı umˇet tyto r˚ uzn´e parametry pˇrij´ımat pro vstup, jakoˇzto i vracet v´ ysledky r˚ uzn´ ych typ˚ u jako v´ ystup. ∙ Podpora nov´ ych funkc´ı: 6. umoˇznit procesu bˇeˇz´ıc´ımu na serveru spouˇstˇet pˇr´ıkazy v procesu na klientu (nerozliˇsovat tedy postaven´ı klientsk´eho a serverov´eho poˇc´ıtaˇce), 7. moˇznost spuˇstˇen´ı dvou a v´ıce pˇr´ıkaz˚ u bˇeˇz´ıc´ıch z´aroveˇ n, 8. volaj´ıc´ı proces by mˇel m´ıt moˇznost oznaˇcit odpovˇed’ jako nepotˇrebnou, tedy ulehˇcit tak s´ıt’ov´emu provozu. Z v´ yˇse uveden´ ych poˇzadavk˚ u vych´ az´ı dle RFC 707 n´avrh nov´eho protokolu, kter´ y vypad´a n´asledovnˇe: message-type=CALL [tid] procedure-name arguments message-type=RETURN tid outcome results Vˇsechny ˇc´asti navrhovan´e syntaxe splˇ nuj´ı v´ yˇse uveden´e poˇzadavky. Stoj´ı snad za zm´ınku pouze voliteln´ y parametr tid, coˇz je identifik´ator transakce pouˇz´ıvan´ y pˇri soubˇeˇzn´ ych operac´ıch nebo pˇri odm´ıtnut´ı v´ ysledku, jak bylo uvedeno v bodu 8.
2.2. HISTORIE
2.2.2
7
Vyuˇ zit´ı distribuovan´ ych prostˇ redk˚ u pomoc´ı RPC
C´ılem novˇe vytvoˇren´eho protokolu by tedy mˇela b´ yt jednoduchost v pouˇzit´ı distribuovan´ ych prostˇredk˚ u, kter´e bude moci program´ator obsluhovat stejnˇe jako ty lok´aln´ı. Vzd´alen´e prostˇredky se budou moci pouˇz´ıvat jako kolekce vzd´alen´ ych podprocedur. Uˇz od poˇc´ atku dob, kdy poˇc´ıtaˇce zastupovaly lidi v ˇreˇsen´ı nejr˚ uznˇejˇs´ıch u ´loh, sloˇzitost tˇechto u ´loh pˇrevyˇsovala kapacitu jednoho poˇc´ıtaˇce. Ano, pˇred ˇctyˇriceti lety to byly u ´lohy, kter´e dnes vyˇreˇs´ı poˇc´ıtaˇc za nˇekolik sekund oproti tehdejˇs´ım nˇekolika t´ ydn˚ um, ale lid´e poˇr´ ad nach´azej´ı nov´e a nov´e probl´emy, kter´e chtˇej´ı vyˇreˇsit a jedin´ y poˇc´ıtaˇc k tomu st´ale nen´ı dostaˇcuj´ıc´ı. Jako aktu´ aln´ı pˇr´ıklad m˚ uˇzeme uv´est v´ ypoˇcet pˇredpovˇedi poˇcas´ı, kter´ y je natolik obt´ıˇzn´ y, ˇze ani dneˇsn´ı nejv´ ykonnˇejˇs´ı poˇc´ıtaˇce k tomu nejsou dost v´ ykonn´e. Vznik protokolu RPC jako prostˇredku pro pouˇzit´ı distribuovan´ ych prostˇredk˚ u je tedy velmi v´ yznamn´ ym miln´ıkem v oblasti poˇc´ıtaˇc˚ u. Poloˇzil z´aklady snadnˇejˇs´ı tvorby aplikac´ı vyuˇz´ıvaj´ıc´ıch ke sv´ ym v´ ypoˇct˚ um v´ıce neˇz jeden poˇc´ıtaˇc.
2.2.3
Implementace RPC v r´ amci Xerox research internetwork
Od prvn´ı zm´ınky o RPC uplynulo t´emˇeˇr deset let, ale vˇsechny dokumenty, kter´e n´aslednˇe popisovaly fungov´ an´ı vzd´ alen´eho vol´an´ı procedur, se zamˇeˇrovaly pouze na teoretickou rovinu. Aˇz v r´ amci v´ yzkumn´e laboratoˇre Xerox3 vznikl ˇcl´anek [9] popisuj´ıc´ı v˚ ubec prvn´ı implementaci RPC. Vzhledem k tomu, ˇze se jedn´a o prvn´ı ˇreˇsen´ı t´eto problematiky, ze kter´eho pot´e postupnˇe vych´ azej´ı vˇsechny n´asleduj´ıc´ı, probereme si tuto implementaci podrobnˇeji. Vzd´ alen´eho vol´ an´ı procedur zde bylo pouˇzito jako prostˇredek pro komunikaci mezi poˇc´ıtaˇci zpracov´ avaj´ıc´ımi distribuovan´e v´ ypoˇcty. RPC m´a dle [9] nˇekolik z´asadn´ıch v´ yhod oproti ostatn´ım zp˚ usob˚ um komunikace: ∙ jednoduch´ a s´ emantika umoˇzn ˇuj´ıc´ı jednoduˇsˇs´ı programov´an´ı distribuovan´ ych v´ ypoˇct˚ u, ∙ efektivita komunikace - vol´an´ı procedur je jednoduch´e a pˇri komunikaci se nepˇren´ aˇs´ı ˇz´ adn´ a nadbyteˇcn´ a data, ∙ obecn´ e pojet´ı komunikace - procedury jsou v lok´aln´ım programu hlavn´ım stavebn´ım prvkem a tak tomu je i pˇri distribuovan´em v´ ypoˇctu. Pˇri n´avrhu implementace byl kladen d˚ uraz na nˇekolik vˇec´ı: ∙ bylo d˚ uleˇzit´e program´ atora oprostit od programov´an´ı sloˇzit´ ych knihoven, umoˇzn ˇuj´ıc´ıch komunikaci s ostatn´ımi poˇc´ıtaˇci, aby se mohl soustˇredit pouze na konstrukci algoritmu pro distribuovan´ y v´ ypoˇcet, ∙ d´ ale bylo vhodn´e vytvoˇrit takovou implementaci RPC, kter´a bude velmi efektivn´ı a samotn´ a komunikace mezi poˇc´ıtaˇci nebude zatˇeˇzovat strojov´ y ˇcas v´ıc, neˇz je nutn´e, 3 Xerox research internetwork byla poˇc´ıtaˇcov´ a s´ıt’ v r´ amci spoleˇcnosti Xerox, kter´ a slouˇzila zejm´ena k v´ yzkumu nov´ ych technologi´ı v IT oblasti. Syst´em Grapevine [10] pak nab´ızel prostˇredky napˇr´ıklad pro pouˇzit´ı e-mailu, autentikace ˇci pr´ avˇe vzd´ alen´eho vol´ an´ı metod.
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
8
∙ v neposledn´ı ˇradˇe pak mˇela implementace umoˇznit zabezpeˇcenou komunikaci mezi volaj´ıc´ım a volan´ ym poˇc´ıtaˇcem. V´ yvoj´aˇri z Xerox Research Center vˇsak museli vyˇreˇsit n´asleduj´ıc´ı probl´emy: ∙ s´emantika v pˇr´ıpadˇe selh´ an´ı komunikace nebo algoritmu (napˇr. dead-lock), ∙ s´emantika pˇri nalezen´ı argumentu procedury obsahuj´ıc´ım odkaz na adresn´ı prostor, kter´ y nemus´ı existovat, ∙ zaˇclenˇen´ı RPC mechanismu do aplikac´ı, ∙ jak´ ym zp˚ usobem zjist´ı volaj´ıc´ı poˇc´ıtaˇc um´ıstˇen´ı (z dneˇsn´ıho pohledu IP adresu) poˇc´ıtaˇce volan´eho, ∙ vhodn´e protokoly pro pˇrenos dat mezi poˇc´ıtaˇci, ∙ zajiˇstˇen´ı bezpeˇcnosti pˇri vol´ an´ı procedur. V n´asleduj´ıc´ım textu postupnˇe objasn´ıme ˇreˇsen´ı nˇekter´ ych z uveden´ ych probl´em˚ u. 2.2.3.1
N´ avrh komponent RPC syst´ emu
Obr´azek 2.2 popisuje jednotliv´e komponenty RPC syst´emu a jejich vz´ajemnou komunikaci. Na stranˇe volaj´ıc´ıho poˇc´ıtaˇce (d´ ale jen klienta) jsou to: ∙ User - uˇzivatel/program volaj´ıc´ı vzd´alenou proceduru, ∙ User-stub - komponenta zajiˇst’uj´ıc´ı operaci s argumenty (z dneˇsn´ıho pohledu ˇreknˇeme serializaci a deserializaci4 , kter´ a nav´ıc obsahuje interface se specifikac´ı vzd´alen´e procedury, ∙ jedna instance RPC communications package (RPCRuntime) - bal´ıˇcek, kter´ y se star´a o spolehliv´ y pˇrenos dat mezi poˇc´ıtaˇci (dnes k tomu vyuˇz´ıv´ame protokol TCP/IP5 zajiˇst’uj´ıc´ı mimo jin´e pr´ avˇe spolehliv´ y pˇrenos dat) a ˇsifrov´an´ı komunikace. A na stranˇe volan´eho poˇc´ıtaˇce (d´ ale jen serveru) se nach´azej´ı tyto komponenty: ∙ Server - poˇc´ıtaˇc zajiˇst’uj´ıc´ı samotn´ y v´ ypoˇcet procedury, ∙ Server-stub - komponenta s podobnou funkc´ı jako user-stub, ∙ jedna instance RPCRuntime. Komponenty User-stub a Server-stub jsou generov´any automaticky, naopak User a Server ˇ obsahuj´ı k´od vytvoˇren´ y program´ atorem vyv´ıjej´ıc´ım distribuovanou aplikaci. Cervenˇ e jsou na obr´azku 2.2 vyznaˇceny operace, kter´e by probˇehly, pokud by byla vol´ana lok´aln´ı procedura nam´ısto vzd´alen´e. Pokud chce uˇzivatel resp. program zavolat vzd´alenou proceduru, probˇehne nejprve 4 Serializace je zp˚ usob pˇreveden´ı objektu na sekvenci byt˚ u (paket˚ u), kter´e pak mohou b´ yt pˇreneseny pˇres s´ıt’. Deserializace je pˇresnˇe opaˇcn´ y postup. 5 Protokol TCP/IP nab´ız´ı spolehliv´ y plnˇe duplexn´ı pˇrenos dat mezi dvˇema poˇc´ıtaˇci [11].
2.2. HISTORIE
9
Caller machine User local call
User-stub pack arg.
Network
RPCRuntime transmit wait
local result
unpack result
Call packet
receive
Callee machine RPCRuntime Server-stub receive
unpack arg.
Server call work
Result packet transmit
importer exporter interface
pack result
return
importer exporter interface
Obr´azek 2.2: Komponenty RPC syst´emu v implementaci v r´amci Xerox research internetwork a jejich vz´ ajemn´ a komunikace. Obr´azek je pˇrevzat´ y z [9] a z´amˇernˇe je ponech´an v angliˇctinˇe z d˚ uvodu pouˇzit´ı zaveden´e anglick´e terminologie. 1. standardn´ı vol´ an´ı odpov´ıdaj´ıc´ı lok´aln´ı procedury v User-stub, 2. kter´ y d´ ale zajist´ı vytvoˇren´ı jednoho nebo v´ıce paket˚ u obsahuj´ıc´ıch definici procedury spolu s jej´ımi argumenty, 3. RPCRuntime v klientsk´em poˇc´ıtaˇci odeˇsle pakety serveru, 4. kde je opˇet RPCRuntime pˇrijme a pˇred´a data do Server-stub. 5. Server-stub provede deserializaci argument˚ u a standardnˇe zavol´a odpov´ıdaj´ıc´ı lok´ aln´ı proceduru na serveru. Mezit´ım je proces na klientsk´em poˇc´ıtaˇci pozastaven a ˇcek´ a na v´ ysledky. 6. Po vykon´ an´ı procedury nastane pˇresnˇe opaˇcn´ y proces, v´ ysledky jsou serializov´ any v Server-stub, 7. pomoc´ı RPCRuntime pˇreneseny do klientsk´eho poˇc´ıtaˇce (pozastaven´ y proces je opˇet spuˇstˇen), 8. kde je User-stub deserializuje a pˇred´a uˇzivateli/programu. 2.2.3.2
S´ emantika v pˇ r´ıpadˇ e selh´ an´ı komunikace ˇ ci algoritmu
Bylo d˚ uleˇzit´e rozhodnout, s jakou s´emantikou se bude prov´adˇet vzd´alen´e vol´an´ı procedur v pˇr´ıpadˇe r˚ uzn´ ych selh´ an´ı. Implementace dle [9] vych´az´ı z jiˇz v´ yˇse zm´ınˇen´eho faktu, ˇze je nejjednoduˇsˇs´ı a nejlogiˇctˇejˇs´ı, aby se vzd´alen´e procedury chovaly stejnˇe jako ty lok´aln´ı. Pro program´ atora je tato situace ide´ aln´ı. Rozliˇs´ıme tedy tyto pˇr´ıpady selh´an´ı: 1. pokud selˇ ze komunikace mezi poˇ c´ıtaˇ ci (napˇr. pˇri nenalezen´ı odpov´ıdaj´ıc´ıho serveru, kter´ y by vzd´ alenˇe vykonal proceduru), RPCRuntime se postar´a o proveden´ı odpov´ıdaj´ıc´ıch akc´ı. Znamen´ a to, ˇze klientsk´ y program se dozv´ı o chybˇe komunikace (odpov´ıdaj´ıc´ı v´ yjimkou) a m˚ uˇze na tuto ud´alost zareagovat,
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
10
2. v pˇr´ıpadˇe selh´ an´ı algoritmu a vyhozen´ı v´ yjimky je tato v´ yjimka propagov´ana do klientsk´eho programu, kde je obslouˇzena, 3. pokud vˇsak algoritmus selˇ ze z d˚ uvodu chybn´ eho k´ odu (napˇr. dead-lock, zacyklen´ı), ˇz´adn´a v´ yjimka nen´ı vyhozena a volaj´ıc´ı program/uˇzivatel tuto chybu nepozn´a. Toto chov´an´ı je totoˇzn´e s chov´ an´ım lok´ aln´ı procedury. 2.2.3.3
Zajiˇ stˇ en´ı bezpeˇ cnosti komunikace
V´ yˇse popisovan´ a implementace byla prvn´ı, kter´a nab´ıdla prostˇredky pro bezpeˇcnou komunikaci dvou poˇc´ıtaˇc˚ u pomoc´ı RPC. Volaj´ıc´ı poˇc´ıtaˇc mˇel tak jistotu, ˇze server je opravdu ten, za kter´eho se vyd´ av´ a, a naopak. Tuto autentizaci zajiˇst’oval syst´em Grapevine [10] v r´amci Xerox research internetwork. Tato RPC knihovna nav´ıc nab´ızela podporu pro celkov´e ˇsifrov´an´ı vol´an´ı i v´ ysledk˚ u procedur. Dalo se tedy jednoduˇse zabr´ anit napˇr´ıklad zmˇenˇe volan´e procedury u ´toˇcn´ıkem.
2.2.4
Dalˇ s´ı v´ yvoj RPC
Nyn´ı se zamˇeˇrme na dalˇs´ı historick´ y v´ yvoj vzd´alen´eho vol´an´ı procedur a zmiˇ nme nejd˚ uleˇzitˇejˇs´ı implementace ˇci protokoly vych´ azej´ıc´ı z RPC, kter´e byly v pr˚ ubˇehu ˇcasu vytvoˇreny. Nejzn´amˇejˇs´ı implementace a nov´e protokoly, kter´e se pouˇz´ıvaj´ı dnes, vˇsak pop´ıˇseme aˇz v ˇc´asti 2.4. 2.2.4.1
Sun Microsystems
D˚ uleˇzit´ ym hr´aˇcem v oblasti vzd´ alen´eho vol´an´ı procedur byla firma Sun Microsystems. Ve stejn´em roce, kdy byla pops´ ana prvn´ı implementace RPC (1984), vyvinula tato firma protokol Network File System, kter´ y umoˇzn ˇoval pˇr´ıstup k soubor˚ um na vzd´alen´em poˇc´ıtaˇci v syst´emu ˇ Unix. C´ast, kter´ a zajiˇst’ovala samotnou komunikaci mezi poˇc´ıtaˇci, se naz´ yvala Sun’s RPC. Dnes m´a tento syst´em n´ azev Open Network Computing Remote Procedure Call a je to, dalo by se ˇr´ıci, z´akladn´ı popsan´ y standard vzd´alen´eho vol´an´ı procedur. Od roku 1988 pak Sun Microsystems vyd´av´a dokumenty RFC popisuj´ıc´ı tento protokol. Uved’me si nyn´ı, jak byly tyto dokumenty postupnˇe zveˇrejˇ nov´any. ∙ RFC 1050 (1988) [79] - jak jsme jiˇz zm´ınili v ˇc´asti 2.1, prvn´ım dokumentem popisuj´ıc´ım specifikaci protokolu bylo RFC 1050 z roku 1988. ∙ RFC 1057 (1988) [80] - jen o nˇekolik mˇes´ıc˚ u pozdˇeji byl vˇsak vyd´an nov´ y dokument, kter´ y popisoval druhou, vylepˇsenou verzi protokolu. ∙ RFC 1831 (1995) [75] - v roce, kdy byl tak´e pˇredstaven programovac´ı jazyk Java, byla zveˇrejnˇena nov´ a specifikace RPC. Od t´e z roku 1988 se vˇsak nijak z´asadnˇe neliˇsila, byla sp´ıˇse zjednoduˇsena. V oblasti bezpeˇcnosti (autentizace) byly napˇr´ıklad odebr´any nˇekter´e moˇznosti, kter´e v tu dobu jiˇz nemohly b´ yt pouˇzity, protoˇze vyuˇz´ıvaly zastaral´e techniky.
ˇ ´I VYZNAM ´ ´ ´ ´ ´I PROCEDUR 2.3. DNESN VZDALEN EHO VOLAN
11
∙ RFC 5531 (2009) [82] - aktu´aln´ı specifikace z roku 2009 reflektuje v nov´em dokumentu zmˇeny, kter´e se ud´ aly v oblasti internetu. Vˇetˇsina tˇechto zmˇen se t´ yk´a opˇet bezpeˇcnosti, ale tak´e napˇr´ıklad specifikace form´atu popisuj´ıc´ı vzd´alenou proceduru. Tento z´ apis vyuˇz´ıv´ a tzv. External Data Representation Standard (XDR) [29], kter´ y doznal od roku 1995 nˇekolika zmˇen. 2.2.4.2
Ostatn´ı firmy
Nebyla to vˇsak jen firma Sun Microsystems, kter´a vytv´aˇrela implementace a standardy v oblasti RPC. Spoleˇcnost Apollo Computer vytvoˇrila v osmdes´at´ ych letech Network Computing System (NCS), coˇz byla implementace vzd´alen´eho vol´an´ı procedur. NCS pozdˇeji slouˇzil jako z´ aklad pro DCE/RPC, tedy Distributed Computing Environment / Remote Procedure Calls. V roce 1989 vytvoˇrily firmy Hewlett-Packard, IBM, Sun Microsystems, Apple Computer, American Airlines a Data General uskupen´ı Object Management Group, kter´e v ˇr´ıjnu roku 1991 pˇredstavilo prvn´ı verzi protokolu CORBA [8], kter´ y je velmi zn´amou implementac´ı nebo sp´ıˇse nov´ ym protokolem vych´azej´ıc´ım z RPC. V´ıce se o tomto protokolu a o tom, proˇc nakonec nebyl u ´spˇeˇsn´ y, doˇctete v ˇc´asti 2.4. Pozdˇeji vstupuje do hry i Microsoft, kter´ y vyvine sv˚ uj protokol DCOM (postaven´ y na RPC) [1] pro vzd´ alenou komunikaci komponent ve Windows. V´ıce o tomto protokolu v ˇc´asti 2.4.
2.3
Dneˇ sn´ı v´ yznam vzd´ alen´ eho vol´ an´ı procedur
Vzd´alen´e vol´ an´ı procedur se i dnes st´ale pouˇz´ıv´a ke komunikaci pˇri distribuovan´ ych v´ ypoˇctech, jeho v´ yznam vˇsak roste v jin´ ych oblastech.
2.3.1
Rich Internet Applications
Pˇrich´az´ıme do doby, kdy klasick´e desktopov´e aplikace zaˇc´ınaj´ı b´ yt pomalu, ale jistˇe vytlaˇcov´any tˇemi internetov´ ymi. M˚ uˇzeme tak mluvit o tzv. Rich Internet Applications (RIA), coˇz bychom mohli pˇreloˇzit jako plnohodnotn´e internetov´e aplikace, tedy takov´e, kter´e nab´ız´ı podobn´e funkce, na kter´e jsme zvykl´ı z aplikac´ı desktopov´ ych [13]. Ze z´astupc˚ u RIA aplikac´ı jmenujme napˇr´ıklad: ∙ Gmail - webov´ y e-mail, ∙ Photoshop Express - editor fotografi´ı, ∙ Docs - webov´ a verze program˚ u Microsoft Word, Excel a PowerPoint. Kaˇzd´ a ze zm´ınˇen´ ych aplikac´ı s nejvˇetˇs´ı pravdˇepodobnost´ı vyuˇz´ıv´a nˇejakou implementaci RPC (s u ´plnou jistotou to samozˇrejmˇe nelze ˇr´ıci, protoˇze k´od tˇechto aplikac´ı nen´ı veˇrejnˇe pˇr´ıstupn´ y, ale z vlastn´ıch zkuˇsenost´ı to pˇredpokl´ad´am). Klientem je v tomto pˇr´ıpadˇe internetov´ y prohl´ıˇzeˇc, kter´ y zobrazuje prezentaˇcn´ı vrstvu aplikace a komunikuje s aplikaˇcn´ı logikou um´ıstˇenou na serveru pr´ avˇe pomoc´ı RPC.
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
12
Je zˇrejm´e, ˇze tento trend se bude jeˇstˇe prohlubovat a moˇzn´a se jednou doˇck´ame chv´ıle, kdy budou poˇc´ıtaˇce jen jak´esi internetov´e termin´aly. T´ımto smˇerem se napˇr´ıklad vyd´av´a operaˇcn´ı syst´em Chrome OS od firmy Google. V posledn´ıch letech nav´ıc pˇrich´ azej´ı na trh mobiln´ı telefony, kter´e sv´ ym v´ ykonem pˇrevyˇsuj´ı dˇr´ıvˇejˇs´ı poˇc´ıtaˇce. Tyto mobiln´ı telefony nav´ıc disponuj´ı rychl´ ym internetov´ ym pˇripojen´ım, takˇze pro uˇzivatele nen´ı probl´em s internetem pracovat podobn´ ym zp˚ usobem jako na poˇc´ıtaˇci. Vzhledem k tomu, ˇze velk´e vyt´ıˇzen´ı procesoru telefonu pomˇernˇe hodnˇe spotˇrebov´av´a energii (a tud´ıˇz sniˇzuje v´ ydrˇz baterie), je v pˇr´ıpadˇe n´aroˇcn´ ych v´ ypoˇct˚ u lepˇs´ı tyto prov´est na vzd´alen´em serveru a do telefonu poslat jen v´ ysledek. Opˇet se v tomto pˇr´ıpadˇe s nejvˇetˇs´ı pravdˇepodobnost´ı pouˇzije vzd´ alen´e zavol´an´ı procedury a mobiln´ı klient m˚ uˇze b´ yt dokonce pouze optimalizovan´ a verze RIA aplikace.
2.3.2
Software jako sluˇ zba
S protokolem RPC u ´zce souvis´ı pojem Software jako sluˇzba“ (z anglick´eho Software as ” ” a service“ - zkratka SaaS). Je to zp˚ usob poskytov´an´ı softwaru jakoˇzto sluˇzby na internetu. A vˇetˇsina tˇechto sluˇzeb pouˇz´ıv´ a ke komunikaci s klientem pr´avˇe nˇejakou formu vzd´alen´eho vol´an´ı procedur.
Poskytovatel služby Publikování služby
Klient – server komunikace
Registr služeb
Klient Nalezení služby
Obr´azek 2.3: Architektura nasazen´ı softwaru jako sluˇzby. Obr´azek je pˇrevzat´ y z [63]. P˚ uvodn´ı koncepce softwaru jako sluˇzby se vˇsak jist´ ym zp˚ usobem liˇs´ı od t´e dneˇsn´ı. Sluˇzbou se rozumˇela sp´ıˇse jednoduˇsˇs´ı funkce (jmenujme napˇr´ıklad sluˇzbu pro pˇrepoˇcet mˇeny), jej´ıˇz definice byla uloˇzena v nˇejak´em centr´ aln´ım registru sluˇzeb a kdokoliv ji mohl vyuˇz´ıt. Tuto architekturu zobrazuje obr´ azek 2.3. Poskytovatel v t´eto architektuˇre nab´ız´ı definici sluˇzby za pouˇzit´ı protokolu WSDL [87]. Komunikace mezi klientem a serverem je pak zajiˇstˇena pomoc´ı protokolu SOAP (v´ıce se o tomto protokolu doˇctete v ˇc´asti 2.4). Sluˇzba m˚ uˇze b´ yt pouˇzita: ∙ samotn´ ym klientem (napˇr´ıklad aplikac´ı pro pˇrepoˇcet mˇeny, kter´a ke sv´emu chodu vyuˇz´ıv´a nˇekterou webovou sluˇzbu poskytuj´ıc´ı pˇrevod mˇen) nebo
´ ´IC´I Z RPC 2.4. DALSˇ´I TECHNOLOGIE A PROTOKOLY VYCHAZEJ
13
∙ jinou sluˇzbou. Webov´e sluˇzby dle p˚ uvodn´ıho konceptu by pak mˇely b´ yt [63]: ∙ platformˇ e nez´ avisl´ e - mus´ı je b´ yt moˇzno zavolat pˇres standardn´ı protokoly, kter´e jsou nez´ avisl´e na poˇc´ıtaˇcov´e platformˇe, ∙ oddˇ elen´ e od implementace - nem˚ uˇze b´ yt vyˇzadov´ana znalost jak´ ychkoli vnitˇrn´ıch struktur (implementace) sluˇzby, pokud ji chceme pouˇz´ıt, ∙ nez´ avisl´ e na um´ıstˇ en´ı - definice sluˇzeb mus´ı b´ yt uloˇzena v nˇejak´em centr´aln´ım registru a um´ıstˇen´ı samotn´e sluˇzby nem˚ uˇze hr´at pro klienta roli. Nen´ı pravda, ˇze by se v´ yˇse zm´ınˇen´ y zp˚ usob dnes jiˇz nepouˇz´ıval, ale s rozvojem rychl´eho internetu se postupnˇe pojem Software as a service“ zaˇcal pouˇz´ıvat v trochu odliˇsn´e ” souvislosti [26][39]. Pokud dnes firmy pouˇz´ıvaj´ı software jako sluˇzbu, je t´ım myˇsleno, ˇze si nenakupuj´ı klasick´ y software, kter´ y se mus´ı instalovat na poˇc´ıtaˇc, ale pouˇz´ıvaj´ı webov´e aplikace (mohou to b´ yt RIA aplikace) poskytuj´ıc´ı stejn´e funkce. Jako v´ yhody tohoto provozov´an´ı softwaru m˚ uˇzeme uv´est: ∙ niˇzˇs´ı poˇrizovac´ı n´ aklady, ∙ odpad´ a nutnost provozu technick´e podpory (software nen´ı hostov´an na naˇsem serveru, takˇze se o technick´e zajiˇstˇen´ı star´a dodavatelsk´a spoleˇcnost), ∙ v r´ amci jedn´e ceny m´ ame vˇetˇsinou pˇr´ıstup vˇzdy k nejnovˇejˇs´ım verz´ım softwaru, tyto verze se nav´ıc aktualizuj´ı automaticky. Mezi nev´ yhody naopak patˇr´ı napˇr´ıklad: ∙ potencion´ aln´ı bezpeˇcnostn´ı riziko - data firmy jsou uloˇzena u tˇret´ı spoleˇcnosti, nicm´enˇe je dnes bˇeˇzn´e, ˇze spoleˇcnosti provozuj´ıc´ı software jako sluˇzbu maj´ı svoje servery zabezpeˇceny v´ yraznˇe v´ıc, neˇz samotn´e firmy, ∙ obt´ıˇzn´e uzp˚ usoben´ı softwaru individu´aln´ım potˇreb´am z´akazn´ıka - vzhledem k tomu, ˇze se v naprost´e vˇetˇsinˇe jedn´ a o webov´e aplikace poskytovan´e mnoha z´akazn´ık˚ um z´aroveˇ n, nen´ı moˇzn´e splnit vˇsechny jejich individu´aln´ı poˇzadavky.
2.4
Dalˇ s´ı technologie a protokoly vych´ azej´ıc´ı z RPC
Specifikace protokolu RPC je velmi obecn´a, proto byly postupnˇe vytvoˇreny urˇcit´e nadstavby ˇ - tedy dalˇs´ı protokoly - vych´ azej´ıc´ı ze vzd´alen´eho vol´an´ı procedur. Casto se vˇsak bohuˇzel zamˇen ˇuje teoretick´ y probl´em (vzd´ alen´e vol´an´ı procedur) s jeho realizac´ı (implementace RPC). Setk´ av´ ame se s t´ım, ˇze implementace protokolu RPC je oznaˇcena za nov´ y protokol (napˇr. XML-RPC) nebo naopak, ˇze protokol vych´azej´ıc´ı z RPC je oznaˇcen pouze za jeho implementaci.
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
14
Osobnˇe si mysl´ım, ˇze napˇr´ıklad XML-RPC je pouze implementac´ı RPC, kter´a definuje zp˚ usob komunikace dvou poˇc´ıtaˇc˚ u a form´ at zpr´av, kter´e si vymˇen ˇuj´ı. Naopak protokol REST je dle m´eho n´azoru jiˇz nadstavbov´ y protokol postaven´ y na RPC, protoˇze definuje speci´aln´ı poˇzadavky na komunikaci klienta a serveru, kter´e samotn´ y protokol RPC nevyˇzaduje. Postupnˇe si nyn´ı pop´ıˇseme nejd˚ uleˇzitˇejˇs´ı nadstavbov´e protokoly6 vych´azej´ıc´ı z RPC. V´ yjimku udˇel´ame u technologie Java RMI, pro kterou vyˇclen´ıme zvl´aˇstn´ı podkapitolu, protoˇze tuto technologii budeme pouˇz´ıvat (dle zad´an´ı) v naˇsem informaˇcn´ım syst´emu, bude tedy vhodn´e ji popsat podrobnˇeji. XML-RPC Jak uˇz n´ azev napov´ıd´ a, XML-RCP [53][90] je protokol vyuˇz´ıvaj´ıc´ı XML7 ke 8 k´odov´an´ı zpr´av a HTTP ke komunikaci mezi klientem a serverem. Nem˚ uˇzeme mluvit vyloˇzenˇe o nov´e technologii postaven´e na RPC, ale sp´ıˇse o specifikaci, jak´ ym zp˚ usobem spolu komunikuj´ı dva poˇc´ıtaˇce. Pˇr´ıklad poˇzadavku XML-RPC vol´ an´ı: 1 2 3 4 5 6 7 8
<methodCall> <methodName>helloWorld.hello <params> <param> <string>John Pˇr´ıklad odpovˇedi od serveru:
1 2 3 4 5 6 7
<methodResponse> <params> <param> <string>Hello, John. U vol´an´ı ani u odpovˇedi jsme pro pˇrehlednost neuv´adˇeli HTTP hlaviˇcku, kter´a mus´ı b´ yt samozˇrejmˇe souˇc´ ast´ı zpr´ avy, protoˇze je pouˇzit protokol HTTP. Protokol XML-RPC jiˇz nen´ı nad´ ale vyv´ıjen a nahradil ho protokol SOAP, kter´ y z nˇeho vych´az´ı. 6
Nadstavbov´ ymi protokoly tedy mysl´ıme i implementace RPC, kter´e jsou vˇsak naz´ yv´ any samostatn´ ymi protokoly. 7 Extensible Markup Language (zkratka XML) je znaˇckovac´ı jazyk pouˇz´ıvan´ y ke k´ odov´ an´ı zpr´ av. Je velmi dobˇre ˇciteln´ y pro ˇclovˇeka, avˇsak pr´ avˇe proto je jeho zpracov´ an´ı poˇc´ıtaˇcem pomalejˇs´ı neˇz napˇr´ıklad konkurenˇcn´ıho jazyka JSON. 8 HTTP je internetov´ y protokol, kter´ y slouˇz´ı k v´ ymˇenˇe hypertextov´ ych dokument˚ u.
´ ´IC´I Z RPC 2.4. DALSˇ´I TECHNOLOGIE A PROTOKOLY VYCHAZEJ
15
Simple Object Access Protocol (SOAP) Protokol SOAP [72][88] byl p˚ uvodnˇe vytvoˇren firmami Microsoft, Userland Software a IBM. V roce 2006 dokonce z´ıskali zakladatel´e na protokol SOAP patent [58]. Specifikace protokolu je vˇsak nyn´ı spravov´ana World Wide Web konsorciem. Na rozd´ıl od protokolu XML-RPC specifikace SOAP povoluje komunikaci tak´e pomoc´ı pos´ıl´an´ı zpr´ av nam´ısto RPC. Ostatn´ı technologie jsou totoˇzn´e, liˇs´ı se pouze syntaxe vol´ an´ı a odpovˇed´ı. Strukturu XML zpr´ avy zobrazuje obr´azek 2.4.
SOAP Envelope
SOAP Header
SOAP Body
Obr´ azek 2.4: Struktura XML zpr´avy protokolu SOAP. V XML zpr´ avˇe SOAP se tedy nach´azej´ı tyto ˇc´asti: ∙ Envelope (ob´ alka) - definuje z´akladn´ı prvky zpr´avy a celou ji obaluje, ∙ Header (hlaviˇcka) - tato nepovinn´a ˇc´ast m˚ uˇze obsahovat napˇr´ıklad k´odov´an´ı zpr´ avy, definici datov´ ych typ˚ u a podobnˇe, ∙ Body (tˇelo) - obsahuje samotn´e RPC vol´an´ı nebo odpovˇed’. Nyn´ı si uvedeme pˇr´ıklad SOAP vol´an´ı. Odpovˇed’ od serveru uv´adˇet nebudeme, liˇs´ı se pouze v pˇrid´ an´ı slova Response“ za n´azev metody. V naˇsem pˇr´ıpadˇe by tedy nam´ısto ” zde bylo: . 1 2
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
16
3 4 5 6 7 8
<SOAP-ENV:Body> John Jak bylo zm´ınˇeno v ˇc´ asti 2.3.2, protokol SOAP se vyuˇz´ıv´a pˇrev´aˇznˇe pro webov´e sluˇzby. Jeho v´ yhoda je zejm´ena v moˇznosti pouˇzit´ı na r˚ uzn´ ych platform´ach a jednoduchosti implementace. Stejnˇe jako u protokolu XML-RPC, ze kter´eho vych´az´ı, nen´ı SOAP omezen napˇr´ıklad firewally, protoˇze pouˇz´ıv´ a na u ´rovni aplikaˇcn´ı vrstvy HTTP. Jako nejvˇetˇs´ı nev´ yhodu uved’me niˇzˇs´ı rychlost z d˚ uvodu velk´e komunikaˇcn´ı reˇzie (zpr´avy jsou pˇrehledn´e a ˇciteln´e pro ˇclovˇeka, ale poˇc´ıtaˇc takto strukturovan´e XML mus´ı parsovat a je to v´ yraznˇe pomalejˇs´ı neˇz kdyby pˇrijal bin´arn´ı zpr´avu). Tato nev´ yhoda vˇsak ˇc´asteˇcnˇe odpad´a pˇri pos´ıl´an´ı vˇetˇs´ıch zpr´ av, kdy vˇetˇsinu zpr´avy zab´ıraj´ı parametry (nebo n´avratov´a hodnota). JSON-RPC Protokol JSON-RPC se od pˇredchoz´ıch dvou liˇs´ı pouze notac´ı pouˇzitou ke k´odov´an´ı zpr´av. Nepouˇz´ıv´ a XML, ale tzv. JavaScript Object Notation (JSON) [18][49]. Z n´azvu by se mohlo zd´ at, ˇze je tento form´ at urˇcen pouze pro zpracov´an´ı v programovac´ım jazyku JavaScript, avˇsak nen´ı to pravda, je to platformˇe nez´avisl´ y form´at pro pˇrenos dat. Dalo by se ˇr´ıci, ˇze JSON je odlehˇcenou variantou XML, protoˇze klade d˚ uraz na minimalizaci znak˚ u potˇrebn´ ych pro definov´ an´ı struktury zpr´avy. Mezi podporovan´e datov´e typy patˇr´ı: ∙ pole, ∙ objekty a ∙ samostatn´e hodnoty (ˇretˇezce ˇci ˇc´ısla). N´asleduj´ıc´ı z´apis pˇredstavuje uk´ azku zak´odov´an´ı objektu Product:
1 2 3 4 5
{"product": { "name": "Bike", "id": "457", "price": 52.5 }} Representational State Transfer (REST) Technologie REST byla navrˇzena R. Fieldingem v jeho disertaci [30] jako standard pro komunikaci poˇc´ıtaˇc˚ u v distribuovan´em prostˇred´ı. Podobnˇe jako XML-RPC resp. SOAP m´a i protokol REST nejvˇetˇs´ı vyuˇzit´ı v oblasti ˇ webov´ ych sluˇzeb [43]. Casto se setk´ av´ ame s pojmem RESTful API, coˇz je jen pojmenov´an´ı 9 API vyuˇz´ıvaj´ıc´ıho protokolu REST. 9
Application Programming Interface (zkr´ acenˇe API) je rozhran´ı, kter´e poskytuje dan´ y program, sluˇzba ˇci protokol a jehoˇz metody pak m˚ uˇze program´ ator vyuˇz´ıvat.
´ ´IC´I Z RPC 2.4. DALSˇ´I TECHNOLOGIE A PROTOKOLY VYCHAZEJ
17
V´ yˇse zm´ınˇen´e protokoly pouˇz´ıvaj´ı ke komunikaci formu RPC. Dalo by se ˇr´ıci, ˇze REST tak´e vyuˇz´ıv´ a z´ akladu ze vzd´ alen´eho vol´an´ı procedur, avˇsak komunikace je orientov´ana datovˇe, m´ame totiˇz na v´ ybˇer pouze ˇctyˇri metody [56][43]. Tyto metody definuj´ı z´akladn´ı operace s daty, tedy tzv. soubor operac´ı CRUD (Create - vytvoˇren´ı, Retrieve - z´ısk´an´ı, Update aktualizace a Delete - smaz´ an´ı) a vych´azej´ı z metod protokolu HTTP. ∙ GET (Retrieve) - z´ısk´ an´ı seznamu poloˇzek ˇci zobrazen´ı informac´ı o konkr´etn´ı poloˇzce (HTTP metoda GET), ∙ PUT (Update) - aktualizace cel´eho seznamu poloˇzek nov´ ym seznamem ˇci aktualizace jedn´e konkr´etn´ı poloˇzky; v pˇr´ıpadˇe, ˇze tato poloˇzka neexistuje, je vytvoˇrena (HTTP metoda POST), ∙ POST (Create) - vytvoˇren´ı nov´e poloˇzky (HTTP metoda POST), ∙ DELETE - smaz´ an´ı jedn´e konkr´etn´ı poloˇzky ˇci cel´eho seznamu poloˇzek (HTTP metoda DELETE). RESTful API pouˇz´ıv´ a napˇr´ıklad zn´am´a sluˇzba Twitter.com. Pro z´ısk´an´ı zpr´av konkr´etn´ıho uˇzivatele zavol´ ame n´ asleduj´ıc´ı: GET /statuses/user_timeline/uzivatel.xml Host: twitter.com Common Object Request Broker Architecture (CORBA) Tento protokol vznikl jiˇz na zaˇc´ atku devades´ at´ ych let minul´eho stolet´ı. Narozd´ıl od pˇredchoz´ıch vyuˇz´ıv´a pro pˇrenos dat protokolu TCP/IP a ne HTTP. Protokol HTTP totiˇz teprve vznikal, kdyˇz byla pˇredstavena verze CORBA 1.0. Protokol CORBA je nadstavbou RPC, kdy pro definici procedur vyuˇz´ıv´a tzv. Interface definition language, coˇz je standard pro z´apis rozhran´ı slouˇz´ıc´ıho pro komunikaci r˚ uzn´ ych komponent programu napsan´ ych v rozd´ıln´ ych programovac´ıch jazyc´ıch [8]. Pr´ avˇe usnadnˇen´ı komunikace r˚ uzn´ ych komponent syst´emu bylo hlavn´ım c´ılem tohoto protokolu. Mnoho ˇc´ ast´ı specifikace protokolu vˇsak nebylo v˚ ubec nikdy implementov´ano a dnes se protokol pouˇz´ıv´ a sp´ıˇse zˇr´ıdka. Probl´em byl v dobˇe vzniku protokolu zejm´ena ve sloˇzitosti specifikace a v absenci jak´ekoli re´ aln´e (byt’ jen uk´azkov´e) implementace, kter´a by poskytovala pˇr´ıklad pouˇzit´ı [36]. Distributed Component Object Model (DCOM) Dalˇs´ım protokolem zaloˇzen´ ym na RPC je propriet´ arn´ı syst´em spoleˇcnosti Microsoft - Distributed Component Object Model. Protokoly DCOM a CORBA b´ yvaj´ı ˇcasto porovn´av´any (napˇr. v [16]) a dalˇs´ım d˚ uvodem, proˇc nebyl protokol CORBA pˇr´ıliˇs u ´spˇeˇsn´ y bylo pr´avˇe rozhodnut´ı Microsoftu o vytvoˇren´ı vlastn´ıho ˇreˇsen´ı. DCOM vych´ az´ı z protokolu COM (Component Object Model), coˇz je syst´em pro snadnou komunikaci r˚ uzn´ ych komponent v operaˇcn´ım syst´emu Windows. Nejvˇetˇs´ı v´ yhoda tohoto syst´emu spoˇc´ıv´ a v tom, ˇze mohou b´ yt jednotliv´e komponenty odpojeny a nahrazeny za jin´e bez nutnosti opˇetovn´e kompilace programu [1]. Na obr´ azku 2.5 vid´ıme architekturu protokolu DCOM. Zmiˇ nme nˇekter´e jej´ı ˇc´asti:
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
18
Klient
COM run-time Security Provider
COM run-time
DCE RPC
Protocol Stack
Security Provider
Komponenta
DCE RPC
Protocol Stack
DCOM network protocol
Obr´ azek 2.5: Architektura protokolu DCOM. Obr´azek je pˇrevzat´ y z [1]. ∙ Klient - program, kter´ y chce vyuˇz´ıt nˇejakou vzd´alenou komponentu, ∙ COM run-time - komunikaˇcn´ı prostˇred´ı protokolu COM, ∙ DCE RPC10 - komponenta, kter´ a zajiˇst’uje vzd´alen´e vol´an´ı procedur. .NET Remoting V roce 2002 byla pˇredstavena spoleˇcnost´ı Microsoft prvn´ı verze frameworku11 .NET, kter´ y se od t´e doby pouˇz´ıv´a k programov´an´ı aplikac´ı pod Windows. Protokol .NET Remoting navazuje na DCOM a je souˇc´ast´ı tohoto frameworku. Apache Thrift Protokol Thrift byl vyvinut prim´arnˇe pro str´anku www.facebook.com pro vyuˇzit´ı distribuovan´ ych prostˇredk˚ u napˇr´ıˇc r˚ uzn´ ymi platformami (C++, Java, PHP a dalˇs´ı). Dnes je tento protokol uvolnˇen jako open-source skupinou Apache Software Foundation [68]. Definice urˇcit´e sluˇzby (implementovan´e na jak´ekoli podporovan´e platformˇe) v protokolu Thrift m´a n´asleduj´ıc´ı formu: 1 2 3 4 5 6
service { (<arguments>) [throws (<exceptions>)] ... }
10
Jak jsme zm´ınili v ˇca ´sti 2.2.4.2, DCE RPC je zkratka pro Distributed Computing Environment / Remote Procedure Calls, coˇz je syst´em, kter´ y umoˇzn ˇuje pouˇzit´ı RPC v distribuovan´ ych prostˇred´ıch. 11 Framework m´ a v´ yznam urˇcit´e programov´e struktury ˇci n´ astroje, kter´ y pom´ ah´ a program´ atorovi ve v´ yvoji softwaru.
´ ´IC´I Z RPC 2.4. DALSˇ´I TECHNOLOGIE A PROTOKOLY VYCHAZEJ
19
Jako pˇr´ıklad m˚ uˇzeme uv´est tento z´apis: 1 2 3 4 5 6
service StringCache { void set(1:i32 key, 2:string value), string get(1:i32 key) throws (1:KeyNotFound knf), void delete(1:i32 key) } Hessian Jedn´ a se o bin´ arn´ı protokol, kter´ y je tedy optim´aln´ı pro pos´ıl´an´ı (velk´ ych) bin´ arn´ıch dat, coˇz nemus´ı b´ yt u ostatn´ıch RPC protokol˚ u pˇr´ıliˇs efektivn´ı. Hessian byl vytvoˇren spoleˇcnost´ı Caucho Technology, Inc. a dnes pro nˇej existuj´ı implementace pro ˇradu programovac´ıch jazyk˚ u (Java, Flash, Python, C++, .NET a dalˇs´ı) [37]. Burlap Tento protokol byl vytvoˇren pro snadnou komunikaci mezi webov´ ymi sluˇzbami. M˚ uˇze b´ yt dokonce pouˇzit ke komunikaci Enteprise Java Beans (EJB) se servery, kter´e jsou postaveny na jin´e platformˇe neˇz Java (se kterou EJB komponenty um´ı komunikovat nativnˇe). Ke k´odov´ an´ı zpr´ av je pouˇzito XML. Protokol je velmi jednoduch´ y, proto je vhodn´ y k pouˇzit´ı napˇr´ıklad v mobiln´ıch telefonech [12]. GWT-RPC Protokol GWT-RPC je speci´alnˇe vyvinut pro framework Google Web Toolkit, kter´ y usnadˇ nuje tvorbu RIA aplikac´ı (viz ˇc´ast 2.3.1). Oproti specifikaci RPC se vˇsak tento protokol liˇs´ı v jednom z´ asadn´ım bodˇe: komunikace se serverem prob´ıh´a asynchronnˇe, GWTRPC totiˇz rozˇsiˇruje z´ akladn´ı zp˚ usob asynchronn´ı komunikace internetov´eho prohl´ıˇzeˇce se serverem [24] [34]. Action Message Format (AMF) Tento bin´arn´ı form´at se pouˇz´ıv´a k serializaci objekt˚ u jazyka Action Script12 (podobnˇe jako se pouˇz´ıv´a XML k serializaci objekt˚ u v protokolu XML-RPC). Do protokol˚ u vych´ azej´ıc´ıch z RPC jsme ho zaˇradili proto, ˇze komunikace Flash aplikac´ı se vzd´ alen´ ym serverem vyuˇz´ıv´a RPC s t´ımto form´atem. Existuj´ı implementace pro mnoho programovac´ıch jazyk˚ u jako napˇr. Java, .NET, PHP, Coldfusion a dalˇs´ı. Remote Python Call (RPyC) Tato knihovna je implementac´ı RPC v prostˇred´ı objektovˇe orientovan´eho programovac´ıho jazyka Python. Podporuje symetrickou komunikaci (jak klient, tak i server mohou pos´ılat dotazy) a synchronn´ı i asynchronn´ı vol´an´ı procedur [67]. PYthon Remote Objects (PYRO) Dalˇs´ı implementac´ı RPC v jazyce Python je syst´em PYthon Remote Objects. Je zde kladen d˚ uraz na jednoduchost a snadnost pouˇzit´ı. Distributed object system for Ruby (DRb) Dalˇs´ı objektovˇe orientovanou implementac´ı RPC je Distributed object system for Ruby. Tato knihovna slouˇz´ı pro komunikaci vzd´ alen´ ych objekt˚ u v programovac´ım jazyce Ruby [25]. 12
Action Script je programovac´ı jazyk pouˇz´ıvan´ y pˇri programov´ an´ı aplikac´ı na platformˇe Adobe Flash.
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
20
2.5
Java Remote Method Invocation
Pokud se dnes setk´ ame s pojmem Remote Method Invocation“ (d´ale jen RMI), je j´ım ve ” vˇetˇsinˇe pˇr´ıpad˚ u myˇslena implementace RPC v programovac´ım jazyku Java, tedy Java Re” mote Method Invocation“. V´ yznam tohoto term´ınu je vˇsak trochu obecnˇejˇs´ı. Vzd´alen´e vol´ an´ı procedur se pouˇz´ıv´ a u neobjektov´ ych programovac´ıch jazyk˚ u, zat´ımco vzd´ alen´ ym vol´ an´ım metod se naopak mysl´ı objektovˇe orientovan´a verze protokolu RPC. Je zˇrejm´e, ˇze architektura RMI je oproti RPC o nˇeco sloˇzitˇejˇs´ı. Nejedn´a se totiˇz o prost´e zavol´an´ı vzd´alen´e procedury, ale vˇse se odehr´av´a v objektovˇe orientovan´em prostˇred´ı. To vˇsak nemˇen´ı nic na tom, ˇze i RMI se snaˇz´ı program´atorovi co nejv´ıce uˇsetˇrit pr´aci a umoˇznit vol´an´ı vzd´alen´e metody tak, jako by byla lok´aln´ı. V dalˇs´ım textu budeme mluvit o technologii RMI a budeme j´ı myslet v´ yhradnˇe Java RMI, jak ji popisuje [44]. Ofici´ aln´ı white paper uv´ad´ı nˇekolik z´asadn´ıch v´ yhod RMI oproti RPC. Je d˚ uleˇzit´e si uvˇedomit, ˇze RPC je platformˇ e nez´ avisl´ y protokol, coˇz je v´ yhoda, ale i nev´ yhoda. Pokud je jak´ ykoli protokol platformˇe nez´avisl´ y, m˚ uˇzeme ho stejn´ ym zp˚ usobem pouˇz´ıvat na r˚ uzn´ ych platform´ ach (v r˚ uzn´ ych programovac´ıch jazyc´ıch). Znamen´a to vˇsak tak´e, ˇze nem˚ uˇzeme vyuˇz´ıt vˇsech technologi´ı, kter´e nab´ız´ı ten ˇci onen programovac´ı jazyk, ale mus´ıme pouˇz´ıvat technologie, kter´e podporuj´ı vˇsechny platformy. Java RMI naopak plnˇe vyuˇz´ıv´ a vˇsech moˇznost´ı objektovˇe orientovan´eho programovac´ıho jazyku Java. Hlavn´ımi v´ yhodami RMI tedy jsou [44]: ∙ Objektovˇ e orientovan´ a technologie - moˇznost pˇren´aˇset jak´ekoli objekty, argumenty nejsou omezeny pouze na primitivn´ı datov´e typy tak, jak je tomu u RPC, ∙ Jednoduch´ a moˇ znost zmˇ eny implementace - nen´ı probl´em zmˇenit chov´an´ı aplikace tak, aby byla metoda (jej´ı implementace) vykon´av´ana bud’ na serveru nebo na klientu. To, co m˚ uˇze vracet RMI metoda, m˚ uˇze b´ yt totiˇz objekt implementuj´ıc´ı dan´ y interface a samotn´ a operace m˚ uˇze b´ yt (pokud je to ˇz´adouc´ı) vykon´ana na klientu (napˇr. z d˚ uvodu zabr´ anˇen´ı pˇrenosu velk´eho mnoˇzstv´ı dat, kter´a by byla obsaˇzena v RMI vol´an´ı), ∙ Bezpeˇ cnost - je zajiˇstˇena bezpeˇcn´a komunikace mezi klientem a serverem, ∙ Jednoduch´ a struktura distribuovan´ eho programu - Java RMI nab´ız´ı jednoduch´ y zp˚ usob programov´ an´ı serverov´ ych i klientsk´ ych aplikac´ı, je pouˇzito standardn´ıch struktur, na kter´e je program´ ator zvykl´ y (viz ˇc´ast 2.5.1), ∙ Pouˇ zit´ı nativn´ıch aplikac´ı - RMI m˚ uˇze komunikovat s nativn´ımi aplikacemi pomoc´ı Java Native Interface, nen´ı tedy nutn´e st´avaj´ıc´ı serverov´e programy pˇrepisovat do jazyka Java, pokud jsou jiˇz vytvoˇren´e v jin´em jazyce (napˇr. v C++) a pˇritom vyuˇz´ıt vˇsech ostatn´ıch v´ yhod RMI.
2.5.1
Princip
Java RMI vych´ az´ı z protokolu RPC, za z´akladn´ı princip m˚ uˇzeme tedy povaˇzovat ten, kter´ y jsme popsali v ˇc´ asti 2.1 resp. na obr´ azku 2.1. Samozˇrejmˇe s t´ım rozd´ılem, ˇze se na serveru nevykon´avaj´ı procedury, ale metody [86].
2.5. JAVA REMOTE METHOD INVOCATION
21
Standardn´ı Java aplikace vˇzdy funguje pod jedn´ım virtu´aln´ım strojem (Java Virtual Machine - JVM)13 . RMI umoˇzn ˇuje distribuovan´ y v´ ypoˇcet t´ım zp˚ usobem, ˇze je moˇzn´e jednotliv´e metody vykon´ avat na r˚ uzn´ ych virtu´aln´ıch stroj´ıch. Z´akladn´ım kamenem Java RMI je rozhran´ı definuj´ıc´ı chov´an´ı volan´e metody. Je d˚ uleˇzit´e si uvˇedomit, ˇze vˇetˇsina v´ yhod RMI plyne pr´avˇe z oddˇelen´ı rozhran´ı a implementace. Ze z´akladn´ıch princip˚ u jazyka Java vˇsak plyne, ˇze pokud vol´ame metodu nˇejak´eho rozhran´ı v jednom JVM, mus´ı zde b´ yt tak´e obsaˇzena implementace. Java RMI tento poˇzadavek ˇreˇs´ı tak, ˇze v klientsk´em k´ odu je implementace dan´eho rozhran´ı tak´e obsaˇzena, je to vˇsak pouze tzv. z´astupn´ y objekt (proxy)14 .
«interface» Service
Klient Service Proxy
Server
RMI komunikace
Service Implementace
Obr´azek 2.6: Pouˇzit´ı n´ avrhov´eho vzoru Proxy pˇri RMI komunikaci mezi klientem a serverem. Obr´azek je pˇrevzat´ y z [66]. Na obr´ azku 2.6 je zobrazena komunikace pomoc´ı z´astupn´eho objektu. Klientsk´ y program tedy: 1. provede vol´ an´ı metody v proxy objektu, 2. RMI poˇsle poˇzadavek na vzd´alen´ y server (jin´emu JVM), 3. zde se provede skuteˇcn´ a metoda na z´akladˇe konkr´etn´ı implementace a 4. v´ ysledky jsou posl´ any zpˇet pomoc´ı RMI klientsk´emu proxy objektu a od nˇej pˇred´ any volaj´ıc´ımu programu. ˇ asti Klient“ Architektura Java RMI se skl´ad´a z nˇekolika vrstev, jak uv´ad´ı obr´azek 2.7. C´ ” a Server“ na obr´ azku pˇredstavuj´ı komponenty, kter´e jsou vytv´aˇreny program´atorem, ˇc´ asti ” RMI syst´emu jsou naopak vytv´ aˇreny bud’ automaticky nebo jsou souˇc´ast´ı JDK15 a program´ator s nimi nepˇrijde do styku [40] [66]. 13 Java Virtual Machine (zkr´ acenˇe JVM) je virtu´ aln´ı procesor, na kter´em bˇeˇz´ı zkompilovan´e Java programy (tedy bytek´ od). JVM m´ a svoji vlastn´ı instrukˇcn´ı sadu a proto m˚ uˇze b´ yt programovac´ı jazyk Java platformˇe nez´ avisl´ y - v kaˇzd´em operaˇcn´ım syst´emu je spuˇstˇen pouze odliˇsn´ y virtu´ aln´ı stroj, ale zdrojov´ y k´ od programu potaˇzmo zkompilovan´ y bytek´ od je vˇzdy stejn´ y [52]. 14 V´ıce o n´ avrhov´em vzoru Proxy se dozv´ıte v [31]. 15 JDK neboli Java Development Kit je soubor programovac´ıch n´ astroj˚ u od firmy Sun Microsystems pro v´ yvoj aplikac´ı na platformˇe Java.
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
22
Aplikace
Klient
Skeletons RMI systém
Server
Stubs
Remote Reference vrstva Transportní vrstva
Obr´ azek 2.7: Vrstevnat´ a architektura RMI. Obr´azek je pˇrevzat´ y z [66]. Stub a Skeleton vrstva Tato vrstva RMI architektury je zaloˇzena na v´ yˇse popsan´em n´avrhov´em vzoru Proxy. V tomto pˇr´ıpadˇe je z´astupn´ ym objektem (proxy) tzv. tˇr´ıda Stub na stranˇe klienta. Skeleton je pouze pomocn´a tˇr´ıda um´ıstˇen´a na serveru, kter´a zajiˇst’uje komunikaci pomoc´ı RMI se Stub objektem. Tato tˇr´ıda tedy pˇrij´ım´a parametry metody, vol´a konkr´etn´ı implementaci na serveru a v´ ysledky pos´ıl´a zpˇet pˇres RMI Stub objektu. Od verze Java 2 (Java SE) se k nalezen´ı implementace metody pouˇz´ıv´a reflexe, tˇr´ıda Skeleton tedy jiˇz nen´ı potˇreba. Remote Reference vrstva Je nutn´e definovat s´emantiku samotn´e RMI komunikace, o to se star´a tato vrstva. Jedn´ a se o zp˚ usob, jak´ ym mezi sebou komunikuj´ı Stub a Skeleton objekty. Stub objekt vol´ a speci´ aln´ı metodu invoke() ve tˇr´ıdˇe RemoteRef zajiˇst’uj´ıc´ı propojen´ı s objektem, kter´ y obsahuje implementaci vzd´alen´e metody. Transportn´ı vrstva Pro spojen´ı dvou JVM se vyuˇz´ıv´a tato vrstva. K pˇrenosu dat je pouˇzit protokol TCP/IP. Pokud jsou dva JVM spuˇstˇeny na stejn´em poˇc´ıtaˇci, je komunikace naprosto totoˇzn´ a jako v pˇr´ıpadˇe, ˇze jsou virtu´aln´ı stroje spuˇstˇeny na vzd´alen´ ych poˇc´ıtaˇc´ıch.
2.5.2
Pouˇ zit´ı RMI
V n´asleduj´ıc´ım textu si uk´ aˇzeme jednoduch´ y pˇr´ıklad pouˇzit´ı RMI v pˇr´ıpadˇe, ˇze klient i server jsou spuˇstˇeny na jednom poˇc´ıtaˇci. Budeme muset vytvoˇrit nˇekolik komponent, kter´e jsme si popsali v´ yˇse: ∙ rozhran´ı poskytuj´ıc´ı klient˚ um definici vzd´alen´ ych metod, ∙ implementaci tohoto rozhran´ı na serverov´e stranˇe, ∙ Stub (a Skeleton) tˇr´ıdy, ∙ samotn´ y serverov´ ya ∙ klientsk´ y modul.
2.5. JAVA REMOTE METHOD INVOCATION
23
ˇ Reknˇ eme, ˇze chceme vytvoˇrit jednoduchou distribuovanou“ aplikaci Hello World. Roz” hran´ı poskytuj´ıc´ı jedinou metodu String hello(String name) bude vypadat n´asledovnˇe: 1 2 3
public interface HelloWorld extends java.rmi.Remote { public String hello(String name) throws java.rmi.RemoteException; } Zmiˇ nme snad jen dvˇe vˇeci - naˇse rozhran´ı mus´ı dˇedit z rozhran´ı Remote (z bal´ıˇcku java.rmi) a kaˇzd´ a metoda m˚ uˇze vyhazovat v´ yjimku RemoteException ze stejn´eho bal´ıˇcku. N´asleduje implementace navrˇzen´eho rozhran´ı:
1 2
public class HelloWorldImpl extends java.rmi.server.UnicastRemoteObject implements HelloWorld {
3
public HelloWorldImpl() throws java.rmi.RemoteException { super(); }
4 5 6 7
public String hello(String name) throws java.rmi.RemoteException { return "Hello, " + name; }
8 9 10 11
} Vˇsimnˇeme si, ˇze implementace dˇed´ı ze tˇr´ıdy UnicastRemoteObject (tentokr´at z bal´ıˇcku java.rmi.server) a je nutn´e, aby zde byl uveden konstruktor, kter´ y vyhazuje v´ yjimku RemoteException. M´ ame tedy vytvoˇren´e rozhran´ı s jeho implementac´ı. Nyn´ı spust´ıme speci´aln´ı RMI kompil´ ator (rmic) s parametrem tˇr´ıdy implementace, tedy: rmic HelloWorldImpl Tato volba vytvoˇr´ı v dan´em adres´aˇri soubor HelloWorld_Stub.class a dle pouˇzit´e verze JDK pˇr´ıpadnˇe i soubor HelloWorld_Skel.class. Nyn´ı zb´ yv´a vytvoˇrit samotnou tˇr´ıdu serveru a klienta. Server bude vypadat takto:
1
public class HelloWorldServer {
2 3 4 5 6 7 8 9 10 11 12
public HelloWorldServer() { try { HelloWorld helloWorld = new HelloWorldImpl(); java.rmi.Naming.rebind("rmi://localhost:1080/HelloWorldService", helloWorld); } catch (Exception e) { ... } }
´ ´ VOLAN ´ ´I PROCEDUR KAPITOLA 2. VZDALEN E
24
public static void main(String args[]) { new HelloWorldServer(); }
13 14 15 16
} Jedn´a se pouze o vytvoˇren´ı implementace dan´e sluˇzby a jej´ı uveˇrejnˇen´ı v RMI registru (ˇr´adky 6 a 7). Klient obsahuj´ıc´ı pouze nejnutnˇejˇs´ı pˇr´ıkazy ke zprovoznˇen´ı RMI komunikace bude podobnˇe jednoduch´ y:
1
public class HelloWorldClient {
2
public static void main(String[] args) { try { HelloWorld helloWorld = (HelloWorld) java.rmi.Naming.lookup( "rmi://localhost/HelloWorldService"); System.out.println(helloWorld.helloWorld("client")); } catch (Exception) { ... } }
3 4 5 6 7 8 9 10 11 12 13
} Na ˇr´adku 5 a 6 se tedy pokus´ıme nal´ezt sluˇzbu, kterou server poskytuje a jej´ıˇz n´azev mus´ıme zn´at (HelloWorldService). N´ aslednˇe pak provedeme vol´an´ı metody pˇres nalezen´e rozhran´ı. Oˇsetˇren´ı v´ yjimek by mˇelo b´ yt samozˇrejmˇe d˚ ukladnˇejˇs´ı neˇz jen zachyt´av´an´ı obecn´e Exception. Mohou nastat r˚ uzn´e pˇr´ıpady, kdy hled´an´ı rozhran´ı ˇci samotn´e vol´an´ı metody selˇze. V´ıce o zp˚ usobu pouˇzit´ı Java RMI se doˇctete v [66] a [33]. V pˇredchoz´ım textu jsme si podrobnˇe popsali princip a pouˇzit´ı Java RMI jako technologie pro distribuovan´e aplikace na platformˇe Java. Pokud dnes vˇsak chceme vyvinout rozs´ahlou (napˇr´ıklad webovou) aplikaci, programovac´ı jazyk Java n´am nab´ız´ı mnohem dokonalejˇs´ı technologie, neˇz samotn´e Java RMI. Jednou takovou technologi´ı jsou tzv. Enterprise Java Beans (EJB), jejichˇz hlavn´ı souˇc´ ast je postavena na Java RMI a kter´e jsou souˇc´ast´ı Java Enterprise Edition. T´eto technologii vˇenujeme celou podkapitolu 4.1.2.
Kapitola 3
Anal´ yza V u ´vodu (ˇc´ ast 1.1) jsme popsali c´ıle t´eto diplomov´e pr´ace. Mimo teoretick´e ˇc´asti je c´ılem n´avrh a implementace serverov´eho modulu informaˇcn´ıho syst´emu pro spr´avu nemovitost´ı. Jelikoˇz bude tento modul poskytovat veˇskerou funkˇcnost syst´emu (klientsk´ y modul se bude starat pouze o prezentaˇcn´ı ˇc´ ast), je nutn´e v anal´ yze probrat st´avaj´ıc´ı ˇreˇsen´ı a pokusit se z nich vyvodit poˇzadavky na IS takov´ ym zp˚ usobem, aby byl n´aˇs produkt konkurenceschopn´ y a pˇrin´aˇsel napˇr´ıklad nˇekter´e unik´atn´ı funkce, kter´e jinde z´akazn´ık nenajde. Na z´ avˇer v anal´ yze pop´ıˇseme typy uˇzivatel˚ u IS a sc´en´aˇre pouˇzit´ı jednotliv´ ych funkc´ı, kter´e bude aplikace poskytovat.
3.1
Informaˇ cn´ı syst´ em pro spr´ avu nemovitost´ı
Jak jsme zm´ınili v ˇc´ asti 2.3 na stranˇe 11, dneˇsn´ı v´ yznam vzd´alen´eho vol´an´ı procedur je pˇredevˇs´ım v oblasti internetov´ ych aplikac´ı (resp. v oblasti Softwaru jako sluˇzby“), kter´e ” pravdˇepodobnˇe ˇcasem u ´plnˇe nahrad´ı vˇsechny bˇeˇznˇe pouˇz´ıvan´e programy na poˇc´ıtaˇci. Pokud chceme tedy vyvinout produkt, kter´ y bude m´ıt velk´ y potenci´al do budoucna, je velmi d˚ uleˇzit´e, aby bylo moˇzn´e pˇristupovat k funkc´ım syst´emu odkudkoli (tak, jak to uv´ ad´ı zad´an´ı), tedy jak napˇr´ıklad z webov´e, tak i z mobiln´ı aplikace. Ke vzniku tohoto projektu nav´ıc pˇrispˇelo zjiˇstˇen´ı, ˇze v oblasti aplikac´ı pro spr´avu nemovitost´ı je pomˇernˇe mal´ a konkurence. Rozhodnˇe nelze ˇr´ıci, ˇze je na trhu dostateˇcn´ y v´ ybˇer z kvalitn´ıch ˇreˇsen´ı. Dnes, v dobˇe celosvˇetov´e ekonomick´e recese, sice mnoho odvˇetv´ı ztr´ac´ı trˇzn´ı potenci´ al a v´ ystavba bytov´ ych dom˚ u se moˇzn´a tak´e zpomalila, ale poˇr´ad tyto domy pˇrib´ yvaj´ı velmi rychle a kaˇzd´ y je potˇreba nˇejak´ ym zp˚ usobem spravovat. C´ılem naˇseho IS je tedy poskytnout jednoduchou spr´avu tˇechto nemovitost´ı s vyuˇzit´ım dneˇsn´ıch modern´ıch standard˚ u.
3.2
St´ avaj´ıc´ı ˇ reˇ sen´ı
Porovn´ an´ı st´ avaj´ıc´ıch ˇreˇsen´ı rozdˇel´ıme do dvou oblast´ı, a to na desktopov´e a webov´e aplikace.
25
´ KAPITOLA 3. ANALYZA
26
3.2.1
Desktopov´ e aplikace
I kdyˇz pˇredpokl´ ad´ ame, ˇze jako prvn´ı klientsk´ y modul bude vytvoˇren modul webov´ y (implementuje ho kolega Petr Horsk´ y), z hlediska funkˇcnosti cel´eho syst´emu (a tedy z hlediska funkˇcn´ıch poˇzadavk˚ u serverov´eho modulu) mus´ıme porovnat jak webov´e, tak i desktopov´e aplikace. Pr´avˇe ty desktopov´e oproti webov´ ym totiˇz disponuj´ı vˇetˇsinou v´ıce funkcemi. 3.2.1.1
Popis vybran´ ych aplikac´ı
N´asleduje popis jednotliv´ ych variant. Byly vybr´any nejzn´amˇejˇs´ı programy z t´eto oblasti softwaru. SSB2000, STARLIT s.r.o. Asi nejzn´amˇejˇs´ım a z´aroveˇ n nejrozˇs´ıˇrenˇejˇs´ım programem pro spr´avu dom˚ u je aplikace SSB2000 od firmy STARLIT s.r.o. [76]. Tato firma se pohybuje na trhu se spr´avou nemovitost´ı jiˇz patn´ act let a m´a zde v´ yrazn´e postaven´ı. Uk´azka z programu je na obr´azku 3.1.
Obr´ azek 3.1: Uk´ azka z programu SSB2000 od firmy STARLIT s.r.o.
´ ´IC´I RE ˇ SEN ˇ ´I 3.2. STAVAJ
27
V´yhody: ∙ zaveden´ y program, ∙ moˇznost dokoupen´ı dalˇs´ıch navazuj´ıch modul˚ u (napˇr. podvojn´e u ´ˇcetnictv´ı), ∙ propojen´ı s dalˇs´ımi sluˇzbami (naˇc´ıt´an´ı bankovn´ıch v´ ypis˚ u, odeˇct˚ u tepla atd.), ∙ v´ yborn´ y z´ akaznick´ y servis. Nev´yhody: ∙ pomˇernˇe nepˇrehledn´e uˇzivatelsk´e rozhran´ı (tato nev´ yhoda m˚ uˇze b´ yt odstranˇena kvalitn´ım zaˇskolen´ım, kter´e firma nab´ız´ı), ∙ v z´ akladn´ı verzi pˇr´ıliˇs mnoho modul˚ u, mal´a flexibilita verz´ı. SOFTWARE 5P, Ing. Oldˇ rich Florian Program, jehoˇz majitel sv˚ uj produkt inzeruje v ˇcasopise urˇcen´em pro spr´ avce dom˚ u, je vytvoˇren v prostˇred´ı Microsoft Access 2007. To m˚ uˇze, ale tak´e nemus´ı b´ yt v´ yhoda. Uk´azka programu s nˇekolika otevˇren´ ymi okny je na obr´azku 3.2. Dalˇs´ı informace naleznete v [73]. V´yhody: ∙ pokud m´ a uˇzivatel na poˇc´ıtaˇci kancel´aˇrsk´ y bal´ık MS Office, nepotˇrebuje program ˇz´ adnou instalaci, ∙ moˇznost exportu r˚ uzn´ ych tabulek do programu MS Excel. Nev´yhody: ∙ v pˇr´ıpadˇe absence MS Office na poˇc´ıtaˇci nutnost dokoupen´ı MS Access, ∙ pomˇernˇe nepˇrehledn´e uˇzivatelsk´e rozhran´ı, ∙ pouze primitivn´ı podpora s´ıt’ov´eho provozu (sd´ılen´a datab´aze MS Access). Cactus Domus, C´ IGLER SOFTWARE, a.s. Firma provozuj´ıc´ı zn´am´ yu ´ˇcetn´ı software Money S3 vytvoˇrila tak´e program pro spr´avu nemovitost´ı. V´ıce na obr´azku 3.3 a v [14]. V´yhody: ∙ asi nejvˇetˇs´ı v´ yhodou je pˇr´ım´e propojen´ı s u ´ˇcetn´ım syst´emem Money S3, coˇz dˇel´a z t´eto aplikace velmi podaˇren´ y produkt
28
´ KAPITOLA 3. ANALYZA
Obr´azek 3.2: Uk´ azka z programu SOFTWARE 5P od firmy Ing. Oldˇrich Florian.
´ ´IC´I RE ˇ SEN ˇ ´I 3.2. STAVAJ
Obr´ azek 3.3: Uk´ azka z programu Cactus Domus od firmy C´IGLER SOFTWARE, a.s.
29
´ KAPITOLA 3. ANALYZA
30
∙ jednoduch´ a spr´ ava dom˚ u jak´ehokoliv typu (majitel, druˇzstvo, spoleˇcenstv´ı vlastn´ık˚ u, firma) Nev´yhody: ∙ u ´pln´a absence s´ıt’ov´e verze ∙ uˇzivatelsk´e rozhran´ı p˚ usob´ı trochu neohrabanˇe, napˇr´ıklad u ´prava informac´ı o bytu je velmi nepˇrehledn´ a 3.2.1.2
Z´ avˇ er z porovn´ an´ı
Desktopov´ ych aplikac´ı pro spr´ avu nemovitost´ı existuje samozˇrejmˇe mnoho. Z vybran´ ych je pravdˇepodobnˇe nejlepˇs´ı SSB2000 od firmy STARLIT s.r.o. Obsahuje velk´e mnoˇzstv´ı dodateˇcn´ ych modul˚ u vˇcetnˇe modulu webov´eho. Vˇsechny zde uveden´e programy maj´ı vˇsak spoleˇcnou nev´ yhodu. I pˇresto, ˇze jsou modul´arn´ı, nab´ızej´ı relativnˇe malou flexibilitu pˇri v´ ybˇeru tˇechto modul˚ u. V z´akladn´ı verzi obsahuj´ı pˇr´ıliˇs mnoho poloˇzek, kter´e pak znepˇrehledˇ nuj´ı uˇzivatelsk´e rozhran´ı. Naˇse aplikace by mˇela tuto nev´ yhodu odstranit. Serverov´ y modul bude oddˇelenˇe poskytovat jednotliv´e sluˇzby, kter´e bude pl´ anovan´a Rich Internet Application na klientsk´e stranˇe vyuˇz´ıvat. Z´akazn´ık si tak bude moci vybrat jen ty moduly, kter´e opravdu potˇrebuje, a nebude muset platit za nˇeco, co nebude nikdy vyuˇz´ıvat.
3.2.2
Webov´ e aplikace
Na poli internetov´ ych aplikac´ı pro spr´ avu dom˚ u si z´akazn´ık rozhodnˇe nem˚ uˇze pˇr´ıliˇs vyb´ırat. Existuj´ı bud’ nadstavby desktopov´ ych program˚ u (kter´e ale ve vˇetˇsinˇe pˇr´ıpad˚ u nejsou plnohodnotn´e) nebo samostatn´e webov´e aplikace. 3.2.2.1
Popis vybran´ ych aplikac´ı
SSBnet, STARLIT s.r.o. Webov´ a nadstavba programu SSB2000 od firmy STARLIT s.r.o. [76] nab´ız´ı zobrazen´ı informac´ı z jednotliv´ ych modul˚ u na internetu, uk´azka je na obr´azku 3.4. V´yhody: ∙ propojen´ı s jedn´ım z nejlepˇs´ıch desktopov´ ych program˚ u pro spr´avu nemovitost´ı, ∙ pˇrehledn´e uˇzivatelsk´e rozhran´ı. Nev´yhody: ∙ pouze manu´ aln´ı export z programu SSB2000 do internetov´eho modulu, ∙ vˇsechna data jsou na internetu pouze pro ˇcten´ı a nelze je upravovat.
´ ´IC´I RE ˇ SEN ˇ ´I 3.2. STAVAJ
Obr´ azek 3.4: Uk´ azka z aplikace SSBnet od firmy STARLIT s.r.o.
Obr´ azek 3.5: Uk´ azka z webov´e nadstavby aplikace WinDomy od firmy O.K. Soft.
31
´ KAPITOLA 3. ANALYZA
32
Webov´ a nadstavba WinDomy, O.K. Soft Tato aplikace umoˇzn ˇuje automatick´e zobrazov´an´ı informac´ı z desktopov´eho programu WinDomy. V´ıce na obr´azku 3.5 a v [59]. V´yhody: ∙ automatick´e zobrazov´ an´ı dat z aplikace WinDomy, ∙ moˇznost zobrazen´ı historick´ ych dat - napˇr. odstˇehovan´ ych uˇzivatel˚ u bytu. Nev´yhody: ∙ nepˇrehledn´e zobrazen´ı dodateˇcn´ ych informac´ı (napˇr. pˇri zobrazen´ı n´ajemn´ıka se objev´ı menu pro pr´ aci s n´ım, ale zmiz´ı menu z´akladn´ı) Building manager, Ikon s.r.o. Komplexn´ı webov´a aplikace Building manager umoˇzn ˇuje celkovou spr´avu nemovitost´ı na internetu. Uk´azka uˇzivatelsk´eho prostˇred´ı je na obr´azku 3.6.
Obr´ azek 3.6: Uk´ azka z aplikace Building manager od firmy Ikon s.r.o. V´yhody: ∙ aplikace umoˇzn ˇuje plnohodnotnou spr´avu nemovitost´ı pouze na internetu, ∙ pˇrehledn´e menu. Nev´yhody: ∙ pomal´e naˇc´ıt´ an´ı, ∙ pro pohodln´e zobrazen´ı je tˇreba velk´eho monitoru.
ˇ ´ 3.3. POZADAVKY NA SYSTEM
3.2.2.2
33
Z´ avˇ er z porovn´ an´ı
Z tohoto pˇrehledu je zˇrejm´e, ˇze jedin´a aplikace Building manager m˚ uˇze b´ yt plnohodnotn´ ym ˇreˇsen´ım spr´ avy nemovitost´ı na internetu. Rozhodnˇe ale nem˚ uˇzeme ˇr´ıci, ˇze je tato aplikace pro uˇzivatele ide´ aln´ı. Moˇzn´ a se ˇcasem i dalˇs´ı desktopov´e aplikace, zm´ınˇen´e v´ yˇse, vydaj´ı cestou internetu a nebudou nab´ızet jen omezen´e internetov´e nadstavby pouze pro ˇcten´ı“. Dnes je ” vˇsak v t´eto oblasti trhu rozhodnˇe voln´ y prostor.
3.3
Poˇ zadavky na syst´ em
N´asleduje seznam poˇzadavk˚ u na informaˇcn´ı syst´em. Nˇekter´e vych´azej´ı ze zad´an´ı, jin´e jsou odvozeny od probran´ ych st´ avaj´ıc´ıch ˇreˇsen´ı.
3.3.1
Funkˇ cn´ı poˇ zadavky
Z funkˇcn´ıch poˇzadavk˚ u probereme nejprve ty, kter´e se t´ ykaj´ı samotn´e spr´avy bytov´ ych dom˚ u, a pot´e pop´ıˇseme v samostatn´e ˇca´sti kl´ıˇcovou historickou funkci naˇseho IS. 3.3.1.1
Prostˇ redky pro spr´ avu bytov´ ych dom˚ u
Informaˇcn´ı syst´em popisovan´ y v tomto textu je velice rozs´ahl´ y a souhrn vˇsech jeho funkc´ı pˇrevyˇsuje kapacitu t´eto pr´ ace. N´ asleduj´ıc´ı funkce jsou tedy rozdˇeleny podle priorit od nejvyˇsˇs´ı (1) aˇz po nejniˇzˇs´ı (3). Implementace syst´emu bude pak zamˇeˇrena na funkce prvn´ı priority. N´asleduj´ıc´ı funkˇcn´ı poˇzadavky jsou d´ale rozdˇeleny na ty, kter´e se t´ ykaj´ı evidence vˇsech poloˇzek souvisej´ıc´ıch s domem, na poˇzadavky souvisej´ıc´ı s uˇzivateli aplikace a nakonec jsou zm´ınˇeny poˇzadavky (sp´ıˇse jako moˇznost rozˇs´ıˇren´ı), kter´e souvisej´ı s r˚ uzn´ ymi komunikaˇcn´ımi n´astroji, kter´e m˚ uˇze aplikace nab´ıdnout. ∙ (1) R˚ uzn´e typy majitel˚ u domu - majitelem domu m˚ uˇze b´ yt druˇzstvo (z pr´avn´ıho hlediska firma), spoleˇcenstv´ı vlastn´ık˚ u (coˇz je vlastnˇe soubor majitel˚ u s dan´ ym vlastnick´ ym pod´ılem) ˇci jeden nebo v´ıce samostatn´ ych majitel˚ u. ∙ Evidence r˚ uzn´ ych poloˇzek souvisej´ıc´ıch s domem: – (1) prostory v domˇe - byty, nebytov´e prostory (napˇr. kancel´aˇre), chodby, gar´ aˇze, sklepy (kaˇzd´ y prostor m˚ uˇze nav´ıc obsahovat m´ıstnosti, kter´e se budou tak´e evidovat), – (2) zaˇr´ızen´ı a stavebn´ı souˇc´asti - zaˇr´ızen´ım m˚ uˇze b´ yt napˇr´ıklad plynov´ y kotel v bytˇe, stavebn´ı souˇc´ ast´ı kupˇr´ıkladu eletrorozvody ˇci hromosvod, – osoby - jak´ akoli osoba“ v naˇsem syst´emu m˚ uˇze b´ yt bud’ fyzickou nebo pr´avnickou ” osobou (firmou), mezi evidovan´e osoby patˇr´ı: * (1) majitel domu, * (1) majitel prostoru, * (2) obyvatel prostoru,
´ KAPITOLA 3. ANALYZA
34
* * * *
(3) n´ ajemn´ık prostoru, (1) spr´ avce domu (napˇr´ıklad pˇredseda druˇzstva), m˚ uˇze m´ıt urˇcitou roli, (3) pracovn´ık domu (napˇr. ukl´ızeˇcka ˇci zahradn´ık), (3) d˚ uleˇzit´e kontakty (instalat´er, elektrik´aˇr apod. - narozd´ıl od pracovn´ıka domu, kter´ y pracuje pravidelnˇe, slouˇz´ı tento kontakt pouze pro jednor´azov´e u ´ˇcely). Obecnˇe ke kaˇzd´emu prostoru ˇci domu m˚ uˇze b´ yt zaznamen´ano v´ıce osob, je tedy moˇznost zaznamenat spolumajitele ˇci v´ıce obyvatel jednoho prostoru.
– (2) revize - ke kaˇzd´emu zaˇr´ızen´ı ˇci stavebn´ı souˇc´asti mohou b´ yt zaznamen´av´any revize, – (2) smlouvy - smlouva se m˚ uˇze vztahovat k cel´emu domu nebo k prostoru, m˚ uˇze b´ yt na dobu urˇcitou nebo neurˇcitou, – (3) platby - ke kaˇzd´emu prostoru mohou b´ yt evidov´any platby (napˇr. platba za vodu, topen´ı ˇci n´ ajem), z tˇechto plateb m˚ uˇze b´ yt pak vypoˇc´ıt´ana celkov´a suma, kterou mus´ı majitel/n´ ajemn´ık prostoru kaˇzd´ y mˇes´ıc platit, – (2) rekonstrukce - veˇsker´e stavebn´ı souˇc´asti domu (napˇr. fas´ada) ˇci prostoru (napˇr. rozvod vody) mohou b´ yt rekonstruov´any a tyto rekonstrukce mohou b´ yt zaznamen´ any; nen´ı vˇsak podm´ınkou m´ıt v evidenci danou stavebn´ı souˇc´ast, aby bylo moˇzn´e evidovat jej´ı rekonstrukci - m˚ uˇzeme evidovat rekonstrukci pouze obecnˇe a opraven´e souˇc´ asti zaznamenat jen do pozn´amky, – (3) dokumenty - r˚ uzn´e poloˇzky k sobˇe mohou m´ıt pˇriloˇzeny pˇr´ılohy (napˇr´ıklad u smlouvy, revize ˇci rekonstrukce) ∙ Uˇzivatel´e aplikace - vˇse s prioritou (1): – pro pˇrihl´ aˇsen´ı do syst´emu je nutn´e zadat e-mail a heslo, – kaˇzd´ y uˇzivatel m´ a v syst´emu urˇcitou roli, ze kter´e jsou odvozena jeho pr´ava - tedy co se mu v syst´emu zobraz´ı nebo jak´e poloˇzky m˚ uˇze upravovat, – pro kaˇzd´eho uˇzivatele mus´ı existovat re´aln´a evidovan´a osoba (viz v´ yˇse), kter´a je s uˇzivatelem spjata, – uˇzivatelsk´e u ´ˇcty m˚ uˇze vytv´ aˇret pouze spr´avce domu (z´aroveˇ n m˚ uˇze pˇriˇrazovat uˇzivatel˚ um urˇcit´e role a t´ım p´adem i dan´a pr´ava - jedin´ ym omezen´ım je to, ˇze spr´avce nem˚ uˇze vytvoˇrit uˇzivatele s vyˇsˇs´ımi pr´avy neˇz m´a on s´am), – nov´eho spr´ avce domu s jak´ ymikoli pr´avy m˚ uˇze vytvoˇrit pouze uˇzivatel s nejvyˇsˇs´ımi pr´avy v aplikaci, tedy napˇr´ıklad pracovn´ık spoleˇcnosti provozuj´ıc´ı informaˇcn´ı syst´em na internetu. ∙ Komunikaˇcn´ı n´ astroje - vˇse s prioritou (3): – n´astˇenka - elektronick´ a obdoba n´astˇenky na chodbˇe domu, – diskuzn´ı f´ orum - moˇznost diskuze napˇr. mezi sousedy jednoho domu, – funkce e-mailu - obyvatel nebo majitel prostoru si nebude moci zobrazit podrobn´e informace o ostatn´ıch sousedech, bude mu vˇsak umoˇznˇeno poslat e-mailovou zpr´avu jednomu nebo vˇsem soused˚ um bez znalosti konkr´etn´ıch adres,
ˇ ´ 3.3. POZADAVKY NA SYSTEM
35
– anketa - pro u ´ˇcely hlasov´an´ı bude moci spr´avce domu vytvoˇrit r˚ uzn´e ankety, kter´e mohou pro v´ ypoˇcet v´ahy hlasu zohledˇ novat vlastnick´ y pod´ıl v domˇe (napˇr. u spoleˇcenstv´ı vlastn´ık˚ u) 3.3.1.2
Funkce ˇ casov´ ych ˇ rez˚ u
Nyn´ı pop´ıˇseme funkci ˇcasov´ ych ˇrez˚ u, tedy moˇznost zobrazit stav syst´emu k libovoln´emu dni v minulosti, ale i v budoucnosti (nad r´amec zad´an´ı). Je totiˇz velmi v´ yhodn´e m´ıt moˇznost evidovat poloˇzky nejen v minulosti, ale i ty, kter´e budou aktu´aln´ı napˇr. aˇz za nˇekolik mˇes´ıc˚ u (jako pˇr´ıklad uved’me novou smlouvu na dobu urˇcitou ˇci n´ajemn´ıka bytu, kter´ y nastupuje aˇz za dva mˇes´ıce). Tato funkce je velmi d˚ uleˇzit´ a (m´a tedy prioritu 1) a pˇrid´a tomuto IS velkou v´ yhodu oproti konkurenˇcn´ım ˇreˇsen´ım. Nˇekter´e programy sice um´ı napˇr´ıklad historicky zaznamen´avat obyvatele bytu, ale tato a podobn´e funkce jsou pouze jednoduch´ ym rozˇs´ıˇren´ım jinak statick´eho ukl´ad´an´ı dat. U kaˇzd´eho objektu je d˚ uleˇzit´e rozliˇsit informace, kter´e se mohou v ˇcase mˇenit a kter´e naopak ne nebo u kter´ ych nen´ı logick´e, aby byly tyto zmˇeny zaznamen´av´any. Vezmˇeme jako pˇr´ıklad evidenci bytu. Statick´e (nemˇenn´e) poloˇzky mohou b´ yt napˇr´ıklad: ∙ ˇc´ıslo bytu a ∙ podlaˇz´ı. Z dynamicky mˇen´ıc´ıch se informac´ı jmenujme kupˇr´ıkladu: ∙ majitele bytu, ∙ obyvatele bytu, ∙ poˇcet m´ıstnost´ı apod. V´ yˇse uveden´e ˇc´ıslo bytu by se teoreticky v nˇejak´em pˇr´ıpadˇe zmˇenit mohlo, ale je to pˇresnˇe ten pˇr´ıpad, kdy evidence t´eto zmˇeny nen´ı ˇz´adouc´ı, protoˇze se jedn´a sp´ıˇse o opravu p˚ uvodnˇe zadan´e hodnoty. ˇ Stejn´ y pˇr´ıpad je napˇr´ıklad u evidence osob. Reknˇ eme, ˇze budeme u majitele domu evidovat adresu trval´eho bydliˇstˇe a kontaktn´ı adresu. Obˇe adresy se samozˇrejmˇe mohou zmˇenit, ale z pohledu naˇseho syst´emu nen´ı potˇreba ukl´adat informaci o kontaktn´ı adrese majitele, kter´a byla aktu´ aln´ı pˇred dvˇema lety. U informac´ı tohoto typu n´as zaj´ım´a vˇzdy jen souˇcasn´ a hodnota a zaznamen´ avat zmˇeny v historii by mˇelo naopak negativn´ı dopad na pˇrehlednost syst´emu. Poˇzadavky t´ ykaj´ıc´ı se ˇcasov´ ych ˇrez˚ u na n´aˇs syst´em jsou tedy tyto: ∙ veˇsker´e informace, kter´e se mˇen´ı v ˇcase a u kter´ ych je tyto zmˇeny vhodn´e evidovat, jsou zaznamen´ av´ any historicky, ∙ jednoduch´ ym zp˚ usobem je moˇzno zobrazit informace k dan´emu datu v minulosti i v budoucnosti,
´ KAPITOLA 3. ANALYZA
36
∙ pˇri u ´pravˇe objekt˚ u (napˇr. domu) mus´ıme rozliˇsit tˇri alternativy: – nehistorick´ au ´prava - upravujeme statickou informaci objektu (napˇr. rok, kdy byl postaven d˚ um), v tomto pˇr´ıpadˇe se jedn´a pouze o opravu p˚ uvodnˇe (ˇspatnˇe) zadan´e hodnoty, – historick´ au ´prava - upravujeme dynamickou informaci (k nˇejak´emu datu) - v syst´emu mus´ı z˚ ustat jak p˚ uvodn´ı informace, tak novˇe zadan´a, – historick´ a oprava - ˇreknˇeme, ˇze jsme provedli u ´pravu dynamick´e informace, ale zjist´ıme, ˇze byla informace zad´ana ˇspatnˇe - potˇrebujeme tedy dynamickou informaci pouze opravit. M´ ame jeˇstˇe ale dvˇe moˇznosti: * p˚ uvodn´ı hodnotu smaˇzeme a vytvoˇr´ıme pro tento ˇcasov´ yu ´sek hodnotu novou (viz obr´ azek 3.7) - v ˇcasov´em u ´seku mezi 5. 10. 1996 a 9. 5. 1998 jsme nahradili p˚ uvodnˇe zadan´ y typ m´ıstnosti ob´ yvac´ı pokoj“ za pokoj pro hosty“, ” ” * p˚ uvodn´ı hodnotu smaˇzeme, ale nevytvoˇr´ıme hodnotu novou, n´ ybrˇz jen urˇc´ıme, kter´ a sousedn´ı hodnota m´a vyplnit pr´azdn´e m´ısto (viz obr´azek 3.8).
1)
Ložnice 2.3.1990
2)
Obývací pokoj 5.10.1996
9.5.1998
Pokoj pro hosty
Ložnice 2.3.1990
Dětský pokoj
5.10.1996
Dětský pokoj 9.5.1998
Obr´azek 3.7: Historick´ a oprava dynamick´e informace - ˇreknˇeme, ˇze zpˇetnˇe ukl´ad´ame do syst´emu typy jedn´e m´ıstnosti v bytˇe tak, jak byly postupnˇe rekonstruov´any. Pˇri zad´av´an´ı ale udˇel´ame chybu (1), kterou potˇrebujeme n´aslednˇe opravit (2).
3.3.2
Nefunkˇ cn´ı poˇ zadavky
Nefunkˇcn´ı poˇzadavky definuj´ı napˇr´ıklad omezen´ı na v´ ykon syst´emu, jeho design ˇci dalˇs´ı technick´e podrobnosti, kter´e se pˇr´ımo net´ ykaj´ı funkc´ı, se kter´ ymi pˇrijde do styku uˇzivatel. Vzhledem k tomu, ˇze popisujeme serverov´ y modul tohoto informaˇcn´ıho syst´emu, omez´ıme se pouze na nefunkˇcn´ı poˇzadavky, kter´e mus´ı splˇ novat server, na kter´em bude aplikace spuˇstˇena. Mezi nˇe patˇr´ı: ∙ provozov´ an´ı bez zv´ yˇsen´ ych n´ arok˚ u na v´ ykon serveru - vzhledem k typu aplikace se nepˇredpokl´ ad´ a, ˇze by i pˇri velk´em mnoˇzstv´ı z´akazn´ık˚ u (ˇr´adovˇe stovky) byla aplikace pˇr´ıliˇs vyt´ıˇzena. Kdyby pro kaˇzd´eho z´akazn´ıka syst´em evidoval pˇribliˇznˇe 200 uˇzivatel˚ u, celkov´ y poˇcet by jich byl 20 000. Vˇetˇsina z nich by se ale do syst´emu pˇrihlaˇsovala pouze zˇr´ıdka (napˇr´ıklad jednou mˇes´ıˇcnˇe), coˇz pak odpov´ıd´a pˇribliˇznˇe 120 uˇzivatel˚ u za hodinu
´ A ´ RE ˇ POUZIT ˇ ´I 3.4. SCEN
1)
37
Ložnice 2.3.1990
2)
Obývací pokoj 5.10.1996
Ložnice 2.3.1990
Dětský pokoj 9.5.1998
Dětský pokoj 5.10.1996
Obr´azek 3.8: Smaz´ an´ı historick´e zmˇeny - do syst´emu jsme omylem zadali rekonstrukci m´ıstnosti, kter´ a vˇsak nebyla provedena, proto ji potˇrebujeme smazat (1) a n´aslednˇe urˇcit, jak´ a sousedn´ı hodnota vypln´ı dan´ y ˇcasov´ yu ´sek (2). (pokud bereme v u ´vahu pouze 8 hodin kaˇzd´eho pracovn´ıho dne). Tento poˇcet uˇzivatel˚ u tedy rozhodnˇe nevyˇzaduje nˇejak´e zvl´aˇstn´ı poˇzadavky na v´ ykon serveru, ∙ maxim´ aln´ı doba v´ ypadku syst´emu bude jeden den, v pˇr´ıpadˇe delˇs´ıho v´ ypadku bude z´ akazn´ık˚ um nab´ızena finanˇcn´ı kompenzace, ∙ aktualizace na novou verzi bude prov´adˇena vˇzdy v noˇcn´ıch hodin´ach, ∙ produkt bude nab´ızen syst´emem software jako sluˇzba“ (viz ˇc´ast 2.3.2). ”
3.3.3
Poˇ zadavky klientsk´ eho modulu
Na z´avˇer je tˇreba jeˇstˇe definovat poˇzadavky, kter´e jsou na serverov´ y modul kladeny od modulu klientsk´eho: ∙ komunikace prob´ıh´ a pomoc´ı vzd´alen´eho vol´an´ı procedur (viz zad´an´ı), ∙ rozhran´ı pro pˇripojen´ı klientsk´eho modulu mus´ı b´ yt univerz´aln´ı - aby bylo moˇzno pˇripojit modul jak´ehokoli typu (webovou aplikaci, tlust´ y klient ˇci mobiln´ı aplikaci).
3.4
Sc´ en´ aˇ re pouˇ zit´ı
Nyn´ı si pop´ıˇseme dle funkˇcn´ıch poˇzadavk˚ u priority (1) vˇsechny u ´kony, kter´e mohou r˚ uzn´ı akt´eˇri se syst´emem prov´ adˇet.
3.4.1
Popis akt´ er˚ u
Jak bylo zm´ınˇeno v ˇc´ asti 3.3.1.1, aplikace bude umoˇzn ˇovat pˇriˇradit uˇzivateli urˇcitou roli definuj´ıc´ı uˇzivatelsk´ a pr´ ava. Tyto role jsou vˇsak dynamick´e - spr´avce domu m˚ uˇze vytvoˇrit jak´ ykoli poˇcet nov´ ych rol´ı s urˇcit´ ymi pr´avy.
´ KAPITOLA 3. ANALYZA
38
Abychom tedy mohli popsat pˇr´ıpady uˇzit´ı, mus´ıme definovat z´akladn´ı uˇzivatelsk´e role, od kter´ ych budou ty dynamick´e odvozen´e. Tyto z´akladn´ı role budou obsahovat nejvyˇsˇs´ı moˇznou mnoˇzinu funkc´ı, kter´e m˚ uˇze uˇzivatel pouˇz´ıvat, a dynamicky vytv´aˇren´e role mohou pak tuto mnoˇzinu zmenˇsit, tedy odebrat uˇzivateli pr´ava pro danou funkci. V n´asleduj´ıc´ım popisu akt´er˚ u vˇzdy nejprve uvedeme, kter´e osoby jsou typicky s akt´erem dan´eho typu spjaty, protoˇze to nejl´epe vystihuje mnoˇzinu povolen´ ych funkc´ı. Dˇediˇcnost akt´er˚ u pak ukazuje obr´ azek 3.9. User Nejniˇzˇs´ı uˇzivatelsk´ a role se naz´ yv´a User“. M˚ uˇze j´ım b´ yt obyvatel ˇci n´ ajemn´ık pros” toru nebo pracovn´ık domu. U d˚ uleˇzit´ych kontakt˚ u se nepˇredpokl´ad´a, ˇze by tyto osoby byly evidov´any i jako uˇzivatel´e aplikace. Superuser Typick´ y Superuser“ je majitel prostoru. Oproti akt´erovi User“ m´a napˇr´ıklad ” ” pˇr´ıstup ke vˇsem informac´ım sv´eho prostoru. Admin Jako Admin“ je v aplikaci oznaˇcen spr´ avce domu nebo jeho majitel. M´a pˇr´ıstup ” ke vˇsem funkc´ım, kter´e si dan´ y z´ akazn´ık, pouˇz´ıvaj´ıc´ı tento informaˇcn´ı syst´em, zaplat´ı. Superadmin Posledn´ım akt´erem je Superadmin“. Tuto uˇzivatelskou roli m˚ uˇze m´ıt pouze ” pracovn´ık firmy provozuj´ıc´ı IS na internetu.
User
Superuser
Admin
Superadmin
Obr´ azek 3.9: Dˇediˇcnost akt´er˚ u.
3.4.2
Podrobn´ y popis pˇ r´ıpad˚ u uˇ zit´ı
Nyn´ı si podrobnˇe pop´ıˇseme vˇsechny pˇr´ıpady uˇzit´ı uveden´e na obr´azku 3.10. Jsou rozdˇeleny do tˇr´ı z´akladn´ıch modul˚ u (viz n´ıˇze). Z d˚ uvodu pˇrehlednosti jsou operace s r˚ uzn´ ymi objekty (napˇr. d˚ um, byt ˇci majitel) rozdˇeleny pouze do dvou skupin na: ∙ zobrazen´ı objektu (napˇr. zobrazit prostor“) a ” ∙ u ´pravu objektu (napˇr. odpov´ıdaj´ıc´ı upravit prostor“). ”
´ A ´ RE ˇ POUZIT ˇ ´I 3.4. SCEN
39
Modul Building Může také přidat nový dům
Omezení na dům, ve kterém bydlí
Zobrazit dům
Upravit dům
Zobrazit správce
Upravit správce
Zobrazit majitele
Upravit majitele
Superadmin Nemůže přidávat nový dům
Modul Space <> Zobrazit prostor
Upravit prostor
<> Zobrazit majitele
Upravit majitele
Zobrazit místnost
Upravit místnost <>
User
Modul Application Zobrazit uživatele <>
Upravit uživatele
Superuser
Zobrazit uživatelskou roli <>
Upravit uživatelskou roli
Obr´ azek 3.10: Pˇr´ıpady uˇzit´ı zohledˇ nuj´ıc´ı funkce priority (1).
Admin
´ KAPITOLA 3. ANALYZA
40
Informační systém Přidat objekt <>
Upravit objekt
<>
Upravit stávající objekt
<>
Aktér s příslušnými právy
Smazat objekt Použije se jedna z možností
´ Obr´azek 3.11: Pˇr´ıpady uˇzit´ı v pˇr´ıpadˇe u ´pravy“ objektu. Upravou se mysl´ı jak u ´prava jiˇz ” vytvoˇren´eho objektu, tak i pˇrid´ an´ı nov´eho ˇci smaz´an´ı st´avaj´ıc´ıho. ´ Uprava objektu vˇsak v tomto pˇr´ıpadˇe znamen´a jak u ´ pravu jiˇ z vytvoˇ ren´ eho objektu, tak i pˇ rid´ an´ı nov´eho ˇci smaz´ an´ı st´ avaj´ıc´ıho. V´ıce na obr´azku 3.11. V n´asleduj´ıc´ım popisu pˇr´ıpad˚ u uˇzit´ı budeme tedy u ´pravou“ myslet tyto tˇri moˇznosti. ” Pokud se naopak jedn´ a pouze o zobrazen´ı objektu, je t´ım myˇsleno bud’ ∙ zobrazen´ı jednoho objektu nebo ∙ zobrazen´ı v´ıce objekt˚ u splˇ nuj´ıc´ıch dan´e podm´ınky (napˇr. vˇsechny m´ıstnosti v prostoru). Zobrazen´ı objekt˚ u je nav´ıc vˇzdy ovlivnˇeno konkr´etn´ım datem, ke kter´emu chce uˇzivatel tyto objekty zobrazit (dle poˇzadavku pro funkci ˇcasov´ ych ˇrez˚ u - viz ˇc´ast 3.3.1.2). V pˇr´ıpadˇe, ˇze budeme tedy pˇr´ıpad uˇzit´ı popisovat napˇr. jako zobrazen´ı informac´ı o majitel´ıch“, mysl´ıme ” t´ım, ˇze se zobraz´ı majitel´e k zadan´emu datu. C´ılem tohoto textu je n´ avrh a implementace serverov´ eho modulu aplikace, proto v n´asleduj´ıc´ım popisu jednotliv´ ych funkc´ı nebudeme br´at v u ´vahu, jak´ ym zp˚ usobem jsou dan´e funkce poskytnuty uˇzivateli (to obstar´av´a klientsk´ y modul), ale sp´ıˇse, co pˇresnˇe nab´ızej´ı a jak je lze vyuˇz´ıt. 3.4.2.1
Pˇ r´ıpady uˇ zit´ı modulu Building
V tomto modulu se nach´ azej´ı funkce souvisej´ıc´ı s domem. Pˇredpokl´ad´ame, ˇze bude pˇrihl´aˇsen´ y uˇzivatel vˇzdy pracovat s jedn´ım zvolen´ ym domem, ke kter´emu se budou vztahovat vˇsechny operace (napˇr. zobrazen´ı spr´ avc˚ u).
´ A ´ RE ˇ POUZIT ˇ ´I 3.4. SCEN
41
1.1 Zobrazit d˚ um Zobraz´ı informace o domu, ve kter´em uˇzivatel bydl´ı (pro akt´era User ), pˇr´ıpadnˇe kolekci dom˚ u s jejich informacemi pro akt´era Admin. 1.2 Upravit d˚ um Umoˇzn´ı upravit informace o domu. Jak jsme zm´ınili v´ yˇse, jako u ´pravu objektu bereme tak´e jeho pˇrid´ an´ı ˇci smaz´an´ı. V tomto jedin´em pˇr´ıpadˇe mus´ıme vˇsak rozliˇsit pˇrid´an´ı a smaz´ an´ı domu, kter´e m˚ uˇze prov´adˇet jenom Superadmin. 1.3 Zobrazit spr´ avce Zobraz´ı informace o spr´avc´ıch domu. Pro akt´era User ˇci Superuser m˚ uˇze b´ yt zobrazen´ı omezen´e jen na nˇekter´e role spr´avc˚ u. 1.4 Upravit spr´ avce Umoˇzn´ı upravit spr´avce domu. Omezen´ı je v tomto pˇr´ıpadˇe takov´e, ˇze spr´avce domu nem˚ uˇze s´ am sebe jako spr´avce smazat. 1.5 Zobrazit majitele Zobraz´ı informace o majitel´ıch domu s jejich vlastnick´ ymi pod´ıly. T´ım, ˇze je syst´em navrˇzen tak, ˇze jak´akoli osoba m˚ uˇze b´ yt bud’ fyzickou nebo pr´avnickou osobou, tak spolu s vlastnick´ ymi pod´ıly jednotliv´ ych majitel˚ u splˇ nuje tento n´avrh poˇzadavek na r˚ uzn´e typy majitel˚ u domu. 1.6 Upravit majitele Umoˇzn´ı upravit majitele domu. Po pˇrid´an´ı majitele m˚ uˇ ze b´ yt zkontrolov´ an souˇcet vˇsech vlastnick´ ych pod´ıl˚ u, kter´ y mus´ı d´at hodnotu jedna. 3.4.2.2
Pˇ r´ıpady uˇ zit´ı modulu Space
N´asleduje podrobn´ y popis funkc´ı souvisej´ıc´ıch s prostorem a jeho m´ıstnostmi. 2.1 Zobrazit prostor Zobraz´ı informace o vˇsech prostorech, ke kter´ ym m´a dan´ y uˇzivatel nˇejak´ y vztah (bydl´ı v nˇem, vlastn´ı ho apod.). Pro spr´avce ˇci majitele domu (akt´er Admin) jsou to vˇsechny prostory v dan´em domˇe. 2.2 Upravit prostor Umoˇzn´ı upravit prostor v domˇe. Pˇri pˇrid´av´an´ı prostoru je automaticky pˇrid´ ana i jeho prvn´ı m´ıstnost, v syst´emu totiˇz nem˚ uˇze existovat prostor bez m´ıstnosti. 2.3 Zobrazit majitele Zobraz´ı vˇsechny majitele dan´eho prostoru s jejich vlastnick´ ymi pod´ıly. 2.4 Upravit majitele Umoˇzn´ı upravit majitele prostoru. Po pˇrid´an´ı nov´eho majitele m˚ uˇ ze b´ yt zkontrolov´ an souˇcet vˇsech vlastnick´ ych pod´ıl˚ u, kter´ y mus´ı d´at hodnotu jedna. 2.5 Zobrazit m´ıstnost
Zobraz´ı vˇsechny m´ıstnosti pˇr´ısluˇsej´ıc´ı k dan´emu prostoru.
2.6 Upravit m´ıstnost Umoˇzn´ı upravit m´ıstnost. Pˇri maz´an´ı m´ıstnosti je kontrolov´ ano, jestli nen´ı dan´ a m´ıstnost jedin´ a, kterou prostor obsahuje, v tom pˇr´ıpadˇe nen´ı smaz´an´ı dovoleno (viz pˇr´ıpad uˇzit´ı ˇc´ıslo 2.2).
´ KAPITOLA 3. ANALYZA
42
3.4.2.3
Pˇ r´ıpady uˇ zit´ı modulu Application
V modulu Application se nach´ azej´ı funkce pro spr´avu uˇzivatelsk´ ych u ´ˇct˚ u v aplikaci. 3.1 Zobrazit uˇ zivatele Zobraz´ı informace o pˇrihl´aˇsen´em uˇzivateli, pˇr´ıpadnˇe (pokud na to m´a dan´ y uˇzivatel pr´ ava) zobraz´ı vˇsechny uˇzivatele v aplikaci. Zobrazen´ı pak m˚ uˇze b´ yt omezeno na uˇzivatele zvolen´eho domu ˇci na uˇzivatele jednoho z´akazn´ıka. 3.2 Upravit uˇ zivatele Pˇrihl´ aˇsen´ y uˇzivatel si touto funkc´ı m˚ uˇze zmˇenit napˇr´ıklad pˇr´ıstupov´e heslo ˇci e-mail. Spr´ avce domu m˚ uˇze upravovat jak´ehokoli uˇzivatele pˇr´ısluˇsej´ıc´ıho k dom˚ um, kter´e spravuje. 3.3 Zobrazit uˇ zivatelskou roli Zobraz´ı vˇsechny dostupn´e uˇzivatelsk´e role pro dan´eho z´akazn´ıka. 3.4 Upravit uˇ zivatelskou roli Umoˇzn ˇuje upravit uˇzivatelskou roli. Pˇri pˇrid´av´an´ı nov´e role nebo pˇri u ´pravˇe pr´ av st´ avaj´ıc´ı role je zde d˚ uleˇzit´e omezen´ı: nem˚ uˇze b´ yt pˇrid´ana/upravena role s vyˇsˇs´ımi pr´ avy, neˇz m´ a pr´ avˇe pˇrihl´ aˇsen´ y uˇzivatel. 3.4.2.4
Pˇ r´ıpady uˇ zit´ı v r´ amci pr´ ace s dynamick´ ymi daty
Obr´azek 3.10 ukazuje vˇsechny pˇr´ıpady uˇzit´ı, kter´e mohou nastat pˇri z´akladn´ım pouˇzit´ı aplikace. Jelikoˇz je vˇsak tento IS navrˇzen tak, aby umoˇzn ˇoval historicky zaznamen´avat vˇsechna data, u kter´ ych je to potˇreba, mus´ıme jeˇstˇe rozˇs´ıˇrit funkce o pˇr´ıpady uˇzit´ı t´ ykaj´ıc´ı se pr´ace s dynamick´ ymi (historick´ ymi) daty. Tyto pˇr´ıpady uˇzit´ı uv´ad´ı obr´azek 3.12. Nejedn´a se vˇsak o pˇr´ıpady uˇzit´ı, kter´e se vztahuj´ı ke konkr´etn´ımu akt´erovi, bereme naopak v u ´vahu, ˇze vˇsechny uveden´e operace m˚ uˇze s objektem prov´adˇet akt´er, kter´ y m´a (v pˇredchoz´ım sch´ematu) pr´ ava k jeho u ´pravˇe. 4.1 Zobrazit historick´ e zmˇ eny Uˇzivatel z´ısk´a kolekci vˇsech zmˇen dynamick´ ych dat, kter´a jsou k dan´emu objektu zaznamen´ ana. 4.2 Opravit historickou zmˇ enu Umoˇzn ˇuje opravit hodnotu dynamick´e informace, kter´a je jiˇz historicky zaznamen´ ana. Na obr´ azku 3.7 na stranˇe 36 je tato oprava zn´azornˇena. Mus´ıme si totiˇz uvˇedomit, ˇze pokud dynamickou informaci uprav´ıme, je zaznamen´ana jak jej´ı star´a hodnota, tak i hodnota novˇe zadan´ a. Pokud bychom v t´eto chv´ıli opravili“ danou informaci ” na p˚ uvodn´ı hodnotu klasick´ ym zp˚ usobem, byly by v syst´emu zaznamen´any ve v´ ysledku hodnoty tˇri (p˚ uvodn´ı, zmˇenˇen´ a a opˇet zmˇenˇen´a, avˇsak s p˚ uvodn´ı hodnotou). 4.3 Smazat historickou zmˇ enu Nˇekdy nepotˇrebujeme historicky zaznamenanou zmˇenu opravit (jako v pˇredchoz´ım pˇr´ıpadˇe), ale vymazat - k tomu slouˇz´ı tato funkce. Uˇzivatel m˚ uˇze d´ale urˇcit, jak´ ym zp˚ usobem se maj´ı ostatn´ı zmˇeny slouˇcit (viz obr´azek 3.8 na stranˇe 37).
´ A ´ RE ˇ POUZIT ˇ ´I 3.4. SCEN
43
Informační systém
Opravit historickou změnu <>
Zobrazit historické změny
Aktér s příslušnými právy
<> Smazat historickou změnu
Obr´ azek 3.12: Pˇr´ıpady uˇzit´ı pro pr´aci s dynamick´ ymi daty.
44
´ KAPITOLA 3. ANALYZA
Kapitola 4
V´ ybˇ er a popis technologi´ı V pˇredch´ azej´ıc´ı kapitole jsme provedli anal´ yzu, ze kter´e vych´azej´ı funkce aplikace, jeˇz je tˇreba navrhnout. N´ avrh vˇsak jiˇz zohledˇ nuje technologie, ve kter´ ych bude syst´em pot´e implementov´an, proto nyn´ı tyto technologie vybereme na z´akladˇe zad´an´ı a dostupn´ ych moˇznost´ı.
4.1
Vzd´ alen´ e vol´ an´ı procedur (RPC)
Zad´an´ı n´ am urˇcuje pouˇzit´ı platformy Java a vzd´alen´eho vol´an´ı procedur. Jak jste se doˇcetli v ˇc´asti 2.5, vzd´ alen´e vol´ an´ı procedur na platformˇe Java je implementov´ano pomoc´ı Java RMI. Ze zad´ an´ı tedy plyne nutnost pouˇzit´ı t´eto technologie.
4.1.1
Popis a porovn´ an´ı technologi´ı
Co vˇsak m˚ uˇzeme vybrat (aby tento v´ ybˇer st´ale odpov´ıdal zad´an´ı), je technologie, kter´a pˇr´ıpadnˇe zastˇreˇs´ı pouˇzit´ı Java RMI. N´asleduj´ıc´ı dva odstavce popisuj´ı nejprve pouˇzit´ı samotn´eho RMI a pot´e vyuˇzit´ı Enterprise Java Beans v r´amci Java Enterprise Edition, coˇz je technologie, jej´ıˇz hlavn´ı ˇc´ ast (session beans) je postaven´a na RMI. Samostatn´ e RMI Vlastnosti a pouˇzit´ı samostatn´e technologie Java RMI jsme popsali v kapitole Vzd´ alen´e vol´ an´ı procedur“, konkr´etnˇe v ˇc´asti 2.5. ” V´ yhody tohoto pouˇzit´ı RMI jsou n´asleduj´ıc´ı: ∙ nepotˇrebujeme ˇz´ adn´e dalˇs´ı knihovny a technologie, pouˇzijeme standardn´ı funkˇcnost jazyka Java, ∙ vytvoˇren´ı rozhran´ı pro klientsk´ y modul je velmi jednoduch´e, jakoˇzto i jeho implementace, ∙ aplikace m˚ uˇze b´ yt spuˇstˇena na jak´emkoli serveru s podporou platformy Java. Samostatn´e RMI m´ a vˇsak tu nev´ yhodu, ˇze z hlediska zabezpeˇcen´ı nab´ız´ı pouze standardn´ı prostˇredky, kter´e jsou souˇc´ ast´ı platformy Java 2. Aplikace m´a nastavena r˚ uzn´a povolen´ı k urˇcit´ ym ˇcinnostem, tato povolen´ı pak kontroluje Security Manager [33].
45
´ ER ˇ A POPIS TECHNOLOGI´I KAPITOLA 4. VYB
46
Pokud bychom vˇsak chtˇeli pouˇz´ıt nˇejak´a povolen´ı na u ´rovni uˇzivatel˚ u, museli bychom vytvoˇrit vlastn´ı ˇreˇsen´ı ˇci pouˇz´ıt nˇejak´e dodateˇcn´e knihovny.
Enterprise Java Beans v r´ amci Java Enterprise Edition Velmi odliˇsnou variantou pro splnˇen´ı zad´ an´ı je pouˇzit´ı platformy Java Enterprise Edition (Java EE), coˇz je soubor technologi´ı pro v´ yvoj rozs´ ahl´ ych enterprise aplikac´ı1 . Pr´avˇe technologie Enterprise Java Beans (EJB), jej´ıˇz hlavn´ı ˇc´ ast - tzv. session beans“ - je j´adrem aplikaˇcn´ı logiky, vyuˇz´ıv´a pro ko” munikaci klient-server pr´ avˇe RMI [62]. Z´akladn´ı pouˇzit´ı session beans je velmi podobn´e pouˇzit´ı samotn´eho RMI. Opˇet mus´ıme vytvoˇrit rozhran´ı, kter´e klient z´ısk´ a a kter´e definuje podporovan´e funkce. Toto rozhran´ı pak na serveru implementujeme. Mezi v´ yhody t´eto technologie patˇr´ı zejm´ena moˇznost pouˇ zit´ı EJB v r´ amci cel´ e platformy Java EE, kter´ a nab´ız´ı vˇsechny prostˇredky pro v´ yvoj enterprise aplikace, kterou n´aˇs informaˇcn´ı syst´em je. Mus´ıme vˇsak jeˇstˇe podotknout, ˇze bychom mohli pouˇz´ıt samostatn´e RMI z pˇredchoz´ı alternativy i v platformˇe Java EE. Ztratili bychom t´ım ale vˇsechny v´ yhody, kter´e nab´ız´ı technologie EJB, jej´ıˇz ˇc´ ast je sice postaven´a na RMI, ale nab´ız´ı i mnoho dalˇs´ıch n´astroj˚ u. Uved’me vˇsak tak´e v´ yznamnou nev´ yhodu cel´e Java EE technologie: pokud nem´a program´ator s touto platformou zkuˇsenosti, nen´ı pˇr´ıliˇs jednoduch´e ji nastudovat tak, aby v n´ı mohl vytv´aˇret kvalitn´ı aplikace. To vyˇzaduje pomˇernˇe hodnˇe zkuˇsenost´ı.
4.1.2
Vybran´ a technologie: Java Enterprise Edition
Nejen kv˚ uli zkuˇsenostem v oblasti platformy Java EE jsme se rozhodli, ˇze pouˇzijeme tuto technologii. Jmenujme dalˇs´ı hlediska, proˇc byla technologie vybr´ana oproti samotn´emu RMI: ∙ vyuˇzijeme mnoho prostˇredk˚ u, kter´e Java EE nab´ız´ı, jako napˇr´ıklad: – podporu pro autentizaci klienta, – zabezpeˇcen´e vol´ an´ı metod EJB (r˚ uzn´e metody m˚ uˇzeme povolit jen nˇekter´ ym uˇzivatelsk´ ym rol´ım), – pˇr´ıpadnou integraci s Java Persistence API pro komunikaci s datab´azovou vrstvou, ∙ v oblasti samotn´eho RMI nab´ız´ı Java EE dostateˇcnou m´ıru abstrakce, abychom se nemuseli zab´ yvat nˇekter´ ymi aspekty RMI komunikace, ∙ technologie EJB pak dokonce umoˇzn ˇuje pouˇz´ıt stejn´e EJB tˇr´ıdy jak pro implementaci RMI rozhran´ı, tak pro implementaci webov´e sluˇzby. Tato kombinace nab´ız´ı velk´ y potenci´al pro rozˇsiˇritelnost aplikace i jako webov´e sluˇzby. 1 Slovem enterprise je v angliˇctinˇe z ekonomick´eho hlediska myˇslena firma ˇci spoleˇcnost, z hlediska poˇc´ıtaˇcov´eho jsou pak enterprise aplikacemi myˇsleny ty, kter´e jsou pouˇz´ıv´ any ve velk´ ych firm´ ach a operuj´ı s rozs´ ahl´ ymi daty.
´ ´ VOLAN ´ ´I PROCEDUR (RPC) 4.1. VZDALEN E
4.1.2.1
47
Popis platformy Java EE
Technologie Java je dnes jednak programovac´ım jazykem, ale tak´e platformou - tedy prostˇred´ım, ve kter´em Java aplikace funguj´ı a kter´e umoˇzn ˇuje program´atorovi pouˇzit´ı nejr˚ uznˇejˇs´ıch prostˇredk˚ u pˇri v´ yvoji softwaru. Podle toho, jak´e aplikace chceme vytv´aˇret, m´ame na v´ ybˇer dokonce z nˇekolika Java platforem: ∙ Java Standard Edition - j´ adro programovac´ıho jazyka, obsahuje z´akladn´ı funkce, virtu´ aln´ı stroj a dalˇs´ı nezbytn´e technologie pro chod Java aplikac´ı, ∙ Java Micro Edition - pokud chceme vyv´ıjet Java aplikace pro mobiln´ı zaˇr´ızen´ı, pouˇzijeme tuto platformu, kter´ a je uzp˚ usoben´a pro bˇeh na m´enˇe v´ ykonn´ ych syst´emech, ∙ JavaFX - platforma pro tvorbu tzv. Rich Internet Applications2 , ∙ Java Enterprise Edition (viz n´ıˇze). Java Enterprise Edition (Java EE) rozˇsiˇruje moˇznosti Java Standard Edition a nab´ız´ı prostˇredky pro v´ yvoj rozs´ ahl´ ych serverov´ ych aplikac´ı (ˇcasto se setk´av´ame s oznaˇcen´ım en” terprise aplikace“). Tyto aplikace se skl´adaj´ı vˇzdy z nˇekolika vrstev [92]: ∙ Klientsk´ a vrstva - klientem se v tomto pˇr´ıpadˇe rozum´ı napˇr´ıklad desktopov´a aplikace ˇci webov´ y prohl´ıˇzeˇc nebo dokonce jin´ y server. Tyto klientsk´e poˇc´ıtaˇce pos´ılaj´ı poˇzadavky na server, kde je nasazena aplikace, a ten jim vrac´ı odpovˇedi. ∙ Webov´ a vrstva se star´ a o komunikaci klientsk´e a business vrstvy (viz d´ale). Obsahuje technologie jako napˇr. servlety3 , JSP str´anky4 ˇci JavaBean komponenty5 . ∙ Business vrstva - obsahuje aplikaˇcn´ı logiku naˇs´ı aplikace a pˇr´ıpadnˇe tak´e dom´enov´ y model. Souˇc´ ast´ı t´eto vrstvy jsou pr´avˇe Enterprise Java Beans (zajiˇst’uj´ıc´ı aplikaˇcn´ı logiku), JPA entity6 a dalˇs´ı. ∙ Enterprise Information Systems - posledn´ı vrstvou v architektuˇre Java Enterprise aplikace je tzv. EIS vrstva, kter´a typicky obsahuje datab´azov´ y server a dalˇs´ı technologie umoˇzn ˇuj´ıc´ı propojen´ı s jin´ ymi syst´emy. Tato vrstevnat´ a architektura je zn´azornˇena na obr´azku 4.1. Zmiˇ nme jeˇstˇe, ˇze aplikace nemus´ı obsahovat webovou vrstvu, protoˇze je moˇzn´e vytvoˇrit klientskou aplikaci (napˇr´ıklad desktopovou), kter´ a bude komunikovat pˇr´ımo s EJB kontejnerem. 2 Rich Internet Applications jsou modern´ı internetov´e aplikace, kter´e nab´ızej´ı stejn´e funkce jako aplikace desktopov´e, a tak je mohou plnohodnotnˇe nahradit [13]. V´ıce se o tˇechto aplikac´ıch dozv´ıte v ˇca ´sti 2.3.1. 3 Servlet je Java tˇr´ıda, kter´ a slouˇz´ı k obslouˇzen´ı HTTP poˇzadavku klientsk´eho poˇc´ıtaˇce a generov´ an´ı odpovˇedi [35]. 4 JSP str´ anky nab´ızej´ı zp˚ usob, kdy m˚ uˇzeme smˇeˇsovat statick´e HTML str´ anky s dynamicky generovan´ ym obsahem, kter´ y dod´ avaj´ı servlety [35]. 5 JavaBean komponenta je bˇeˇzn´ a Java tˇr´ıda s nˇekolika speci´ aln´ımi pravidly: mus´ı obsahovat pr´ azdn´ y konstruktor, nesm´ı m´ıt ˇza ´dn´e veˇrejn´e instanˇcn´ı promˇenn´e a k hodnot´ am, kter´e mohou b´ yt upraveny, se mus´ı pˇristupovat pomoc´ı metod getXxx resp. setXxx. Tato tˇr´ıda pak m˚ uˇze b´ yt pouˇzita napˇr´ıklad spolu s HTML formul´ aˇrem a JSP str´ anka automaticky zajist´ı jej´ı sp´ arov´ an´ı s hodnotami formul´ aˇre [35]. 6 JPA entity jsou speci´ aln´ı Java tˇr´ıdy, kter´e pˇredstavuj´ı persistentn´ı data aplikace. Typicky tak jedna JPA entita pˇredstavuje jednu tabulku v datab´ azi, nemus´ı tomu tak vˇsak b´ yt vˇzdy. JPA entity pouˇz´ıvaj´ı specia ´ln´ı anotace k urˇcen´ı prim´ arn´ıho kl´ıˇce, typu atribut˚ u a dalˇs´ıch informac´ı, kter´e koresponduj´ı s datab´ azovou tabulkou [46].
´ ER ˇ A POPIS TECHNOLOGI´I KAPITOLA 4. VYB
48
Klientská vrstva
Prohlížeč
Desktopová Java aplikace
Webová vrstva
Business vrstva
Webový server
EJB kontejner
JSP
EJB
Enterprise Information System
JSP EJB Servlet
Nějaká další klientská Java aplikace
EJB Servlet
Obr´ azek 4.1: Vrstevnat´ a architektura Java Enterprise Edition. 4.1.2.2
Enterprise Java Beans
Enterprise Java Beans jsou j´ adrem Java EE aplikace. V n´asleduj´ıc´ım textu budeme popisovat v´ yhradnˇe EJB verze 3.0. Od pˇredchoz´ı verze totiˇz doˇslo v t´eto technologii k v´ yznamn´ ym zmˇen´am a vylepˇsen´ım a neexistuje dnes jedin´ y d˚ uvod pouˇz´ıvat starou verzi. Komponenty v EJB kontejneru se dˇel´ı na: ∙ Session beans - zajiˇst’uj´ı hlavn´ı ˇc´ ast aplikaˇcn´ı logiky - v naˇsem pˇr´ıpadˇe zejm´ena operace s datab´az´ı, ∙ Message-driven beans - slouˇz´ı ke komunikaci mezi Java EE komponentami pomoc´ı zpr´av. Session beans jsou komponenty, jejichˇz metody jsou vol´any klientem, kter´ y poˇzaduje po serveru urˇcitou funkci. Jedn´ a se pr´ avˇe o ty komponenty, kter´e v pˇr´ıpadˇe, ˇze se klient nenach´az´ı na stejn´em poˇc´ıtaˇci jako server, komunikuj´ı pomoc´ı RMI. Dˇel´ı se d´ale na dva typy: stateful a stateless session beans [62]. ∙ Typ stateful oznaˇcuje takovou session bean, kter´a uchov´av´a sv˚ uj stav v pr˚ ubˇehu klientsk´eho pˇripojen´ı (v pˇr´ıpadˇe webov´eho klienta to je nejd´ele doba, jakou existuje session dan´eho webov´eho prohl´ıˇzeˇce). Pˇr´ıkladem takov´e stateful session bean m˚ uˇze b´ yt objekt uchov´avaj´ıc´ı poloˇzky n´ akupn´ıho koˇs´ıku pˇri n´akupu v internetov´em obchodˇe.
´ ´ VOLAN ´ ´I PROCEDUR (RPC) 4.1. VZDALEN E
49
∙ Naopak typ stateless neuchov´av´a ˇz´adn´a data a je vhodn´e ho pouˇz´ıt pro jednor´azov´e funkce (napˇr´ıklad uloˇzen´ı z´aznamu do datab´aze). Session beans tohoto typu mohou b´ yt uveˇrejnˇeny jako webov´e sluˇzby. Zvl´ aˇstn´ı komponentou jsou tzv. entity, kter´e slouˇz´ı k objektovˇe-relaˇcn´ımu mapov´an´ı, a na rozd´ıl od pˇredchoz´ıch nejsou spravov´any pˇr´ımo EJB kontejnerem (i kdyˇz do nˇej patˇr´ı), ale speci´aln´ım n´ astrojem zvan´ ym Entity Manager.
4.1.2.3
Zabezpeˇ cen´ı Java EE
Platforma Java EE nab´ız´ı prostˇredky pro celkov´e zabezpeˇcen´ı aplikace. Nejd˚ uleˇzitˇejˇs´ım prvkem zabezpeˇcen´ı je autentizace klienta. V definici enterprise aplikace m˚ uˇzeme urˇcit, kter´e prvky aplikace jsou zabezpeˇcen´e (pro webovou aplikaci to mohou b´ yt kupˇr´ıkladu vˇsechny kromˇe pˇrihlaˇsovac´ı str´ anky) a postup komunikace klienta se serverem pak vypad´a n´ asledovnˇe: 1. klient se dot´ aˇze na zobrazen´ı zabezpeˇcen´eho prvku, 2. server zjist´ı, zda-li je klient autentizov´an, pokud ano, pokraˇcuje na bod 5, pokud ne, pokraˇcuje d´ ale: 3. vyˇz´ ad´ a si od klienta zad´ an´ı pˇrihlaˇsovac´ıch u ´daj˚ u (u webov´e aplikace klientovi napˇr´ıklad zobraz´ı pˇrihlaˇsovac´ı str´ anku), 4. pokud server ovˇeˇr´ı totoˇznost klienta, pokraˇcuje d´ale, jinak klientovi nahl´as´ı zad´ an´ı ˇspatn´ ych pˇrihlaˇsovac´ıch u ´daj˚ u, 5. server poskytne klientovi dotazovan´ y prostˇredek (napˇr´ıklad webovou str´anku). Pokud pot´e prob´ıh´ a komunikace pomoc´ı RMI (na u ´rovni EJB kontejneru), je tato komunikace v pˇr´ıpadˇe u ´spˇeˇsn´e autentizace klienta zabezpeˇcena. Kaˇzd´ y klient, kter´ y se chce do zabezpeˇcen´e aplikace pˇripojit, mus´ı m´ıt tedy pˇriˇrazeno: ∙ uˇzivatelsk´e jm´eno, ∙ heslo a ∙ uˇzivatelskou roli. Vˇsechny tyto poloˇzky musej´ı b´ yt definov´any na serveru, tedy napˇr´ıklad v datab´azi. Velmi d˚ uleˇzit´ a je posledn´ı zm´ınˇen´ a poloˇzka - uˇzivatelsk´a role. Pomoc´ı n´ı totiˇz m˚ uˇzeme omezit pˇr´ıstup k metod´ am session beans tˇr´ıd. EJB kontejner pak pˇri kaˇzd´em vol´an´ı session bean metody kontroluje, zda-li m´ a pˇrihl´aˇsen´ y uˇzivatel k t´eto akci pr´ava [46].
´ ER ˇ A POPIS TECHNOLOGI´I KAPITOLA 4. VYB
50
4.2
Funkce ˇ casov´ ych ˇ rez˚ u
To, co definuj´ı ˇcasov´e ˇrezy, jsou vlastnˇe funkce tempor´arn´ı datab´aze. Tempor´arn´ı znamen´a obecnˇe pˇrechodn´ y“ ˇci doˇcasn´ y“, tempor´arn´ı datab´aze jsou pak ty, kde maj´ı poloˇzky sv´e ” ” ˇcasov´e raz´ıtko a m˚ uˇzeme se pt´ at, jakou hodnotu mˇela dan´a poloˇzka v dan´ y ˇcas. V anal´ yze jsme popsali, jak´e jsou poˇzadavky na tuto funkˇcnost z hlediska naˇseho informaˇcn´ıho syst´emu. Nyn´ı probereme moˇznosti, kter´ ymi se d´a t´eto funkˇcnosti dos´ahnout.
4.2.1
Moˇ znosti n´ avrhu tempor´ arn´ı funkˇ cnosti
Abychom mohli k datab´ azi pˇristupovat jako k datab´azi tempor´arn´ı, m´ame dvˇe hlavn´ı moˇznosti, kter´e m˚ uˇzeme pouˇz´ıt: ∙ speci´aln´ı datab´ aze s tempor´ arn´ım SQL rozˇs´ıˇren´ım, ∙ vlastn´ı zp˚ usob n´ avrhu datab´ aze, kter´ y umoˇzn´ı pouˇz´ıvat tempor´arn´ı funkce ve standardn´ım SQL. Datab´ aze s tempor´ arn´ım SQL rozˇ s´ıˇ ren´ım Teoretick´e snahy o tempor´arn´ı rozˇs´ıˇren´ı SQL existuj´ı jiˇz velmi dlouho [70], avˇsak v oblasti implementac´ı tohoto rozˇs´ıˇren´ı mus´ıme konstatovat, ˇze nen´ı vˇzdy jednoduch´e zav´est nˇejak´ y teoretick´ y koncept do praktick´eho vyuˇzit´ı, protoˇze datab´ az´ı, kter´e podporuj´ı dotazovac´ı jazyk TSQL, je velmi m´alo. Jedn´ım z d˚ uvod˚ u m˚ uˇze b´ yt to, ˇze aktu´ aln´ı specifikace jazyka TSQL2 ˇc´ıt´a kolem 700 str´anek [47]. Moment´alnˇe existuj´ı dva odliˇsn´e pˇr´ıstupy, jak lze dos´ahnout toho, aby dan´a datab´aze implementovala TSQL rozˇs´ıˇren´ı [47][84]: ∙ integrovan´e ˇreˇsen´ı - v t´eto variantˇe je Database Management System (DBMS) jiˇz od z´aklad˚ u upraven tak, aby podporoval pr´aci s ˇcasov´ ymi daty, ∙ vrstevnat´e ˇreˇsen´ı naopak stav´ı na z´akladu tradiˇcn´ıho DBMS a pˇrid´av´a speci´aln´ı tempor´arn´ı vrstvu, kter´ a se star´ a o zpracov´an´ı TSQL dotaz˚ u, jeˇz jsou konvertov´any na standardn´ı SQL dotazy. Ze souˇcasn´ ych technologi´ı, kter´e podporuj´ı tempor´arn´ı rozˇs´ıˇren´ı TSQL, m˚ uˇzeme jmenovat: ∙ Oracle Workspace Manager [61] je modul datab´aze Oracle 11g, kter´ y umoˇzn ˇuje pr´aci s aktu´aln´ımi, historick´ ymi i budouc´ımi“ daty. V aktu´aln´ı verzi podporuje TSQL verze 2. ” Licence Oracle datab´ aze je vˇsak velmi drah´a (Enterprise verze, jej´ıˇz souˇc´ast´ı je modul Workspace Manager, stoj´ı aktu´ alnˇe pˇribliˇznˇe 20 000 Kˇc), proto nen´ı pro naˇse pouˇzit´ı toto ˇreˇsen´ı vhodn´e. ∙ TimeDB [77], jej´ıˇz implementace je pops´ana v dizertaci Andrease Steinera [78], je funkˇcn´ı tempor´ arn´ı datab´ aze, avˇsak posledn´ı jej´ı verze je z roku 2005 a jedn´a se sp´ıˇse o projekt z akademick´eho prostˇred´ı neˇz o datab´azi otestovanou v re´aln´em nasazen´ı.
ˇ ´ ˇ U ˚ 4.2. FUNKCE CASOV YCH REZ
51
∙ Bal´ıˇcek temporal [65] v r´ amci datab´aze PostgreSQL [64] nab´ız´ı rozˇs´ıˇren´ı funkc´ı datab´ aze o pr´ aci s ˇcasov´ ymi daty. Projekt je vˇsak st´ale ve v´ yvojov´em st´adiu. ˇ sen´ı datab´ Reˇ aze s tempor´ arn´ım rozˇs´ıˇren´ım m´a jasnou v´ yhodu - nen´ı potˇreba vym´ yˇslet nov´ y zp˚ usob dotazov´ an´ı, ale pouˇzijeme jiˇz hotov´e rozˇs´ıˇren´ı SQL. Jak je vˇsak patrn´e z v´ yˇse uveden´eho pˇrehledu, nev´ yhoda je tak´e zˇrejm´a - mus´ıme pro chod naˇseho syst´emu pouˇz´ıt datab´azi, kter´ a toto rozˇs´ıˇren´ı podporuje, a nem˚ uˇzeme ˇr´ıci, ˇze bychom si mohli vybrat z mnoha (kvalitn´ıch) moˇznost´ı. Jedin´ ym re´alnˇe pouˇziteln´ ym ˇreˇsen´ım je datab´aze od firmy Oracle, kter´a je vˇsak moment´ alnˇe nad naˇse finanˇcn´ı moˇznosti. Vˇsechny v´ yˇse uveden´e implementace maj´ı jeˇstˇe jednu spoleˇcnou nev´ yhodu: pro pr´ aci s datab´ az´ı bychom nemohli pouˇz´ıt objektovˇe-relaˇcn´ı mapov´an´ı (popsan´e n´ıˇze, v ˇc´asti 4.3), coˇz je velmi omezuj´ıc´ı. Vlastn´ı sch´ ema s poloˇ zkami fromDate a toDate Pokud bychom nepouˇzili datab´ azi s tempor´ arn´ım rozˇs´ıˇren´ım, mus´ıme vytvoˇrit vlastn´ı ˇreˇsen´ı s pouˇzit´ı st´avaj´ıc´ıch technologi´ı (SQL). Vˇsechny entity by v tomto datov´em modelu mˇely atributy fromDate a toDate - tyto atributy zde znaˇc´ı ˇcasovou validitu dan´e poloˇzky (ˇr´adku v tabulce). Pˇri kaˇzd´e zmˇenˇe z´aznamu entity se tedy dan´ y z´ aznam vlastnˇe nemˇen´ı, ale jen se zap´ıˇse konec jeho platnosti. D´ale se vytvoˇr´ı z´ aznam nov´ y, se stejn´ ymi daty kromˇe zmˇenˇen´e poloˇzky a s platnost´ı zaˇc´ınaj´ıc´ı od data editace ˇci od data explicitnˇe zadan´eho. N´avrh tohoto ˇreˇsen´ı byl inspirov´an ˇcl´ankem [71]. V tomto pˇr´ıpadˇe tedy nemus´ıme pouˇz´ıt ˇz´adnou speci´aln´ı datab´azi a n´avrh modelu je pomˇernˇe jednoduch´ y (pˇrid´ an´ı dvou poloˇzek do kaˇzd´e entity jiˇz vytvoˇren´eho modelu). Vlastn´ı sch´ ema s poloˇ zkami fromDate a toDate (upraveno dle anal´ yzy) lytick´e ˇc´ asti jsme rozdˇelili informace (z pohledu datov´eho modelu atributy) na:
V ana-
∙ statick´e a ∙ dynamick´e. Statick´ y atribut je napˇr´ıklad rok v´ ystavby domu, kter´ y se nem˚ uˇze zmˇenit. Naopak dynamick´ y atribut je napˇr. typ prostoru - z bytu se m˚ uˇze st´at nebytov´ y prostor a naopak. Nen´ı tedy nutn´e poloˇzky fromDate a toDate zaznamen´avat u statick´ ych atribut˚ u, je to potˇreba jen u atribut˚ u dynamick´ ych.
4.2.2
Popis zvolen´ e moˇ znosti pro n´ avrh tempor´ arn´ı funkˇ cnosti
Z d˚ uvodu neexistuj´ıc´ı vhodn´e implementace tempor´arn´ı datab´aze jsme vybrali ˇreˇsen´ı postaven´e na vlastn´ım sch´ematu navrˇzen´em v´ yˇse. Pˇri n´ avrhu tempor´ arn´ı funkˇcnosti jsme pak rozliˇsili dvˇe moˇznosti: ∙ klasick´ y objekt s dynamick´ ymi daty (napˇr. d˚ um) - existuj´ı pro nˇej dvˇe entity: Objekt (nehistorick´ a) a ObjektH (historick´a) a
´ ER ˇ A POPIS TECHNOLOGI´I KAPITOLA 4. VYB
52
∙ M:N vztahov´ a entita (napˇr. majitel/´e domu) - existuje pouze jedna entita, kter´a pˇredstavuje M:N spojen´ı. V pˇr´ıpadˇe prvn´ı moˇznosti datov´ y model obsahuje ke kaˇzd´e nehistorick´e entitˇe dalˇs´ı specia´ln´ı historickou s pˇr´ıdavkem H“ (viz obr´ azek 4.2). Vztah je zde 1:N, tedy mnoho historick´ ych ” entit (ObjektH) pˇr´ısluˇs´ı jedn´e nehistorick´e (Objekt). D˚ uleˇzit´e je, ˇze pro kaˇzdou nehistorickou entitu mus´ı v datab´ azi existovat alespoˇ n jedna odpov´ıdaj´ıc´ı historick´a. Pokud syst´em obsahuje historick´ ych entit v´ıce, je nav´ıc nutn´e, aby na sebe pˇ resnˇ e navazovaly (toDate jedn´e mus´ı b´ yt pr´avˇe o jeden den menˇs´ı neˇz fromDate navazuj´ıc´ı), v opaˇcn´em pˇr´ıpadˇe by se jednalo o nekonzistentn´ı stav. Aktu´ aln´ı z´ aznam v H“ tabulce m´a nastaveno v toDate NULL hodnotu ” a takov´ y z´aznam m˚ uˇze existovat k dan´e historick´e entitˇe jen jeden.
Entita PK
id
EntitaH INTEGER
PK,FK1 PK
statickáInformace1 VARCHAR(45) statickáInformace2 INTEGER
EntitaId fromDate
INTEGER DATETIME
toDate dynamickáInformace1 dynamickáInformace2 dynamickáInformace3
DATETIME VARCHAR(255) DATETIME INTEGER
Obr´ azek 4.2: Entita se statick´ ymi a dynamick´ ymi informacemi. Druhou moˇznost (M:N vztahovou entitu) uv´ad´ı obr´azek 4.3. Tato vztahov´a entita je jiˇz vlastnˇe historick´ a. Obsahuje totiˇz poloˇzky fromDate a toDate.
EntitaMN EntitaM PK
id
INTEGER
atribut1 atribut2
INTEGER VARCHAR(45)
PK,FK1 PK,FK2 PK
EntitaMId EntitaNId fromDate
INTEGER INTEGER DATETIME
toDate DATETIME dalšíAtribut VARCHAR(45)
EntitaN PK
id
INTEGER
atribut1
VARCHAR(255)
Obr´ azek 4.3: M:N historick´a entita. Dotazov´an´ı na stav syst´emu pro urˇcit´e datum pak prob´ıh´a n´asleduj´ıc´ım zp˚ usobem: ∙ vyber vˇsechny poloˇzky, jejichˇz fromDate je menˇs´ı nebo rovno zadan´emu datu a z´aroveˇ n toDate je vˇetˇs´ı nebo rovno zadan´emu datu pro konkr´etn´ı datum, ∙ vyber vˇsechny poloˇzky, jejichˇz toDate se rovn´a NULL pro nejnovˇejˇs´ı poloˇzku/poloˇzky (ty maj´ı vˇzdy toDate nastaveno na NULL). Tyto dotazy n´ am v pˇr´ıpadˇe entity vyjadˇruj´ıc´ı M:N vztah vr´at´ı nula aˇz N v´ ysledk˚ u (napˇr. vˇsechny uˇzivatele bytu k dan´emu datu), v ostatn´ıch pˇr´ıpadech (entity s H“ pˇr´ıdavkem) pr´avˇe ” jeden v´ ysledek. Historick´ a entita obsahuje totiˇz dodateˇcn´a data pro entitu nehistorickou, z tohoto d˚ uvodu mus´ı existovat pro kaˇzd´e datum pr´avˇe jedna, v opaˇcn´em pˇr´ıpadˇe by se jednalo o nekonzistenci datab´ aze.
´ ´ VRSTVA V RAMCI ´ 4.3. DATABAZOV A JAVA EE
53
Pokud se v n´ asleduj´ıc´ı kapitole setk´ame s pojmem data ˇci objekty platn´e pro dan´e ” datum“, jsou t´ım myˇsleny pr´ avˇe data/objekty, kter´e v´ yˇse uveden´ ymi dotazy pro zadan´e datum z´ısk´ ame.
4.3
Datab´ azov´ a vrstva v r´ amci Java EE
Abychom plnˇe vyuˇzili moˇznost´ı platformy Java EE, je vhodn´e pouˇz´ıt techniku tzv. objektovˇerelaˇcn´ıho mapov´ an´ı (ORM). Je to zp˚ usob, kter´ y velmi ulehˇc´ı interakci mezi objektovˇeorientovan´ ym programovac´ım jazykem a relaˇcn´ı datab´az´ı. Pokud bychom totiˇz chtˇeli pˇristupovat k datab´ azi pˇr´ımo, naraz´ıme na nˇekolik probl´em˚ u: ∙ datov´e typy v datab´ azi mohou b´ yt odliˇsn´e od datov´ ych typ˚ u v jazyce Java, ∙ objekty v jazyce Java udrˇzuj´ı jak informaci o samotn´ ych datech, tak i o tom, jak´ ym zp˚ usobem m˚ uˇzeme s tˇemito daty pracovat (metody v objektu), relaˇcn´ı datab´aze oproti tomu udrˇzuje informaci pouze o uloˇzen´ ych datech, ∙ pokud bychom se rozhodli zmˇenit samotnou datab´azi (napˇr. z MySQL na Apache Derby), byli bychom moˇzn´ a nuceni zmˇenit i veˇskerou komunikaci, protoˇze by se pouˇzit´ı nˇekter´ ych datab´ azov´ ych dotaz˚ u liˇsilo. Vˇsechny v´ yˇse uveden´e probl´emy se snaˇz´ı eliminovat pr´avˇe objektovˇe-relaˇcn´ı mapov´ an´ı, kter´e, zjednoduˇsenˇe ˇreˇceno, mapuje datab´azov´e entity (tabulky) na Java tˇr´ıdy. V aplikaˇcn´ı logice pak m˚ uˇzeme pracovat pˇr´ımo s objekty a nemus´ıme se starat o to, jak´ ym zp˚ usobem jsou ve v´ ysledku uloˇzeny v datab´azi [2]. Nejrozˇs´ıˇrenˇejˇs´ım standardem pro ORM v jazyce Java je Java Persistence API (JPA), aktu´alnˇe ve verzi 2.0 [22]. JPA je vyv´ıjen´e firmou Sun Microsystems. Dalˇs´ım standardem pro objektovˇe-relaˇcn´ı mapov´ an´ı je technologie Java Data Objects (JDO). Pˇri porovn´an´ı tˇechto dvou technologi´ı [5] zjist´ıme, ˇze JPA kromˇe nˇekolika drobnost´ı nab´ız´ı podmnoˇzinu funkc´ı JDO. Mimo implementac´ı JPA a JDO existuje i mnoho implementac´ı, kter´e nejsou zaloˇzeny na ˇz´adn´em standardu (napˇr. Apache Cayenne [4]), avˇsak jejich nev´ yhoda je zˇrejm´a: pˇri ukonˇcen´ı v´ yvoje projektu bychom byli nuceni mˇenit velkou ˇc´ast k´odu datab´azov´e vrstvy z d˚ uvodu pˇrechodu na jin´ y ORM framework. Tato nev´ yhoda u jak´ekoli implementace JPA/JDO neexistuje, protoˇze pro komunikaci s datab´az´ı pouˇz´ıv´ame standardizovan´e API. Konkr´etn´ı ORM framework, kter´ y toto API implementuje, si m˚ uˇzeme pak zvolit libovolnˇe. Z n´ asleduj´ıc´ıch d˚ uvod˚ u se d´ ale zamˇeˇr´ıme pouze na popis implementac´ı JPA a n´aslednˇe jednu z nich vybereme: ∙ oproti nestandardizovan´e ORM technologii m´a JPA obrovskou v´ yhodu - nejsme nijak z´ avisl´ı na pouˇzit´ı konkr´etn´ı JPA implementace, naopak v pˇr´ıpadˇe ukonˇcen´ı v´ yvoje v´ yˇse zm´ınˇen´eho Apache Cayenne bychom museli celou datab´azovou vrstvu upravit, ∙ JPA nab´ız´ı sice podmnoˇzinu funkc´ı JDO, ale tato podmnoˇzina je plnˇe dostaˇcuj´ıc´ı, ∙ s pouˇzit´ım JPA m´ am osobnˇe velk´e zkuˇsenosti, naopak JDO jsem nikdy v takto velk´em projektu nepouˇz´ıval.
´ ER ˇ A POPIS TECHNOLOGI´I KAPITOLA 4. VYB
54
4.3.1
Java Persistence API
Jeˇstˇe pˇred samotn´ ym popisem jednotliv´ ych implementac´ı si nyn´ı popiˇsme nˇekter´e z´akladn´ı prvky JPA. Java Persistence API se skl´ ad´a ze dvou z´akladn´ıch ˇc´ast´ı: ∙ entity (zm´ınˇen´e jiˇz v ˇc´ asti 4.1.2.2) jsou tˇr´ıdy, kter´e pˇredstavuj´ı objektovou ˇc´ast ORM mapov´an´ı. Nab´ız´ı API pro: – definici prim´ arn´ıch (i sloˇzen´ ych) kl´ıˇc˚ u, – r˚ uzn´e typy dˇediˇcnosti, – vˇsechny druhy vztah˚ u mezi entitami (one-to-one, one-to-many, many-to-one a tak´e many-to-many), ∙ EntityManager a dalˇs´ı souvisej´ıc´ı tˇr´ıdy pak umoˇzn ˇuj´ı pˇr´ımou pr´aci s datab´az´ı jako napˇr´ıklad: – ukl´ ad´ an´ı, maz´ an´ı ˇci u ´pravu entit v datab´azi, – dotazov´ an´ı do datab´ aze pomoc´ı Java Persistence query language, coˇz je obdoba klasick´eho SQL. Zde pˇredstavuje pro program´atora JPA obrovskou v´ yhodu, protoˇze tento dotazovac´ı jazyk je nez´avisl´ y jak na pouˇzit´e implementaci Java Persistence API, tak na pouˇzit´e datab´azi, – podpora pro transakce (opˇet nez´avisl´a na zvolen´e implementaci a datab´azi). Specifikace JPA je velmi rozs´ ahl´ a a nen´ı pro jej´ı popis v tomto textu dostatek prostoru. Odk´aˇzeme proto ˇcten´ aˇre na [50], kde se dozv´ı vˇsechny potˇrebn´e informace.
4.3.2
Popis a porovn´ an´ı implementac´ı Java Persistence API
Nyn´ı si pˇredstav´ıme nejzn´ amˇejˇs´ı implementace JPA. Je tˇreba zd˚ uraznit, ˇze aˇckoli na konci vybereme jednu z tˇechto implementac´ı, kterou budeme pouˇz´ıvat, nen´ı tento v´ ybˇer tolik d˚ uleˇzit´ y. Kv˚ uli v´ yˇse zm´ınˇen´e v´ yhodˇe standardu JPA m˚ uˇzeme totiˇz kdykoli jednoduˇse vybran´ y ORM framework zmˇenit za jin´ y bez nutnosti z´ asahu do k´odu. EclipseLink Projekt EclipsLink [28] komunity Eclipse (kopnkr´etnˇe jeho verze 2.0.0) je dle Sun Microsystems referenˇcn´ı implementac´ı pro JPA 2.0. Splˇ nuje tedy vˇsechny poˇzadavky specifikace a umoˇzn ˇuje nav´ıc napˇr´ıklad pouˇzit´ı XML konfigurace nam´ısto JPA anotac´ı v entit´ach. Hibernate Framework Hibernate [38] je v oblasti ORM nejzn´amˇejˇs´ım produktem. Nab´ız´ı jak implementaci JPA, tak i vlastn´ı API (v modulu Hibernate Core) pro objektovˇe-relaˇcn´ı ˇ ast specifikace JPA vych´ mapov´an´ı. C´ az´ı pr´avˇe z t´eto knihovny Hibernate Core, kter´a vznikla jako prvn´ı a aˇz pozdˇeji byla vytvoˇrena implementace JPA, kter´a je vˇsak tak´e postavena na modulu Hibernate Core. Pouˇzit´ı Hibernate jako implementace pro JPA m´a tu v´ yhodu, ˇze m˚ uˇzeme pouˇz´ıt i sloˇzitˇejˇs´ı propriet´arn´ı API, kter´e Hibernate nab´ız´ı. Nˇekdy se totiˇz m˚ uˇze st´at, ˇze program´ator potˇrebuje
´ ´ VRSTVA V RAMCI ´ 4.3. DATABAZOV A JAVA EE
55
vyuˇz´ıt nˇejakou funkci, kterou JPA specifikace nepodporuje, ale samotn´ y Hibernate ano. Na druhou stranu, pokud vyuˇzijeme vˇetˇsinu funkc´ı samotn´eho JPA, z˚ ust´av´a zde v´ yhoda (pomˇernˇe) jednoduch´e pˇr´ıpadn´e zmˇeny JPA implementace. DataNucleus AccessPlatform Tento produkt [19] je unik´atn´ı t´ım, ˇze podporuje opravdu mnoho typ˚ uu ´loˇziˇst’ dat. Nejsme tak omezeni ani relaˇcn´ı datab´az´ı, ale m˚ uˇzeme vyuˇz´ıt i datab´aze objektov´e. OpenJPA Apache Software Foundation vyv´ıj´ı tuto JPA implementaci [60]. Podporuje vˇsak jen samotnou JPA specifikaci a nepˇrid´av´a ˇz´adn´e dalˇs´ı funkce. Dle rychlostn´ıch test˚ u [48] je nav´ıc tato implementace jedna z nejpomalejˇs´ıch. TopLink Tato implementace [83] je u ´zce spjata s projektem EclipseLink, ve kter´em se nejv´ıce angaˇzuje firma Oracle. TopLink pak Oracle cel´ y s´am vyv´ıj´ı. Vedle Hibernate je TopLink potaˇzmo EclipseLink velmi v´ yznamn´ ym projektem v oblasti objektovˇe-relaˇcn´ıho mapov´ an´ı.
4.3.3
Vybran´ a implementace: Hibernate
Z moˇzn´ ych implementac´ı jsme vybrali framework Hibernate zejm´ena z tˇechto d˚ uvod˚ u: ∙ je to zaveden´ y projekt, kter´ y dokonce st´al u zrodu specifikace JPA, ∙ pouˇzijeme sice pouze standardizovan´e Java persistence API, ale pokud bychom pˇri implementaci potˇrebovali pouˇz´ıt nˇejak´e speci´aln´ı funkce, kter´e nab´ız´ı modul Hibernate Core, nic n´ am v tom nebude br´anit, ∙ podle rychlostn´ıch test˚ u [48] je Hibernate jednou z nejrychlejˇs´ıch implementac´ı. Jak jsme vˇsak zm´ınili v´ yˇse, v´ ybˇer t´eto technologie nen´ı nevratn´ y a v pˇr´ıpadˇe, ˇze bychom pˇri implementaci naˇs´ı aplikace narazili na nˇejak´ y probl´em, proˇc by nemohl b´ yt framework Hibernate pouˇzit, nen´ı probl´em pouˇz´ıt jinou JPA implementaci.
4.3.4
Datov´ eu ´ loˇ ziˇ stˇ e
Vzhledem k tomu, ˇze jsme se rozhodli pouˇz´ıt objektovˇe-relaˇcn´ı mapov´an´ı s vyuˇzit´ım JPA, nen´ı moment´ alnˇe v´ ybˇer konkr´etn´ıho datov´eho u ´loˇziˇstˇe (datab´aze) pˇr´ıliˇs d˚ uleˇzit´ y. Pro testov´ an´ı m˚ uˇze b´ yt pouˇzita napˇr´ıklad datab´aze HyperSQL (HSQLDB) [41], kter´ a nepotˇrebuje v podstatˇe ˇz´ adnou konfiguraci a pro testov´an´ı je ide´aln´ı. Umoˇzn ˇuje dokonce vytvoˇren´ı datab´ aze pouze v operaˇcn´ı pamˇeti, coˇz je velmi v´ yhodn´e napˇr´ıklad pro unit testy, zejm´ena z d˚ uvodu rychlosti.
56
´ ER ˇ A POPIS TECHNOLOGI´I KAPITOLA 4. VYB
Kapitola 5
N´ avrh ˇ reˇ sen´ı V t´eto kapitole navrhneme ˇreˇsen´ı na z´akladˇe vybran´ ych technologi´ı z kapitoly pˇredchoz´ı. Nejprve navrhneme datov´ y model cel´e aplikace, zohledˇ nuj´ıc´ı zejm´ena vybranou technologii pro tempor´ arn´ı datab´ azi, a pot´e pop´ıˇseme vˇsechny z´akladn´ı funkce aplikaˇcn´ı logiky.
5.1
Datov´ y model
V n´asleduj´ıc´ım textu pop´ıˇseme n´ avrh datov´eho modelu pro cel´ y IS. Cel´ y syst´em je rozdˇelen do nˇekolika modul˚ u. Pro lepˇs´ı pˇrehlednost budeme datov´ y model popisovat v r´amci tˇechto modul˚ u, i kdyˇz se nˇekter´e entity objev´ı ve v´ıce modulech z´aroveˇ n. Je nutn´e tak´e zm´ınit, ˇze v r´ amci tohoto textu jsou pops´any moduly obsahuj´ıc´ı n´avrh zejm´ena pro funkce prvn´ı (nejvyˇsˇs´ı) priority. Rozdˇelen´ı funkc´ı do priorit jsme provedli v anal´ yze v ˇc´asti 3.3.1. Pˇri n´ avrhu datov´eho modelu bylo dodrˇzeno nˇekolik jmenn´ ych konvenc´ı: ∙ pokud m´ a entita ˇc´ıseln´ y identifik´ator, je to atribut s n´azvem id, ∙ identifikaˇcn´ı ciz´ı kl´ıˇc u slab´e entity m´a tvar CiziEntitaId, ∙ ciz´ı kl´ıˇc u standardn´ı entity m´a tvar CiziEntita, ∙ ostatn´ı atributy zaˇc´ınaj´ı mal´ ym p´ısmenem a dalˇs´ı slova jsou oddˇelena p´ısmenem velk´ ym. Popis jednotliv´ ych modul˚ u se skl´ad´a z popisu entit a jejich atribut˚ u. Nezmiˇ nujeme vˇsak vˇzdy vˇsechny atributy, ale sp´ıˇse ty, kter´e potˇrebuj´ı bliˇzˇs´ı vysvˇetlen´ı.
5.1.1
Modul Type
Nejprve si pˇredstavme modul na obr´azku 5.1, jehoˇz hlavn´ı sloˇzka je entita AbstractType, kter´a je v ISA hierarchii1 na vrcholu vˇsech konkr´etn´ıch typ˚ u, kter´e si pop´ıˇseme v dalˇs´ıch modulech. Typem se v tomto pˇr´ıpadˇe mysl´ı napˇr´ıklad typ domu (kter´ y je uveden na obr´azku 5.1), avˇsak typem m˚ uˇze b´ yt tak´e napˇr´ıklad uˇzivatelsk´a role vytv´aˇren´a spr´avcem domu. 1 ISA hierarchie pˇredstavuje v relaˇcn´ı datab´ azi obdobu dˇediˇcnosti v objektov´em svˇetˇe. M˚ uˇzeme tak definovat urˇcit´ y nadtyp, kter´ y urˇcuje spoleˇcn´e atributy vˇsech podtyp˚ u, a pak jednotliv´e podtypy, kter´e pˇrid´ avaj´ı nˇekter´e dalˇs´ı informace. Typick´ ym pˇr´ıkladem m˚ uˇze b´ yt nadtyp Osoba s podtypy Doktor a Pacient.
57
´ ˇ SEN ˇ ´I KAPITOLA 5. NAVRH RE
58
Tyto typy“ maj´ı totiˇz nˇekolik spoleˇcn´ ych rys˚ u. Aplikace m˚ uˇze nab´ıdnout nˇejak´e stan” dardn´ı, kter´e mohou vˇsichni z´ akazn´ıci vyuˇz´ıvat (v tomto pˇr´ıpadˇe nen´ı u tohoto AbstractType odkaz na z´akazn´ıka - poloˇzka AbstractType.Customer nen´ı vyplnˇena). Takov´ ymto pˇredpˇripraven´ ym typem m˚ uˇze b´ yt napˇr´ıklad uˇzivatelsk´a role spr´avce“ s dan´ ymi pr´avy. Z´akazn´ık ” si vˇsak m˚ uˇze vytvoˇrit svoje uˇzivatelsk´e role a t´ım rozˇs´ıˇrit moˇznosti aplikace. Role zapisovatel ” smluv“ m˚ uˇze pak obsahovat pouze pr´ ava na pˇrid´av´an´ı n´ajemn´ıch smluv. Podobnˇe tento n´ avrh zohledˇ nuje typy, kter´e se t´ ykaj´ı bud’ vˇsech dom˚ u nebo jen tˇech s urˇcit´ ym statutem. Status domu m˚ uˇze b´ yt napˇr´ıklad druˇzstvo“ ˇci spoleˇcenstv´ı vlastn´ık˚ u“ ” ” a jeho pˇresn´ y v´ yznam bude vysvˇetlen v popisu modulu Building. Vzhledem k z´ akazn´ıkovi a statutu domu mohou tedy v syst´emu existovat ˇctyˇri r˚ uzn´e abstraktn´ı typy: ∙ Customer = NULL a BuildingStatus = NULL - pˇredpˇripraven´ y typ pro vˇsechny z´akazn´ıky bez rozd´ılu statutu domu, ∙ Customer != NULL a BuildingStatus = NULL - uˇzivatelsky vytvoˇren´ y typ bez rozd´ılu statutu domu, ∙ Customer = NULL a BuildingStatus != NULL - pˇredpˇripraven´ y typ pro vˇsechny z´akazn´ıky pro d˚ um s konkr´etn´ım statutem, ∙ Customer != NULL a BuildingStatus != NULL - uˇzivatelsky vytvoˇren´ y typ pro d˚ um s konkr´etn´ım statutem.
AbstractType
BuildingStatus PK
id
INTEGER
name description
VARCHAR(45) VARCHAR(255)
PK
id
INTEGER
FK1 FK2
name description BuildingStatus Customer
VARCHAR(45) VARCHAR(255) INTEGER INTEGER
Customer PK
id
INTEGER
description
VARCHAR(255)
BuildingType PK,FK1
AbstractTypeId INTEGER
Obr´ azek 5.1: Datov´ y model modulu Type.
5.1.2
Modul Personal
Vˇsechny entity souvisej´ıc´ı s personalistikou se nach´azej´ı v tomto modulu (viz obr´azek 5.2). Kl´ıˇcovou funkci zde zastupuje entita UniversalPerson, kter´a je na vrcholu ISA hierarchie a z n´ıˇz d´ale dˇed´ı dalˇs´ı dvˇe entity, kter´ ymi jsou Firm a Person. Tato ISA hierarchie umoˇzn ˇuje v kter´emkoli vztahu pouˇz´ıt UniversalPerson jako univerz´aln´ı osobu, kter´a m˚ uˇze pˇredstavovat fyzickou osobu ˇci firmu a kter´ a m˚ uˇze napˇr´ıklad vlastnit d˚ um ˇci byt.
´ MODEL 5.1. DATOVY
59
Ke kaˇzd´emu kontaktn´ımu u ´daji (entita Contact) univerz´aln´ı osoby je uloˇzen jeho typ (ContactType) a hodnota. To umoˇzn ˇuje velmi snadn´e uchov´av´an´ı r˚ uzn´ ych typ˚ u kontakt˚ u (telefon, e-mail, ICQ) u r˚ uzn´ ych osob.
Address PK
Contact
id
INTEGER
country city street zip streetNumber
VARCHAR(90) VARCHAR(90) VARCHAR(90) INTEGER VARCHAR(20)
ContactType
PK
id
CHAR(10)
FK1 FK2
contactValue VARCHAR(90) UniversalPerson INTEGER ContactType INTEGER
PK,FK1
AbstractTypeId INTEGER
Firm PK,FK1
name description tradeRN taxID type
UniversalPerson PK
id
FK1 FK2
DomicileAddress INTEGER ContactAddress INTEGER
UniversalPersonId INTEGER
INTEGER
VARCHAR(90) VARCHAR(255) VARCHAR(45) VARCHAR(45) VARCHAR(45) Person
PK,FK1
UniversalPersonId INTEGER personalId firstName lastName
VARCHAR(45) VARCHAR(45) VARCHAR(90)
Obr´ azek 5.2: Datov´ y model modulu Personal.
5.1.3
Modul Building
Tento z´ akladn´ı modul (viz obr´ azek 5.3) obsahuje mnoˇzinu entit pˇr´ımo souvisej´ıc´ıch s domem: ∙ UniversalSpace - nadtyp vˇsech prostor˚ u, v tomto pˇr´ıpadˇe se mysl´ı prostorem jak d˚ um, tak i byt ˇci m´ıstnost, ∙ Building + BuildingH - d˚ um se statick´ ymi a dynamick´ ymi daty: – Address - adresa domu – BuildingStatus - typ domu ve smyslu r˚ uzn´ ych majitel˚ u (napˇr. bytov´e druˇzstvo“ ” ˇci spoleˇcenstv´ı vlastn´ık˚ u“), pouˇz´ıv´a se zejm´ena k rozliˇsen´ı r˚ uzn´ ych vlastnost´ı ” syst´emu na z´ akladˇe r˚ uzn´ ych typ˚ u majitel˚ u, – BuildingType - typ domu ve smyslu stavebn´ım (napˇr. panelov´ y“, cihlov´ y“ apod.), ” ” – ownerUnitCount - nepovinn´ y atribut pro zaznamen´an´ı poˇctu vlastnick´ ych jednotek budovy tak, jak jsou zaznamen´any v katastru nemovitost´ı, ∙ Space - jak´ ykoli prostor v domˇe, napˇr. byt ˇci gar´aˇzov´e st´an´ı: – ownerUnitCount - jakou ˇc´ast vlastnick´ ych jednotek cel´eho domu pˇredstavuje dan´ y prostor,
´ ˇ SEN ˇ ´I KAPITOLA 5. NAVRH RE
60
– sharedSpace - pokud je vyplnˇeno, tak znaˇc´ı, ˇze je tento prostor spoleˇcn´ y (napˇr. chodba) a neud´ av´ a se u nˇej tedy vlastnick´ y pod´ıl, ∙ BuildingManager - spr´ avce domu - pro kaˇzd´ y d˚ um mus´ı existovat alespoˇ n jeden, protoˇze m´a v syst´emu urˇcit´ a pr´ ava, kter´a ostatn´ı osoby nemaj´ı, ∙ ManagerRole - role spr´ avce domu (napˇr´ıklad pˇredseda druˇzstva“), ” ∙ BuildingOwner - vlastn´ık domu, vlastnick´ y pod´ıl je vyj´adˇren zlomkem pomoc´ı atribut˚ u shareNumerator a shareDenominator.
Address PK
BuildingStatus
id
INTEGER
PK
country city street zip streetNumber
VARCHAR(90) VARCHAR(90) VARCHAR(90) INTEGER VARCHAR(20)
INTEGER
name description
VARCHAR(45) VARCHAR(255)
PK,FK1 PK
BuildingId fromDate
INTEGER DATETIME
FK2
toDate DATETIME BuildingStatus INTEGER description VARCHAR(255)
Building
ManagerRole PK,FK1
BuildingH
id
AbstractTypeId INTEGER
UniversalSpace
PK,FK1
UniversalSpaceId
INTEGER
FK2 FK3
builtYear Address BuildingType ownerUnitCount
DATETIME INTEGER INTEGER INTEGER
PK
id
INTEGER
name
VARCHAR(45)
BuildingManager PK,FK1 PK,FK2 PK PK,FK3
UniversalPersonId BuildingId fromDate ManagerRoleId
INTEGER INTEGER DATETIME INTEGER
toDate
DATETIME
Space PK,FK1
UniversalSpaceId
INTEGER
FK2
inventaryId floor Building ownerUnitCount sharedSpace
VARCHAR(45) INTEGER INTEGER INTEGER BIT
BuildingOwner PK,FK1 PK,FK2 PK
UniversalPersonId BuildingId fromDate
INTEGER INTEGER DATETIME
toDate shareNumerator shareDenominator
DATETIME INTEGER INTEGER
BuildingType PK,FK1
AbstractTypeId INTEGER
Obr´ azek 5.3: Datov´ y model modulu Building.
5.1.4
Modul Space
Dalˇs´ım modulem syst´emu je modul Space (obr´azek 5.4), jehoˇz obsahem je prim´arnˇe entita Space + SpaceH, tedy jak uˇz bylo ˇreˇceno, jak´ ykoli prostor v domˇe, kter´ y m´a definov´an sv˚ uj typ - SpaceType (napˇr. byt, nebytov´ y prostor ˇci gar´aˇz). D´ale se zde nach´azej´ı tyto entity: ∙ Room + RoomH - m´ıstnost nach´ azej´ıc´ı se v bytˇe nebo nebytov´em prostoru,
´ MODEL 5.1. DATOVY
61
∙ RoomType - typ m´ıstnosti (napˇr. loˇznice), ∙ SpaceOwner - majitel prostoru s vlastnick´ ym pod´ılem v podobˇe zlomku (stejn´ y zp˚ usob jako v entitˇe BuildingOwner), ∙ SpaceRenter - n´ ajemn´ık prostoru, ∙ SpaceUser - uˇzivatel prostoru - m˚ uˇze se pouˇz´ıt napˇr´ıklad k v´ ypoˇct˚ um plateb za vodu, kter´e z´ avis´ı na poˇctu osob v bytˇe.
SpaceH
SpaceOwner PK,FK1 PK,FK2 PK
SpaceType
UniversalPersonId SpaceId fromDate
INTEGER INTEGER DATETIME
PK,FK1 PK
SpaceId fromDate
INTEGER DATETIME
toDate shareNumerator shareDenominator
DATETIME INTEGER INTEGER
FK2
toDate SpaceType description
DATETIME INTEGER VARCHAR(255)
PK,FK1
AbstractTypeId INTEGER
PK,FK1
AbstractTypeId INTEGER
RoomType
SpaceRenter PK,FK1 PK,FK2 PK
UniversalPersonId INTEGER SpaceId INTEGER fromDate DATETIME toDate description
Space PK,FK1
UniversalSpaceId
DATETIME VARCHAR(255)
inventaryId floor Building ownerUnitCount sharedSpace
FK2
RoomH
INTEGER VARCHAR(45) INTEGER INTEGER INTEGER BIT
PK,FK1
FK2
RoomId
INTEGER
fromDate toDate RoomType description
DATETIME DATETIME INTEGER VARCHAR(255)
SpaceUser PK,FK1 PK,FK2 PK
Room
UniversalPersonId INTEGER SpaceId INTEGER fromDate DATETIME
UniversalSpace PK
toDate description
DATETIME VARCHAR(255)
id
INTEGER
name
VARCHAR(45)
PK,FK1
UniversalSpaceId
INTEGER
FK2
inventaryId area Space
VARCHAR(45) REAL INTEGER
Obr´ azek 5.4: Datov´ y model modulu Space.
5.1.5
Modul Application
Tento modul (viz obr´ azek 5.5) je v´ıcem´enˇe oddˇelen od zbytku syst´emu. Slouˇz´ı k uloˇzen´ı uˇzivatelsk´ ych u ´daj˚ u pro vstup do IS. Kaˇzd´ y uˇzivatel (AppUser) m´a pˇriˇrazenu konkr´etn´ı UniversalPerson, ˇc´ımˇz je jasnˇe definov´ano, jak´ y typ uˇzivatele to je (lze tedy zjistit, ˇze tento uˇzivatel je n´ ajemn´ıkem ˇci vlastn´ıkem bytu apod.). Syst´em je koncipov´ an tak, aby bylo moˇzno pro kaˇzd´eho uˇzivatele stanovit povolen´ı pro atomick´e operace s informacemi (napˇr´ıklad pˇridat majitele“, ukonˇcit n´ajemn´ı smlouvu“, ” ” pˇridat uˇzivatelsk´ y u ´ˇcet“). To je ˇreˇseno standardnˇe pomoc´ı uˇzivatelsk´ ych rol´ı (UserRole) ” a povolen´ı (Permission). Aby byl vˇsak syst´em dostateˇcnˇe zabezpeˇcen, je v n´avrhu jeˇstˇe jedna entita - SecurityRole, coˇz je statick´ a uˇzivatelsk´ a role ve smyslu uˇzivatelsk´ ych skupin v Java EE (viz ˇc´ast 4.1.2.3),
´ ˇ SEN ˇ ´I KAPITOLA 5. NAVRH RE
62
kter´a bude pˇriˇrazena jednotliv´ ym sluˇzb´ am poskytovan´ ym pˇres RPC rozhran´ı. Vˇsechny pouˇzit´e uˇzivatelsk´e role byly pops´ any v pˇr´ıpadech uˇzit´ı v ˇc´asti 3.4.1. Tento n´avrh tedy poskytne: ∙ z´akladn´ı u ´rovnˇe uˇzivatelsk´ ych rol´ı definovan´e pˇr´ımo na u ´rovni Enterprise Java Beans - n´ajemn´ık bytu nebude napˇr´ıklad moci pracovat se sluˇzbami upravuj´ıc´ımi informace o domu, ∙ podrobnˇejˇs´ı rozvrstven´ı uˇzivatelsk´ ych rol´ı povoluj´ıc´ıch jednotliv´e atomick´e operace jist´ y pracovn´ık spr´ avcovsk´e firmy bude moci napˇr. pˇrid´avat n´ajemn´ı smlouvy, uˇz je ale nebude moci mazat. Jako posledn´ı nebyla jeˇstˇe zm´ınˇena entita Customer. Tuto entitu a dalˇs´ı podrobnosti jiˇz zm´ınˇen´ ych entit si pop´ıˇseme nyn´ı: ∙ Customer - identifikuje z´ akazn´ıka, kter´ y si objednal informaˇcn´ı syst´em, v entitˇe AppUser mus´ı pak existovat alespoˇ n jeden uˇzivatel s atributem customerAdmin = TRUE, kter´ y zastupuje z´ akazn´ıka pˇri komunikaci s firmou poskytuj´ıc´ı IS, ∙ Permission - mimo informac´ı o operaci, pro kterou je dan´e povolen´ı, obsahuje odkaz na entitu SecurityRole. Kaˇzd´e povolen´ı mus´ı totiˇz obsahovat informaci, v jak´e u ´rovni zabezpeˇcen´ı se nach´ az´ı a jakou SecurityRole zpˇresˇ nuje.
UniversalPerson
UserRole
PK
id
INTEGER
FK1 FK2
DomicileAddress INTEGER ContactAddress INTEGER
PK,FK1
Role_has_Permission
AbstractTypeId INTEGER
PK,FK1 PK,FK2
UserRoleId PermissionId
INTEGER VARCHAR(45)
AppUser PK
FK1 FK2 FK3 FK4
id
Permission
INTEGER
username password UniversalPerson UserRole SecurityRole Customer customerAdmin
VARCHAR(90) VARCHAR(32) INTEGER INTEGER INTEGER INTEGER BIT
PK
internalName
VARCHAR(45)
FK1
name description SecurityRole sortNumber SuperiorPermission
VARCHAR(45) VARCHAR(255) VARCHAR(45) INTEGER VARCHAR(45)
FK2
SecurityRole Customer PK
PK
id
INTEGER
description
VARCHAR(255)
name
VARCHAR(45)
description securityLevel
VARCHAR(255) SMALLINT
Obr´ azek 5.5: Datov´ y model modulu Application.
ˇ ´I VRSTVA 5.2. APLIKACN
5.2
63
Aplikaˇ cn´ı vrstva
V t´eto podkapitole se zamˇeˇr´ıme na n´avrh a popis r˚ uzn´ ych ˇc´ast´ı aplikaˇcn´ı logiky. Z pohledu serverov´eho modulu naˇs´ı aplikace, kter´ y bude implementov´an na platformˇe Java Enterprise Edition, je aplikaˇcn´ı (business) logikou myˇslena v´ yhradnˇe Enterprise Java Beans vrstva, tedy jednotliv´e EJB tˇr´ıdy a jejich metody.
5.2.1
Z´ akladn´ı operace v tempor´ arn´ı datab´ azi
V ˇc´asti 4.2.2 jsme popsali zvolenou moˇznost pro tempor´arn´ı funkci naˇseho syst´emu a tak´e jsme vysvˇetlili, jak´ ym zp˚ usobem bude prob´ıhat z´ısk´av´an´ı historick´ ych entit z datab´ aze (jak´ ym zp˚ usobem budou tvoˇreny dotazy). Jednalo se vˇsak pouze o uk´ azku pr´ace s historick´ ymi daty. Nyn´ı si naopak pop´ıˇseme vˇsechny z´ akladn´ı funkce (dle pˇr´ıpad˚ u uˇzit´ı popsan´ ych v podkapitole 3.4), kter´e budou pro pr´aci s entitami z priority (1) implementov´any. N´asleduj´ıc´ı text jeˇstˇe rozdˇel´ıme na funkce pro pr´ aci s: ∙ klasick´ ymi objekty obsahuj´ıc´ı dynamick´a data a ∙ M:N vztahov´ ymi entitami. Podrobnˇejˇs´ı popis tˇechto dvou variant naleznete v ˇc´asti 4.2.2.
5.2.1.1
Operace s klasick´ ymi objekty obsahuj´ıc´ımi dynamick´ a data
Popis funkc´ı rozdˇel´ıme do odstavc˚ u, kde vˇzdy nejprve pop´ıˇseme, co za v´ ysledek dan´a funkce vrac´ı, a pot´e to, jak´e u ´kony jsou pˇri vykon´av´an´ı funkce prov´adˇeny.
get(id, datum) Vr´ at´ı objekt se zadan´ ym identifik´atorem, kter´ y je platn´ y pro dan´e datum. 1. Najdi objekt se zadan´ ym id, 2. k nˇemu pak najdi odpov´ıdaj´ıc´ı ˇr´adek v historick´e entitˇe, kde: (fromDate <= datum) AND ((toDate >= datum) OR (toDate IS NULL))
getHistory(id) Vr´ at´ı kolekci historick´ ych zmˇen objektu se zadan´ ym identifik´atorem. Pokud objekt existuje, tato kolekce nem˚ uˇze b´ yt nikdy pr´azdn´a (viz ˇc´ast 4.2.2). 1. Najdi vˇsechny ˇr´ adky historick´e entity pˇr´ısluˇsej´ıc´ı k objektu se zadan´ ym id.
´ ˇ SEN ˇ ´I KAPITOLA 5. NAVRH RE
64
getAll(datum) Vr´ at´ı vˇsechny objekty, kter´e existovaly v zadan´e datum. 1. Najdi vˇsechny ˇr´ adky historick´e entity odpov´ıdaj´ıc´ı dan´emu datu: (fromDate <= datum) AND ((toDate >= datum) OR (toDate IS NULL)). Z n´avrhu plyne, ˇze ve v´ ysledku nemohou existovat dva ˇr´adky, kter´e by odpov´ıdaly stejn´emu z´ aznamu v nehistorick´e entitˇe, proto m˚ uˇzeme pokraˇcovat takto: 2. ke kaˇzd´emu takto nalezen´emu z´ aznamu v historick´e entitˇe najdi odpov´ıdaj´ıc´ı z´aznam v entitˇe nehistorick´e. add(vˇ sechny poloˇ zky objektu) Pˇrid´a nov´ y objekt se zadan´ ymi poloˇzkami. Kontroluje spr´avn´e vyplnˇen´ı povinn´ ych poloˇzek. 1. Vytvoˇr nov´ y objekt se statick´ ymi daty a pˇridej ho do datab´aze, 2. vytvoˇr nov´ y objekt s dynamick´ ymi daty (z´aznam v H“ entitˇe), ” 3. pˇriˇrad’ tomuto objektu odkaz na objekt se statick´ ymi daty (z bodu 1) a 4. uloˇz ho do datab´ aze. historyUpdate(zmˇ enˇ en´ e poloˇ zky objektu, datum zmˇ eny) Uprav´ı objekt se zachov´an´ım p˚ uvodn´ıch dynamick´ ych dat v historii (v pˇr´ıpadˇe, ˇze se zmˇenila). Touto metodou je moˇzn´e upravit jak statick´ a data, tak ta dynamick´a. 1. Zjisti, zda-li se zmˇenila dynamick´ a data objektu, pokud ano, pokraˇcuj d´ale, pokud ne, pˇreskoˇc na bod 5, 2. najdi z´aznam v H“ entitˇe, kter´ y m´a toDate nastaveno na hodnotu NULL, ” 3. zmˇen ˇ tuto hodnotu na (datum zmˇeny minus jeden den), 4. vytvoˇr v datab´ azi nov´ y z´ aznam v H“ entitˇe se zadan´ ymi zmˇenˇen´ ymi daty (fromDate ” v tomto z´ aznamu je nastaveno na datum zmˇeny, toDate je vyplnˇeno jako NULL), 5. uloˇz zmˇeny nehistorick´eho objektu do datab´aze. update(zmˇ enˇ en´ e historick´ e poloˇ zky objektu, datum) pro zadan´e datum.
Oprav´ı historick´a data objektu
1. Zmˇenˇen´e poloˇzky jsou aktualizov´ any v z´aznamu H“ entity, kter´ y je nalezen podle ” zadan´eho data, 2. m˚ uˇze b´ yt nutno upravit fromDate a/nebo toDate u pˇredchoz´ıho a/nebo n´asleduj´ıc´ıho z´aznamu v H“ entitˇe, pokud jsou tato data zmˇenˇena v upravovan´em z´aznamu. ” 3. Statick´a data nemohou b´ yt touto funkc´ı aktualizov´ana.
ˇ ´I VRSTVA 5.2. APLIKACN
65
historyRemove(id, substitutiveId) Smaˇze historick´ y z´aznam pro objekt se zadan´ ym id, pr´azdn´e m´ısto je vyplnˇeno“ (pomoc´ı u ´pravy fromDate resp. toDate) objektem se zadan´ ym ” substitutiveId. 1. Najdi, jak´emu historick´emu z´aznamu odpov´ıd´a substitutiveId, 2. pokud substitutiveId neidentifikuje pˇredchoz´ı nebo n´asleduj´ıc´ı historick´ y z´aznam (jenom ty mohou nahradit smazan´ y z´aznam), neprov´adˇej ˇz´adnou akci, jinak pokraˇcuj d´ ale: 3. smaˇz historick´ y z´ aznam s identifik´atorem id, 4. uprav poloˇzku toDate pˇredchoz´ıho historick´eho z´aznamu resp. poloˇzku fromDate n´ asleduj´ıc´ıho historick´eho z´ aznamu tak, aby na sebe historick´e z´aznamy navazovaly dle poˇzadavku v ˇc´ asti 4.2.2. remove(id) Smaˇze objekt z datab´aze i s jeho histori´ı. Tato metoda by mˇela b´ yt pouˇz´ıv´ ana pouze v pˇr´ıpadˇe, ˇze byl objekt do datab´aze uloˇzen omylem nebo m´a b´ yt u ´plnˇe vyˇrazen z evidence. Pokud vˇsak objekt jiˇz neexistuje (napˇr. p˚ uvodn´ı m´ıstnost v pˇr´ıpadˇe, ˇze se dvˇe m´ıstnosti pˇrestav´ı v jednu), nen´ı ˇz´adouc´ı objekt mazat touto funkc´ı. Objekt naopak pouze uprav´ıme funkc´ı historyUpdate a nastav´ıme poloˇzku toDate na datum, kdy byla m´ıstnost zbour´ ana“. ” 1. Smaˇz vˇsechny historick´e z´ aznamy k objektu s dan´ ym id, 2. smaˇz statick´ y z´ aznam objektu s dan´ ym id. 5.2.1.2
Operace s M:N vztahov´ ymi entitami
Nyn´ı n´ asleduje popis funkc´ı, kter´e se t´ ykaj´ı M:N vztahov´ ych entit. Oproti pˇredchoz´ım se tyto funkce liˇs´ı t´ım, ˇze neexistuje u ´prava objektu, kter´a by nebyla historick´eho charakteru. Je to z toho d˚ uvodu, ˇze tyto M:N vztahov´e entity (jak bylo zm´ınˇeno v ˇc´asti 4.2.2) jsou vlastnˇe entitami historick´ ymi. Z tohoto d˚ uvodu maj´ı tak´e tyto entity sloˇzen´e prim´arn´ı kl´ıˇce z identifik´ atoru dvou odkazovan´ ych entit (d´ale id1“ a id2“) a z poloˇzky fromDate. ” ” get(id1, id2, datum) Vr´ at´ı objekt definovan´ y zadan´ ymi identifik´atory, kter´ y existuje pro dan´e datum. Pozor, objekt nemus´ı existovat. Pokud nen´ı jeden z identifik´ator˚ u vyplnˇen, vr´at´ı kolekci objekt˚ u, kter´e jsou omezeny zvolen´ ym vyplnˇen´ ym identifik´atorem (pouze ten je zahrnut v podm´ınce WHERE). 1. Najdi objekt(y), kter´e odpov´ıdaj´ı podm´ınce zohledˇ nuj´ıc´ı vyplnˇen´e identifik´atory, 2. kter´e nav´ıc splˇ nuj´ı podm´ınku: (fromDate <= datum) AND ((toDate >= datum) OR (toDate IS NULL)).
´ ˇ SEN ˇ ´I KAPITOLA 5. NAVRH RE
66
getAll(datum) Vr´ at´ı vˇsechny objekty, kter´e existovaly v zadan´em datu. Dotaz nen´ı omezen ˇz´adn´ ym z identifik´ ator˚ u. 1. Najdi vˇsechny objekty, kter´e existuj´ı v syst´emu a kter´e splˇ nuj´ı podm´ınku: (fromDate <= datum) AND ((toDate >= datum) OR (toDate IS NULL)). add(vˇ sechny poloˇ zky objektu) Pˇrid´a nov´ y objekt se zadan´ ymi poloˇzkami. Kontroluje spr´avn´e vyplnˇen´ı povinn´ ych poloˇzek. 1. Vytvoˇr nov´ y objekt se zadan´ ymi poloˇzkami, 2. pokud je nˇejak´ a z odkazovan´ ych entit historick´a (existuje tak´e H“ entita), zkontroluj, ” zda-li nepˇrid´ av´ ame objekt, jehoˇz doba platnosti zaˇc´ın´a pˇred dobou platnosti prvn´ıho z´aznamu v odkazovan´e entitˇe (BuildingManager nem˚ uˇze b´ yt napˇr´ıklad spr´avcem domu dˇr´ıv, neˇz byl tento d˚ um postaven), 3. uloˇz objekt do datab´ aze. update(oldId1, oldId2, oldDatum, zmˇ enˇ en´ e poloˇ zky objektu) Tato metoda je ekvivalentem metody update u klasick´ ych objekt˚ u (viz ˇc´ast 5.2.1.1). Opravuje dynamick´a data, coˇz jsou v pˇr´ıpadˇe M:N vztahov´ ych entit vˇsechny poloˇzky. Je d˚ uleˇzit´e podotknout, ˇze zde neexistuje metoda historyUpdate, protoˇze ned´av´a smysl. Pokud chceme zmˇenit napˇr. spr´avce domu, ukonˇc´ıme st´ avaj´ıc´ımu platnost (pomoc´ı t´eto metody) a vytvoˇr´ıme spr´avce nov´eho (pomoc´ı metody add). 1. Vzhledem k tomu, ˇze M:N vztahov´e entity maj´ı sloˇzen´e kl´ıˇce a m˚ uˇze se st´at, ˇze se pˇri u ´pravˇe zmˇen´ı jeden z kl´ıˇc˚ u, je nejjednoduˇsˇs´ı nejprve smazat pomoc´ı metody remove p˚ uvodn´ı objekt nalezen´ y podle p˚ uvodn´ıch identifik´ator˚ u (oldId1, oldId2 a oldDatum) a 2. pot´e vytvoˇrit objekt nov´ y (pomoc´ı metody add) se zmˇenˇen´ ymi poloˇzkami, kter´e obsahuj´ı i vˇsechny (zmˇenˇen´e) identifik´atory. Obˇe metody mus´ı b´ yt provedeny v transakci. M˚ uˇze se totiˇz st´ at, ˇze metoda add z nˇejak´eho d˚ uvodu selˇze. Pak mus´ı b´ yt ale v´ ysledek takov´ y, ˇze selhala metoda update, tzn., ˇze p˚ uvodn´ı objekt nem˚ uˇzeme smazat a mus´ı b´ yt proveden rollback2 . remove(id1, id2, datum) Smaˇze objekt z datab´aze. Stejnˇe, jako bylo uvedeno v´ yˇse, tato metoda se pouˇzije jen v pˇr´ıpadˇe, ˇze chceme dan´ y objekt u ´plnˇe odstranit z evidence. V pˇr´ıpadˇe, ˇze m´a b´ yt pouze ukonˇcena jeho platnost (napˇr´ıklad vlastn´ık domu jiˇz dan´ y d˚ um nevlastn´ı), zmˇen´ı se jen poloˇzka toDate. 1. Smaˇz objekt dle zadan´ ych identifik´ator˚ u z datab´aze. 2
Datab´ azov´ a operace rollback slouˇz´ı k uveden´ı datab´ aze do nˇejak´eho pˇredchoz´ıho stavu - napˇr´ıklad do stavu pˇred zapoˇcet´ım transakce v pˇr´ıpadˇe, ˇze nˇejak´ a operace v transakci selhala.
ˇ ´I VRSTVA 5.2. APLIKACN
5.2.2
67
Zabezpeˇ cen´ı funkc´ı syst´ emu dle uˇ zivatelsk´ ych pr´ av
Je d˚ uleˇzit´e zvolit vhodn´ y zp˚ usob pro kontrolu pr´av pouˇz´ıvan´ ych funkc´ı. Kaˇzd´a funkce aplikaˇcn´ı logiky tak mus´ı m´ıt jednoznaˇcnˇe urˇceno, jak´ ym povolen´ım (Permission) mus´ı uˇzivatel disponovat, aby mohl danou funkci pouˇz´ıt. To, ˇze by klientsk´ y modul nemˇel uˇzivateli umoˇznit nepovolen´e funkce v˚ ubec vyuˇz´ıvat, je vˇec druh´ a. Z naˇseho pohledu vˇsak mus´ıme zajistit, aby tato kontrola zabezpeˇcen´ı probˇehla na u ´rovni serverov´eho modulu. Mus´ıme poˇc´ıtat s t´ım, ˇze napˇr´ıklad webov´ y klientsk´ y modul m˚ uˇze b´ yt upraven u ´toˇcn´ıkem, kter´ y by se pokusil zavolat nepovolenou funkci na serveru. 5.2.2.1
Aspektovˇ e orientovan´ e programov´ an´ı
Pro realizaci v´ yˇse zm´ınˇen´e kontroly uˇzivatelsk´ ych pr´av se nab´ız´ı pouˇzit´ı takzvan´eho aspektovˇe orientovan´eho programov´ an´ı (AOP). Tato programovac´ı technika umoˇzn ˇuje rozdˇelit k´od na aspekty“, coˇz jsou jednotliv´e ˇc´ asti programu, kter´e spolu nesouvis´ı a kter´e vykon´avaj´ı jednu ” jasnˇe danou funkci [42]. Jako pˇr´ıklad m˚ uˇzeme uv´est: ∙ pˇripojen´ı do datab´ aze, ∙ logov´ an´ı ˇci ∙ n´ aˇs pˇr´ıpad kontroly opr´ avnˇen´ı k dan´e funkci. Pro programovac´ı jazyk Java existuje mnoho framework˚ u nab´ızej´ıc´ıch podporu pro AOP. Nejzn´amˇejˇs´ım z nich je AspectJ. Technologie Java EE, kterou jsme vybrali v minul´e kapitole (v´ıce na stranˇe 46), tak´e nab´ız´ı ˇc´asteˇcnou implementaci AOP v podobˇe tzv. interceptor˚ u. Program´ator tak m˚ uˇze vol´an´ı EJB metody obalit“ a spustit k´ od pˇred a/nebo po kaˇzd´e metodˇe. T´ımto vlastnˇe danou metodu ve ” v´ ysledku zmˇen´ı, mohli bychom se tedy na tento zp˚ usob tak´e d´ıvat jako na variantu reflexe3 . 5.2.2.2
Pouˇ zit´ı AOP pro kontrolu uˇ zivatelsk´ ych pr´ av
At’ uˇz nakonec naimplementujeme kontrolu uˇzivatelsk´ ych pr´av jak´ ymkoli aspektovˇe oriento” van´ ym“ zp˚ usobem, tedy pomoc´ı interceptor˚ u na u ´rovni EJB, s vyuˇzit´ım frameworku AspectJ ˇci nˇejak´eho jin´eho, princip t´eto implementace z˚ ustane vˇzdy stejn´ y a ten si nyn´ı pop´ıˇseme. Funkci, kterou potˇrebujeme z hlediska AOP pouˇz´ıt, dokumentuje obr´azek 5.6. Pˇred spuˇstˇen´ım samotn´e metody je tˇreba zkontrolovat, zda-li m´a pˇrihl´aˇsen´ y uˇzivatel povolen´ı ke spuˇstˇen´ı t´eto metody. Obr´ azek 5.7 pak popisuje, jak´e u ´kony prov´ad´ı funkce kontroluj´ıc´ı opr´avnˇen´ı uˇzivatele k dan´e metodˇe: 1. Funkce naˇcte pr´ ava aktu´ alnˇe pˇrihl´aˇsen´eho uˇzivatele, 2. pot´e zjist´ı, zda-li tato pr´ ava obsahuj´ı povolen´ı k vol´an´ı EJB metody: 3
Reflex´ı m´ ame ve svˇetˇe programovac´ıch jazyk˚ u na mysli schopnost programu pˇristupovat k vlastn´ımu k´ odu jako k datov´emu objektu a z toho vypl´ yvaj´ıc´ı schopnost mˇenit tento sv˚ uj k´ od za bˇehu [57].
´ ˇ SEN ˇ ´I KAPITOLA 5. NAVRH RE
68
Spuštění úkonů před voláním metody
AOP část kódu
EJB metoda
Standardní kód v Enterprise Java Bean
Spuštění úkonů po volání metody
AOP část kódu
Obr´azek 5.6: Aspektovˇe orientovan´e programov´an´ı pˇri pouˇzit´ı s Enterprise Java Bean metodou. 3. pokud je povolen´ı nalezeno, AOP ˇc´ ast k´odu je dokonˇcena a EJB metoda je standardnˇe spuˇstˇena, 4. pokud vˇsak povolen´ı nalezeno nen´ı, je vyhozena bezpeˇcnostn´ı v´ yjimka a program tedy d´ale nepokraˇcuje.
Načtení uživatelských práv
[Povolení nenalezeno]
Vyhození výjimky [Povolení nalezeno]
Spuštění metody
Obr´azek 5.7: Diagram aktivit pro funkci, kter´a kontroluje opr´avnˇen´ı uˇzivatele ke spuˇstˇen´ı EJB metody.
Kapitola 6
Implementace Nyn´ı si pˇredstav´ıme programovou realizaci r˚ uzn´ ych ˇc´ast´ı naˇseho informaˇcn´ıho syst´emu. Zamˇeˇr´ıme se na nˇekter´e probl´emy, na kter´e jsme pˇri implementaci narazili, a na sloˇzitˇejˇs´ı programov´e struktury, kter´e stoj´ı za zm´ınku.
6.1
Struktura projektu
Pro v´ yvoj aplikace bylo pouˇzito prostˇred´ı NetBeans 6.8. Aplikace je rozdˇelena do bal´ıˇck˚ u, kter´e uv´ ad´ı tabulka 6.1. cz.fman.is.domain cz.fman.is.server.application cz.fman.is.server.ejb cz.fman.is.server.exception cz.fman.is.shared.exception Tabulka 6.1: Bal´ıˇcky serverov´eho modulu.
∙ domain - obsahuje JPA entity (dom´enov´ y model datab´aze) rozdˇelen´e do podbal´ıˇck˚ u dle modul˚ u navrˇzen´ ych v ˇca´sti 5.1 (napˇr´ıklad podbal´ıˇcky building ˇci space), ∙ server.application - zde se nach´azej´ı pomocn´e tˇr´ıdy, kter´e se vztahuj´ı k aplikaˇcn´ı logice, ale pˇr´ımo ji nevykon´avaj´ı, ∙ server.ejb - nejd˚ uleˇzitˇejˇs´ı bal´ıˇcek obsahuj´ıc´ı EJB tˇr´ıdy (v´ıce se o technologii EJB doˇctete v ˇc´ asti 4.1.2.2), ∙ server.exception - soubor v´ yjimek, kter´e se objevuj´ı pouze v serverov´em modulu a nen´ı vhodn´e je propagovat do modulu klientsk´eho, ∙ shared.exception - bal´ıˇcek shared obsahuje vˇsechny tˇr´ıdy, u kter´ ych se pˇredpokl´ ad´ a, ˇze se budou pouˇz´ıvat i na klientsk´e stranˇe. Nyn´ı se zde nach´az´ı pouze podbal´ıˇcek exception s v´ yjimkami, u kter´ ych se pˇredpokl´ad´a, ˇze budou propagov´any do klientsk´eho modulu.
69
70
KAPITOLA 6. IMPLEMENTACE
6.2
Datab´ azov´ a vrstva
V t´eto ˇc´asti probereme nˇekter´e detaily z implementace datab´azov´e vrstvy. Zm´ın´ıme nˇekter´e odliˇsnosti mezi n´ avrhem entit a implementac´ı pomoc´ı JPA. D´ale si pop´ıˇseme nˇekter´e u ´pravy na z´akladˇe poˇzadavk˚ u klientsk´eho modulu a nakonec struˇcnˇe pˇredstav´ıme velmi zaj´ımavou technologii Spring ROO.
6.2.1
Implementaˇ cn´ı rozd´ıly v entit´ ach oproti n´ avrhu
V n´avrhu m˚ uˇzeme narazit na nˇekolik vztah˚ u 1:1, kter´e v dan´ ych pˇr´ıpadech definuj´ı vlastnˇe ISA hierarchii. Na u ´rovni JPA entit jsou tyto vztahy implementovan´e pomoc´ı dˇediˇcnosti. N´asleduj´ıc´ı tabulka 6.2 uv´ ad´ı v lev´em sloupci vˇsechny entity, kter´e odpov´ıdaj´ı tabulk´am na vrcholu ISA hierarchie, druh´ y sloupec pak uv´ad´ı vˇsechny zdˇedˇen´e entity a ve tˇret´ım sloupci je uveden typ dˇediˇcnosti, kter´ y pot´e koresponduje s re´aln´ ymi tabulkami v datab´azi. M˚ uˇze m´ıt tyto hodnoty [46]: ∙ SINGLE TABLE - vˇsechny tˇr´ıdy jsou ukl´ad´any do jedin´e tabulky, kter´a m´a definov´any sloupce pro vˇsechny promˇenn´e vˇsech podtˇr´ıd. Z´aznam v t´eto tabulce m´a pak vyplnˇeny sloupce, kter´e odpov´ıdaj´ı dan´e tˇr´ıdˇe a ostatn´ı sloupce jsou pr´azdn´e, ∙ JOINED - tato strategie odpov´ıd´ a pˇresnˇe naˇsemu n´avrhu datab´aze - existuje tabulka jak pro spoleˇcnou nadtˇr´ıdu, tak pro vˇsechny podtˇr´ıdy, ∙ TABLE PER CLASS - v t´eto strategii je vytvoˇrena v datab´azi tabulka pro kaˇzdou konkr´etn´ı tˇr´ıdu. Tato tabulka obsahuje vˇsechny promˇenn´e dan´e tˇr´ıdy (i ty zdˇedˇen´e). Typy dˇediˇcnosti byly zvoleny na z´ akladˇe kompromisu mezi rychlost´ı (nejrychlejˇs´ı je strategie SINGLE TABLE, kter´ a nevyˇzaduje ˇz´adn´e speci´aln´ı SQL pˇr´ıkazy jako napˇr. JOIN ˇci UNION pro z´ısk´ an´ı z´ aznamu) a poˇzadovan´ ym m´ıstem na disku (nejm´enˇe m´ısta zab´ır´a strategie JOINED). Nadtˇ r´ıda AbstractType
UniversalPerson UniversalSpace
Podtˇ r´ıdy ContactType, BuildingType, ManagerRole, SpaceType, RoomType, UserRole Person, Firm Building, Space, Room
Typ dˇ ediˇ cnosti JOINED
SINGLE TABLE JOINED
Tabulka 6.2: Dˇediˇcnost v JPA entit´ach.
6.2.2
´ Upravy dle poˇ zadavk˚ u klientsk´ eho modulu
Tato pr´ace popisuje pouze serverov´ y modul tohoto informaˇcn´ıho syst´emu. Funkce, kter´e tento n´aˇs serverov´ y modul nab´ız´ı, byly testov´ any klientsk´ ym modulem vyv´ıjen´ ym kolegou Petrem Horsk´ ym.
´ ´ VRSTVA 6.2. DATABAZOV A
71
Pˇri pouˇz´ıv´ an´ı objektovˇe-relaˇcn´ıho mapov´an´ı s implementac´ı Hibernate (tak, jak byla vybr´ana v ˇc´ asti 4.3.3) se setk´ ame s t´ım, ˇze EJB metoda, kter´a m´a n´avratovou hodnotu kupˇr´ıkladu List<Building>, ve skuteˇcnosti vr´at´ı konkr´etn´ı implementaci rozhran´ı List a v pˇr´ıpadˇe knihovny Hibernate to je PersistentBag. Technologie pouˇz´ıvan´ a v klientsk´em modulu vˇsak nepodporuje pouˇzit´ı t´eto tˇr´ıdy, proto jsme se po domluvˇe s kolegou implementuj´ıc´ım klientsk´ y modul rozhodli pouˇz´ıt technologii GILEAD (Generic Light Entity Adapter) [32]. ´ Uprava pak spoˇc´ıv´ a pouze v tom, ˇze veˇsker´e JPA entity mus´ı dˇedit z tˇr´ıdy LightEntity. GILEAD pot´e zajist´ı spr´ avn´e fungov´an´ı komunikace klient-server. Z hlediska naˇseho serverov´eho modulu se jednalo tedy pouze o jednoduchou u ´pravu dom´enov´eho modelu, kter´a byla provedena na z´ akladˇe poˇzadavku klientsk´eho modulu. Je nutn´e jeˇstˇe zm´ınit, ˇze v dobˇe dokonˇcov´an´ı tohoto textu jiˇz tato u ´prava dom´enov´eho modelu nebyla potˇreba, protoˇze s novou verz´ı technologie klientsk´eho modulu byla komunikace se serverem upravena tak, aby pouˇzit´ı GILEAD jiˇz nepotˇrebovala.
6.2.3
Spring ROO
V souvislosti s datab´ azovou vrstvou jak´ekoli Java aplikace jeˇstˇe zmiˇ nme velmi zaj´ımav´ y n´astroj, kter´ ym je Spring ROO [74]. Tento n´astroj byl v pr˚ ubˇehu v´ yvoje otestov´an, ale nakonec nebyl pouˇzit. Jedn´ a se o produkt, vytv´aˇren´ y komunitou Spring, kter´ y velmi ulehˇcuje vytvoˇren´ı struktury Java aplikace, jej´ı datab´azov´e vrstvy a dalˇs´ıch souˇc´ast´ı. Program se ovl´ ad´ a z pˇr´ıkazov´e ˇr´adky a jako uk´azku jeho pouˇzit´ı uved’me n´asleduj´ıc´ı k´ od pˇrevzat´ y z [74]: mkdir hello cd hello roo roo> hint roo> project --topLevelPackage com.foo roo> persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY roo> entity --class ~.Timer --testAutomatically roo> field string --fieldName message --notNull roo> hint controllers roo> controller all --package ~.web roo> selenium test --controller ~.web.TimerController roo> gwt setup roo> perform tests roo> quit Tˇemito pˇr´ıkazy jsme vytvoˇrili kompletn´ı strukturu webov´e aplikace spolu s JUnit a Selenium testy a dvˇema r˚ uzn´ ymi webov´ ymi moduly. Je vidˇet, ˇze moˇznosti n´astroje Spring ROO jsou velmi rozs´ ahl´e a pˇri spr´ avn´em pouˇzit´ı uˇsetˇr´ı program´atorovi mnoho ˇcasu.
72
KAPITOLA 6. IMPLEMENTACE
6.3
Aplikaˇ cn´ı logika
N´asleduj´ıc´ı text se zab´ yv´ a nejpodstatnˇejˇs´ı ˇc´ast´ı implementace - aplikaˇcn´ı logikou naˇseho informaˇcn´ıho syst´emu.
6.3.1
Uk´ azka funkˇ cn´ıch metod EJB
Funkˇcn´ı metody v EJB tˇr´ıd´ ach tvoˇr´ı z´ akladn´ı k´amen aplikaˇcn´ı logiky. Byly implementov´any na z´akladˇe n´avrhu v ˇc´ asti 5.2.1. Jelikoˇz se vˇsak jedn´ a o pomˇernˇe rozs´ahl´e ˇc´asti k´odu, odk´aˇzeme ˇcten´aˇre na pˇr´ılohu C, konkr´etnˇe na ˇc´ ast C.1, kde tyto uk´ azky nalezne.
6.3.2
Zabezpeˇ cen´ı funkc´ı dle uˇ zivatelsk´ ych pr´ av
V n´avrhu ˇreˇsen´ı (v ˇc´ asti 5.2.2) jsme popsali, jak´ ym zp˚ usobem bude zabezpeˇceno vol´an´ı jednotliv´ ych funkc´ı EJB. Nyn´ı si uk´ aˇzeme konkr´etn´ı implementaci t´eto funkce. Byla vytvoˇrena speci´ aln´ı anotace @RequiredPermissions, kter´a definuje mnoˇzinu povolen´ı, z nichˇz alespoˇ n jedn´ım mus´ı pˇrihl´ aˇsen´ y uˇzivatel disponovat, aby mohl prov´est danou EJB metodu. N´ asleduj´ıc´ı k´ od pˇredstavuje uk´azku pouˇzit´ı t´eto anotace pro konkr´etn´ı metodu: 1 2 3 4 5
@RolesAllowed({"admin", "superAdmin"}) @RequiredPermissions(EjbPermission.Space_ADD) public void addSpace(SpaceH spaceH) throws DatabaseException { ... } Na prvn´ım ˇr´ adku jsou definov´ any povolen´e role v r´amci Java EE, na druh´em ˇr´adku je pak pouˇzita naˇse zm´ınˇen´ a anotace, kter´ a v tomto pˇr´ıpadˇe urˇcuje povolen´ı Space ADD“, kter´e ” je potˇreba pro pˇrid´ an´ı prostoru. V ˇc´asti 5.2.2.2 jsme popsali, jak´ ym zp˚ usobem je tˇreba kontrolovat tato povolen´ı k jednotliv´ ym metod´ am. Nejjednoduˇsˇs´ı je vyuˇz´ıt tzv. aspektovˇe orientovan´eho programov´an´ı (viz ˇc´ast 5.2.2.1). Jak uˇz bylo zm´ınˇeno v n´ avrhu, Java EE nab´ız´ı pouˇzit´ı tzv. interceptor˚ u, kter´ ymi byla kontrola povolen´ı k EJB metod´ am implementov´ana. Pˇred kaˇzdou EJB metodou je tedy spuˇstˇen interceptor, kter´ y na z´akladˇe naˇs´ı anotace pˇr´ısluˇsej´ıc´ı dan´e metodˇe zkontroluje uˇzivatelsk´e opr´avnˇen´ı. Uk´azku pouˇzit´eho k´odu naleznete v pˇr´ıloze C.
6.3.3
Ostatn´ı funkce aplikaˇ cn´ı logiky
Z funkc´ı aplikaˇcn´ı logiky jeˇstˇe stoj´ı za zm´ınku dvˇe tˇr´ıdy: ∙ EjbHelper obsahuje statick´e metody, kter´e kontroluj´ı r˚ uzn´e podm´ınky pˇri pr´aci s datab´az´ı. M˚ uˇze to b´ yt napˇr´ıklad kontrola pˇri u ´pravˇe entity UniversalPerson, kdy nen´ı dovoleno upravit entitu takov´ ym zp˚ usobem, aby z p˚ uvodn´ı osoby (Person) vznikla firma (Firm) nebo naopak. D´ ale jsou zde metody, kter´e kontroluj´ı r˚ uzn´a ˇcasov´a raz´ıtka a jejich konzistenci pˇri pr´ aci s dynamick´ ymi daty.
ˇ ´I LOGIKA 6.3. APLIKACN
73
∙ EntityHelper tak´e obsahuje statick´e metody, kter´e se vˇsak jiˇz t´ ykaj´ı pouze tˇr´ıd s anotac´ı @Entity. Kontroluje se napˇr´ıklad vyplnˇen´a hodnota promˇenn´e, kter´a je oznaˇcena jako povinn´ a (NOT NULL). V´ ysledkem tˇechto kontrol, kter´e byly zm´ınˇeny v´ yˇse, nen´ı ˇz´adn´a n´avratov´a hodnota, ale v pˇr´ıpadˇe, ˇze nen´ı dan´ a podm´ınka splnˇena, je vyhozena odpov´ıdaj´ıc´ı v´ yjimka.
6.3.4
V´ yjimky
Jak uˇz jste si mohli pˇreˇc´ıst v ˇc´ asti 6.1, v´ yjimky serverov´eho modulu jsou rozdˇeleny do dvou kategori´ı: 1. v´ yjimky, kter´e by se za standardn´ıch podm´ınek nemˇely objevit a nemˇely by se propagovat do klientsk´eho modulu, tedy v´ yjimky nepˇredv´ıdateln´e (bal´ıˇcek server.exception), 2. v´ yjimky, jejichˇz vyhozen´ı nemus´ı b´ yt nutnˇe selh´an´ım programu, ale sp´ıˇse upozornˇen´ım na nˇejak´ y ˇspatn´ y stav (napˇr´ıklad, pokud chce uˇzivatel pˇridat nov´ y objekt do datab´ aze, kter´ y nem´ a vyplnˇen´e vˇsechny povinn´e poloˇzky). Tyto v´ yjimky se nach´azej´ı v bal´ıˇcku shared.exception. Obr´ azek 6.1 uv´ ad´ı class diagram prvn´ı mnoˇziny v´ yjimek. Jelikoˇz se jedn´a o nepˇredv´ıdateln´e v´ yjimky, vˇsechny dˇed´ı z nadtˇr´ıdy RuntimeException. Popiˇsme si nyn´ı jednotliv´e tˇr´ıdy: ∙ InternalServerException je nadtˇr´ıdou vˇsech nepˇredv´ıdateln´ ych v´ yjimek v aplikaci, ∙ DatabaseInconsistencyException - vyhozena v pˇr´ıpadˇe, ˇze je nalezena nˇejak´a nekonzistence v datab´ azi, coˇz m˚ uˇze b´ yt napˇr´ıklad absence jak´ehokoli z´aznamu v H“ tabulce, ” pokud v tabulce se statick´ ymi daty existuje alespoˇ n jeden z´aznam. V´ıce o moˇznostech nekonzistentn´ıho stavu v souvislosti s funkc´ı ˇcasov´ ych ˇrez˚ u jste se doˇcetli v ˇc´asti 4.2.2, ∙ FManSecurityException pˇredstavuje jak´ekoli poruˇsen´ı bezpeˇcnosti v aplikaci. Moment´ alnˇe se to m˚ uˇze st´ at pouze v pˇr´ıpadˇe vol´an´ı EJB metody, na kterou nem´a pˇrihl´aˇsen´ y uˇzivatel povolen´ı (je pak vyhozena v´ yjimka RequiredPermissionsException). Na obr´ azku 6.2 je zobrazen class diagram druh´e mnoˇziny v´ yjimek. Jelikoˇz se jedn´ a o v´ yjimky, kter´e by mˇely b´ yt adekv´atnˇe obslouˇzeny (pomoc´ı bloku try - catch), dˇed´ı vˇsechny z nadtˇr´ıdy Exception. ∙ PropagatedServerException je nadtˇr´ıdou vˇsech v´ yjimek v aplikaci, u kter´ ych se pˇredpokl´ ad´ a, ˇze budou propagov´any do klientsk´eho modulu (EJB metody, kter´e nˇejakou z tˇechto v´ yjimek vyhazuj´ı, ji maj´ı uvedenou za kl´ıˇcov´ ym slovem throws), ∙ InvalidSessionException znaˇc´ı stav, kdy jiˇz uˇzivatel nen´ı pˇrihl´aˇsen (m˚ uˇze b´ yt pouˇzito napˇr´ıklad pro odhl´ aˇsen´ı uˇzivatele v pˇr´ıpadˇe naruˇsen´ı bezpeˇcnosti), ∙ DatabaseException je nadtˇr´ıdou vˇsech v´ yjimek, kter´e souvisej´ı s prac´ı s datab´ az´ı. V´ yjimky, kter´e od t´eto tˇr´ıdy dˇed´ı, jsou n´asleduj´ıc´ı:
74
KAPITOLA 6. IMPLEMENTACE
RuntimeException
InternalServerException
DatabaseInconsistencyException
FManSecurityException
TransactionException
RequiredPermissionsException
Obr´azek 6.1: Nepˇredv´ıdateln´e v´ yjimky serverov´eho modulu, kter´e znaˇc´ı selh´an´ı programu. – CannotRemoveException je vyhozena tehdy, pokud chce uˇzivatel odstranit nˇejakou entitu, ale nen´ı to moˇzn´e z d˚ uvodu zpˇetn´eho odkazu jin´e entity. Pokud to explicitnˇe neurˇc´ıme, nem˚ uˇzeme napˇr´ıklad smazat d˚ um, kter´ y obsahuje nˇejak´e prostory, – CannotUpdateException znamen´a probl´em pˇri pˇrid´av´an´ı nebo u ´pravˇe entity (napˇr´ıklad z d˚ uvodu nevyplnˇen´ı vˇsech potˇrebn´ ych pol´ı), – EntityNotFoundException je vyhozena v pˇr´ıpadˇe, ˇze chceme zobrazit nˇejak´e z´avisl´e objekty (napˇr´ıklad prostory v domˇe), ale zadan´ y objekt (v tomto pˇr´ıpadˇe tedy d˚ um) nebyl nalezen. Podobn´ y pˇr´ıpad je u maz´an´ı entity, kter´a v datab´azi neexistuje, ∙ ServerErrorException je obecnou v´ yjimkou, kter´a znamen´a jak´ekoli jin´e selh´an´ı na serveru, kter´e nepatˇr´ı do ˇz´ adn´e z v´ yˇse uveden´ ych kategori´ı. Pomoc´ı interceptoru (podobnˇe jako je zajiˇstˇena kontrola uˇzivatelsk´ ych pr´av) se zachyt´av´a jak´akoli v´ yjimka typu RuntimeException pˇri prov´ adˇen´ı EJB metody, kter´a je obalena do naˇs´ı v´ yjimky ServerErrorException, a propagov´ana do klientsk´eho modulu.
6.4
Napojen´ı rozd´ıln´ ych klientsk´ ych modul˚ u
Nyn´ı zm´ın´ıme nˇekter´e moˇznosti napojen´ı klientsk´ ych modul˚ u, kter´e mohou vyuˇz´ıvat funkce, jeˇz tento serverov´ y modul nab´ız´ı. To, ˇze jsme pouˇzili technologii Enterprise Java Beans
´ ´ ˚ 6.4. NAPOJEN´I ROZD´ILNYCH KLIENTSKYCH MODULU
75
Exception
PropagatedServerException
InvalidSessionException
CannotRemoveException
DatabaseException
CannotUpdateException
ServerErrorException
EntityNotFoundException
Obr´azek 6.2: V´ yjimky serverov´eho modulu, kter´e jsou propagov´any do modulu klientsk´eho. v r´amci Java Enterprise Edition splˇ nuje zad´an´ı z hlediska poskytnut´ı rozhran´ı pro RPC komunikaci. EJB technologie totiˇz vyuˇz´ıv´a Java Remote Method Invocation, coˇz je objektov´ a verze vzd´ alen´eho vol´ an´ı procedur. V r˚ uzn´ ych typech klient˚ u se vˇsak pouˇzit´ı EJB m˚ uˇze liˇsit. Ukaˇzme si proto nyn´ı komunikaci klient-server ve tˇrech z´ akladn´ıch typech klient˚ u. Webov´ a aplikace Nejbˇeˇznˇejˇs´ım dneˇsn´ım typem klienta EJB modulu je webov´a aplikace. Pokud je spolu s EJB modulem nasazena na server jako EAR1 aplikace, je pouˇzit´ı EJB metod velmi jednoduch´e (mluv´ıme nyn´ı o EJB 3.0, protoˇze jak jsme zm´ınili v ˇc´asti 4.1.2.2, neexistuje dnes jedin´ y d˚ uvod pouˇz´ıvat nˇejakou z pˇredchoz´ıch verz´ı). Pokud tedy chceme napˇr´ıklad v servletu vyuˇz´ıt funkci poskytovanou na u ´rovni Enterprise Java Beans, staˇc´ı n´ am definovat promˇennou s typem dan´eho EJB rozhran´ı a s anotac´ı @EJB: @EJB private BuildingLocal buildingEjb; Pro zavol´ an´ı EJB metody pak nap´ıˇseme n´asleduj´ıc´ı: buildingEjb.addBuilding(...); 1
Enterprise Archive (zkr´ acenˇe EAR) je form´ at souboru pouˇz´ıvan´ y platformou Java EE pro zabalen´ı jednoho nebo v´ıce modul˚ u enterprise aplikace do jedin´eho souboru.
76
KAPITOLA 6. IMPLEMENTACE
Pokud by vˇsak nebyly webov´ y a EJB modul nasazeny na server jako jedin´a aplikace, bylo by nutn´e pouˇz´ıt stejn´ y zp˚ usob jako v pˇr´ıpadˇe pˇripojen´ı desktopov´e aplikace (viz d´ale). Desktopov´ a aplikace (tlust´ y klient) V desktopov´e aplikaci je nutn´e pouˇz´ıt jin´ y zp˚ usob pro vyhled´an´ı EJB rozhran´ı. Anotace @EJB m˚ uˇze b´ yt pouˇzita jen v pˇr´ıpadˇe, ˇze je klientsk´ y modul souˇc´ast´ı aplikace, kde se nach´ az´ı i modul EJB. Nejprve mus´ıme vytvoˇrit soubor jndi.properties a d´at ho do naˇs´ı classpath. Obsah souboru bude v pˇr´ıpadˇe aplikaˇcn´ıho serveru JBoss n´asleduj´ıc´ı: 1 2 3
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=http://muj.server.cz:1099 D˚ uleˇzit´ y je tˇret´ı ˇr´ adek, kter´ y definuje adresu serveru, na kter´em je spuˇstˇen serverov´ y EJB modul. V k´odu aplikace pak pro nalezen´ı dan´eho EJB rozhran´ı zavol´ame tento k´od:
1 2 3 4 5 6 7 8 9 10
private Context context; ... try { context = new InitialContext(); BuildingBeanRemote buildingEjb = (BuildingBeanRemote) context.lookup( "BuildingBean/remote"); } catch (NamingException e) { ... } buildingEjb.addBuilding(...); Vˇsimnˇete si rozd´ılu pouˇzit´eho rozhran´ı poskytuj´ıc´ıho dan´e metody. V pˇr´ıpadˇe, ˇze jsou EJB modul i jeho klient (napˇr. webov´ y modul) souˇc´ast´ı jedn´e aplikace a jsou spuˇstˇeny na 2 stejn´em Java Virtual Machine , m˚ uˇzeme pouˇz´ıt rozhran´ı Local, v opaˇcn´em pˇr´ıpadˇe (jako napˇr´ıklad u desktopov´e aplikace) mus´ıme vyuˇz´ıt rozhran´ı Remote a komunikace pak prob´ıh´a pomoc´ı RMI. V´ıce se o tˇechto rozhran´ıch dozv´ıte v [46]. Mobiln´ı aplikace Vzhledem k tomu, ˇze Java platforma pro mobiln´ı telefony (J2ME) nepodporuje funkce z bal´ıˇcku javax.naming (kter´ y obsahuje napˇr. tˇr´ıdu Context pouˇzitou v´ yˇse), nen´ı moˇzn´e pouˇz´ıt EJB metody pˇr´ımo. Nab´ız´ı se nˇekolik variant: ∙ zveˇrejnit EJB tˇr´ıdy jako webov´e sluˇzby a ty pak pouˇz´ıvat v mobiln´ı aplikaci (napˇr´ıklad pomoc´ı knihovny kSOAP 2 [51]), ∙ vytvoˇrit speci´ aln´ı servlet, kter´ y bude obsluhovat vol´an´ı z mobiln´ıho zaˇr´ızen´ı a bude pˇrepos´ılat“ poˇzadavky EJB metod´am a v´ ysledky bude vracet v HTTP odpovˇedi, ” ∙ upravit webovou aplikaci pro pouˇzit´ı v mobiln´ım zaˇr´ızen´ı. 2
V´ yznam Java Virtual Machine je vysvˇetlen v ˇca ´sti 2.5.1
´ 6.5. SPRAVA PROJEKTU
77
Zaj´ımav´ a je posledn´ı moˇznost, kter´a disponuje velkou v´ yhodou oproti ostatn´ım - pˇri v´ yvoji klientsk´e webov´e aplikace by staˇcilo optimalizovat jej´ı zobrazen´ı i pro mobiln´ı zaˇr´ızen´ı a odpadla by tak nutnost v´ yvoje samostatn´e mobiln´ı aplikace. Dnes, s rozvojem HTML 5, je tato alternativa st´ale ˇcastˇejˇs´ı a moˇzn´a se doˇck´ame chv´ıle, kdy v´ yvoj nativn´ıch mobiln´ıch aplikac´ı jiˇz nebude v˚ ubec potˇreba.
6.5
Spr´ ava projektu
Pˇri v´ yvoji jak´ekoli rozs´ ahlejˇs´ı aplikace, jakou dozajista informaˇcn´ı syst´em popisovan´ y v t´eto pr´aci je, je d˚ uleˇzit´e cel´ y projekt vhodnˇe spravovat. Existuje ˇrada n´astroj˚ u, kter´e n´am mohou tuto pr´ aci usnadnit, pokud je spr´avnˇe pouˇz´ıv´ame. Popiˇsme si tedy nyn´ı dva hlavn´ı n´astroje, kter´e jsou pouˇzity ke spr´ avˇe naˇs´ı aplikace.
6.5.1
Subversion
Prvn´ım z nich je Apache Subversion [7] [17] (zkr´acenˇe SVN) - nejrozˇs´ıˇrenˇejˇs´ı n´astroj pro verzov´ an´ı soubor˚ u. Mohlo by se zd´at, ˇze pˇri v´ yvoji aplikace jedn´ım program´atorem nen´ı ˇz´adn´ y syst´em pro verzov´ an´ı soubor˚ u potˇreba, opak je vˇsak pravdou. Nehledˇe na to, ˇze se poˇc´ıt´a v budoucnu s rozˇs´ıˇren´ım t´ ymu program´ator˚ u. At’ uˇz pro samostatn´eho program´atora nebo pro t´ ym v´ yvoj´aˇr˚ u nab´ız´ı tento syst´em ˇradu v´ yhod: ∙ pˇri spr´ avn´em potvrzov´ an´ı zmˇen se m˚ uˇzeme jednoduˇse vr´atit k pˇredchoz´ı verzi jednoho nebo vˇsech soubor˚ u, ∙ SVN pln´ı u ´lohu z´ alohov´ an´ı - pouˇzijeme-li Subversion na nˇejak´em vzd´alen´em serveru, m´ ame po kaˇzd´em potvrzen´ı zmˇen jistotu, ˇze jsou data spolehlivˇe uloˇzena, ∙ pˇri pr´ aci v t´ ymu program´ ator˚ u je nutn´e nˇejak sluˇcovat zmˇeny v k´odu, kter´e mohou vyvolat konflikty (dva lid´e uprav´ı stejn´ y soubor ˇci dokonce stejn´ y ˇr´adek, ale kaˇzd´ y jin´ ym zp˚ usobem), k vyˇreˇsen´ı tˇechto konflikt˚ u disponuje SVN speci´aln´ımi funkcemi, ∙ SVN tak´e nab´ız´ı jednoduch´ y zp˚ usob pro uchov´av´an´ı r˚ uzn´ ych verz´ı stejn´eho projektu (verz´ı je nyn´ı myˇslena napˇr. verze 1.0, 2.0 apod.), ale i testovac´ıch verz´ı (napˇr. pro testov´ an´ı nov´e technologie), ∙ vˇsechna modern´ı v´ yvojov´ a prostˇred´ı (napˇr. NetBeans ˇci Eclipse) maj´ı podporu pro SVN. 6.5.1.1
Z´ akladn´ı pojmy
Abychom porozumˇeli pouˇzit´ı SVN, potˇrebujeme zn´at nˇekter´e z´akladn´ı pojmy, kter´e si nyn´ı pop´ıˇseme. Revize je urˇcit´ y stav repozit´aˇre3 , kter´ y definuje verze vˇsech soubor˚ u a adres´aˇr˚ u. Operace svn commit vˇzdy vytv´ aˇr´ı novou revizi. Touto operac´ı m˚ uˇze b´ yt zmˇenˇen jak´ ykoli poˇcet 3
Repozit´ aˇrem je myˇsleno fyzick´e um´ıstˇen´ı dat pro Subversion. M˚ uˇze to b´ yt vzd´ alen´ y server, ale i lok´ aln´ı disk.
78
KAPITOLA 6. IMPLEMENTACE
soubor˚ u a adres´ aˇr˚ u. D˚ uleˇzit´e je, ˇze i pˇri zmˇenˇe velk´eho mnoˇzstv´ı soubor˚ u je tato operace atomick´a4 . Pracovn´ı kopie je lok´ aln´ı kopie projektu z repozit´aˇre (stav soubor˚ u s danou reviz´ı). Pokud chceme pracovat s projektem um´ıstˇen´ ym na SVN, provedeme vˇzdy nejprve operaci svn checkout, kter´ a zkop´ıruje obsah repozit´aˇre ze zadan´e adresy URL do poˇc´ıtaˇce a vytvoˇr´ı zde lok´aln´ı kopii. Pˇri dalˇs´ı pr´ aci pak uˇz nepouˇz´ıv´ame pˇr´ıkaz svn checkout, ale svn update, kter´ y jiˇz jen aktualizuje lok´ aln´ı kopii dle stavu v repozit´aˇri. Lok´aln´ı kopie souboru m˚ uˇze b´ yt v r˚ uzn´ ych stavech [17] (zapisov´ ano jako stav lok´aln´ıho souboru | stav vzd´alen´eho souboru): ∙ nezmˇenˇena, aktu´ aln´ı - soubor nebyl lok´alnˇe zmˇenˇen a oproti pracovn´ı kopii nebyly potvrzeny v repozit´ aˇri ˇz´ adn´e nov´e zmˇeny tohoto souboru, operace svn commit ani svn update nezmˇen´ı ˇz´ adn´e soubory, ∙ lok´alnˇe zmˇenˇena, aktu´ aln´ı - soubor byl zmˇenˇen v pracovn´ı kopii, v repozit´aˇri je beze zmˇeny, operace svn commit potvrd´ı zmˇeny v repozit´aˇri (vytvoˇr´ı novou revizi), operace svn update neudˇel´ a nic, ∙ nezmˇenˇena, neaktu´ aln´ı - soubor v pracovn´ı kopii nebyl zmˇenˇen, ale v repozit´aˇri byla potvrzena nov´ a verze tohoto souboru, operace svn commit neudˇel´a nic, naopak operace svn update aktualizuje soubor v pracovn´ı kopii na nejnovˇejˇs´ı revizi z repozit´aˇre, ∙ zmˇenˇena, neaktu´ aln´ı - soubor byl zmˇenˇen jak v pracovn´ı kopii, tak v repozit´aˇri, operace svn commit selˇze s chybou out-of-date“, abychom mohli potvrdit zmˇeny, mus´ıme ” nejprve aktualizovat soubor v pracovn´ı kopii (svn update) - SVN se pokus´ı slouˇcit zmˇeny z repozit´ aˇre se zmˇenami lok´aln´ımi, pokud se mu to automaticky nepovede, je nutn´e pouˇz´ıt pˇr´ıkaz svn resolve a opravit konflikty manu´alnˇe. 6.5.1.2
Pouˇ z´ıv´ an´ı Subversion
Subversion nab´ız´ı velmi mnoho funkc´ı, vˇsechny vˇsak zdaleka nemus´ıme vyuˇz´ıt. Popiˇsme si typick´ y pˇr´ıklad pr´ ace program´ atora v t´ ymu spolu s funkcemi, kter´e nejˇcastˇeji pouˇzije [17]: ∙ Program´ ator si zaktualizuje pracovn´ı kopii (svn update), ∙ n´aslednˇe s n´ı pracuje a upravuje soubory, pˇrid´av´a je (svn add), maˇze (svn delete), kop´ıruje (svn copy) ˇci pˇresouv´ a (svn move), ∙ d´ale pracuje se zmˇenˇen´ ymi soubory a m˚ uˇze napˇr´ıklad zjistit, v ˇcem se nyn´ı jeho zmˇeny liˇs´ı od verze v repozit´ aˇri (svn diff) nebo m˚ uˇze pracovn´ı verzi vr´atit do stavu zadan´e revize (svn revert). ∙ Pˇred potvrzen´ım zmˇen m˚ uˇze b´ yt potˇreba slouˇcit zmˇeny v repozit´aˇri a pracovn´ı kopii (zmˇeny jsou slouˇceny do pracovn´ı kopie, repozit´aˇr z˚ ust´av´a nezmˇenˇen). K tomu slouˇz´ı pˇr´ıkaz svn merge. Pokud toto slouˇcen´ı vytvoˇr´ı nˇejak´e lok´aln´ı konflikty, m˚ uˇzeme pouˇz´ıt pˇr´ıkaz svn resolve a po manu´ aln´ım opraven´ı pˇr´ıkaz svn resolved. 4
Pokud je nˇejak´ a operace atomick´ a, znamen´ a to, ˇze mus´ı b´ yt provedena bud’ cel´ a nebo nesm´ı b´ yt provedena v˚ ubec. Nem˚ uˇze se tedy st´ at, ˇze pokud dojde v p˚ ulce operace k nˇejak´e chybˇe, budou provedeny vˇsechny u ´kony, kter´e se nach´ azely pˇred touto chybou, ale uˇz nebudou provedeny ty, kter´e by n´ asledovaly po chybˇe. V tomto pˇr´ıpadˇe se mus´ı zajistit, ˇze se neprovedou u ´kony ˇza ´dn´e (cel´ a operace je tedy oznaˇcena jako neproveden´ a).
´ 6.5. SPRAVA PROJEKTU
79
∙ Na z´ avˇer potvrd´ı program´ ator zmˇeny k´odu pˇr´ıkazem svn commit. Pokud chceme SVN pouˇz´ıvat se vˇsemi jeho v´ yhodami, je d˚ uleˇzit´e spr´avnˇe vytvoˇrit strukturu naˇseho repozit´ aˇre. Skl´ ad´ a se z nˇekolika adres´aˇr˚ u: ∙ trunk - nejd˚ uleˇzitˇejˇs´ı adres´ aˇr, kter´ y bude repozit´aˇr vˇzdy obsahovat. Obsahuje pracovn´ı verzi projektu s nejnovˇejˇs´ımi soubory. Pokud si program´ator vytv´aˇr´ı pracovn´ı kopii, je to kopie pr´ avˇe tohoto adres´aˇre. ∙ branches - pokud projekt dospˇeje do st´adia, kdy je vhodn´e kopii projektu uloˇzit jako samostatnou ˇc´ ast, uloˇz´ı se tato verze do adres´aˇre branches, konkr´etnˇe napˇr´ıklad do branches/1.0_dev. Zde se m˚ uˇze verze d´ale upravovat a nˇekter´e opraven´e chyby napˇr´ıklad zpˇet sluˇcovat s verz´ı v adres´aˇri trunk. ∙ tags - V tomto adres´ aˇri jsou vytv´aˇreny kopie projektu, kter´e by se jiˇz nikdy nemˇely mˇenit. Mohou to b´ yt napˇr´ıklad verze pˇred zmˇenou nˇejak´e technologie (pro uchov´ an´ı stavu pˇred touto zmˇenou) ˇci hlavn´ı verze programu (napˇr. 1.0, 2.0).
6.5.2
Apache Maven
Dalˇs´ı technologi´ı, kterou je pro spr´avu projektu v´ yhodn´e pouˇz´ıt je Apache Maven [6] (d´ ale budeme popisovat v´ yhradnˇe jeho verzi 2). Tento n´astroj nab´ız´ı mnoho funkc´ı pro projekty v jazyce Java, jmenujme ty hlavn´ı: ∙ podpora pro vytv´ aˇren´ı projekt˚ u r˚ uzn´eho typu (napˇr. EJB modul, webov´a aplikace ˇci standardn´ı Java aplikace) d´ıky tzv. archetyp˚ um, kter´e definuj´ı strukturu jednotliv´ ych projekt˚ u, ∙ spr´ ava z´ avislost´ı, tedy knihoven, kter´e dan´ y projekt pouˇz´ıv´a - program´ator se nemus´ı starat o stahov´ an´ı knihoven z nejr˚ uznˇejˇs´ıch m´ıst, vˇetˇsina knihoven je totiˇz uloˇzena v centr´ aln´ım Maven u ´loˇziˇsti, pˇr´ıpadnˇe v u ´loˇziˇst´ıch, kter´e spravuj´ı pˇr´ımo spoleˇcnosti vytv´ aˇrej´ıc´ı danou knihovnu, ∙ funkce pro pˇreklad, testov´ an´ı i nasazen´ı projektu - vˇetˇsina v´ yvojov´ ych prostˇred´ı pouˇz´ıv´ a 5 pro tyto funkce n´ astroj Apache Ant , Apache Maven nab´ız´ı vˇsak vlastn´ı implementaci zm´ınˇen´ ych funkc´ı (tedy napˇr. build, clean ˇci deploy), ∙ vytv´ aˇren´ı projektu nez´ avisl´eho na v´ yvojov´em prostˇred´ı - tato funkce je velmi v´ yhodn´ a, protoˇze nemus´ıme vytv´ aˇret jiˇz ˇz´adn´ y NetBeans projekt“ ˇci Eclipse projekt“, vˇzdy ” ” to bude jen Maven projekt“, kter´ y vˇetˇsina dneˇsn´ıch modern´ıch v´ yvojov´ ych prostˇred´ı ” podporuje. 5
V´ıce se o tomto n´ astroji dozv´ıte v [3].
80
KAPITOLA 6. IMPLEMENTACE
6.5.2.1
Project Object Model
Vˇsechny informace, kter´e se vztahuj´ı k Maven projektu jsou uloˇzeny ve speci´aln´ım souboru pom.xml, coˇz je tzv. Project Object Model, tedy zkr´acenˇe POM [69]. Tento soubor m˚ uˇze u velmi jednoduch´eho projektu vypadat napˇr´ıklad takto: 1 2 3 4 5 6 7 8 9 10 11
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0 cz.mojedomena.pokus <artifactId>PokusProjekt <packaging>war 1.0-SNAPSHOT Muj pokusny projekt http://maven.apache.org
12 13 14 15 16 17 18 19 20 21
<dependencies> <dependency> junit <artifactId>junit 3.8.1 <scope>test Na ˇr´adku 5 aˇz 11 jsou informace o samotn´em projektu, ˇr´adek 14 aˇz 19 pak definuje jednu z´avislost. Vˇsimnˇeme si tagu <scope>, kter´ y urˇcuje, pro jak´ yu ´ˇcel je z´avislost pouˇzita, Maven rozliˇsuje tyto moˇznosti (existuj´ı i dalˇs´ı, kter´e vˇsak nejsou tolik pouˇz´ıv´any) [6][69]: ∙ compile - standardn´ı volba, knihovna je dostupn´a ve vˇsech f´az´ıch v´ yvojov´eho cyklu (build, test i deploy), ∙ provided - knihovna je pouˇzita pˇri kompilaci, ale nekop´ıruje se na server pˇri nasazen´ı aplikace, poˇc´ıt´ a se, ˇze implementaci poskytne server (napˇr. Java servlet API), ∙ runtime - knihovna nen´ı pouˇzita pˇri kompilaci, ale pouze v run-time (napˇr. nˇejak´ y JDBC driver), ∙ test - pouˇzit´ı knihovny je z´ uˇzeno pouze na kompilaci test˚ u (napˇr. JUnit). Soubor pom.xml nab´ız´ı spoustu dalˇs´ıch funkc´ı, napˇr´ıklad definici r˚ uzn´ ych plugin˚ u ˇci nastaven´ı test˚ u, na to vˇsak jiˇz nen´ı v tomto textu prostor, dalˇs´ı informace najdete v [6] a [69].
´ 6.5. SPRAVA PROJEKTU
6.5.2.2
81
Struktura Maven projektu
Posledn´ı, co v tomto struˇcn´em popisu technologie Maven zm´ın´ıme, bude struktura adres´ aˇre obsahuj´ıc´ıho Maven projekt. Tento adres´aˇr je vytv´aˇren automaticky, ale je dobr´e vˇedˇet, co jednotliv´e podadres´ aˇre obsahuj´ı. Strukturu ukazuje obr´azek 6.3. src main config filters java resources webapp site test target pom.xml
Obr´ azek 6.3: Struktura adres´aˇre Maven projektu. ∙ src/main/java - samotn´ y k´od aplikace, ∙ src/main/resources - prostˇredky, kter´e aplikace potˇrebuje (mohou to b´ yt napˇr´ıklad obr´ azky), ∙ src/main/filters - filtry prostˇredk˚ u definov´any jako properties soubory6 , ∙ src/main/config - konfiguraˇcn´ı soubory, ∙ src/main/webapp - adres´ aˇr webov´e aplikace (to, co napˇr´ıklad v NetBeans projektu pˇredstavuje adres´ aˇr WAR) ∙ src/site - soubory potˇrebn´e k vytvoˇren´ı str´anky Maven projektu, coˇz je standardizovan´ a HTML str´ anka s informacemi o dan´em projektu, ∙ src/test/java - unit testy, ∙ src/test/resources - prostˇredky potˇrebn´e pouze pro testy (podobn´e jako u test scope), ∙ src/test/filters - filtry prostˇredk˚ u potˇrebn´e pouze v pr˚ ubˇehu testov´an´ı 6
Properties soubory se pouˇz´ıvaj´ı napˇr´ıklad k z´ apisu r˚ uzn´ ych konfiguraˇcn´ıch poloˇzek. Maj´ı speci´ aln´ı form´ at, kdy na kaˇzd´em ˇra ´dku je vˇzdy dvojice n´ azev a hodnota oddˇelena od sebe rovn´ıtkem.
82
KAPITOLA 6. IMPLEMENTACE
∙ target - do tohoto adres´ aˇre se ukl´adaj´ı zkompilovan´e tˇr´ıdy a archivy pˇripraven´e pro nasazen´ı aplikace.
Kapitola 7
Testov´ an´ı Tato kapitola se zab´ yv´ a testov´ an´ım cel´e aplikace resp. jej´ıho serverov´eho modulu. Text je rozdˇelen na popis r˚ uzn´ ych moˇznost´ı pro testov´an´ı Enterprise Java Beans a na v´ ybˇer jedn´e z nich.
7.1
R˚ uzn´ e zp˚ usoby testov´ an´ı Enterprise Java Beans
J´adrem funkˇcnosti cel´eho serverov´eho modulu jsou jednotliv´e Enterprise Java Beans, proto mus´ıme zajistit jejich komplexn´ı otestov´an´ı. I pˇresto, ˇze je technologie EJB pomˇernˇe star´ a, neexistuje jedin´ y (nejlepˇs´ı) postup pro testov´an´ı, kter´ y by napˇr´ıklad firma Sun Microsystems, tv˚ urce t´eto technologie, jednoznaˇcnˇe doporuˇcovala. M´ame proto na v´ ybˇer dva odliˇsn´e zp˚ usoby, jak´ ymi m˚ uˇzeme testy prov´adˇet: ∙ Testov´ an´ı mimo J2EE kontejner1 (Out-of-container), ∙ Testov´ an´ı uvnitˇr J2EE kontejneru (In-container). Tabulka 7.1 uv´ ad´ı porovn´ an´ı tˇechto dvou zp˚ usob˚ u. V tabulce se nach´az´ı poloˇzka Postup ” dle Test-Driven development“ (TDD), coˇz je technika v´ yvoje softwaru. Tradiˇcn´ı testovac´ı metody vych´ azej´ı z pˇredpokladu, ˇze pokud chceme nˇeco otestovat, mus´ıme nejprve napsat alespoˇ n nˇejakou implementaci dan´e funkce. TDD jde pˇresnˇe opaˇcn´ ym smˇerem. Program´ ator nejprve nap´ıˇse test (kter´ y samozˇrejmˇe v prvn´ı chv´ıli nem˚ uˇze uspˇet) a aˇz pot´e nap´ıˇse prvn´ı verzi implementace. Pot´e m˚ uˇze napsat nov´ y, dokonalejˇs´ı test, kter´ y opˇet neuspˇeje, zdokonalit implementaci a pokusit se znovu o splnˇen´ı testu. V´ıce informac´ı o Test-Driven Development naleznete v [54]. Porovn´ an´ı v tabulce nem˚ uˇzeme vˇsak br´at naprosto exaktnˇe, protoˇze kaˇzd´ y typ testov´ an´ı se dˇel´ı na dalˇs´ı varianty. Existuj´ı i varianty, kter´e nelze pˇresnˇe zaˇradit do jedn´e nebo druh´e kategorie. Je nicm´enˇe d˚ uleˇzit´e, abychom vybrali spr´avn´ y zp˚ usob testov´an´ı a pˇr´ıpadnˇe i konkr´etn´ı framework, kter´ y n´ am tvorbu test˚ u ulehˇc´ı. V n´asleduj´ıc´ım textu tedy probereme moˇznosti testov´an´ı EJB v J2EE kontejneru i mimo nˇej. 1
J2EE kontejner je prostˇred´ı, ve kter´em je nasazena Java EE aplikace. J2EE kontejnerem je napˇr´ıklad aplikaˇcn´ı server Glassfish ˇci JBoss.
83
´ ´I KAPITOLA 7. TESTOVAN
84
Rychlost
Spolehlivost
N´ aroˇ cnost pro program´ atora
Postup dle Test-Driven Development
Ouf-of-container Vysok´ a, srovnateln´a s klasick´ ymi JUnit testy, nen´ı tˇreba spouˇstˇet server. Niˇzˇs´ı, nˇekter´e chyby se mohou projevit aˇz pˇri spuˇstˇen´ı testu v r´ amci dan´eho kontejneru, coˇz out-of-container testy neodhal´ı (nem˚ uˇzeme zde testovat napˇr. interceptory). Z´ aleˇz´ı na konkr´etnˇe zvolen´em zp˚ usobu test˚ u, v pˇr´ıpadˇe testov´ an´ı pomoc´ı mock“ ob” jekt˚ u2 je n´ aroˇcnost pomˇernˇe vysok´ a. Out-of-container testov´an´ı umoˇzn ˇuje vyv´ıjet aplikaci dle principu TDD, tedy napsat nejprve testy (nez´avisl´e na implementaci EJB rozhran´ı), a aˇz pozdˇeji vytvoˇrit implementaci, pot´e upravit testy, refaktorovat implementaci atd.
In-container N´ızk´a, je tˇreba spustit aplikaˇcn´ı server, prov´est deploy (nasazen´ı aplikace), a aˇz pot´e je moˇzn´e spustit testy. Zaruˇcen´a, testov´an´ı prob´ıh´a ve stejn´em prostˇred´ı, ve kter´em bude aplikace pot´e nasazena.
N´ızk´a, testy se vytv´aˇrej´ı podobnˇe jako jak´ekoli jin´e unit testy.
V pˇr´ıpadˇe in-container testov´an´ı je postup dle TDD v podstatˇe nemoˇzn´ y, spouˇstˇen´ı test˚ u je velmi pomal´e a testy mohou b´ yt z´avisl´e napˇr´ıklad na zvolen´em J2EE kontejneru (aplikaˇcn´ım serveru).
Tabulka 7.1: Srovn´ an´ı testov´ an´ı EJB mimo J2EE kontejner a uvnitˇr J2EE kontejneru.
7.1.1
Moˇ znosti out-of-container testov´ an´ı
V tomto pˇr´ıpadˇe m´ ame na v´ ybˇer pouˇzit´ı standardn´ıch JUnit test˚ u s nˇejak´ ym mechanismem, kter´ y n´am umoˇzn´ı pracovat s datab´ az´ı mimo kontejner (toto umoˇzn ˇuje napˇr. Hibernate) nebo m˚ uˇzeme vyuˇz´ıt funkc´ı nˇekter´eho frameworku pro out-of-container testov´an´ı. Probereme si dva r˚ uzn´e frameworky, kter´e usnadˇ nuj´ı pr´aci s testy. JBoss Needle Tento projekt [45] je nadstavbou frameworku EasyMock [27]. Nab´ız´ı tedy stejn´e API pro psan´ı test˚ u jako EasyMock a nav´ıc pˇrid´av´a nˇekolik uˇziteˇcn´ ych funkc´ı, napˇr´ıklad speci´aln´ı tˇr´ıdu pro spouˇstˇen´ı test˚ u v in-memory3 datab´azi.
2
Mock objekty jsou velmi uˇziteˇcn´ a technika pro unit testov´ an´ı. M´ısto re´ aln´e implementace obsahuj´ı pouze nˇejak´ y jednoduch´ y k´ od, kter´ y nevyˇzaduje dalˇs´ı z´ avislosti, jeˇz by se musely v re´ aln´e implementaci instancovat [55]. 3 Tzv. in-memory datab´ aze nem´ a ˇza ´dn´e souborov´e u ´loˇziˇstˇe a veˇsker´ a data jsou uloˇzena pouze v operaˇcn´ı pamˇeti. Tento reˇzim podporuje napˇr. datab´ aze HSQLDB (jak jsme zm´ınili v ˇca ´sti 4.3.4).
˚ E ´ ZPUSOBY ˚ ´ ´I ENTERPRISE JAVA BEANS 7.1. RUZN TESTOVAN
85
Uk´azka testu: 1 2 3 4 5
@Test public void testSelectAllPerson() throws Exception { createPersons(); //add some test records to in-memory database EasyMock.expect(this.getMock(PersonService.class).saveOrUpdate( (Person) EasyMock.anyObject())).andReturn("success");
6
replayAll(); List all = this.getObjectUnderTest().selectAllPerson(); verifyAll();
7 8 9 10
Assert.assertEquals(5, all.size());
11 12
} V´yhody: ∙ pouˇzit´ı EasyMock - program´ator se nemus´ı uˇcit nov´e API, pokud EasyMock zn´a, ∙ velmi rychl´e spouˇstˇen´ı test˚ u v in-memory datab´azi. Nev´yhody: ∙ testov´ an´ı pomoc´ı mock objekt˚ u pˇrin´aˇs´ı vˇzdy jednu z´asadn´ı nev´ yhodu - netestuje se konkr´etn´ı implementace, ale pouze se zjiˇst’uje, zda-li byly metody zavol´any ve spr´avn´em poˇrad´ı a se spr´ avn´ ymi n´ avratov´ ymi typy, ∙ jedn´ a se o pomˇernˇe nezabˇehnut´ y projekt, verze 1.0 byla pˇredstavena na zaˇc´atku roku 2010. Unitils Projekt Unitils [85] nab´ız´ı ucelen´e testovac´ı prostˇred´ı. M˚ uˇzeme vyuˇz´ıt velk´e mnoˇzstv´ı modul˚ u, z nichˇz nˇekter´e pouˇz´ıvaj´ı dalˇs´ı extern´ı knihovny: ∙ unitils-mock - framework pro tvorbu mock objekt˚ u, ∙ unitils-inject - podpora pro Dependency Injection4 , ∙ unitils-dbunit - umoˇzn ˇuje pouˇzit´ı funkc´ı projektu DbUnit [21], tedy napˇr´ıklad tzv. DataSetu, coˇz je XML soubor, kter´ y slouˇz´ı pro naplnˇen´ı datab´aze testovac´ımi daty pˇred libovoln´ ym testem, ∙ unitils-orm - testov´ an´ı za pomoci Hibernate a JPA, ∙ unitils-spring - podpora pro Spring framework, 4
Princip Dependency Injection ˇr´ık´ a, ˇze by tˇr´ıda nemˇela b´ yt z´ avisl´ a na jin´ ych konkr´etn´ıch implementac´ıch, ale pouze na abstraktn´ıch tˇr´ıd´ ach ˇci rozhran´ıch. To, jak´ ym zp˚ usobem se dan´e z´ avisl´e tˇr´ıdy vyrob´ı a jak´e to budou konkr´etn´ı implementace, by mˇelo b´ yt jedno. Tato informace by nemˇela b´ yt obsaˇzena v implementaci tˇr´ıdy, ale v nˇejak´e celkov´e konfiguraci aplikace [91].
´ ´I KAPITOLA 7. TESTOVAN
86
∙ unitils-dbmaintainer - pouˇz´ıv´ a knihovnu DbMaintain [20] umoˇzn ˇuj´ıc´ı spr´avu sch´ematu datab´ aze, ∙ unitils-easymock - integrace s frameworkem EasyMock [27], ∙ unitils-testng - podpora pro testovac´ı framework TestNG [81]. N´asleduje uk´ azka DataSetu (pojmenovan´eho napˇr´ıklad City.xml), kter´ y velmi usnadˇ nuje vytvoˇren´ı testovac´ıho prostˇred´ı se zn´ am´ ymi testovac´ımi daty uloˇzen´ ymi v datab´azi. 1 2 3 4 5 6
Unit testy pak prob´ıhaj´ı standardnˇe: 1. zavol´an´ı testovan´e metody z dan´e EJB tˇr´ıdy 2. kontrola stavu datab´ aze po proveden´ı zmˇen nebo 3. porovn´an´ı v´ ysledku z´ıskan´eho z datab´aze s v´ ysledkem oˇcek´avan´ ym Jmenujme nˇekolik dalˇs´ıch funkc´ı frameworku, kter´e uˇsetˇr´ı program´atorovi ˇcas: ∙ anotace @TestedObject - slouˇz´ı pro dependency injection testovan´eho EJB, ∙ anotace @InjectIntoByType spolu s anotac´ı @PersistenceContext m˚ uˇze b´ yt pouˇzita pro dependency injection tˇr´ıdy EntityManager, ∙ statick´e metody ReflectionAssert.* slouˇz´ı k jednoduˇsˇs´ımu porovn´av´an´ı objekt˚ u, nevyuˇz´ıvaj´ı funkce equals(), ale pomoc´ı reflexe porovn´avaj´ı skuteˇcn´ y obsah objektu a nab´ızej´ı mnoho dalˇs´ıch uˇziteˇcn´ ych funkc´ı (z nich stoj´ı za zm´ınku napˇr´ıklad porovn´an´ı java.util.Collection, kde nez´ aleˇz´ı na poˇrad´ı). V´yhody: ∙ velmi ucelen´e ˇreˇsen´ı pro testov´ an´ı datab´azov´ ych aplikac´ı, ∙ jednoduch´e pouˇzit´ı, ∙ jedn´a se sice o out-of-container testov´an´ı, ale pˇri pouˇzit´ı spolu s Hibernate testujeme EJB metody mimo kontejner, avˇsak v podstatˇe ve stejn´em prostˇred´ı (pomoc´ı stejn´eho objektovˇe relaˇcn´ıho mapov´ an´ı), J2EE funkce jako napˇr. interceptory samozˇrejmˇe ale otestovat nem˚ uˇzeme. Nev´yhody: ∙ program´ ator se mus´ı uˇcit ˇc´ asteˇcnˇe nov´e API, to je vˇsak minim´aln´ı nev´ yhoda vzhledem k tomu, kolik n´ asledn´e pouˇzit´ı nov´ ych funkc´ı uˇsetˇr´ı ˇcasu
˚ E ´ ZPUSOBY ˚ ´ ´I ENTERPRISE JAVA BEANS 7.1. RUZN TESTOVAN
7.1.2
87
Moˇ znosti in-container testov´ an´ı
V pˇr´ıpadˇe testov´ an´ı uvnitˇr J2EE kontejneru je takˇrka nutn´e pouˇz´ıt nˇejak´ y framework, kter´ y n´am usnadn´ı pr´ aci. V n´ asleduj´ıc´ım textu si pˇredstav´ıme dva nejzn´amˇejˇs´ı. Cactus Cactus framework [15] nab´ız´ı ucelen´e ˇreˇsen´ı pro in-container testov´an´ı. Je zaloˇzen na knihovnˇe JUnit a d´ ale ji rozˇsiˇruje. Pro vytvoˇren´ı testu je nutno rozˇs´ıˇrit jednu z n´asleduj´ıc´ıch tˇr´ıd: ∙ ServletTestCase, ∙ JspTestCase nebo ∙ FilterTestCase. Na obr´ azku 7.1 je zobrazeno sch´ema, kter´e popisuje fungov´an´ı frameworku. YYYTestCase na obr´ azku pˇredstavuje nˇekterou z v´ yˇse uveden´ ych tˇr´ıd. Obr´azek je z´amˇernˇe (pro pˇrehlednost) ponech´ am v angliˇctinˇe.
1
begin() beginXxx()
4 2
3
Redirector Proxy
YYYTestCase 7 8
YYYTestCase 6 5
endXxx() end()
Client side
setUp() testXxx() tearDown()
Server side
Server side classes
Obr´azek 7.1: Diagram fungov´ an´ı testovac´ıho frameworku Cactus. Obr´azek je pˇrevzat´ y z [15]. Testov´ an´ı kaˇzd´e metody testXXX() um´ıstˇen´e ve tˇr´ıdˇe zdˇedˇen´e od YYYTestCase pak prob´ıh´ a dle obr´ azku takto: 1. JUnit TestRunner zavol´ a metodu YYYTestCase.runTest(). Pokud existuje metoda begin(WebRequest), je v tomto okamˇziku spuˇstˇena. Parametr WebRequest slouˇz´ı k pˇred´ an´ı r˚ uzn´ ych informac´ı jako napˇr. HTTP hlaviˇcky, HTTP parametr˚ u apod. Metoda runTest() nakonec spust´ı volitelnou metodu beginXXX(WebRequest). 2. Se serverem je nav´ az´ ano HTTP spojen´ı, skrze nˇejˇz Redirector Proxy pˇrijme parametr WebRequest. 3. Redirector Proxy bˇeˇz´ıc´ı na serveru vytvoˇr´ı instanci naˇseho testu a nastav´ı vˇsechny implicitn´ı objekty (promˇenn´e tˇr´ıdy YYYTestCase).
´ ´I KAPITOLA 7. TESTOVAN
88
4. Redirector Proxy zavol´ a metody setUp(), testXXX a tearDown um´ıstˇen´e v naˇsem testu. 5. testXXX() metody spouˇstˇej´ı serverovou aplikaˇcn´ı logiku, kter´a m´a b´ yt otestov´ana. Vyuˇz´ıv´a se standardn´ıch JUnit metod jako napˇr. assert() nebo fail(). 6. Pokud test selˇze, metoda testXXX() vyhod´ı v´ yjimku, kter´a je zachycena v Redirector Proxy. 7. Informace o pˇr´ıpadn´e v´ yjimce jsou posl´any zpˇet na klientskou stranu a v´ yjimka je standardnˇe vytiˇstˇena pomoc´ı knihovny JUnit. 8. Pokud ˇz´ adn´ a v´ yjimka vyhozena nebyla, je zavol´ana metoda endXXX(WebResponse) (pokud existuje), ve kter´e je moˇzn´e zkontrolovat informace poslan´e zpˇet JSP str´ankou ˇci servletem. Na konci kaˇzd´eho testu je zavol´ana metoda end(). V´yhody: ∙ velmi komplexn´ı ˇreˇsen´ı pro in-container testov´an´ı, ∙ st´ale se vyv´ıjej´ıc´ı projekt, provˇeˇren´ y mnoha velk´ ymi firmami, ∙ vˇetˇsina pr´ ace je zautomatizov´ ana. Nev´yhody: ∙ jelikoˇz potˇrebujeme v naˇsem pˇr´ıpadˇe otestovat pouze EJB tˇr´ıdy, je pouˇzit´ı tohoto frameworku trochu tˇeˇzkop´ adn´e (je urˇcen pro komplexn´ı testov´an´ı servlet˚ u, JSP str´anek a mimo jin´ e i Enterprise Java Beans), ∙ vˇetˇsinu funkc´ı frameworku bychom nemohli pouˇz´ıt a testov´an´ı EJB tˇr´ıd by sest´avalo z klasick´eho JUnit testov´ an´ı s tou nev´ yhodou, ˇze bychom museli EJB tˇr´ıdy nasadit na server (prov´est deploy). OpenEJB V tomto pˇr´ıpadˇe se nejedn´ a o framework urˇcen´ y pˇr´ımo k testov´an´ı, ale o kompletn´ı implementaci aplikaˇcn´ıho serveru podporuj´ıc´ıho EJB 3.0. Nejvˇetˇs´ı vyuˇzit´ı tohoto projektu vˇsak spoˇc´ıv´ a pr´ avˇe v ulehˇcen´ı in-container test˚ u. Aplikaˇcn´ı server lze totiˇz spustit pˇr´ımo v k´odu, ide´alnˇe tedy v metodˇe setUp(): 1 2 3 4 5 6
private InitialContext initialContext; ... protected void setUp() throws Exception { Properties properties = new Properties(); properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
7
initialContext = new InitialContext(properties);
8 9
}
´ ZPUSOB ˚ ´ ´I 7.2. VYBRANY TESTOVAN
89
Pr˚ ubˇeh testu pak prob´ıh´ a standardnˇe, jako bychom pracovali s aplikac´ı nasazenou na serveru: 1 2
public void testCalculatorViaLocalInterface() throws Exception { Object object = initialContext.lookup("CalculatorImplLocal");
3
assertNotNull(object); assertTrue(object instanceof CalculatorLocal); CalculatorLocal calc = (CalculatorLocal) object; assertEquals(10, calc.sum(4,6)); assertEquals(12, calc.multiply(3,4));
4 5 6 7 8 9
} V´yhody: ∙ v´ yborn´ y kompromis mezi rychl´ ymi, ale m´enˇe spolehliv´ ymi out-of-container testy a pomal´ ymi testy pˇr´ımo na re´ aln´em aplikaˇcn´ım serveru, ∙ psan´ı test˚ u je velmi jednoduch´e, nen´ı potˇreba ˇz´adn´ ych speci´aln´ıch tˇr´ıd, staˇc´ı z´akladn´ı knihovna JUnit. Nev´yhody: ∙ jedn´ a se sice o in-container testov´an´ı, avˇsak prostˇred´ı, ve kter´em jsou testy spouˇstˇen´e (OpenEJB aplikaˇcn´ı server), neodpov´ıd´a pˇresnˇe tomu, ve kter´em pak bude projekt nasazen (napˇr. na server Glassfish).
7.2
Vybran´ y zp˚ usob testov´ an´ı
Z uveden´eho pˇrehledu je zˇrejm´e, ˇze neexistuje ˇz´adn´ y ide´aln´ı zp˚ usob testov´an´ı Enterprise Java Beans. Vˇzdy mus´ıme pˇristoupit na nˇejak´ y kompromis. Testy mohou b´ yt velmi rychl´e, ale ne tak spolehliv´e nebo naopak velice pomal´e, ale zaruˇcuj´ıc´ı bezchybn´e otestov´an´ı aplikace. Projekt OpenEJB se zd´ a b´ yt pˇr´ıjemn´ ym kompromisem, proto byl pouˇzit pro otestov´ an´ı r˚ uzn´ ych specifick´ ych funkc´ı aplikace (napˇr´ıklad interceptor˚ u), kter´e nemohou b´ yt otestov´ any mimo kontejner. Samotn´e metody EJB tˇr´ıd byly vˇsak testov´any pˇri v´ yvoji pomoc´ı frameworku Unitils [85], coˇz umoˇznilo rychl´ y v´ yvoj ve stylu Test Driven Development.
90
´ ´I KAPITOLA 7. TESTOVAN
Kapitola 8
Z´ avˇ er 8.1
Zhodnocen´ı v´ ysledk˚ u
Tato diplomov´ a pr´ ace se skl´ ad´ a ze dvou hlavn´ıch ˇc´ast´ı. Prvn´ı z nich je ˇ c´ ast ryze teoretick´ a a podrobnˇe popisuje vzd´ alen´e vol´an´ı procedur, jeho princip, historii i dneˇsn´ı v´ yznam a vybran´e dalˇs´ı technologie, kter´e ze vzd´alen´eho vol´an´ı procedur vych´azej´ı. Jedn´a se zejm´ena o technologii Java RMI, kter´ a byla pouˇzita v implementaˇcn´ı ˇc´asti. V druh´e ˇc´ asti byl pak na platformˇe Java Enterprise Edition u ´spˇeˇsnˇe implementov´ an serverov´ y modul informaˇ cn´ıho syst´ emu, kter´ y poskytuje prostˇredky pro spr´avu bytov´ ych dom˚ u. Je kladen d˚ uraz na ˇsirok´e pouˇzit´ı tohoto syst´emu (podpora pro r˚ uzn´e typy majitel˚ u jako napˇr. sdruˇzen´ı vlastn´ık˚ u ˇci druˇzstvo) i na unik´atn´ı funkci ˇcasov´ ych ˇrez˚ u, kterou v t´eto podobˇe nenajdete v ˇz´ adn´em konkurenˇcn´ım ˇreˇsen´ı. Tato funkce umoˇzn ˇuje proch´ azet stav dat syst´emu k libovoln´emu dni v minulosti (jmenujme kupˇr´ıkladu b´ yval´eho majitele bytu), ale i v budoucnosti (pokud se zde nach´ azej´ı nˇejak´a data - m˚ uˇze to b´ yt napˇr´ıklad budouc´ı n´ajemn´ık, kter´ y m´a jiˇz podepsanou smlouvu s n´astupem za dva mˇes´ıce). V analytick´e ˇc´ asti byly probr´any poˇzadavky na syst´em s ohledem na budouc´ı rozˇs´ıˇren´ı. Jsou rozdˇeleny do tˇr´ı priorit, pˇriˇcemˇz implementace byla zamˇeˇrena na funkce priority nejvyˇsˇs´ı. Co je d˚ uleˇzit´e zm´ınit, tato pr´ace nebere v potaz, jak´ ym zp˚ usobem jsou funkce syst´emu prezentov´ any uˇzivateli a jak´ ym zp˚ usobem s nimi m˚ uˇze pracovat. Tuto ˇc´ast popisuje kolega Petr Horsk´ y ve sv´e diplomov´e pr´aci Klientsk´ y modul informaˇcn´ıho syst´emu jako plnohod” notn´a webov´ a aplikace“, kter´ a se zab´ yv´a jedn´ım z moˇzn´ ych klientsk´ ych modul˚ u popisovan´eho IS. N´avrh datov´eho modelu je pak natolik univerz´aln´ı, ˇze rozˇs´ıˇren´ı informaˇcn´ıho syst´emu o funkce niˇzˇs´ıch priorit bude velmi jednoduch´e a nebude vyˇzadovat ˇz´adn´e z´asahy do z´akladn´ı struktury datab´ aze. Na u ´rovni datab´ azov´e vrstvy bylo pouˇzito objektovˇe-relaˇcn´ıho mapov´an´ı (konkr´etnˇe frameworku Hibernate jako implementace Java Persistence API), coˇz je technika, kter´a mapuje datab´ azov´e entity na standardn´ı Java tˇr´ıdy, a nab´ız´ı program´atorovi mnoho v´ yhod plynouc´ıch z tohoto pˇr´ıstupu. Serverov´ y modul poskytuje jak´emukoli klientsk´emu modulu rozhran´ı pro vol´an´ı metod definovan´ ych pomoc´ı technologie Enterprise Java Beans, kter´a je souˇc´ast´ı platformy Java
91
´ ER ˇ KAPITOLA 8. ZAV
92
Enterprise Edition. Tato klient-server komunikace je pak postavena na Java RMI, coˇz je objektov´a verze vzd´ alen´eho vol´ an´ı procedur. Hlavn´ım pˇr´ınosem t´eto pr´ ace je vznik serverov´eho modulu informaˇcn´ıho syst´emu pro spr´avu nemovitost´ı, kter´ y nab´ıdne spolu s klientsk´ ym modulem implementovan´ ym Petrem Horsk´ y velmi komplexn´ı aplikaci s nˇekolika unik´atn´ımi funkcemi, jimiˇz ˇz´adn´e st´avaj´ıc´ı ˇreˇsen´ı nedisponuje. Nejvˇetˇs´ım pˇr´ınosem pro mˇe je pak zejm´ena z´ısk´an´ı zkuˇsenost´ı v oblasti pokroˇcil´eho programov´ an´ı v jazyce Java. V neposledn´ı ˇradˇe bylo velmi zaj´ımav´e vytvoˇrit ucelen´ y dokument popisuj´ıc´ı vzd´ alen´e vol´ an´ı procedur. Z´akladn´ı princip t´eto technologie je jiˇz velmi star´ y, avˇsak st´ ale aktu´ aln´ı a hojnˇe vyuˇz´ıvan´ y.
8.2
Dalˇ s´ı v´ yvoj aplikace
Serverov´ y modul je plnˇe funkˇcn´ı a nab´ız´ı zejm´ena funkce prvn´ı priority tak, jak byly pops´any v anal´ yze. Funkce niˇzˇs´ıch priorit jsou vˇsak tak´e pops´any, tud´ıˇz by je bylo vhodn´e navrhnout a implementovat. Existuje napˇr´ıklad zaj´ımav´a moˇznost, kter´a by se nab´ızela po implementaci rozˇsiˇruj´ıc´ıch funkc´ı pro komunikaci (n´ astˇenka, diskuzn´ı f´orum apod.). Z´akazn´ık˚ um by mohla b´ yt nab´ızena speci´ aln´ı verzi aplikace, kter´a by poskytovala pouze jednoduchou komunikaˇcn´ı platformu pro majitele, n´ ajemn´ıky ˇci sousedy. V listopadu 2010 jsem navˇst´ıvil konferenci Google Developer Day, kde jsem byl podrobnˇe sezn´amen se sluˇzbou Google App Engine. Tato sluˇzba umoˇzn ˇuje nasazen´ı aplikace na vzd´alen´ y server spoleˇcnosti Google (cloud) bez nutnosti jeho konfigurace a spr´avy. Z´akladn´ı pouˇzit´ı dokonce tato firma nab´ız´ı zcela zdarma. Moˇznost provozov´ an´ı aplikace t´ımto zp˚ usobem je velice zaj´ımav´a a umoˇzn ˇuje velmi efektivn´ı ˇsk´alov´an´ı v´ ykonu. Nˇekolik ˇc´ ast´ı implementace by vˇsak muselo b´ yt upraveno, protoˇze Google App Engine nepodporuje nˇekter´e technologie, kter´e byly v implementaci pouˇzity. Z finanˇcn´ıho hlediska by se vˇsak moˇzn´ a tato u ´prava v brzk´e dobˇe vr´atila. Bude ale potˇreba tuto moˇznost podrobnˇe zanalyzovat a zv´ aˇzit vˇsechna pro a proti.
Literatura [1] J. ˚ Akerberg. Distributed Component Object Model. 2005. [2] K. Anuja. Object Relational Mapping. 2008. [3] Apache Ant. http://ant.apache.org. [4] Apache Cayenne. http://cayenne.apache.org. [5] Apache JDO - Which Persistence Specification? http://db.apache.org/jdo/jdo_v_jpa.html. [6] Apache Maven. http://maven.apache.org. [7] Apache Subversion. http://subversion.apache.org. [8] K. P. Birman. Corba: The common object request broker architecture. In Reliable Distributed Systems, pages 119–140. Springer New York, 2005. [9] A. Birrell and B. J. Nelson. Implementing remote procedure calls. ACM Trans. Comput. Syst., 2(1):39–59, 1984. [10] A. D. Birrell, R. Levin, R. M. Needham, and M. D. Schroeder. Grapevine - an exercise in distributed computing. Communications of the ACM, 25(4):260–274, 1982. [11] R. Braden. Requirements for Internet Hosts - Communication Layers. RFC 1122 (Standard), Oct. 1989. Updated by RFCs 1349, 4379. [12] Burlap protocol. http://www.caucho.com/resin-3.0/protocols/burlap.xtp. [13] M. Busch and N. Koch. Rich Internet Applications. 2009. [14] Cactus Domus. http://www.catusdomus.cz. [15] Cactus Test Framework. http://jakarta.apache.org/cactus.
93
94
LITERATURA
[16] P. Chung, Y. Huang, S. Yajnik, D. Liang, J. Shih, C. Wang, and Y. Wang. DCOM and CORBA side by side, step by step, and layer by layer. C++ Report, 10(1):18–30, 1998. [17] B. Collins-Sussman, B. Fitzpatrick, and C. Pilato. Version control with subversion. O’Reilly Media, Inc., 2004. [18] D. Crockford. The application/json Media Type for JavaScript Object Notation (JSON). RFC 4627 (Informational), July 2006. [19] DataNucleus AccessPlatform. http://www.datanucleus.org/products/accessplatform. [20] DbMaintain. http://dbmaintain.sourceforge.net. [21] DbUnit. http://www.dbunit.org. [22] L. DeMichiel. JSR 317: Java Persistence 2.0. http://jcp.org/en/jsr/detail?id=317. [23] P. Denning. The ARPANET after twenty years. American Scientist, 77(6):530–534, 1989. [24] R. Dewsbury. Google web toolkit applications. Prentice Hall, 2007. [25] Distributed object system for Ruby. http://ruby-doc.org/stdlib/libdoc/drb/rdoc/index.html. [26] A. Dubey and D. Wagle. Delivering software as a service. The McKinsey Quarterly, 2007. [27] EasyMock. http://easymock.org. [28] EclipseLink. http://www.eclipse.org/eclipselink. [29] M. Eisler. XDR: External Data Representation Standard. RFC 4506 (Standard), May 2006. [30] R. Fielding. Architectural styles and the design of network-based software architectures. PhD thesis, Citeseer, 2000. [31] E. Gamma, R. Helm, R. Johnson, and J. Vlissides. N´ avrh program˚ u pomoc´ı vzor˚ u. Grada, 2003. [32] Generic Light Entity Adapter. http://noon.gilead.free.fr/gilead. [33] W. Grosso. Java RMI. O’Reilly & Associates, Inc., Sebastopol, CA, USA, 2001.
LITERATURA
95
[34] GWT: Communicate with a Server. http://code.google.com/webtoolkit/doc/latest/DevGuideServerCommunication. html. [35] M. Hall. Java: servlety a str´ anky JSP. Neocortex, 2001. [36] M. Henning. The rise and fall of corba. Queue, 4(5):28–34, 2006. [37] Hessian binary web service protocol. http://hessian.caucho.com. [38] Hibernate. http://www.hibernate.org. [39] F. Hoch, M. Kerr, and A. Griffith. Software as a service: Strategic backgrounder. Software & Information Industry Association, 2001. [40] D. Hou and H. Xia. Design of distributed architecture based on java remote method invocation technology. In ESIAT ’09: Proceedings of the 2009 International Conference on Environmental Science and Information Application Technology, pages 618–621, Washington, DC, USA, 2009. IEEE Computer Society. [41] HyperSQL. http://hsqldb.org. [42] J. Irwin, G. Kickzales, J. Lamping, A. Mendhekar, C. Maeda, C. Lopes, and J. Loingtier. Aspect-oriented programming. Proceedings of ECOOP, IEEE, Finland, pages 220–242, 1997. [43] M. Jakl. Representational State Transfer. [44] Java remote method invocation - distributed computing for java. White paper, Sun Microsystems. http://www.oracle.com/technetwork/java/javase/tech/index-jsp-138781. html. [45] JBoss Needle. http://jbosscc-needle.sourceforge.net/jbosscc-needle/1.0. [46] E. Jendrock, J. Ball, D. Carson, I. Evans, S. Fordin, and K. Haase. The java EE 5 Tutorial. Addison-Wesley, 2006. [47] C. Jensen and R. Snodgrass. Temporal data management. Knowledge and Data Engineering, IEEE Transactions on, 11(1):36–44, 2002. [48] JPA Performance Benchmark. http://www.jpab.org. [49] Json-rpc 1.1 specification. http://json-rpc.org/wd/JSON-RPC-1-1-WD-20060807.html.
96
LITERATURA
[50] M. Keith and M. Schincariol. Pro EJB 3: Java Persistence API. Apress, 2006. [51] kSOAP 2. http://ksoap2.sourceforge.net. [52] A. Lal, J. Formichelli, and C. Pool. The java virtual machine. 1998. [53] S. S. Laurent, E. Dumbill, and J. Johnston. Programming Web Services with XML-RPC. O’Reilly & Associates, Inc., Sebastopol, CA, USA, 2001. [54] L. Linnamaa. Test-Driven Development. In Seminar on Current Trends in Software Industry, Department of Computer Science, University of Helsinki, 2008. [55] T. Mackinnon, S. Freeman, and P. Craig. Endo-testing: unit testing with mock objects. Extreme programming examined, pages 287–301, 2001. [56] M. Mal´ y. Rest: architektura pro webov´e api. http://zdrojak.root.cz/clanky/rest-architektura-pro-webove-api. [57] J. Malenfant, M. Jacques, and F. Demers. A tutorial on behavioral reflection and its implementation. In Proc. Reflection, volume 96, pages 1–20. [58] G. Mein, S. Pal, G. Dhondu, T. Anand, A. Stojanovic, M. Al-Ghosein, and P. Oeuvray. United states patent no. 7146618. http://www.google.cz/patents?id=7Bt9AAAAEBAJ. [59] O.K. Soft. http://www.oksoft.cz. [60] OpenJPA. http://openjpa.apache.org. [61] Oracle Workspace Manager. http://www.oracle.com/technetwork/database/enterprise-edition/ index-087067.html. [62] D. Panda, R. Rahman, and D. Lane. Ejb 3 in Action. Manning Publications Co., Greenwich, CT, USA, 2007. [63] M. P. Papazoglou. Service-oriented computing: Concepts, characteristics and directions. In WISE, pages 3–12. IEEE Computer Society, 2003. [64] PostgreSQL. http://www.postgresql.org. [65] PostgreSQL - temporal package. http://pgfoundry.org/projects/temporal. [66] Remote Method Invocation (RMI). http://java.sun.com/developer/onlineTraining/rmi/RMI.html.
LITERATURA
97
[67] Remote Python Call. http://rpyc.wikidot.com. [68] M. Slee, A. Agarwal, and M. Kwiatkowski. Thrift: Scalable Cross-Language Services Implementation. 2007. [69] J. Smart. An introduction to maven 2. JavaWorld Magazine., 2005. http://www.javaworld.com/javaworld/jw-12-2005/jw-1205-maven.html. [70] R. Snodgrass. Temporal databases. Theories and Methods of Spatio-Temporal Reasoning in Geographic Space, pages 22–64, 1992. [71] R. Snodgrass. Developing Time-Oriented Database Applications in SQL. 2009. [72] Soap version 1.2. http://www.w3.org/TR/soap12-part1. [73] SOFTWARE 5P. http://www.ofsoft.cz. [74] Spring ROO. http://www.springsource.org/roo. [75] R. Srinivasan. RPC: Remote Procedure Call Protocol Specification Version 2. RFC 1831 (Proposed Standard), Aug. 1995. Obsoleted by RFC 5531. [76] STARLIT, software a sluˇzby pro spr´avu dom˚ u. http://www.starlit.cz. [77] A. Steiner. TimeDB. http://www.timeconsult.com/Software/Software.html. [78] A. Steiner. A generalisation approach to temporal data models and their implementations. PhD thesis, Swiss Federal Institute of Technology Z¨ urich, 1998. [79] Sun Microsystems. RPC: Remote Procedure Call Protocol specification. RFC 1050 (Historic), Apr. 1988. Obsoleted by RFC 1057. [80] Sun Microsystems. RPC: Remote Procedure Call Protocol specification: Version 2. RFC 1057 (Informational), June 1988. [81] TestNG. http://testng.org. [82] R. Thurlow. RPC: Remote Procedure Call Protocol Specification Version 2. RFC 5531 (Draft Standard), May 2009. [83] TopLink. http://www.oracle.com/technetwork/middleware/toplink/overview. [84] K. Torp, C. Jensen, and R. Snodgrass. Stratum approaches to temporal DBMS implementation. In Database Engineering and Applications Symposium, 1998. Proceedings. IDEAS’98. International, pages 4–13. IEEE, 2002.
98
LITERATURA
[85] Unitils. http://www.unitils.org. [86] J. Waldo. Remote procedure calls and java remote method invocation. IEEE concurrency, 6(3):5–7, 1998. [87] Web Service Definition Language. http://www.w3.org/TR/wsdl. [88] T. Wennerstr¨ om, J. Jespersen, and M. Lundquist. Simple Object Access Protocol A basic overview. 2002. [89] J. White. High-level framework for network-based resource sharing. RFC 707, 1975. [90] Xml-rpc home page. http://www.xmlrpc.com. [91] H. Yang, E. Tempero, and H. Melton. An empirical study into use of dependency injection in Java. In Software Engineering, 2008. ASWEC 2008. 19th Australian Conference on, pages 239–247. IEEE, 2008. [92] Your First Cup: An Introduction to the Java EE Platform. http://download.oracle.com/javaee/6/firstcup/doc/.
Pˇ r´ıloha A
Seznam zkratek OS Operaˇcn´ı syst´em (Operating System) RPC Remote Procedure Call RMI Remote Method Invocation IS Informaˇcn´ı syst´em RFC Request for Comments ARPANET Advanced Research Projects Agency Network FTP File Transfer Protocol RJE Remote Job Entry Protocol IT Informaˇcn´ı technologie TCP Transmission Control Protocol IP Internet Protocol XDR External Data Representation Standard NCS Network Computing System DCE/RPC Distributed Computing Environment / Remote Procedure Calls CORBA Common Object Request Broker Architecture DCOM Distributed Component Object Model RIA Rich Internet Applications SaaS Software as a service WSDL Web Service Definition Language SOAP Simple Object Access Protocol
99
100
ˇ ´ILOHA A. SEZNAM ZKRATEK PR
XML Extensible Markup Language HTTP Hypertext Transfer Protocol REST Representational State Transfer API Application programming interface JSON JavaScript Object Notation COM Component Object Model EJB Enteprise Java Bean(s) GWT Google Web Toolkit AMF Action Message Format RPyC Remote Python Call PYRO PYthon Remote Objects DRb Distributed object system for Ruby JVM Java Virtual Machine JDK Java Development Kit (Java) EE (Java) Enterprise Edition JSP Java Server Pages HTML HyperText Markup Language EIS Enterprise Information Systems (T)SQL (Temporal) Structured Query Language DBMS Database Management System ORM Objektovˇe-relaˇcn´ı mapov´ an´ı (Object-relational mapping) JPA Java Persistence API JDO Java Data Objects HSQLDB Hyper Structured Query Language Database ISA Is a AOP Aspektovˇe orientovan´e programov´an´ı GILEAD Generic Light Entity Adapter SVN Subversion
101
URL Unique Resource Locator POM Project Object Model JDBC Java Database Connectivity J2EE Java 2 Enterprise Edition TDD Test-Driven Development
102
ˇ ´ILOHA A. SEZNAM ZKRATEK PR
Pˇ r´ıloha B
Popis instalace B.1
Java Runtime Environment
Nainstalujte JRE, webov´e str´ anky: http://www.oracle.com/technetwork/java/javase/downloads.
B.2
Server Glassfish
Nainstalujte aplikaˇcn´ı server Glassfish, webov´e str´anky: http://glassfish.java.net/public/downloadsindex.html.
B.3
Nasazen´ı EJB modulu
V adres´ aˇri cesta_k_instalaci_glassfish/bin se nach´az´ı spustiteln´ y soubor asadmin (s pˇr´ıponou dle operaˇcn´ıho syst´emu). N´asleduj´ıc´ım pˇr´ıkazem nasad’te EJB modul (n´aˇs serverov´ y modul informaˇcn´ıho syst´emu) na server: asadmin deploy --user jmeno_admina --password heslo_admina cesta_k_souboru/fman-ejb.jar
B.4
Spuˇ stˇ en´ı serveru
Spust’te server Glassfish pˇr´ıkazem: asadmin start-domain domain1 Tento pˇr´ıkaz proved’te v adres´ aˇri, kter´ y byl uveden v pˇredchoz´ım bodˇe (B.3).
103
ˇ ´ILOHA B. POPIS INSTALACE PR
104
B.5
Pˇ ripraven´ y EJB modul
V tomto okamˇziku je EJB modul pˇredstavuj´ıc´ı serverov´ y modul naˇseho informaˇcn´ıho syst´emu pˇripraven k poskytov´ an´ı sluˇzeb klientsk´emu modulu skrze implementovan´e rozhran´ı.
Pˇ r´ıloha C
Uk´ azky k´ odu Nyn´ı si uk´ aˇzeme nˇekter´e zaj´ımav´e ˇc´asti zdrojov´eho k´odu. Nejprve to budou vybran´e funkˇcn´ı metody EJB, tedy hlavn´ı funkce aplikaˇcn´ı logiky, a pot´e kontrola uˇzivatelsk´ ych pr´av pomoc´ı interceptoru.
C.1
Funkˇ cn´ı metody EJB
Metoda pro pˇrid´ an´ı prostoru: 1 2
@RequiredPermissions(EjbPermission.Space_ADD) public void addSpace(SpaceH spaceH) throws DatabaseException {
3 4 5 6
EjbHelper.checkNotNullConstraints(spaceH.getSpace()); userBean.checkLoggedInBuildingManager(spaceH.getSpace() .getBuilding().getId());
7 8 9 10 11 12
EjbHelper.checkNullId(spaceH.getSpace()); EjbHelper.checkNullToDate(spaceH); EjbHelper.checkDependentHistoryEntityFromDate(spaceH, buildingBean.getFirstBuilding(spaceH.getSpace() .getBuilding().getId()));
13 14
UserTransaction ut = ctx.getUserTransaction();
15 16
Space space = spaceH.getSpace();
17 18 19 20 21
try { ut.begin(); em.persist(space); em.flush();
22 23
spaceH.setSpace(space);
105
ˇ ´ILOHA C. UKAZKY ´ ´ PR KODU
106
spaceH.getSpaceHPK().setSpaceId(space.getId()); EjbHelper.checkNotNullConstraints(spaceH); em.persist(spaceH); ut.commit();
24 25 26 27
} catch (CannotUpdateException e) { try { ut.rollback(); } catch (SystemException sysEx) { throw new TransactionException( "Rollback failed: " + sysEx.getMessage()); } throw e; }
28 29 30 31 32 33 34 35 36 37 38 39
} Metoda pro smaz´ an´ı historick´e zmˇeny prostoru:
1 2 3 4 5
@RequiredPermissions(EjbPermission.Space_UPDATE) public void historyRemoveSpace(SpaceHPK id, SpaceHPK substitutiveSpaceHPK) throws DatabaseException, IllegalStateException { UserTransaction ut = ctx.getUserTransaction();
6 7 8
SpaceH oldSpaceH = this.getSpace(id.getSpaceId(), id.getFromDate()); EjbHelper.checkEntityWasFound(oldSpaceH, SpaceH.class, id);
9 10 11
userBean.checkLoggedInBuildingManager( oldSpaceH.getSpace().getBuilding().getId());
12 13 14
SpaceH beforeOldSpaceH = this.getSpace(oldSpaceH.getSpace().getId(), EjbHelper.getYesterday(oldSpaceH.getFromDate()));
15 16 17 18 19 20
SpaceH afterOldSpaceH = null; if (oldSpaceH.getToDate() != null) { afterOldSpaceH = this.getSpace(oldSpaceH.getSpace().getId(), EjbHelper.getTomorrow(oldSpaceH.getToDate())); }
21 22 23 24 25 26 27
SpaceH substitutiveSpaceH = null; if (substitutiveSpaceHPK != null) { substitutiveSpaceH = this.getSpace(substitutiveSpaceHPK.getSpaceId(), substitutiveSpaceHPK.getFromDate()); EjbHelper.checkEntityWasFound(substitutiveSpaceH, SpaceH.class, substitutiveSpaceHPK);
ˇ ´I METODY EJB C.1. FUNKCN
}
28 29
try { ut.begin();
30 31 32
EjbHelper.checkPossibleHistoryEntitySubstitutiveRemove( substitutiveSpaceH, beforeOldSpaceH, afterOldSpaceH); em.remove(oldSpaceH);
33 34 35 36
if ((substitutiveSpaceH != null) && substitutiveSpaceH.equals(beforeOldSpaceH)) { substitutiveSpaceH.setToDate(oldSpaceH.getToDate()); em.merge(substitutiveSpaceH); } else if ((substitutiveSpaceH != null) && substitutiveSpaceH.equals(afterOldSpaceH)) { em.remove(substitutiveSpaceH); em.flush(); substitutiveSpaceH.setFromDate(oldSpaceH.getFromDate()); em.persist(substitutiveSpaceH); } else if (substitutiveSpaceH != null) { throw new CannotUpdateException(oldSpaceH.getClass(), CannotUpdateReason.HISTORY_INCONSISTENCY); }
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
ut.commit(); } catch (CannotUpdateException e) { try { ut.rollback(); } catch (SystemException sysEx) { throw new TransactionException( "Rollback failed: " + sysEx.getMessage()); } throw e; }
54 55 56 57 58 59 60 61 62 63 64 65 66
} Metoda pro z´ısk´ an´ı vˇsech spr´ avc˚ u domu k dan´emu datu:
1 2 3 4
@RequiredPermissions(EjbPermission.BuildingManager_VIEW) public Collection<BuildingManager> getBuildingManagers( Integer buildingId, Date date) {
107
ˇ ´ILOHA C. UKAZKY ´ ´ PR KODU
108
userBean.checkLoggedInBuildingManager(buildingId); date = EjbHelper.getResolvedDate(date);
5 6 7
Query query = em.createQuery( "SELECT bm FROM BuildingManager bm " + "LEFT JOIN FETCH bm.building" + "LEFT JOIN FETCH bm.universalPerson" + "LEFT JOIN FETCH bm.managerRole " + "WHERE bm.building.id = :buildingId " + "AND ((bm.buildingManagerPK.fromDate" + " <= :date AND bm.toDate >= :date) " + "OR (bm.buildingManagerPK.fromDate" + " <= :date AND bm.toDate IS NULL))"); query.setParameter("buildingId", buildingId); query.setParameter("date", date);
8 9 10 11 12 13 14 15 16 17 18 19 20
List<BuildingManager> buildingManagersList = query.getResultList(); return buildingManagersList;
21 22 23
}
C.2 1
Interceptor na kontrolu uˇ zivatelsk´ ych pr´ av
public class PermissionsCheckInterceptor {
2
@EJB UserLocal userBean;
3 4 5
@AroundInvoke public Object checkPermissions(InvocationContext ctx) throws Exception { RequiredPermissions requiredPermissions = ctx.getMethod() .getAnnotation(RequiredPermissions.class); if (requiredPermissions != null) { for (EjbPermission requiredPermission : requiredPermissions.value()) { if (userBean.userHasPermission(requiredPermission)) { return ctx.proceed(); } }
6 7 8 9 10 11 12 13 14 15 16
throw new InvalidSessionException("User does not have required" + "permissions to perform an action.");
17 18
} return ctx.proceed();
19 20
}
21 22
}
Pˇ r´ıloha D
Obsah pˇ riloˇ zen´ eho CD Pˇriloˇzen´e CD je rozdˇeleno na tˇri hlavn´ı adres´aˇre: ∙ text\ - vlastn´ı text diplomov´e pr´ace v PDF spolu se zdrojov´ ym k´odem v LATEXu a vˇsemi pouˇzit´ ymi obr´ azky, ∙ install\ - soubory pro instalaci a spuˇstˇen´ı aplikace (resp. serverov´eho modulu), ∙ src\ - NetBeans projekt se zdrojov´ ymi k´ody. N´asleduje podrobn´ y v´ ypis obsahu CD: text\ text\dp.pdf text\dp-latex.zip install\ install\fman-ejb src\ src\fman-ejb.zip
109