Portál AbcLinuxu, 26. dubna 2024 00:41

Strč prst skrz AbcLinuxu - I

9. 4. 2003 | Leoš Literák
Články - Strč prst skrz AbcLinuxu - I  

aneb pohled pro programátory do útrob našeho serveru.

Právě začíná dlouho slibovaný seriál pro programátory, kteří se chtějí dozvědět něco více o tom, jak je AbcLinuxu napsáno a jak funguje. Kdoví, pokud bude zájem, možná i zveřejním zdrojové kódy a umožním na něm pracovat i případným dobrovolníkům. Nápadů na vylepšení mám spousty, ale času málo :-( .

Základní informace

Java logo AbcLinuxu je naprogramováno v Javě na základě vybraných J2EE techologií za použití moderních programátorských přístupů. Architektura je postavena na pull variantě MVC (Model-View-Controller) patternu. MVC je léty prověřený přístup k vývoji GUI aplikací, kdy aplikace je rozdělena na tři části. Model reprezentuje data, View slouží pro interakci s uživatelem a Controller je zodpovědný za zpracování uživatelských požadavků. Pull varianta je jeho rozšířením, ve kterém Controller tlačí data do View, takže ve View máte přístup jen k těm datům, které vám Controller zpřístupní.

Model je postaven na základě objektů majících společného předka - GenericObject. Tato data jsou ukládána přes JDBC do databáze MySQL. Pro zvýšení rychlosti je na vrstvu persistence navázána transparentní cache.

Jako View v současnosti slouží knihovna Velocity, ale kvůli jejím nedostatkům a nulovému vývoji přecházím na FreeMarker. Obě knihovny definují svůj vlastní programovací jazyk, který se podobně jako PHP zapisuje přímo do html souborů. Jazyky jsou velice jednoduché, koneckonců šablony (jak se kombinaci html a těchto jazyků říká) by měli vytvářet designeři, nikoliv programátoři.

Konečně poslední zásadní částí architektury je Controller. Zde se jedná o několik desítek servletů. Ty mají na starost zkontrolovat vstup od uživatelů (HTTP request), zpracovat jej (například uložit komentář či vytáhnout článek z databáze), zvolit šablonu a vykonat šablonu. Její výstup je pak vrácen prohlížeči.

Motivace

V dnešním díle se budeme hlouběji zabývat modelem. Nejdříve se pokusím vysvětlit své cíle a požadavky, aby bylo jasné, proč model vypadá zrovna takto.

Když jsem propgramoval AbcLinuxu, měl jsem již dostatek zkušeností s projektem Linux Hardware. Tento projekt umožňoval ukládat hardwarové záznamy do stromové struktury a později bylo přidáno diskusní fórum. Databáze byla naprogramována účelově a pro každou novou službu bylo nutno přidat nové tabulky. Vytváření vazeb mezi tabulkami bylo velmi obtížné. Neexistovala žádná separace do MVC a jedna php stránka měla na starost jak manipulaci, tak zobrazování dat. Proto přidávání nových služeb bylo prakticky nemožné.

Mým hlavním požadavkem tedy byla maximální flexibilita. Chtěl jsem mít možnost vytvářet vazby mezi libovolnými objekty, snadno přidávat nové služby a upravovat existující objekty. Mou noční můrou z časů Linux Hardware bylo, když po mně někdo chtěl přidat další údaj k hardwarovým záznamům. Znamenalo by to úpravu tabulky v databázi a kontrolu všech databázových příkazů. Proto jsem se rozhodl, že vlastní data budou uložena v podobě XML, v tabulce reprezentované jako BLOB. Takto mám zachovánu zpětnou i dopřednou kompatibilitu :-).

Z Linux Hardware se mi osvědčilo členění dat do stromu. Například Procesory / Intel / Pentium III / Pentium III 750 MHz. Proto jsem chtěl tuto vlastnost nejen zachovat, ale vytvořit ji univerzálněji. Abych mohl vytvořit vazby mezi libovolnými objekty, i těmi, které ještě neexistují. V Linux Hardware byly tyto vztahy natvrdo zapsány do tabulek. Například záznam měl jako políčko číslo položky, položka zase obsahovala číslo kategorie, ve které je umístěna. Ale co když jsem chtěl mít jednu položku ve dvou kategoriích? Řešením je nový objekt Relation.

