11. Cvičenie - XML jazyky a procesory (Úloha 7)

Ciele
  1. Oboznámiť sa s modelom jazyka pre opis používateľského rozhrania (UI).
  2. Oboznámiť sa s xml schémou špecifikujúcou syntax jazyka pre opis UI.
  3. Oboznámiť sa s XML procesorom JAXB.
  4. Definovať XML syntax jazyka pre opis používateľského rozhrania.
  5. Rozšíriť procesor jazyka pre opis UI o validáciu opísaného používateľského rozhrania v kompozícii s jazykom entít.
  6. Otestujtovať funkčnosť kompozície jazykov výpisom modelu systému obsahujúceho model entít a model UI.
Úvod
    Na dnešnom cvičení vytvoríme jazyk pre opis UI, ktorý bude slúžiť na definíciu používateľského rozhrania. Pomocou tohto jazyka je možné zadefinovať dialógy - formuláre a tabuľky pre prácu s entitami formou CRUD operácií.

    Používateľské rozhranie sa skladá z tabuliek (table), ktoré obsahujú zoznam výskytov entity. Tabuľka sa skladá zo stĺpcov zodpovedajúcich vlastnostiam entity. V prípade, že medzi entitami existuje referencia, je možné pridať špeciálny stĺpec (lookup column), ktorý bude zobrazovať vybranú vlastnosť referovanej entity (napríklad v tabuľke s údajmi o zamestnancovi bude zobrazený názov oddelenia). Na upravovanie jednotlivých výskytov entity slúžia formuláre (form) obsahujúce polia pre hodnoty vlastností (field). V prípade referencie medzi entitami sa znovu použije špeciálny typ poľa (lookup field), ktorý umožní zadať referenciu výberom z tabuľky referovaných entít.

    • UI - trieda reprezentujúca používateľské rozhranie obsahujúca zoznam formulárov a tabuliek používateľského rozhrania.
    • Dialog - dialóg pre komunikáciu s používateľom. Dialóg má jedinečné pomenovanie, slúži na prácu s entitou identifikovanou menom (Entity). Dialóg obsahuje komponenty pre reprezentáciu a manipuláciu s vlastnosťami entity.
    • Component - komponent je prvok dialógu. Komponent sa viaže na vlastnosť entity na základe jej mena (Property).
    • Form - predstavuje formulár pre prácu s jedným výskytom entity. Používa sa pre pridávanie a úpravu výskytu entity. Obsahuje zoznam komponentov typu Field.
    • Table - predstavuje tabuľku pre zobrazenie zoznamu výskytov entít. Obsahuje komponenty typu Column.
    • Field - komponent predstavujúci pole formulára. Slúži pre zadávanie nových hodnôt vlastností entít.
    • LookupField - komponent predstavujúci pole formulára, ktorý umožňuje na základe výberu identifikátora z tabuľky priradiť referenciu.
    • Column - komponent predstavujúci stĺpec tabuľky.
    • LookupColumn - komponent predstavujúci stĺpec tabuľky zobrazujúci vybranú vlastnosť referovanej entity.
    Obr.: Model tried grafického používateľského rozhrania

    Jazyk používateľského rozhrania bude implementovaný ako XML jazyk (XML tutoriál).
    Poznámka: Zamyslite sa: je to externý alebo interný jazyk?

    Syntax tohto XML jazyka bude vyjadrená pomocou XML schémy. Pomocou XML schémy (tutoriál k XML schéme) je možné špecifikovať konkrétny XML jazyk, XML schéma opisuje štruktúru XML dokumentov, ktoré do daného jazyka patria.

    Ako jazykový procesor, ktorý nám umožní spracovanie XML dokumentu opisujúceho používateľské rozhranie a vytvorenie jeho modelu v pamäti, budeme používať JAXB. JAXB (Java Architecture for XML Binding) je knižnica pre spracovanie XML dokumentov, kde jednotlivé elementy XML dokumentu sú naviazané na triedy jazyka Java na základe definovanej XML schémy (XML - objektové mapovanie). Výsledkom spracovania XML dokumentu pomocou príslušnej JAXB metódy je stromová štruktúra objektov, kde uzly tohto stromu zodpovedajú XML elementom. Atribúty a obsah týchto XML elementov sú prístupné pomocou členských premenných. Samotné zobrazenie tried na elementy XML schémy je prispôsobiteľné pomocou anotácií (podobne ako v nástroji YAJCo). S knižnicou je možné sa oboznámiť napríklad v

    Po úspešnom vytvorení jazyka pre opis používateľského rozhrania vykonáme kompozíciu tohto jazyka s jazykom entít.

