Mendelova zemědělská a lesnická univerzita v Brně Provozně ekonomická fakulta
Multiplatformní osobní organizér v jazyce Java Bakalářská práce
Vedoucí práce: Ing. Petr Jedlička, Ph.D
Petr Gola
Brno 2009
Rád bych touto cestou poděkoval Ing. Petru Jedličkovi, Ph.D. za veškerou trpělivost, projevenou důvěru, rady a připomínky, které mi poskytl při zpracování bakalářské práce.
Prohlašuji, že jsem tuto bakalářskou práci včetně vyvíjeného programu, který je její neoddělitelnou součástí, zpracoval samostatně s použitím uvedené literatury a pod odborným vedením Ing. Petra Jedličky, Ph.D.
V Brně 26. května 2009
....................................................
4
Abstract Gola, P. Multiplatform personal manager in Java. Bc. Dissertation. Brno, 2009 This dissertation deals with features of current software personal management organizers (PIM). A new one is designed on the basis of identified deficiencies. The aim of this dissertation is creation maximum accessible personal information management in space and time on the Java platform.
Abstrakt Gola, P. Multiplatformní osobní organizér v jazyce Java. Bakalářská práce. Brno, 2009 Tato práce se zabývá možnostmi současnými softwarových osobních organizérů (PIM). Na základě analýzy zjištěných nedostatků je navržen nový softwarový osobní organizér. Cílem práce je vytvoření maximálně dostupného osobního organizéru v čase a prostoru realizovaného na platformě Java.
5
OBSAH
Obsah 1 Úvod
8
2 Cíl a metodika práce 10 2.1 Cíl práce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2 Metodika práce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3 Současná situace 11 3.1 Popis funkcí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.2 Zjištěné nedostatky . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4 Osobní organizér Laura 14 4.1 Návrh řešení zjištěných nedostatků . . . . . . . . . . . . . . . . . . . 14 4.2 Vhodné funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 5 Java jako multiplatforma 15 5.1 Multiplatformní aplikace . . . . . . . . . . . . . . . . . . . . . . . . . 15 5.2 J2SE, J2EE, J2ME . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 6 Implementace 6.1 Výběr vhodných technologií . . . 6.1.1 Maven . . . . . . . . . . . 6.1.2 Hibernate . . . . . . . . . 6.1.3 Spring framework . . . . . 6.1.4 Substance . . . . . . . . . 6.1.5 JSF a RichFaces . . . . . 6.2 Laura - Architektura . . . . . . . 6.3 LauraCommons - Společný základ 6.4 LauraBase - Virtuální databáze . 6.5 Laura - Aplikace . . . . . . . . . 6.5.1 Role . . . . . . . . . . . . 6.5.2 Úkoly . . . . . . . . . . . 6.5.3 Kalendář . . . . . . . . . . 6.5.4 Peněženka . . . . . . . . . 6.5.5 Poznámky . . . . . . . . . 6.6 LauraDesktop - J2SE . . . . . . . 6.7 LauraWeb - J2EE . . . . . . . . . 6.8 LauraMobile - J2ME . . . . . . . 6.9 Synchronizace . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
17 17 18 19 22 25 26 27 28 29 29 30 30 30 31 31 31 33 35 37
7 Diskuse
39
8 Závěr
40
OBSAH
6
9 Literatura
41
Přílohy
42
A Elektronická příloha
43
B Náhledy aplikace
44
PŘEHLED POUŽITÝCH ZKRATEK
Přehled použitých zkratek AJAX AWT GPL HBM HTML HQL J2EE J2ME J2SE JSF JSP JVM LGPL ORM PIM SQL SWT XHTML XML
Asynchronous JavaScript and XML Abstract Window Toolkit General Public Licence Hibernate Mapping HyperText Markup Language Hibernate Query Language Java 2 Enterprise Edition Java 2 Micro Edition Java 2 Standard Edition Java Server Faces Java Server Pages Java Virtual Machine Lesser General Public Licence Object-Relational Mapping Personal Information Management Structured Query Language Standard Widget Toolkit Extensible HyperText Markup Language Extended Markup Language
7
1 ÚVOD
1
8
Úvod
Osobní organizer je nástroj člověka, kterému by měl usnadnit jeho každodenní život po všech možných stránkách. Okolní svět, zvlášť ten současný, nás denně zasypává ohromným množstvím informací, s kterými potřebujeme dále pracovat. Osobní organizér vynalezl člověk za účelem ukládání, organizování a používání informací. Myšlenkou i cílem osobního organizéru je mít správnou informaci ve správné chvíli, na správném místě, ve správné formě a v dostatečné kvalitě k uskutečnění aktuální potřeby. Jedním ze stěžejních pilířů osobního organizéru je plánování a řízení času. Myšlení ve sféře osobního řízení se vyvíjelo obdobně jako v mnoha jiných oblastech lidského snažení. Stěžejní myšlenky, neboli hlavní vývojové proudy přicházely postupně, každá přinesla něco nového. Ve společenském rozvoji po agrární revoluci přišla revoluce průmyslová a po ní revoluce informační. Každý další vlna je zdrojem pokroku. Obdobně i ve sféře řízení času každá další následující generace vychází z předchozí, staví na ní a je dalším krokem na cestě k lepšímu řízení našeho života. Lidská společnost již zaznamenala 4 generace řízení času. Pro první generaci byla typická snaha vtisknout našemu životu řád. Prostředky byly zejména seznam úkolů a poznámky. Druhá generace byla dobou plánovacích kalendářů a diářů. Projevila se tedy snaha plánovat, dívat se dopředu. Třetí generace zavádí priority za účelem co nejlepšího využití času. Ukázalo se ale, že snaha o co nejúspornější využití času je často kontraproduktivní, Mnoho lidí díky tomuto plánování zanevřelo na různé metody plánování, protože rychle nabyli pocit, že je jejich život do posledního okamžiku naplánovaný. Dnes se prosazuje čtvrtá generace řízení času. Vychází z toho, že už samotný pojem „řízení časuÿ je chybný. Cílem není řídit nebo plánovat čas, ale řídit sami sebe.1 Dnešní osobní organizéry můžeme mimo používané „generaceÿ dělit ještě taky podle formy realizace na papírové a na softwarové. S příchodem moderní IT přicházejí do světa osobních organizérů dosud nevídané možnosti. Oproti papírovým předchůdcům mají mnohé výhody. Prakticky neomezenou zaznamenávající kapacitu, bohaté možnosti organizace, silné zabezpečení či velmi užitečné vyhledávání. Přesto se stále setkáme i s těmi papírovými. A to nejen u starší generace, která už příchod počítačové éry nechce dohánět. Mnoho manažerů, často velmi mladých lidí, používá papírové osobní organizéry. Také jej na některé z činností osobního managementu denně používám. Po několika diskuzích s ostatními a vlastním zamyšlení je důvod 1
COVEY, Stephen R. 7 návyků skutečně efektivních lidí (3)
1 ÚVOD
9
překvapivě jednoduchý. Dostupnost informací. Počítač není tolik spolehlivý, je závislý na elektrické energii. Nevezeme si jej sebou v dopravním prostředku, nejde s námi do kina ani do obchodu. A i kdybychom si ho sebou nosili, často nebudeme mít příliš chuť jej vytahovat např. kvůli pár informacím, co nakoupit.
2 CÍL A METODIKA PRÁCE
2 2.1
10
Cíl a metodika práce Cíl práce
Cílem této práce je navrhnout a realizovat vlastní softwarový osobní organizér se zaměřením na největším možnou míru dostupnosti uživateli s využitím jazyka Java. Dostupností budeme rozumět dostupnost jednou zaznamenaných informací do osobního organizéru jeho uživateli. S výhodou bude k tomuto účelu využit právě jazyk Java, který v současné době poskytuje neuvěřitelné možnosti přenositelnosti sestaveného řešení i programového kódu. V dnešní době již není počítač jen ta velká krabice pod stolem, ale jeho funkci může nahradit i dnes populárnější notebook či dokonce mobilní telefon. A právě mobilní zařízení (nejen mobilní telefon) mohou velkou mírou přispět k větší dostupnosti aplikace. Tato jednotlivá cílová zařízení můžeme označit jako platformy. Další možností řešení zmiňované dostupnosti je internet. Všudypřítomnost internetu je čím dál větší samozřejmostí a pokud se nám podaří zpřístupnit náš osobní organizér přes internet, umožníme tak uživateli přístup k informacím i skrz vypůjčené zařízení. Uživatel se pak nemusí tolik obávat poruchy jeho zařízení. Cílem této práce je tedy realizace maximálně přístupného multiplatformního osobního organizéru v jazyce Java.
2.2
Metodika práce
K dosažení cíle bude nejprve analyzována současná nabídka softwarových osobních organizérů a jejich nabízených funkcí. Z těch budou vybrány vhodné funkce pro návrh řešení vlastního multiplatformního osobního organizéru. Následně bude tento návrh implementován pro jednotlivé platformy či skupiny platforem. Jazyk Java poskytuje řešení na bázi edicí, které jsou vždy zaměřeny na určitou skupinu platforem. Implementace řešení tedy proběhne postupně ve všech třech aktuálně dostupných edicích jazyka Java - J2SE, J2EE a J2ME. Pro každou edici budou před implementací vybrány vhodné technologie (nástroje, knihovny nebo frameworky) a výsledná řešení budou porovnávána v oblastech náročnosti implementace, uživatelské přívětivosti a celkové přístupnosti výsledku.
3 SOUČASNÁ SITUACE
3
11
Současná situace
Vymezení pojmu osobní organizér (PIM) je poměrně široké, proto nemusí být vždy úplně jednoznačné, zda produkt spadá do kategorie PIM nebo ne. Prohlídkou nejméně stovky různých softwarů, které by mohly vyhovovat tomuto pojmu jsem dospěl k názoru, že za PIM je možno považovat jakýkoliv software, který se věnuje oblasti řízení času (time management), řízení úkolů (task management) nebo řízení znalostí (knowledge management). Pokud vymezíme definici PIM takto široce, zjistíme, že na softwarovém trhu je neuvěřitelně rozsáhlá nabídka. Po internetu vzniká mnoho různých míst2 , kde je vidět snaha udržovat seznam dostupných organizérů. Počty zde uvedených softwarů jdou do stovek. Bohužel, tyto seznamy trpí velkým množstvím neaktuálních záznamů. Navíc kvalita jednotlivých uvedených PIM je natolik rozdílná, že průchod tímto seznam se stává velmi neatraktivním a případného zájemce o hledání vhodného PIM pro osobní použití spolehlivě velmi rychle odradí. Také proto většina potenciální uživatelů PIM zůstává u softwarů, které jsou předinstalovány v dnešních operačních systémech.
3.1
Popis funkcí
Analýzou nabídky softwarových organizátorů byly pro jednotlivé oblasti zjištěny následující nejpočetněji zastoupené funkce: • Oblast řízení času – Kalendář – Připomínkovač • Oblast řízení úkolů – Úkoly • Oblast řízení znalostí – – – – – 2
Deník Poznámky Adresář kontaktů Archiv komunikace Peněženka
Tato místa mají většinou podobu veřejných seznamů s možností editace i pro návštěvníky. (8) (9) (10)
3 SOUČASNÁ SITUACE
12
– RSS/Atom čtečka Kalendář umožňuje plánování událostí - schůzky, narozeniny, výročí. Často je umožněno několik pohledů s rozdílným intervalem plánování - denní, týdenní, a měsíční. Připomínkovač je doplňková funkce většinou navázaná na kalendář, která připomíná uživateli blížící události nebo termíny plnění úkolů. Může upozorňovat i na nesplněné události po termínu. Úkoly slouží ke správě aktuálních úkolů uživatele. Často bohužel postrádají nějaké rozumnější členění a uživatel se musí v lepším případě spokojit s určením priorit. Takto jsou ovšem „zamíchányÿ úkoly související s rodinným životem spolu s pracovními záležitostmi. Uživatel je pak většinou nucen používat softwarový PIM pouze pro pracovní záležitosti, protože je nemyslitelné, aby na poradě vedení vytáhl seznam úkolů spolu osobními. Dalšími možnostmi jsou nesdílet informace s ostatními nebo používat dva různé nástroje či jen databáze. Deník je zápisník denních událostí tak, jak je známý v původní papírové podobě. Poznámky je možno využít k rychlému zaznamenání myšlenek či jiných zajímavých informací. Adresář kontaktů umožňuje správu kontaktů a dalších detailů k nim (telefonní číslo, adresa, email,. . .). Vhodnou funkcí je vyhledávání. Archiv komunikace slouží k archivaci komunikace uživatele (emaily, zprávy). Může být napojen k emailovém klientovi nebo také k instant messaging klientovi (ICQ, MSN, Jabber). Vhodnou funkcí je vyhledávání. Peněženka je nástroj pro uchování důležitých citlivých informací (přístupových údajů, hesel, pinů). RSS/Atom čtečka je integrovaná čtečka RSS/Atom kanálů, slouží k odběru uživatelem vybraných novinek z webu.
3.2
Zjištěné nedostatky
Pokud se podíváme na nabídku softwarových organízátorů podrobněji, zjistíme dva hlavní nedostatky. 1. Nedostatečná dostupnost aplikace. PIM jsou pouze výjimečně multiplatformní, často jsou určeny pouze pro jeden operační systém nebo jsou naopak pouze internetové a pak postrádají možnost přístupu k informacím bez internetového připojení.
3 SOUČASNÁ SITUACE
13
2. Chybí možnost oddělené organizace a prezentace informací. Současné PIM postrádají možnost rozdělení spravovaných informací do několika kategorií a následnou možnost spravovat či prezentovat jen filtrované informace. První z nich byl předpokládán a je důvodem vzniku této bakalářské práce. Je pravdou, že nové aplikace se již snaží tento problém řešit, nicméně stále vždy něco chybí. Pokud vznikne řešení pro desktop se synchronizací pro mobilní telefon, chybí zase možnost svobodného výběru operačních systémů pro tyto platformy. Druhý z nich může být zdánlivým překvapením. Ovšem je nutno si uvědomit, že většina současných PIM vychází ještě z 3. generace osobního řízení, kdy snahou bylo zejména řízení vedoucí k úspoře času. Teprve současná 4. generace přichází se zaměřením se na cíl veškerého snažení. Řešení tohoto nedostatku by významně přispělo k použitelnosti výsledného PIM.
4 OSOBNÍ ORGANIZÉR LAURA
4
14
Osobní organizér Laura
4.1
Návrh řešení zjištěných nedostatků
Nově navrhovaný osobní organízér bude řešit oba zjištěné nedostatky. Naprosto zásadní je řešení prvního nedostatku, kterým je nedostatečná dostupnost aplikace. Stěžejním prostředkem bude vlastní implementace PIM v jazyce Java s výhodným využitím všech možností, které tento jazyk v dnešní době nabízí. Jedná se zejména o jeho rozšířenost a podpora na mnoha různých platformách. Dalším krokem bude zpřístupnění informací přes internetový prohlížeč, který dnes už také možno považovat za platformu. Pro účel řešení druhého nedostatku, kterým je chybějící možnost oddělené organizace a prezentace informací, zavedeme do programu novou funkci - správu rolí. Člověk jako jedinec naplňuje v životě mnoho různých rolí - člen rodiny, zaměstnanec, podnikatel, student a další. Vše co vykonává a plánuje by měl vztahovat k naplnění cílů v rámci těchto rolí. Nejen že mu to umožní oddělenou organizaci i prezentaci informací, ale hlavně jej toto členění povede ve smyslu 4. generace osobního řízení k uvědomění si cíle svých činností.
4.2
Vhodné funkce
Pro takto orientovaný osobní organizér definujeme novou oblast funkcí - oblast osobního řízení. Její vznik vyplývá ze 4. generace osobního řízení, kdy se upouští od řízení a plánování času a prosazuje se snaha řízení sebe. Bude do ní zařazena právě nově definovaná funkce správy rolí. Z dalších používaných funkcí budou vzhledem k rozsahu práce vybrány jen ty klíčové. • Oblast osobního řízení – Role • Oblast řízení úkolů – Úkoly • Oblast řízení času – Kalendář • Oblast řízení znalostí – Peněženka – Poznámky Tyto funkce by měly být dostupné na všech cílových platformách.
5 JAVA JAKO MULTIPLATFORMA
5
15
Java jako multiplatforma
5.1
Multiplatformní aplikace
Platforma je skupina technických prostředků v informatice a výpočetní technice, které mluvčí (obecně producent softwarových řešení) používá nebo nabízí jako základ pro další vývoj.3 Pojem multiplatformní aplikace je tedy možno chápat v různě širokém pojetí. Význam je většinou stejný - abstrakce od konkrétního technického vybavení, uživatel platformy se spoléhá na dostupnost všech prostředků, které platforma definuje. Poměrně zažitým vnímáním platformy je operační systém. Různými platformami se pak v tomto případě rozumí různé operační systémy - Microsoft Windows, Linux, Mac a další. Platformou ovšem můžeme stejně tak rozumět i cílové zařízení - desktop, notebook, mobilní telefon. Platformou se v poslední době stal i webový prohlížeč. Nakonec i samotná Java je jako jazyk s podporou mnoha různých platforem také považována za platformu. V tomto případě chápeme Javu jako sjednocující základnu pro vývoj multiplatformních aplikací. Přispívá k tomu mimo jiné architektura Javy, protože tento jazyk je na cílovém zařízení vykonáván pomocí virtuálního stroje (JVM), který musí být na tomto zařízení nainstalovaný. Java program, který je vykonávaný pomocí JVM, je překládán do tzv. „bytecodeÿ. Samotné JVM se v poslední době prosazuje nejen jako virtuální stroj pro běh programů napsaných v Javě. Některé moderní dynamické jazyky jsou také překládány do „bytecodeÿ a pro svůj běh JVM s výhodou využívají4 .
5.2
J2SE, J2EE, J2ME
Java je podle cílových zařízení vydávána ve třech edicích. Jelikož každé zařízení disponuje jinými možnostmi, je takto vhodně definován pro každou skupinu zařízení společný základ. Vývojář aplikace pak vyvíjí pro jednu z těchto edicí s předpokladem, že cílové zařízení bude podporovat celou množinu definovaných funkcí. J2SE (Java 2 Standard Edition) je edice Javy pro použití na osobním počítači. Je vydávána pro různé operační systémy, ale vždy podporuje shodnou množinu funkcí. J2SE je standard, který je pak pro různé operační systémy implementován 3 4
Takto obecně je tento pojem popsán na české Wikipedii. (11) Příkladem je JRuby - http://jruby.codehaus.org/
5 JAVA JAKO MULTIPLATFORMA
16
zvlášť. Přímo jsou podporovány operační systémy Microsoft Windows, Linux, Mac OS a Solaris. Další operační systémy jsou podporovány nepřímo - existuje komunita, která dodává vlastní implementaci Javy - např. pro operační systém FreeBSD5 . J2EE (Java 2 Enterprise Edition) je edice Javy zaměřená na webové aplikace. Je postavena nad J2SE a navíc přidává mnohé vlastní webové standardy. Ty jsou pak implementovány aplikačními servery od různých dodavatelů. J2ME (Java 2 Micro Edition) je edice Javy pro mobilní telefony a další zařízení s omezenými technickými prostředky (PDA, TV set-top boxy, tiskárny). Je podmnožinou J2SE.
5
Projekt FreeBSD Java - http://www.freebsd.org/java/
6 IMPLEMENTACE
6
17
Implementace
Implementace multiplatformního osobního organizéru proběhne v jazyce Java. Jednou z výhod tohoto řešení je dostupnost volně přístupného vývojového prostředí. Není třeba za něj platit ani korunu, je poskytováno zcela zdarma. Dokonce i v případě, že by byl výsledek naší činnosti předmětem komerčního záměru. Takto volně přístupná vývojová prostředí jsou dvě. NetBeans IDE, za kterým stojí společnost Sun Microsystems a Eclipse IDE, které podporuje společnost IBM. Obě prostředí mají svoje specifika a z nich vyplývající výhody i nevýhody. Eclipse IDE je postaveno na technologii SWT, která umožňuje řádově rychlejší běh prostředí - vývojové prostředí lépe využívá systémové rostředky operačního systému - přistupuje přímo k nativním knihovnám pro vykreslování grafických komponent. Nevýhodou může být nejednotný vzhled mezi operačními systémy. Nativní vzhled aplikace ovšem může být považován stejně tak i za výhodu. Zde je důležité upozornit, že se jedná pouze o technologii samotného vývojového prostředí, pro vyvíjenou aplikaci si programátor vybírá vlastní řešení. NetBeans IDE je od začátku pojato více v multiplatformní duchu a se zaměřením na J2EE. Celé IDE je napsáno přímo v čisté Javě. Množina nabízených funkcí více odpovídá vývoji pro různé platformy. Zejména již zmíněná podpora J2EE je zde historicky výraznější než v případě Eclipse IDE. V poslední době ovšem dochází k výraznému přibližování nabízených funkcí obou IDE. Pro vývoj osobního organizéru bylo nakonec vybráno vývojové prostředí NetBeans, a to právě z důvodu výraznější podpory vývoje pro více platforem, což odpovídá motivaci našeho projektu. Všechny další potřebné technologie byly vybrány s ohledem na nabízenou licenci. Ve většině případů se jedná o licenci LGPL či Apache Licence. Tedy licence, které jsou velmi svobodné. Nejen, že poskytují otevřené zdrojové kódy, ale také nezakazují komerční využití vyvíjeného programu, pokud v něm technologie využijeme. Tímto zákazem je opatřena například licence GNU GPL, která byla dříve vůbec nejpopulárnější svobodnou licencí.
6.1
Výběr vhodných technologií
Java platforma je denně zásobena příspěvky rozsáhlé komunity, která kolem ní za poslední roky vyrostla. Existuje zde nepřeberné množství různých nástrojů a frameworků, které mohou vývojářům usnadnit vývoj. Většina z nich je volně pou-
6 IMPLEMENTACE
18
žitelná, čímž se tato platforma odlišuje od konkurenčních (.NET od společnosti Microsoft). Vhodné využítí existujících řešení může výslednému produktu zajistit snadný další rozvoj do budoucna. Platforma Java nabízí řešení téměř pro každou myslitelnou problematiku, ovšem při výběru je třeba vzít v úvahu náš požadavek na multiplatformní řešení. Znovupoužitelnost částí vyvíjené aplikace v rámci edicí je možné zejména mezi J2SE a J2EE. J2ME je tak výraznou podmnožinou J2SE, že ji většina standardních frameworků nepodporuje. V tomto případě je proto často třeba jít vlastní cestou. Následuje popis využitých technologií. 6.1.1
Maven
Maven spadá nejvíce do kategorie nástrojů pro vývoj. Není obsažen ve výsledném programu. Je přístupný pod licencí Apache Licence 2.0. Maven slouží k deklarativnímu popisu projektu s návazností na vývojové prostředí. Základem je konfigurační soubor projektu - pom.xml. V tomto souboru je popsána struktura a konfigurace projektu - informace o názvu projektu, stránkách produktu, cestě k verzovacímu systému, použitých knihovnách a jiných závislostech, zúčastněných vývojářích a mnoho dalšího. Výhodou tohoto nástroje je neuvěřitelně snadné zapojení programátora do vývoje. Zájemci stačí poskytnout soubor pom.xml s definicí projektu spolu se zdrojovými kódy a ten je následně schopen začít na projektu pracovat. Jednoduchým příkazem jsou z internetu automaticky staženy potřebné knihovny, které projekt využívá a projekt může být sestaven (maven build). Poté může být stejně jednoduchým způsobem spuštěn (maven run). Dalším často používaným příkazem je sestaven distribuční balík aplikace (maven package). Příklad deklarativní konfigurace projektu - pom.xml: <project ...> <modelVersion>4.0.0
cz.gola.laura <artifactId>Laura <packaging>pom
1.0-SNAPSHOT Laura <dependencies> ...
6 IMPLEMENTACE
19
<modules> <module>LauraDesktop <module>LauraBase <module>LauraCommons <module>LauraWeb ... } Maven je velmi mocný a sofistikovaný nástroj, jehož podrobný popis by byl úkolem na samostatnou práci. 6.1.2
Hibernate
Hibernate je ORM framework. Je vydáván pod svobodnou licencí LGPL. Jeho úkolem je mapování objektů aplikace do relačních tabulek databáze. Umožňuje tak transparentní práci s objekty, jako by se přímo ukládaly do databáze. Tato vrstva abstrakce navíc přidává významnou užitnou hodnotnu v podobě praktické nezávislosti na použité databázi. Hibernate zavádí vlastní dotazovací jazyk HQL. Ten je objektovou obdobou známého SQL a navíc není závislý na cílové databází (SQL teoreticky také ne, ale prakticky ano). Aplikace tedy nepracuje přímo s databází pomocí SQL, ale komunikuje s Hibernate pomocí HQL. Hibernate podle nastaveného dialektu překládá potřebné dotazy na SQL dle potřeby konkrétní databáze. Dialekt musí být pro každou databázi jiný a Hibernate jich v současné době podporuje asi 20. Přitom všechny majoritní databáze jsou zastoupeny (Oracle, MS SQL, PostgreSQL, MySQL, FireBird, Apache Derby, H2 Database, . . .). Použití tohoto frameworku neuvěřitelným způsobem usnadňuje vývoj datové vrstvy. Po správném namapování objektů do relačních struktur je další používání jednoduché a přímočaré. S využitím objektové dědičnosti je pak jednoduché napsat společné dotazy pro rozdílné objekty. Je tak významným způsobem podpořena znovupoužitelnost kódu. Příklad mapování abstraktní třídy Entity: public abstract class Entity implements Serializable { protected Long id;
20
6 IMPLEMENTACE
protected protected protected protected protected protected
Long version; String name; Date dateCreated; Date dateModified; Long rank; Boolean active;
... } Prakticky je nutno popsat mapování třídy v HBM souboru:
... <property name="userId" not-null="true" unique="true" /> <property name="name" not-null="true" /> <property name="dateCreated" not-null="true" /> <property name="dateModified" not-null="true" /> <property name="rank" not-null="true" /> <property name="active" not-null="true" /> <property name="type" not-null="true" /> } Každá vlastnost třídy Entity je zde jednoduchým způsobem mapována do tabulky COR ENTITY. Hibernate automaticky pozná typ property a vytvoří v databázové tabulce sloupec odpovídajícího typu. Následuje konkrétní používaná a ukládaná třída Task: public class Task extends Entity { private Role parentRole; private TaskPriority priority; private Date dateCompleted;
6 IMPLEMENTACE
21
private Date dateDeadline; } Její mapování je pak realizováno takto:
<joined-subclass name="Task" table="TSK_TASK" extends="Entity"> <many-to-one name="parentRole" not-null="true" lazy="false" /> <property name="priority" not-null="true"> <param name="enumClassName">TaskPriority <property name="priorityNumber" not-null="true" /> <property name="dateCompleted" /> <property name="dateDeadline" /> Jak je vidět, u každé vlastnosti objektu je možno jednoduchým způsobem nastavit další atributy mapování vlastností na sloupce tabulky. Ty jsou pak součástí integritních omezení databáze - sloupce s povinnou hodnotou (not-null=true), jedinečnými hodnotami (unique=true) a cizími klíči (vazby many-to-one a další). Mimo HBM soubory je mapování možno definovat pomocí java anotací nebo Xdoclet komentářů. Tyto způsoby sice umožňují udržování zdrojového kódu spolu s mapováním na jednom místě, nicméně nemají tak bohaté možnosti konfigurace. Ne všechno, co je možno nastavit v HBM souborech, je umožněno i v konfiguraci java anotacemi nebo Xdoclet komentáři. Oddělená správa HBM souborů také umožňuje více různých mapování pro jednu třídu. Výsledkem předchozího ukázkového mapování třídy Task je vytvoření dvou tabulek v databázi - COR ENTITY a TSK TASK. Pokud za pomocí Hibernate uložíme instanci třídy Task do databáze, bude SQL příkazem uložen jeden řádek do tabulky COR ENTITY (vlastnosti společné všem instancím třídy Entity) a druhý řádek do tabulky TSK TASK (specifické vlastnosti objektů Task). Přitom pro ukládání všech potomků třídy Entity do databáze je využívána jedna společná funkce:
6 IMPLEMENTACE
22
public void saveEntity(Entity entity, boolean quiet) { ... Session s~= getSessionFactory().openSession(); s.saveOrUpdate(entity); s.flush(); s.close(); } Tato funkce slouží jak pro vytvoření nového tak i pro uložení změn záznamu. Hibernate automaticky rozpozná, zde je třeba do databázové tabulky uložit nový řádek nebo provést update existujícího. Tento framework ovšem není možno využít v J2ME, proto tuto edici je nutno realizovat vlastní způsob persistence. Hibernate je velmi mocný nástroj pro zjednodušení práce s databází. Pro jednoduché případy použití je jeho používání radostné. Pro složitější používání je ovšem nutná velmi dobrá odborná znalost tohoto frameworku, protože vnitřně je Hibernate velmi složitý. Jedná se o jeden z nejobsáhlejších frameworků pro Javu. 6.1.3
Spring framework
Tento framework je pravděpodobně vůbec nejznámějším, nejpopulárnějším, nejrozšířenějším a nejrozsáhlejším v jazyce Java. Je vydáván pod licencí Apache Licence 2.0. Dělí se do mnoha samostatných modulů řešící různé problémové oblasti. V počátku jej proslavila zejména implementace revolučního návrhového vzoru Inversion of Control (IOC), realizovaná jako Dependency Injection (vkládání závislostí). IOC výrazným způsobem napomáhá udržet kvalitu návrhu aplikace. Tento návrhový vzor je možno zjednodušeně popsat jako „obrácené řízeníÿ, kdy vytvářené objekty nejsou odpovědné za vytváření svých závislostí, ale závislosti jsou jim nastaveny z vnějšku. Právě toto plnění závislostí z vnějšku bylo primární a klíčovou úlohou Springu. Dnes je již působnost tohoto frameworku výrazně širší a Spring pomáhá vývojářům v mnoha dalších oblastech. Realizace IOC probíhá skrz konfigurační xml soubor, kde každý spravovaný objekt (v terminologii Springu tzv. „beanaÿ), má nastaveno několik klíčových vlastností - typ (odpovídá konkrétní třídě v jazyce Java), scope (rozsah platnosti - platný po celou dobu aplikace, pro http session, jen v rámci jednoho requestu atd.) a další vlastnosti (definované buď konkrétní hodnotou nebo závislostí na jinou beanu).
6 IMPLEMENTACE
23
<property name="dataSource" ref="dataSource"/> <property name="mappingLocations"> <list> classpath*:cz/gola/laura/**/bo/**/*.hbm.xml <property name="hibernateProperties" ref="hibernateProperties" /> <property name="sessionFactory" ref="sessionFactory" /> Podle této konfigurace Spring vytvoří ve svém ApplicationContext objekty s názvy sessionFactory a entityService jako instance tříd udaných atributem class. Protože není atributem definován scope, implicitně jsou objekty platné po celou dobu běhu aplikace. Ukázkou přiřazení závislosti (IOC) je řádek s nastavením sessionFactory, kdy se do objektu entityService nastaví stejnojmenná beana definovaná o pár řádků výše. Konfiguraci Springu je mimo XML soubor možné provádět ještě programově nebo pomocí java anotací přímo v kódu. Od verze 2.5 jsou ve Springu dostupné následující moduly: Spring-core - tento modul je základem Springu. Bez něj není možno Spring používat, obsahuje základní prvky Springu. Spring-context - tento modul umoňuje používání XML konfiguračních souborů pro vytvoření tzv. ApplicationContext. Ten slouží pro uchování Springem spravovaných objektů a následně pro přístup k nim. ApplicationContext poskytuje také abstrakci nad skutečným místem uchování objektů. Proto v desktopové aplikaci můžeme přistupovat k objektům stejně, jako ve webové apliaci. Spring-aop - modul pro podporu aspektově orientovaného programování. Spring často využívá techniky AOP pro podporu dalších modulů (transakcí, logování). AOP je programovací technika, kdy jsou často opakované části kódu přidávány do kódu deklarativním způsobem. Vhodné například pro logování (například je možno definovat, že před každou metodou, jejíž název začíná slovy „deleteÿ se provede zalogování této činnosti).
6 IMPLEMENTACE
24
Spring-orm - modul pro podporu ORM frameworků. Obsahuje zejména podporu pro Hibernate, kdy významným způsobem zjednodušuje jeho konfiguraci i používání. Nabízí vhodné šablony používání Hibernate pro desktopové i webové využití (HibernateTemplate, OpenSessionInViewFilter). Spring-jdbc - tento modul přidává podporu pro přímé používání databáze přes JDBC ovladač. Doplňuje prosté volání SQL dotazů o tzv. mappery, které umějí převádět result sety z databáze na seznamy objektů. Spring-tx - jeden z nejmocnějších a nejužitečnějších modulů Springu pro produkční nasazení aplikací. Poskytuje velmi jednoduše použitelné řešení pro řízení transakcí v aplikaci. To vše je možno nakonfigurovat deklarativním způsobem na několika řádcích. Spring-web - obecná podpora integrace Springu a webových aplikací podle standardů J2EE. Umožňuje přístup k ApplicationContext ze kontextů webových frameworků (podpora pro JSP, JSF). Ukázka deklarativní konfigurace transakcí:
Zavedení Springu se liší pro desktopovou a webovou aplikaci. Zavedení v desktopové aplikaci: ApplicationContex ctx = new ClassPathXmlApplicationContext("cesta"); Zavedení ve webové aplikaci se realizuje v souvislosti se specifikací J2EE speciálním Servletem nebo Listenerem, v obou případech je nutno konfiguraci provést
6 IMPLEMENTACE
25
do konfiguračního souboru webové aplikace - web.xml (příklad zavedení přes Listener).
<param-name>contextConfigLocation <param-value> classpath*:cz/gola/**/spring-*.xml <listener> <listener-class>org...ContextLoaderListener V obou případech je pak možno přistupovat ke všem objektům spravovaným Springem takto (příklad pro vytažení objektu entityService). EntityService service = (EntityService) ctx.getBean("entityService"); Správné používání Springu v rámci projektu významně přispívá k udržení čistoty návrhu a vhodné architektury. Spring přímo vede k používání objektových principů, které by jinak „línýÿ programátor mohl opomenout - příkladem může být programování s využitím interface a jeho implementací. Stejně jako v případě Hibernate i tento framework je třeba v případě J2ME nahradit vlastním řešením. 6.1.4
Substance
Tato knihovna je určena výhradně pro J2SE. Je licencována pod LGPL. Přináší moderní Look and Feel určený pro desktopové aplikace. Upravuje pouze vzhled aplikace, nepřidává žádné funkce. Ovšem je zřejmé, že dnešní náročný uživatel od aplikace očekává i příjemný a moderní vzhled. A s tímto dnes Java na desktopu ve svém standardním provedení mírně pokulhává. Přitom nastavení moderního vzhledu je s touto knihovnou opravdu jednoduché, většinu potřeb je možno zvládnout na jednom jediném řádku: UIManager.setLookAndFeel(new SubstanceBusinessBlackSteelLookAndFeel()); Pro další používání v aplikaci je potřeba ještě dodržet několik postupu, které jinak standardní řešení Javy nevyžaduje.
6 IMPLEMENTACE
26
V první řadě je třeba provádět změny, které způsobí překreslení uživatelského rozhraní jen ve vláknech řazených v AWT frontě uživatelského rozhraní. Druhým vyžadovaným postupem je rozšiřování Substance rendererů při implementaci vlastního způsobu vykreslování komponent. Příkladem může být rozšíření vykreslování buněk tabulky. public class LauraTableCellRenderer extends SubstanceTableCellRenderer { @Override public Component getTableCellRendererComponent(..) { Component c = super.getTableCellRendererComponent(..); ... vlastní rozšíření ... } Ukázka rozdílu vzhledu aplikace s touto knihovnou a součástí přílohy B (Obr. 1: Standardní look and feel, Obr. 2: Substance look and feel). 6.1.5
JSF a RichFaces
JSF je moderní webový framework. Lépe řečeno jde o specifikaci webového standardu, který je pak různými subjekty implementován. Referenční implementace je přímo od Sun Microsystems. V této práci je použita implementace MyFaces, která je zaštítěna organizací Apache Software Foundation. Licencováno pod Apache Licence 2.0. JSF je postaveno na principu komponent. Do xhtml stránky jsou vkládány značky představující JSF komponenty spolu s okolním HTML kódem.
...
<pre> #{walletList.detailItem != null ? walletList.detailItem.content : ’’}
...
6 IMPLEMENTACE
27
Při běhu aplikace se pak JSF komponenty renderují do HTML kódu. V předchozím případě se do HTML kódu převede komponenta rich:panel, která v sobě bude obsahovat detail vybrané položky z modulu Peněženka. Původní JSF byly stránkově orientované, ale s příchodem AJAXu byly JSF rozšířeny dalšími frameworky právě o podporu AJAXu. Jedním z takových rozšiřujících frameworků jsou právě RichFaces od společnosti JBoss. JBoss je poskytuje pod licencí LGPL. Má-li se webový klient uživatelským ovládání blížit desktopové verzi, je třeba využít některého z AJAXových frameworků, bez kterého by se na webové stránce těžko dosahovalo podobné interaktivity prostředí. RichFaces se ukázaly jako vhodná volba. Stěžejní komponentou,kterou RichFaces původní sadu komponent obohacují, je AjaxSupport. Tato komponenta umožňuje : • asynchronní obsluhu událostí (atribut event=„onchangeÿ), • zpracování na serveru (atribut action=„roleList.reloadItemsÿ), • promítnutí výsledku do části stránky (atribut reRender=„itemsTableÿ).
6.2
Laura - Architektura
Architektura navrženého projektu je třívrstvá. Zastoupeny jsou: • datová vrstva, • logická vrstva, • prezentační vrstva. Jednotlivé vrstvy je možno na různých platformách nahrazovat, některé mohou zůstat společné. Mezi těmito všemi vrstvami jsou vyměňovány společné objekty - tzv. business objekty. Je možno je považovat za ”krev” aplikace - proudí mezi vrstvami a přitom přenáší informace.
6 IMPLEMENTACE
28
Celý osobní organizér je podle řešených funkcí rozdělen do modulů. Architektura navrženého projektu je třívrstvá. Zastoupeny jsou: • • • • • • • • • •
Modul Modul Modul Modul Modul Modul Modul Modul Modul Modul
Core - jádro aplikace a společné třídy Role - modul správy rolí Calendar - modul kalendáře Task - modul úkolů Wallet - modul peněženky Note - modul poznámek Desktop - modul obsahující desktopového klienta Web - modul obsahující webovou aplikaci Mobile - modul obsahující mobilního klienta Resources - společné obrázky, ikony, překlady textů
V projektu je udržována organizační struktura, která je připravena umožnit snadné další rozšiřování - přidáváním dalších modulů. Organizace java balíčků odpovídá tomuto předpisu: cz.gola.laura.
.. Moduly odpovídající přímo jednotlivým funkcím osobního organizéru jsou navíc zařazeny do sjednocujícího balíčku „moduleÿ. cz.gola.laura.module... Je tomu tak pro případ přidávání dalších rozšíření s možností zavádět moduly uživatelem. Pro tyto účely by bylo vhodné rozlišovat moduly systému a moduly funkcí. Části jednotlivých modulů jsou pak spojovány v rámci maven projektů do knihoven či aplikací pro konkrétní platformy. Laura knihovny: • LauraCommons - knihovna společného základu • LauraBase - knihovna jednotné databáze Laura aplikace: • LauraDesktop - aplikace pro desktop • LauraWeb - aplikace pro web • LauraMobile - aplikace pro mobilní telefon
6.3
LauraCommons - Společný základ
LauraCommons je knihovna sloužící jako společný základ pro všechny Laura aplikace. Jsou v ní zahrnuty společné:
6 IMPLEMENTACE
• • • •
29
business objekty, interfacy služeb, překlady textů, obrázky a ikony.
Výhodou takového společného základu je správa, rozšiřování i případné opravy základu Laura aplikací na jednom místě. Úprava se promítne do všech aplikací.
6.4
LauraBase - Virtuální databáze
LauraBase je knihovna jednotného používání databáze. Navazuje na datovou vrstvu Hibernate logickou vrstvou aplikace. Obsahuje: • mapování objektů pro Hibernate - HBM soubory • implementaci logické vrstvy v HQL - služba EntityService LauraBase je díky abstrakci Hibernate nezávislá na konkrétní použité databázi. Konkrétní databáze se nastavuje až v cílové Laura aplikaci. Podporovány jsou všechny, ke kterým existuje pro Hibernate třída dialektu. Všechny známější databáze jsou podporovány (Oracle, MS SQL, MySQL, PostgreSQL, Apache Derby a další). Výhodou takového oddělení je opět používání stejného celku v jednotlivých Laura aplikacích - LauraDesktop i LauraWeb používají tento stejný základ.
6.5
Laura - Aplikace
Sestavené aplikace odpovídají jednotlivým edicím Javy (J2SE, J2EE a J2ME) a tedy cílovým platformám desktop, web a mobilní zařízení. Snahou bylo jednotlivé aplikace co možná nejvíce přiblížit a to jak množinou dostupných funkcí (zpřístupněny všechny moduly, funkce řazení a filtrování) tak i způsobem ovládání (zejména mezi J2SE a J2EE). Edice J2ME je od předchozích ovšem tolik vzdálená, že to nebylo vždy technicky možné. Zajímavou vlastností osobního organizéru Laura je omezené využívání funkce mazání. V aplikacích je upřednostňována funkce pro archivaci. Archivováním se záznam vyřadí z aktivních záznamů a není tedy standardně dostupný. Nicméně LauraDesktop a LauraWeb umožňují zapnout režim se zobrazováním archivovaných záznamů. v aplikaci LauraMobile je archivace z důvodu omezených prostředků pouze jednosměrná. Záznam se po archivaci stane na mobilním zařízení nedostupný, ovšem při synchronizaci s LauraWeb je přenesen a může být znovu obnoven. Z mobilního zařízení je při přenosu odstraněn.
6 IMPLEMENTACE
30
Dále popisované funkce jsou v plném rozsahu implementovány v aplikacích LauraDesktop a LauraWeb. Rozdíly v implementaci aplikace LauraMobile jsou popsány dále v kapitole o LauraMobile. 6.5.1
Role
Modul správy rolí je klíčový. Je novinkou, kterou se odlišuje od ostatních softwarových organizérů. Slouží jako rozcestník pro další práci s osobním organizérem. Uživatel by si zde měl pečlivě poskládat životní role, v kterých působí a na kterých mu záleží. Předpokládá se, že budou 2-4, příklady mohou být: • Člen rodiny, Manažer, Sportovec • Student, Podnikatel, Hokejista • Člen rodiny, Ředitel závodu, Domácí kutil Jednotlivé role je umožněno seřadit podle uživatelových preferencí - uživatel si uspořádáním ujasní vlastní priority. 6.5.2
Úkoly
Klíčovou úlohou osobního řízení je zaznamenávání, sledování a plnění úkolů. Tyto úkoly jsou vždy plněny v rámci nějaké uživatelovy životní role. Proto je uživatel nucen při zadávání úkolu určit také pod kterou roli úkol spadá. Volitelnou možností je uvedení termínu pro dokončení. Modul umožňuje oddělenou organizaci i prezentaci poznamenaných úkolů na základě filtrování podle rolí. Úkoly je také možno řadit podle role, priority, názvu, termínu nebo času dokončení. 6.5.3
Kalendář
Funkcí spadající do časového řízení je kalendář. Za nejčastěji používaný a z hlediska plánování nejvhodnější je v současné generaci řízení času považován týdenní kalendář6 . Proto je zde implementován právě tento typ plánovacího kalendáře. Modul umožňuje filtrování a řazení obdobným způsobem jako předchozí modul Úkoly. Navíc obsahuje výběr data pro určení týdne pro zobrazení. 6
Této problematice se věnuje Stephen R. Covey ve svojí slavné knize 7 návyků skutečně efektivních lidí. (3)
6 IMPLEMENTACE
6.5.4
31
Peněženka
Tento modul slouží k uchování citlivých údajů. Tyto údaje jsou organizovány do přístupů. Každý přístup má svůj název a obsahovou část, do které je možno vložit údaje jako uživatelské jméno, heslo, pin. 6.5.5
Poznámky
Tento modul slouží k rychlému poznamenání myšlenek, postřehů a jiných informací. Poznámky jsou standardně řazeny podle data a času vložení. Uživatel má možnost zadat název vkládané poznámky, ale není to vyžadováno. Pokud není název vložen, je místo něj zobrazována část obsahu.
6.6
LauraDesktop - J2SE
LauraDesktop je aplikace Laura klienta pro desktop. LauraDesktop běží všude tam, kde je nainstalováno JRE, které je standardní součástí J2SE. Tuto aplikaci je tedy možno spustit na většině dnešních operačních systémech (Window, Linux, Mac, Solaris, FreeBSD). Pro uchování informací je využita knihovna LauraBase napojená k databázi Apache Derby. Jedná se o jednoduchou embedded databázi, která nevyžaduje zvláštní instalaci. Nainstaluje se automaticky při spuštění aplikace do pracovního adresáře aplikace. Pracovní adresář aplikace vznikne automaticky v domovském adresáři uživatele, pod kterým je aplikace spuštěna. Pokud již databáze existuje, aplikace nevytváří novou, ale pouze se k existující připojí. Vývoj této aplikace byl relativně nejméně problémový. Bylo v největší možné míře využito principů objektově orientovaného programování, jednotlivé záložky modulů tedy mají svého abstraktního předka. Stejně tak editační dialogy. Z implementačního hlediska je ještě zásadní využití možností jazyka Java od verze 5.0 - tzv. generických tříd. Ty umožnily ještě ve větší míře aplikovat znovupoužitelnost kódu, jsou zachovány všechny obecné principy objektového programování. public abstract class LauraPanel extends JPanel { } Vzhled uživatelského prostředí je oproti standardní Javě významně vylepšen využitím knihovny Substance. Funkce aplikace jsou rozděleny do záložek podle pří-
6 IMPLEMENTACE
32
slušných modulů, ovládání je standardní jak je na dnešních desktopových aplikacích očekáváno. Aplikace je plně lokalizovaná, všechny texty jsou dostupné v češtině a angličtině. Podle jazykového nastavení operačního systému jsou pak automaticky zobrazovány české případně anglické popisky. Je k tomu využita podpora J2SE - tzv. ResourceBundle. Pro přístup ke konkrétnímu popisku byla vytvořena pomocná třída LocHelper se statickou metodou getString(key). public class LocHelper { private static final ResourceBundle bundle = ResourceBundle.getBundle( DesktopSettings.RESOURCE_MESSAGES, Locale.getDefault() ); public static String getString(String key) { return bundle.getString(key); } } Použití v aplikaci je následující: public String getColumnName(int column) { switch (column) { case 0: return LocHelper.getString("time"); case 1: return LocHelper.getString("monday"); } Pokud v aplikaci existuje odpovídající překlad pro klíč „timeÿ a „mondayÿ vrací jej metoda getString() - pro češtinu je zobrazeno „Časÿ a „Pondělíÿ, v anglickém prostředí se zobrazí „Timeÿ a „Mondayÿ. Aplikace LauraDesktop je distribuována jako adresář se spustitelným jar souborem (LauraDesktop.jar) a potřebnými knihovnami. Sestavená distribuce je elektronickou přílohou této práce - příloha A. Screenshoty z aplikace jsou pak součástí přílohy B.
6 IMPLEMENTACE
6.7
33
LauraWeb - J2EE
LaureWeb je webový server, který zpřístupňuje Lauru přes webové rozhraní. Pro přístup tedy stačí pouhý webový prohlížeč. Podporovány jsou oba nejrozšířenější webové prohlížeče - Internet Explorer a Mozilla Firefox. Stejně jako v případě LauraDesktop je pro uchovávání informací využita LauraBase s připojením na embedded Apache Derby databázi. Tato aplikace je postavena nad standardy J2EE, proto potřebuje ke svému běhu aplikační server, který bude tyto standardy implementovat. Jednoduchým volně dostupným vyhovujícím aplikačním serverem je Apache Tomcat. Implementace této aplikace již byla o něco problémovější, ladění webových částí je podstatně náročnější. V xhtml šablonách, které jsou využívány JSF frameworkem chybí typová kontrola. Také není možno tyto šablony dědit a upravovat jen rozdílné části. Vznikají tak tedy opakované části, které jsou podstatně hůře spravovatelné. Za xhtml šablonami jsou na pozadí tzv. ManagedBeany, což jsou java objekty, které se starají o plnění a řízení zobrazované stránky. Použitý JSF framework má širokou základnu uživatelů, ale také čelí poměrně velké kritice. Ne všichni jeho uživatelé jsou přesvědčeni o jeho kvalitě. Za dalšími problémy, které se při vývoji vyskytly, stála nadstavba v podobě RichFaces. Ne vždy se chovají korektně, existuje spousta nepopsaných slepých uliček v používání. Příkladem za všechny je omezení zákazu vnořování formulářů do sebe, který ve Firefoxu nepůsobí žádné problémy zatímco v Internet Exploreru způsobí „tichouÿ nefunkčnost všech AJAXových akcí. Přitom není vůbec patrné, proč se tak děje. Podobné problémy někdy působí míchání AJAXových spolu s původními JSF komponentami. Zvlášť pokud některé optimalizace původního JSF nepočítají s tím, že se komponenta na stejné stránce může znovu použít. Přesto bylo vyvinuto nemalé úsilí při snaze zachovat v co největší míře principy objektového programování. Konkrétní ManagedBeany žijící na pozadí webových stránek jsou již správně objektově děděny z abstraktních předků podobně jako je tomu v případě aplikace LauraDesktop. Klíčovou funkcí aplikace LauraWeb je vystavení služby pro synchronizaci. Ta je zpřístupněna na definované adrese na stejném webovém serveru, jako běží webová prezentace. Vystavení služby pro vzdálené volání je díky Spring Frameworku velice jednoduché. Nejprve je třeba zaregistrovat Servlet, který bude vyřizovat případné požadavky odeslané na vystavenou službu.
6 IMPLEMENTACE
34
<servlet> <servlet-name>ws <servlet-class>org...DispatcherServlet <servlet-mapping> <servlet-name>ws /ws/* Dále je třeba ve Spring konfiguračním souboru definovat proxy na původní službu. <property name="target" ref="entityService" /> Posledním krokem je konfigurace vlastního vystavení služby. <property name="service" ref="entityServiceProxy" /> <property name="serviceInterface" value="cz...EntityService" /> Výsledkem je vystavení služby na adrese /LauraWeb/ws/LauraService. Pro potřebu synchronizace s mobilním zařízením bylo třeba vystavit ještě jednu službu, která bude fungovat vlastním primitivním způsobem. J2ME nemá žádnou podporu pro vzdálené volání metod. Proto bylo nutné v aplikaci LauraWeb vystavit TCP/IP server socket, který po připojení klienta čeká na jednoduché řetězcové příkazy. na tyto příkazy pak reaguje odesíláním informací, případně příjmem informací k uložení. Implementace je ve třídě MobileSynchronizationThread. Tato služba se automaticky nastartuje při startu webové aplikace a naslouchá na portu 7666. Poslouchání na portu pro příjem nových klientů: final ServerSocket serverSocket = new ServerSocket(7666); while (true) { Socket client = serverSocket.accept(); final DataInputStream dataInputStream
6 IMPLEMENTACE
35
= new DataInputStream(client.getInputStream()); final DataOutputStream dataOutputStream = new DataOutputStream(client.getOutputStream()); processCommand(dataInputStream, dataOutputStream); } Ukázka primitivního odeslání seznamu všech rolí v aplikaci: String command = dataInputStream.readUTF(); if ("LIST-ROLES".equals(command)) { List result = entityService.listEntityActiveOfType( Role.TYPE_ROLE, null, null); dataOutputStream.writeInt(result.size()); for (Entity entity : result) { byte[] data = entity.saveBytes(); dataOutputStream.writeInt(data.length); dataOutputStream.write(data); } } Vlastní proces synchronizace společně s jejím účelem bude podrobněji rozebrána v kapitole o synchronizaci. Aplikace LauraWeb je distribuována jako WAR soubor, který je třeba nasadit na webový server Apache Tomcat. Sestavená distribuce je elektronickou přílohou této práce - příloha A. Screenshoty z aplikace jsou pak součástí přílohy B.
6.8
LauraMobile - J2ME
Poslední aplikací je mobilní klient. Tento klient vychází z edice J2ME. Java 2 Micro Edition je výrazně omezenou edicí Javy. Tato cílová platforma se ještě podle dostupných prostředků dělí na podporované profily konfigurace zařízení (CDC a CLDC) a profily mobilního zařízení (MIDP). Většina dnešních telefonů podporuje CLDC 1.1 a MIDP 2.0. Proto bude tento klient vyvíjen pro tyty profily. Při programování pro J2ME je třeba rychle zapomenout na všechny vymoženosti známé z J2SE. J2ME nezná jazykové prvky jako generické šablony nebo výčtové typy. Velmi výrazným způsobem je také okleštěna množina podporovaného API.
6 IMPLEMENTACE
36
Celé původní API pro práci s kolekcemi je minimalizováno na jedinou, zastaralou a mezi vlákny nesynchronizovanou kolekci - Vector. Neexistuje zde podporovaná databáze, je třeba se omezit na technologii RMS. RMS umožňuje pouze primitivní ukládání polí bytů pod aplikací definované identifikátory, tedy těžko zde lze využívat nějaký dotazovací jazyk. Uživatelské prostředí se zde buduje specifickým způsobem. Vývojář nemůže určit, jak bude výsledná aplikace vypadat. Může pouze řict, že se v aplikaci má zobrazit nějaká komponenta umožňující výběr z několika možností. Jak tuto komponentu zobrazí konkrétní telefon je už mimo jeho vliv. Není zde podpora pro tzv. reflexi. Jedná se o nástroj jazyka, kterým je možno dynamicky přistupovat k vlastnostem a metodám tříd na základě jména. Tato zdánlivě nevyužívaná funkcionalita je rychle postrádána v momentě snahy o realizaci AOP. AOP zde není možné. S předchozím bodem souvisí i chybějící podpora serializace objektů. Serializace je metoda uložení objektů do pole bytů a obráceně zpětné získání objektů z polí bytů. Využívá se např. pro různé cache, kdy se objekty odkládají z paměti na disk. Také je klíčovým mechanizmem pro mnohé metody vzdáleného volání metod. Z výše uvedených překážek J2ME vyplynuly mnohé nutné ústupky oproti jednotnosti implementace jednotlivých vrstev rámci celého projektu Laura. LauraMobile je tak víceméně samostatnou aplikací bez návaznosti na knihovny LauraCommons a LauraBase. Interface pro integraci s ostatními aplikacemi je tvořen pouze pomocí obyčejné TCP/IP protokolové komunikace sloužící k synchronizaci. Vyšší integraci ve smyslu používání stejných knihoven brání technická omezení této platformy. Pro ukládání informací primitivním způsobem do RMS musela být dopsána podpora vlastní serializace objektů do pole bytů. Příklad uložení a obnovení objektu Event (události z kalendáře). protected void store(DataOutputStream os) { try { super.store(os); os.writeInt(eventRoleId.intValue()); os.writeLong(getDateBegin().getTime()); os.writeUTF(location); os.writeUTF(content); } catch (IOException ex) { ex.printStackTrace();
6 IMPLEMENTACE
37
} } protected void unstore(DataInputStream is) { try { super.unstore(is); eventRoleId = new Integer(is.readInt()); setDateBegin(new Date(is.readLong())); location = is.readUTF(); content = is.readUTF(); } catch (IOException ex) { ex.printStackTrace(); } } Aplikace obsahuje všechny moduly - Role, Úkoly, Kalendář, Peněženku i Poznámky. Z důvodu primitivního ukládání informací ovšem není umožněno filtrování, řazení a zobrazování archivních položek. Modul kalendáře je omezen na zobrazování pouze denního kalendáře. Týdenní interval není možno na malém display přehledným způsobem prezentovat. Implementace této aplikace se ukázala jako časově nejnáročnější. Programování pro tuto platformu je často až nepříjemné. Operace, které by ve standardní Javě znamenaly dva řádky kódu, se zde vydají na celou stránku. LauraMobile je určen pro omezené využití v případě potřeby přístupu k informacím v terénu. Pro tento účel jsou nabízené funkce dostačující. Aplikace LauraMobile je distribuována jako JAR soubor, který je třeba nainstalovat na cílovém mobilním telefonu (s podporou CLCD 1.1 a MIDP 2.0). Sestavená distribuce je elektronickou přílohou této práce - příloha A. Screenshoty z aplikace jsou pak součástí přílohy B.
6.9
Synchronizace
Aby bylo možné využívat současně všechny klienty podle aktuální potřeby, je třeba zajistit, aby uživatel vždy pracoval pokud možno se stejnými daty. Není myslitelné, aby nové úkoly zanášel 3x do tří různých databází. Také je třeba počítat s tím, že ne vždy je dostupné internetové spojení, proto bylo sdílení jedné společné databáze jen částečným řešením.
6 IMPLEMENTACE
38
S ohledem na jmenované skutečnosti bylo navrženo řešení založené na synchronizaci mezi lokálními databázemi. Pokud chce uživatel synchronizace využívat, musí si někde nainstalovat aplikaci LauraWeb, která obsahuje vystavené služby pro synchronizaci s LauraDesktop i s LauraMobile. Uživatel pak může před každým použitím aplikace spustit synchronizaci s primární databází (databáze LauraWeb). Výhodu je, že dokud uživatel synchronizaci nepožaduje, může využívat pouze lokálních databází klientů - ať už si vybere LauraDesktop nebo LauraMobile. V momentě, kdy pocítí potřebu větší přístupnosti, nainstaluje si LauraWeb a provede synchronizaci stejným způsobem, jak ji potom bude provádět pravidelně. Synchronizace funguje na následujícím principu. 1. Pro každý modul je zjištěno datum poslední úpravy lokální a vzdálené databáze. 2. Všechny informace, které se změnily (byly vytvořeny, upraveny nebo archivovány) mezi těmito časy je třeba synchronizovat. 3. Vlastní realizace synchronizace je velmi jednoduchá, za aktuální záznam je považován ten s novějším datem a časem úpravy. V případě LauraDesktop umožňuje Spring velmi jednoduchou konfiguraci napojení na vzdálenou službu. <property name="serviceInterface" value="cz...EntityService" /> <property name="serviceUrl" value="http://localhost:8084/LauraWeb/ws/LauraService" /> V kódu již je tato vzdálená služba používána jako by se jednalo o lokální volání metod. EntityService remoteService = (EntityService) ContextHelper.getContext().getBean("remoteService"); vysledekVzdalenehoVlani = remoteService.nazevVolaneMetody();
7 DISKUSE
7
39
Diskuse
Po úspěšné implementaci multiplatformního osobního organizéru s balíkem základních funkcí se logicky nabízí otázka jeho další budoucnosti. na trhu je v současné době neuvěřitelné množství různých osobních organizérů. Některé jsou distribuovány přímo s operačními systémy, jiné spolu s kancelářskými balíky, což je v obou případech velká výhoda. Jestli by sebelepší výsledek snažení o vyřešení dvou zjištěných nedostatků dokázal prosadit tento software i na tak hustém trhu je těžké odhadovat. Výsledná realizace softwarového osobního organizéru sice prověřila současné možnosti jazyka Java jako multiplatformního řešení, ale asi by nebylo spravedlivé ji srovnávat co se týče funkcí se softwarovými osobními organizéry vyvíjenými již mnoho let, případně dokonce komerčním způsobem. Zde by tato implementace v některých případech těžko obstávala, minimálně co se týče bezpečnosti uložených dat, šifrování komunikace, funkcí vyhledávání, případně integrací s dalšími softwary jako je Microsoft Outlook, Mozilla Thunderbird a další. Další překážkou masivního rozšíření, kterou by bylo nutné vyřešit, je náročnost nasazení aplikace LauraWeb. Instalaci vlastního aplikačního serveru běžného uživatele odradí. Zde by bylo zajímavé nabídnout LauraWeb jako veřejnou službu. Nicméně, jedna možnost prosazení se přece jen nabízí - vydání pod svobodnou licencí. Vhodnou licencí by mohla být licence GPL, která by umožňovala dalším uživatelům volné používání i přispívání do zdrojových kódů. Přitom by chránila případný zájem autora na komerčním využití.
8 ZÁVĚR
8
40
Závěr
V souladu se zadáním této práce byl nejprve navržen a poté i úspěšně implementován multiplatformní osobní organizér v jazyce Java. Analýzou současných softwarových osobních organizérů byly nejprve zjištěny dva hlavní aktuální nedostatky - nedostatečná dostupnost aplikace a chybějící možnost rozdělení spravovaných informací do různých oblastí. Na základě prvního z těchto poznatků bylo navrhnuto řešení v podobě jazyka Java jako virtuální „superplatformyÿ. Jako reakce na druhý z poznatků byla navržena nová vhodná funkce osobního organizéru - správa uživatelských rolí. Nově jsou informace v osobním organizéru udržovány pod definovanými rolemi, na základě kterých je volitelně umožněna jejich oddělená správa i prezentace (funkce filtrování). Dále byly představeny jednotlivé edice jazyka Java (J2SE, J2EE a J2ME), jejich zaměření na cílová zařízení, vzájemné souvislosti a rozdíly. Java byla vyhodnocena jako rozsáhlá platforma vhodná pro vývoj opravdových multiplatformních aplikací. Tím byla zakončena fáze návrhu. Při vlastní implementaci došlo ke skutečné konfrontaci teorie s reálnou praxí. Vývoj pro J2SE probíhal relativně hladce, výsledek je nejlépe ovladatelný, nejlépe vypadá, ale také je nejméně dostupný - uživatel si jej může pustit pouze na osobním počítači, kde má tuto aplikaci nainstalovanou. V případě vývoje pro J2EE se ukázaly některé mouchy webové platformy zejména nedostatek typové kontroly, nemožnost objektové práce s XHTML šablonamy a často těžko laditelné chování aplikace. Celkově je ovšem možno J2EE díky dnešním AJAXovým možnostem označit za vhodný a příjemný kompromis mezi komfortem ovládání, náročností vývoje a dostupností výsledné aplikace (stačí pouze webový prohlížeč). Po všech strastech spojených s vývojem pro J2ME se tato edice stala velkým zklamáním. Vývojář si často připadá oproti zbytku programátorského světa opravdu pozadu. Téměř vše je zde nutno psát úplně od začátku, navíc bez moderních prostředků jazyka. To vede k náročnému a především zdlouhavému vývoji. Výsledkem jsou navíc velmi omezené možnosti ovládání. Tak velká je cena nejpřístupnější aplikaci. Kdybych byl znovu postaven před podobný úkol, Javu bych neváhal doporučit jako multiplatformní řešení aplikace pro osobní počítač či web (J2SE a J2EE). Nedoporučil bych její využití pro mobilní telefony. V tomto případě bych se podíval po Symbianu či Google Android.
9
9
LITERATURA
41
Literatura
BAUER, C. – KING, G. Hibernate in Action. USA: Manning Publications Co. 2004. 400 s. ISBN 1-932394-15-X. BREIDENBACH, R. – WALLS, C. Spring in Action, Second Edition. USA: Manning Publications Co. 2007. 768 s. ISBN 1-933988-13-4. COVEY, Stephen R. 7 návyků skutečně efektivních lidí : Zásady osobního rozvoje, které změní váš život Aleš Lisa. 1. vyd. Praha: Management Press, s.r.o., 2007. 342 s. ISBN 978-80-7261-156-0. HEROUT, P. Java - bohatství knihoven. České Budějovice: KOOP, 2006. 251 s. ISBN 80-7232-288-5. KEOGH, J. E. J2ME: The Complete Reference. —: McGraw-Hill/OsborneMedia 2003. 768 s. ISBN 3-293-00018-5. SUN MICROSYSTEMS, I. The Java EE 5 Tutorial. [online]. 2008 [cit. 2009-05-11] Dostupný z WWW: < http : //java.sun.com/javaee/5/docs/tutorial/doc/> . TEIXEIRA, S. Java 2 ME Developer’s Guide. : Wordware Publishing 2002. 510 s. ISBN 80-86851-54-0. Free PIMs [online]. 2003 [cit. 2009-05-24] Dostupný z WWW: < http : //www.f reepims.com/navigatef reepims.html/> . List of personal information managers [online]. 2005 [cit. 2009-05-24] Dostupný z WWW: < http : //en.wikipedia.org/wiki/List of personal inf ormation managers/. Open Directory - Home: Personal Organization [online]. 1998 [cit. 2009-05-24] Dostupný z WWW: < http : //www.dmoz.org/Home/P ersonal Organization/> . Platforma [online]. 2008 [cit. 2009-05-24] Dostupný z WWW: < http : //cs.wikipedia.org/wiki/P latf orma/> .
Přílohy
A ELEKTRONICKÁ PŘÍLOHA
43
A Elektronická příloha • • • • • • • • •
Přílohou této práce je CD s elektronickým obsahem. /LauraDesktop.bat - spouštěcí skript aplikace LauraDesktop pro Windows. /LauraDesktop.sh - spouštěcí skript aplikace LauraDesktop pro Linux. /LauraDesktop.jar - vlastní aplikace LauraDesktop. /LauraDeksktop/lib - knihovny, které potřebuje LauraDesktop ke svému běhu. /LauraWeb/LauraWeb.war - vlastní aplikace LauraWeb (je třeba ji nasadit na Apache Tomcat). /LauraWeb/Apache Tomcat - instalační soubor Apache Tomcat pro Windows (v Linux je lépe jej nainstalovat přes balíčkovací systém). /LauraMobile/LauraMobile.jar - instalační soubor LauraMobile - je třeba přenést na mobilní telefon a nainstalovat. /bp.pdf - elektronická verze bakalářské práce.
44
B NÁHLEDY APLIKACE
B Náhledy aplikace
Obr. 1: Standardní look and feel
Obr. 2: Substance look and feel
45
B NÁHLEDY APLIKACE
Obr. 3: LauraDesktop - Zavádění
Obr. 4: LauraDesktop - Správa úkolů
46
B NÁHLEDY APLIKACE
Obr. 5: LauraDesktop - Poznámky
Obr. 6: LauraDesktop - Synchronizace
47
B NÁHLEDY APLIKACE
Obr. 7: LauraWeb - Úkoly
Obr. 8: LauraWeb - Kalendář
48
B NÁHLEDY APLIKACE
Obr. 9: LauraWeb - Peněženka
Obr. 10: LauraMobile - Aplikace v emulátoru
49
B NÁHLEDY APLIKACE
Obr. 11: LauraMobile - Aplikace v telefonu
Obr. 12: LauraMobile - Kalendář
50
B NÁHLEDY APLIKACE
Obr. 13: LauraMobile - Editace úkolu