Popis tříd modelu

Každý objekt modelu je potomkem GenericObjectu. Proto všechny objekty sdílejí jeho vlastnosti. GenericObject má dvě hlavní vlastnosti (properties). Prvním z nich je id. Jedná se o identifikátor objektu, který spolu s třídou jednoznačně objekt identifikuje. Druhou vlastností je content, což je seznam relací, ve kterých je objekt předkem. Relation je objekt definující vztah mezi dvěma objekty. Každý objekt tedy může mít libovolný počet libovolných potomků, stačí vytvořit mezi nimi relaci. Jedná se o Composite pattern.

Na následujícím obrázku je zobrazen UML diagram tříd v AbcLinuxu.

model class diagram

Než se dostanu k detailnějšímu popisu jednotlivých tříd, měl bych se zmínit o způsobu, jak je řešeno XML. Jak jsem se již zmínil, v databázi je XML uložen jako blob data. Třídy, které jej používají, musí implementovat rozhraní XMLContainer. Takto získávám uniformní přístup ke stejným datům. Protože pětkrát implementovat stejnou funkcionalitu je nesmysl, vytvořil jsem třídu XMLHandler a zmíněné třídy (User, Relation, Category, Item a Record) ji používají (viz asociativita v class diagramu). XML je fyzicky realizováno pomocí stromu knihovny DOM4J.

GenericDataObject je společný předek tříd Category, Item a Record. Kromě instance XMLHandleru obsahuje vlastnosti owner (id vlastníka), type (dělení na podtypy) a datumy created a updated (kdy byl objekt vytvořen, respektive naposledy upraven). Category reprezentuje jednu sekci stromu, Item zase položku (hlavička článku, položka hardwaru apod). Konečně Record reprezentuje jeden záznam, jedná se vždy o list stromu a je potomkem Item.

User uchovává uživatelské profily. Z důvodu lepší efektivity a přehlednosti jsou některé jeho vlastnosti uloženy mimo XML. Jedná se o login, name, email a password. Vše ostatní je v XML. Relation obsahuje dvě hlavní vlastnosti - parent a child. Náznak obousměrného seznamu je vytvořen skrze vlastnost upper, která obsahuje odkaz na rodičovskou relaci. Zbylá data (možnost předefinovat ikonku či jméno potomka) jsou opět uložena v XML.

Poll je objekt obsahující ankety a v budoucnu i hodnocení článků. Má dvě logické vlastnosti - multichoice a closed. Ty určují, zda je povoleno dát hlas více možnostem, respektive zda je vůbec možné ještě hlasovat. Položky jsou uloženy v separátním objektu PollChoice. Není to optimální implementace, ale nechtělo se mi ručně předělávat staré ankety z Linux Hardware. Teď toho začínám litovat.

Server drží informace o cizích serverech, ze kterých stahujeme aktuální články. Link obsahuje data o externí informaci, například nejnovější článek na Rootovi. Můj původní záměr byl však mnohem širší, chtěl jsem vám dát možnost přidávat URL do systému. Konečně Data je další nedodělek. V Linux Hardware bylo možné přidávat k položkám obrázky, například snímek scanneru. Data byla určen právě pro tyto účely. Bohužel jiné věci měly prioritu.

Související články

Proč právě Java?
AbcLinuxu pro programátory aneb od PHP k Javě

Odkazy a zdroje

Java
Velocity
FreeMarker
DOM4J
Jakarta

Seriál AbcLinuxu pro programátory (dílů: 4)

První díl: AbcLinuxu pro programátory aneb od PHP k Javě, poslední díl: Strč prst skrz AbcLinuxu - II.
Předchozí díl: Proč právě Java?
Následující díl: Strč prst skrz AbcLinuxu - II

Další články z této rubriky

LLVM a Clang – více než dobrá náhrada za GCC
Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
Reverzujeme ovladače pro USB HID zařízení
Linux: systémové volání splice()
Programování v jazyce Vala - základní prvky jazyka

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.