Postup
  1. Oboznámte sa s vyjadrením modelu jazyka používateľského rozhrania implementovaný v jazyku Java metamodel4.zip.
  2. Príklad XML dokumentu jazyka používateľského rozhrania je uvedený v ui.xml. Syntax tohto XML jazyka bude vyjadrená pomocou XML schémy (príklad schémy: ui.xsd).
    Úloha: Preštudujte štruktúru jazyka pre opis používateľského rozhrania špecifikovanú v uvedenej XML schéme.
    Poznámka: Cieľom tejto úlohy je pochopiť zobrazenie ("mapovanie") XML dokumentu jazyka do jeho modelu v Java triedach.


    Pošli
  3. Pre spracovanie XML dokumentu opisujúceho používateľské rozhranie a vytvorenie jeho modelu v pamäti budeme používať JAXB.
  4. V tomto kroku pridáme do projektu súbory potrebné na konfiguráciu nástroja JAXB a anotácie potrebné pre vygenerovanie schémy XML jazyka do tried metamodelu rozhrania. Následne vygenerujeme XML schému, ktorej správnosť budeme overovať pomocou príkladu z kroku 2.
    Úloha: Pridajte konfiguračné súbory jaxb.index a package-info.java do balíka sk.tuke.magsa.tools.metamodel.ui. Predvytvorené súbory sa nachádzajú v jaxb.zip.


    Pošli
    Úloha: Použite JAXB anotácie na definíciu zobrazenia (mapovania) tried modelu jazyka UI na XML dokumenty pre opis UI. Keďže jazyk pre opis rozhrania sa týka len tried rozhrania, anotovať budeme len tieto triedy.
    Poznámka: Pre bezproblémové spracovanie anotujte gettre sprostredkujúce prístup k členským premenným a nie samotné premenné.


    Pošli
    Na základe anotovaných tried modelu je možné vygenerovať XML schému pomocou nástroja schemagen.
    Úloha: Vygenerujte XML schému pomocou nástroja schemagen, ktorý je súčasťou JDK (napr. C:\Program Files\Java\jdk1.6.0_31\bin\schemagen.exe).
    Poznámka: Pre balík s metamodelom UI je možné vygenerovať XML schému nasledovne (volanie z príkazového riadku v priečinku projektu MaGSA):
    
    schemagen.exe -cp magsa-generator\target\classes -d model magsa-generator\src\main\java\sk\tuke\magsa\tools\metamodel\ui\*.java
    
    XML schéma s názvom schema1.xsd by mala po úspešnom generovaní pribudnúť v adresári model.
    Ladenie: Keďže JAXB spracuje od koreňovej triedy všetky nasledujúce podľa dedičnosti a členských premenných, je potrebné pomocou anotácie @XmlTransient označiť členské premenné, ktorých typ je z iných balíkov než z sk.tuke.magsa.tools.metamodel.ui, napr. getter členskej premennej entity v triede Dialog. Neúspech generovania môže byť následkom toho, že schemagen sa pokúša generovať schému aj pre triedy, ktoré nie sú v balíku sk.tuke.magsa.tools.metamodel.ui a preto nemusia zodpovedať štandardom požadovaným technológiou JAXB.


    Pošli
    Generovanú schému porovnávajte ju so zadanou schémou - zobrazenie tried do XML má zodpovedať príkladovým dokumentom. Prípadné rozdiely opravte zmenou anotácií v triedach modelu rozhrania. Generovanú schému aktualizujete opätovným použitím príkazu uvedeného v predchádzajúcej úlohe.
  5. V tomto kroku vykonáme kompozíciu jazyka entít s jazykom UI.
    Úloha: Pre potreby kompozicie jazykov pridajte do triedy Model členskú premennú ui typu UI a príslušnú get/set metódu.
    Poznámka: Nezabudnite upraviť metódu toString() triedy Model, aby zohľadňoval aj výpis UI.


    Pošli
    Spracovanie XML dokumentu predstavujúceho vetu jazyka pre opis UI a následnú kompozíciu vykonáva trieda UIProcessor. Zdrojový kód tejto triedy sa nachádza v parserxml.zip.
    Úloha: V triede UIProcessor implementujte metódu void validate(Dialogs[] dialogs), ktorej úlohou je validácia opisu UI obsiahnutom vo vstupnom XML dokumente a jeho kompozícia s modelom externého jazyka entít.


    Pošli
    Poznámka: Úloha tejto validačnej metódy je analogická k validácii realizovanej v triede ConstraintBuilder pri kompozícii jazyka obmedzení a jazyka entít (overiť či existujú určené entity a ich vlastnosti). Naviac je však potrebné skontrolovať platnosť referencií (lookup column a lookup field sa majú používať pri referenciách medzi entitami).
    Poznámka: V prípade komponentu typu LookupColumn je potrebné overiť existenciu vlastnosti v referovanej entite. Kým premenná propertyName (zdedená z typu Component) sa v prípade ostatných typov komponentov vzťahuje na vlastnosť entity, ku ktorej komponent patrí, pri LookupColumn sa odkazuje na vlastnosť referovanej entity. Tzn. že definuje, ktorá vlastnosť referovanej entity má byť v danom stĺpci vypísaná. Obdobný test je potrebný pre LookupField, kde sa však k referovanej entite dostanete cez členskú premennú table.
    Poznámka: Zamyslite sa: v ktorom riadku triedy UIProcessor nastáva samotná kompozícia jazyka entít s jazykom používateľského rozhrania?
  6. Úloha: Otestujte funkčnosť kompozície jazykov výpisom modelu systému, ktorý vznikol kompozíciou viet jazykov entít a UI.


    Pošli
    
    public class Make {
        public static void main(String[] args) throws Exception {
            //... povôdný obsah spracovania viet jazyka entít
    
            /* External language - UI */
            UIProcessor uiProcessor = new UIProcessor(
                new FileReader("model/ui.xml"),
                new File("model/ui.xsd")
            );
            uiProcessor.compose(model);
    
            /* Print the model */
            System.out.println(model);
            
            //... povôdný obsah generovania
        }
        //... pôvodný obsah
    }        
    
    Ladenie: Počas spracovania XML dokumentu automaticky prebieha kontrola jeho štruktúry podľa XML schémy, cesta ku ktorej je uvedená ako druhá hodnota atribútu triedy konštruktora UIProcessor. Ak nie je schéma nájdená na uvedenom mieste, potom sa vyhodí výnimka org.xml.sax.SAXParseException.
  7. Vymažte súbory z disku a zrušte všetky vami vytvorené nastavenia vo vývojovom prostredí!
Zdroje
  1. Anotácie:
  2. Viac o XML a XML schémach:
  3. Viac o JAXB:
  4. Zdrojové kódy:
    • metamodel4.zip - model jazyka používateľského rozhrania
    • ui.xml - príklad XML dokumentu jazyka používateľského rozhrania
    • ui.xsd - XML schéma definujúca syntax jazyka používateľského rozhrania
    • jaxb.zip - konfiguračné súbory umožňujúce použitie knižnice JAXB.
    • parserxml.zip - zdrojový kód triedy UIProcessor umožňujúcu spracovanie XML dokumentu.
comments powered by Disqus