X-komponenty 3.1. Uživatelská příručka. J. Kocman, V. Trojan

Podobné dokumenty
Teoretické minimum z PJV

Generické programování

Programování v Javě I. Leden 2008

Programování v Javě I. Únor 2009

Seminář Java II p.1/43

Java a XML. 10/26/09 1/7 Java a XML

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Úvod do programovacích jazyků (Java)

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

KTE / ZPE Informační technologie

Algoritmizace a programování

20. Projekt Domácí mediotéka

Výčtový typ strana 67

1. Téma 12 - Textové soubory a výjimky

Typický prvek kolekce pro české řazení

RMI Remote Method Invocation

typová konverze typová inference

Java Výjimky Java, zimní semestr

1. Programování proti rozhraní

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

RMI - Distribuované objekty v Javě

UJO Framework. revoluční architektura beans. verze

Dědičnost (inheritance)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

8 Třídy, objekty, metody, předávání argumentů metod

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PŘETĚŽOVÁNÍ OPERÁTORŮ

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

IRAE 07/08 Přednáška č. 1

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

17. Projekt Trojúhelníky

Abstraktní datové typy: zásobník

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Zápis programu v jazyce C#

Java - výjimky. private void vstup() throws IOException {... }

Z. Kotala, P. Toman: Java ( Obsah )

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programovací jazyk Java

Soubor jako posloupnost bytů

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Abstraktní třída a rozhraní

Úvod do programovacích jazyků (Java)

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

PREPROCESOR POKRAČOVÁNÍ

JAVA. Další jazyky kompilovatelné do Java byte-code

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Návrh softwarových systém. Návrh softwarových systémů

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Úvod do programování - Java. Cvičení č.4

Algoritmizace a programování

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Datové struktury. alg12 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Vytváření a použití knihoven tříd

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

7. Dynamické datové struktury

Datové typy strana 29

Principy objektově orientovaného programování

Výjimky. v C# a Javě

Iterator & for cyklus

ADT/ADS = abstraktní datové typy / struktury

Remote Method Invocation RMI

Jazyk C# (seminář 6)

Jazyk C# (seminář 3)

Java Enum Java, zimní semestr ,2017 1

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Úvod do programovacích jazyků (Java)

OOPR_05. Případové studie

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

7. Datové typy v Javě

3. Třídy. Základní pojmy objektového programování. Třídy

8. přednáška: Soubory a proudy

Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml

Regulární výrazy. Vzory

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Programování v C++ 2, 4. cvičení

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Soketové připojení Klient InetAddress getbyname() UnknowHostException SecurityException Socket getinputstream() getoutputstream() IOException Server

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

Přehled probírané látky

Java Řetězce Java, zimní semestr

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Dynamicky vázané metody. Pozdní vazba, virtuální metody

KTE / ZPE Informační technologie

Projekty pro výuku programování v jazyce Java

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Transkript:

X-komponenty 3.1 Uživatelská příručka Napsal: J. Kocman, V. Trojan Verze: 3.1 Ze dne: 01.11.2017

Chyba! Nenalezen zdroj odkazů. Chyba! Nenalezen zdroj o dkazů. Soupis změn Výchozí verze i

Chyba! Nenalezen zdroj odkazů. Chyba! Nenalezen zdroj o dkazů. Obsah 1 Úvod... 1 1.1 Používané pojmy a zkratky... 1 2 X-komponenty... 2 2.1 Instance X-komponenty... 4 2.2 XDPozice... 4 2.3 Příkazy pro generování X-komponent... 4 2.3.1 Příkaz %class... 4 2.3.2 Příkaz %bind... 5 2.3.3 Příkaz %interface... 5 2.3.4 Příkaz %ref... 6 2.3.5 Příkaz %enum... 7 3 Jak pracovat s X-komponentami... 8 3.1 Generování X-komponent... 8 3.2 Vytvoření instance X-komponenty z XML (unmarshalling)... 8 3.3 Vytvoření XML z X-komponenty (unmashalling)... 8 3.4 Transformace na jinou X-komponentu... 9 4 Příklad... 10 4.1 Vytvoření X-komponent a práce s nimi... 10 4.2 Ukázka transformace... 12 Dokument: Chyba! Nenalezen zdroj odkazů., verze: 3., ze dne: 01.11. ii

1 Úvod T ento dokument je uživatelskou příručkou popisující základní použití technologie "X-komponent". Je určen pro programátory, kteří potřebují převádět data z XML do objektů a zpět. X-komponenty jsou nadstavbou nad X-definicemi a rozšiřují její možnosti o další způsob práce s XML. Pro použití X-komponent je nutné mít základní znalosti o X-definicích. Upozornění: Tento manuál se týká implementace X-komponent v X-definicích verze 3.1 build 3.1.2.5 Dotazy, poznámky a hlášení chyb poslílejte na adresu: xdef@syntea.cz. Aktuální verzi X-definic můžete stáhnout na adrese: http://www.xdef.cz. 1.1 Používané pojmy a zkratky X-definice X-komponenty X-komponenta XComponent Unmarshalling Marshalling xd:component 1. Jazyk, který umožňuje popsat strukturu, obsah a zároveň i zpracování obsahu XML objektů. 2. XML element jehož obsah je zapsán v jazyce X-definic. Technologie pro vytváření javovských tříd na základě struktury X-definic. Javovská třída či objekt, který byl vytvořen technologií X-komponent. Javovské rozhraní cz.syntea.xc.xcomponent, které implementují všechny X-komponenty. Naplnění objektů daty z XML. Opak marshallingu. Převod dat z objektů do XML. Opak unmarshallingu. XML element v X-definici obsahující popis X-komponent. 1 / 12

2 X-komponenty X-komponenta je vygenerovaná javovská třída, která svou strukturou odpovídá určitému modelu X-definice. Každému elementu v X-definici odpovídá jedna X-komponenta. Hodnoty atributů, elementů a textových hodnot jsou v X-komponentě přístupné pomocí metod getnazev() a setnazev(), kde Nazev je jméno atributu nebo elementu v X-definici. Převod mezi hodnotou atributu nebo textové hodnoty v X-definici a objektem v Javě je dán následující tabulkou. X-definice boolean short, int, long float, double dec, decimal datetime, xdatetime duration base64binary, hexbinary enum ostatní X-komponenta java.lang.boolean java.lang.long java.lang.double java.math.bigdecimal cz.syntea.xdef.sys.sdatetime cz.syntea.xdef.sys.sduration byte[] Java.lang.String nebo Enum v Javě java.lang.string Všechny typy jsou objekty, což umožňuje u nepovinných atributů testovat, zda při převodu X-komponenty do XML mají být generovány či nikoliv. Pokud bude mít element více opakování, vytvoří se pole hodnot (implementované pomocí java.util.list). Příklad Mějme vzorovou X-definici popisující pojistnou smlouvu: <Smlouva VIN = "required int()" DatumUzavreni = "required datetime('yyyymmdd')"> <Vlastnik NazevFirmy = "required string()" ICO = "required num(8)" /> <Provozovatel xd:script="occurs 1.." RC = "required num(10)" /> </Smlouva> Vygenerovaná X-komponenta bude vypadat následovně (konstruktory a metody z rozhraní cz.syntea.xdef.component.xcomponent nejsou zobrazeny): package cz.syntea.user.kocman.manual; public class Smlouva implements cz.syntea.xdef.component.xcomponent{ public cz.syntea.xdef.sys.sdatetime getdatumuzavreni() {return _DatumUzavreni; public java.util.date dateofdatumuzavreni() { return cz.syntea.xdef.sys.sdatetime.getdate(_datumuzavreni); public java.sql.timestamp timestampofdatumuzavreni() { return cz.syntea.xdef.sys.sdatetime.gettimestamp(_datumuzavreni); public java.util.calendar calendarofdatumuzavreni() { return cz.syntea.xdef.sys.sdatetime.getcalendar(_datumuzavreni); public Long getvin() {return _VIN; public Smlouva.Vlastnik getvlastnik() {return _Vlastnik; public java.util.list<smlouva.provozovatel> listofprovozovatel() {return _Provozovatel; public void setdatumuzavreni(cz.syntea.xdef.sys.sdatetime x) {_DatumUzavreni = x; public void setdatumuzavreni(java.util.date x) { _DatumUzavreni=x==null? null : new cz.syntea.xdef.sys.sdatetime(x); public void setdatumuzavreni(java.sql.timestamp x) { _DatumUzavreni=x==null? null : new cz.syntea.xdef.sys.sdatetime(x); public void setdatumuzavreni(java.util.calendar x) { _DatumUzavreni=x==null? null : new cz.syntea.xdef.sys.sdatetime(x); public void setvin(long x) {_VIN = x; 2 / 12

public void setvlastnik(smlouva.vlastnik x) {_Vlastnik = x; public void addprovozovatel(smlouva.provozovatel x) { if (x!=null) _Provozovatel.add(x); private cz.syntea.xdef.sys.sdatetime _DatumUzavreni; private Long _VIN; private Smlouva.Vlastnik _Vlastnik; private final java.util.list<smlouva.provozovatel> _Provozovatel = new java.util.arraylist<smlouva.provozovatel>(); public static class Vlastnik implements cz.syntea.xdef.component.xcomponent{ public String getico() {return _ICO; public String getnazevfirmy() {return _NazevFirmy; public void setico(string x) {_ICO = x; public void setnazevfirmy(string x) {_NazevFirmy = x; public String xposofico(){return XD_XPos + "/@ICO"; public String xposofnazevfirmy(){return XD_XPos + "/@NazevFirmy"; private String _ICO; private String _NazevFirmy; public static class Provozovatel implements cz.syntea.xdef.component.xcomponent{ public String getrc() {return _RC; public void setrc(string x) {_RC = x; public String xposofrc(){return XD_XPos + "/@RC"; private String _RC; 3 / 12

2.1 Instance X-komponenty Každá X-komponenta implementuje rozhraní cz.syntea.xdef.component.xcomponent, které umožnuje převod z a do XML. Instance X-komponenty může být vytvořena při parsování XML podle modelu v X-definici, kdy dojde i k jejímu naplnění příslušnými daty z XML (operace unmarshalling). X-komponentu lze vytvořit i pomocí bezparametrického konstruktoru a daty ji naplnit ručně. Z instance X-komponenty je možné vytvořit XML element zavoláním metody cz.syntea.xdef.component.xcomponent.toxml() (operace marshalling). 2.2 XDPozice XDPozice je popis místa v kolekci X-definic (XDPoolu). Skládá se ze jména X-definice, po kterém následuje # a jméno modelu. Za modelem může následovat znak / a buď jméno vnořeného elementu, text() pro textovou hodnotu, nebo @ a jméno atributu. Pokud mají jména prefix, tak se zapisují s prefixem tak, jak byla uvedena v X-definici. Pokud se v množině potomků elementu vícekrát vyskytuje uzel se stejným jménem, doplní se do hranatých závorek pořadové číslo (čísluje se od jedničky [1] ). Pokud se pořadí neuvede, bude se brát pouze první element ( [1] se nemusí zapisovat). V následujícím příkladě jsou pro ukázku uvedeny XDPozice všech prvků v X-definici: <xd:def name = "Model"> <A> Model#A <B Model#A/B b = "string()" /> Model#A/B/@b <C /> Model#A/C <B> Model#A/B[2] required string(); Model#A/B/$text </B> </A> 2.3 Příkazy pro generování X-komponent Příkazy pro tvorbu X-komponent se zapisují do sekce <xd:component>, která musí být uvedena v X-definici. Sekce <xd:component> může být v samostatné X-definici nebo může být součástí libovolné jiné X-definice. Každý příkaz je ukončen znakem ;. 2.3.1 Příkaz %class Příkazem %class se definuje Javovská třída, která se má vygenerovat podle určitého elementu v X-definicích. Za klíčovým slovem %class následuje plně kvalifikované jméno třídy a klíčové slovo %link, které určuje pozici modelu v XDPoolu, pro který se má daná X-komponenta vygenerovat. Pokud má X-komponenta rozšiřovat nějakou třídu, či implementovat rozhraní, lze plně kvalifikované jméno rozšířit o extends JmenoSuperClass implements JmenoInterface, kde JmenoSuperClass a JmenoInterface musí být znovu plně kvalifikovaná jména. Syntaxe je stejná jako v deklaraci třídy definované v zdrojovém kódu Java. Příklad 1 Zdrojová X-definice: <xd:def xmlns:xd="http://www.syntea.cz/xdef/3.1" xd:name="vozidlo" xd:root="vozidlo"> <Vozidlo VIN = "required string()" /> <xd:component> %class cz.syntea.tutorial.vozidlo extends cz.syntea.tutorial.prevozidlo implements cz.syntea.tutorial.ivozidlo %link Vozidlo#Vozidlo; </xd:component> Vygenerovaná X-komponenta: 4 / 12

package cz.syntea.tutorial; public class Vozidlo extends cz.syntea.tutorial.prevozidlo implements cz.syntea.tutorial.ivozidlo, cz.syntea.xdef.component.xcomponent{ public String getvin() {return _VIN; public void setvin(string x) {_VIN = x; private String _VIN; 2.3.2 Příkaz %bind Jméno objektu (atributu, textové hodnoty či elementu a odpovídající jméno getterů a setterů) lze nastavit příkazem %bind. Po klíčovém slově %bind následuje jméno proměnné, které bude použito místo automaticky vygenerovaného. Dále následuje příkaz %from, po kterém jsou uvedeny XDPozice všech prvků oddělených čárkou, kterých se příkaz týká. Stejné jméno může být použito ve více modelech. Gettery a settery budou automaticky upraveny tak, aby odpovídaly nově přiřazenému jménu (viz Příklad 1). Pokud vygenerovaná třída má předka, lze pomocí %bind navázat objekt na getter a setter definovaný v předkovi. V tomto případě se daná proměnná včetně getterů a setterů nebude vůbec generovat a bude využívat implementaci těchto metod předka (viz Příklad 2). Příklad 2 Máme nákladní vozidlo, které rozšiřuje vozidlo z předchozího příkladu. Vygenerovaná X-komponenta nebude obsahovat gettery a settery pro položky, které se zdědily: <xd:def xmlns:xd="http://www.syntea.cz/xdef/3.1" xd:name="nakladni" xd:root="nakladni"> <Nakladni xd:script = "ref Vozidlo#Vozidlo" MaxNaklad = "required int()" /> <xd:component> %bind VIN %with cz.syntea.tutorial.vozidlo %link Nakladni#Nakladni/@VIN; %class cz.syntea.tutorial.nakladni extends cz.syntea.tutorial.vozidlo %link Nakladni#Nakladni; </xd:component> Vygenerovaná X-komponenta. package cz.syntea.tutorial; public class Nakladni extends cz.syntea.tutorial.vozidlo implements cz.syntea.xdef.component.xcomponent{ public Long getmaxnaklad() {return _MaxNaklad; public void setmaxnaklad(long x) {_MaxNaklad = x; private Long _MaxNaklad; 2.3.3 Příkaz %interface Často se vyskytuje případ, kdy (koncový) model přebírá strukturu jiného (referenčního) modelu a případně ji i doplňuje o další atributy, textové hodnoty či elementy. Aby se X-komponenty vygenerované z koncových modelů mohly chovat jako X-komponenta vytvořená z referenčního, lze z daného modelu vytvořit interface. Tento interface pak lze přidat u generování koncových modelů (viz 2.3.1). Interface se vytvoří klíčovým slovem %interface, za kterým je plně kvalifikované jméno interfaceu a klíčové slovo %link s pozicí modelu v XDPoolu. Příklad 3 Osobní automobil má stejnou část struktury jako Vozidlo. Tato struktura byla vytažena ven a element OsobniVozidlo se na ni odkazuje. 5 / 12

<xd:def xmlns:xd="http://www.syntea.cz/xdef/3.1" xd:name="osobni" xd:root="osobni"> <Vozidlo VIN = "required string()" /> <Osobni xd:script = "ref Vozidlo" Pocetmist = "required int()" /> <xd:component> %interface cz.syntea.tutorial.ivozidlo %link Osobni#Vozidlo; %class cz.syntea.tutorial.osobni implements cz.syntea.tutorial.ivozidlo %link OsobniVozidlo#Osobni; </xd:component> Vygenerovaný interface pak má definovány veškeré gettery a settery. X-komponenta Osobni je vygenerovány standardně jako v předchozích příkladech, pouze implementuje rozhraní IVozidlo. package cz.syntea.tutorial; public interface IVozidlo extends cz.syntea.xdef.component.xcomponent { public String getvin(); public void setvin(string x); public String xposofvin(); package cz.syntea.tutorial; public class Osobni implements cz.syntea.tutorial.ivozidlo,cz.syntea.xdef.component.xcomponent{ public Long getpocetmist() {return _Pocetmist; public String getvin() {return _VIN; public void setpocetmist(long x) {_Pocetmist = x; public void setvin(string x) {_VIN = x; private Long _Pocetmist; private String _VIN; 2.3.4 Příkaz %ref Často se stává, že XDPool je generován z různého množství X-definic. V případě, že X-komponenta je vygenerována danou X-definicí, ale XDPool je jiný (například tam jsou nějaké X-definice navíc), lze se na již vytvořenou X-komponentu odvolat a zamezit jejímu opětovnému vygenerování (například pokud se daná X- komponenta nachází v jiném jaru). K odkazu na již vygenerovanou X-komponentu se používá příkaz %ref s plně kvalifikovaným jménem již vygenerované X-komponenty a klíčovým slovem %link s pozicí modelu v XDPoolu. Příklad V jar souboru, který máme v classpath, je již vygenerována X-komponenta cz.syntea.test.prexd.vozidlo (z Příkladu 1). X-definici, která tuto X-komponentu vygenerovala, máme zahrnutou v XDPoolu. Pak při tvorbě nových X-komponent se pak použije již vygenerovaná X-komponenta a negeneruje se znovu. <xd:def xmlns:xd="http://www.syntea.cz/xdef/3.1" xd:name="flotila" xd:root="flotila"> <Flotila> <Osobni xd:script = "ref Vozidlo#Vozidlo; occurs 0.."/> <Dodavka xd:script = "ref Vozidlo#Vozidlo; occurs 0.."/> </Flotila> <xd:component> %ref cz.syntea.tutorial.vozidlo %link Vozidlo#Vozidlo; %class cz.syntea.tutorial.flotila %link Flotila#Flotila; </xd:component> 6 / 12

package cz.syntea.tutorial; public class Flotila implements cz.syntea.xdef.component.xcomponent{ public java.util.list<vozidlo> listofosobni () {return _Osobni; public java.util.list<vozidlo> listofdodavka() {return _Dodavka; public void addosobni (Vozidlo x) { if (x!= null) { if (x.xgetxpos() == null) x.xinit(this, "OsobniAutomobil", null, "Flotila#Flotila/Osobni"); _Osobni.add(x); public void adddodavka(vozidlo x) { if (x!= null) { if (x.xgetxpos() == null) x.xinit(this, "Dodavka", null, "Flotila#Flotila/Dodavka"); _Dodavka.add(x); private final java.util.list<vozidlo> _Osobni = new java.util.arraylist<vozidlo>(); private final java.util.list<vozidlo> _Dodavka = new java.util.arraylist<vozidlo>(); 2.3.5 Příkaz %enum Pokud je v X-definici použit datový typ enum nebo list, převádí se do X-komponent standardně jako String. V případě, že chceme i v kódu mít na výběr pouze z povolených hodnot, lze z datového typu enum a list vytvořit enum v kódu Javy. Datový typ musí být definovaná mimo model v sekci <xd:declaration>. Enum se vygeneruje pomocí příkazu %enum následovaný plně kvalifikovaným jménem třídy a názvem datového typu. Příklad <xd:def xmlns:xd="http://www.syntea.cz/xdef/3.1" xd:name="vozidlo2" xd:root="vozidlo2"> <Vozidlo2 VIN = "required string()" Barva = "required barva()" /> <xd:declaration> type barva enum('bila', 'modra', 'zelena'); </xd:declaration> <xd:component> %enum cz.syntea.tutorial.barva barva; %class cz.syntea.tutorial.vozidlo2 %link Vozidlo2#Vozidlo2; </xd:component> package cz.syntea.tutorial; public enum Barva implements cz.syntea.xdef.component.xcenumeration { bila, modra, zelena; @Override public final Object itemvalue() {return name(); @Override public final String tostring() {return name(); public static final Barva toenum(final Object x) { if (x!= null) for(barva y: values()) if (y.itemvalue().tostring().equals(x.tostring())) return y; return null; package cz.syntea.tutorial; 7 / 12

public class Vozidlo2 implements cz.syntea.xdef.component.xcomponent{ public cz.syntea.tutorial.barva getbarva() {return _Barva; public String getvin() {return _VIN; public void setbarva(cz.syntea.tutorial.barva x) {_Barva = x; public void setvin(string x) {_VIN = x; private cz.syntea.tutorial.barva _Barva; private String _VIN; Poznámka - některé příkazy v X-definici ovlivňují i vytvořenou X-komponentu: ignore takto označené prvky X-definice při zpracování ignoruje. Nevytváří se ani odpovídající X-komponenta nebo getter a setter forget elementy se po zpracování vymažou z paměti i ze zpracovávaného dokumentu. Odpovídající X-komponenta se ale vytvoří 3 Jak pracovat s X-komponentami 3.1 Generování X-komponent Abychom vygenerovali X-komponenty podle X-definic, musíme mít vytvořen objekt cz.syntea.xdef.xdpool. Ten se může vytvořit např. metodou cz.syntea.xdef.xdfactory.compilexd(). Druhou možností je XDPool je načíst již zkompilovaný XDPool (metoda cz.syntea.xdef.xdfactory.readxdpool()). X-komponenty se vygenerují pomocí metody cz.syntea.xdef.component.genxcomponent.genxcomponent() (viz následující ukázka kódu). XDPool xdpool = XDFactory.compileXD(null, "resources/manual/vozidlo.xdef"); GenXComponent.genXComponent( xdpool, // XDPool new File("src/main/java").getAbsolutePath(), // adresář kam se bude generovat null // znakova sada (defaultne UTF-8) ); Pomocí shora vytvořeného progamu vygenerujeme zdrojové kódy X-komponent definované v předaném XDPoolu. Po překladu Java kompilátorem vzniknou třídy, které můžeme používat. 3.2 Vytvoření instance X-komponenty z XML (unmarshalling) XDPool je plně reentrantní objekt, proto je vhodné jej uložit jako statickou finální proměnnou, která je staticky iniciovaná a je přístupná pro všechny programy, které s ní pracují. Např. příkazem: Příklad vytvoření X-komponenty z XML: public static final XDPool XD_POOL = XDFactory.compileXD(null, "/manual/vozidlo.xdef");... ArrayReporter reporter = new ArrayReporter(); File source = new File("src/main/resources/manual/Vozidlo.xml");... // 1. Vytvoříme obvyklým způsobem objekt XDDocument XDDocument doc = XD_POOL.createXDDocument("Vozidlo"); // 2. X-komponentu vytvoříme metodou parsexcomponent(). XComponent xc = doc.parsexcomponent(source, Vozidlo.class, reporter); // 3. Metoda parsexcomponent vrací instanci XComponent vyvořenou podle příkazu %class. // Můžeme ji tedy přetypovat na třídu, kterou jsme definovali příkazem %class a pak // používat příslušné gettery a settery: getmujobjekt(),... setmujobjekt(...)... Vozidlo vozidlo = (Vozidlo) xc; 3.3 Vytvoření XML z X-komponenty (unmashalling) Z X-komponenty je možné vytvořit XML element, který odpovídá hodnotám, které jsou v instanci X- komponenty. K tomu slouží příkaz toxml(): 8 / 12

Element el = xc.toxml(); 3.4 Transformace na jinou X-komponentu X-komponenty umožňují vytvořit z X-kompnenty novou X-komponentu, která má jinou strukturu (obdoba konstrukčního režimu). K tomu slouží statická metoda toxcomponent vve třídě XComponentUtil. Příklad: XComponent stara; // původní X-komponenta... XDPool xp; // použitý XDPool XComponent newxc = XComponentUtil.toXComponent(stara, // původní X-kompnenta xp, // XDPool "def#model"); // XDPozice modelu nové X-komponenty 9 / 12

4 Příklad 4.1 Vytvoření X-komponent a práce s nimi Mějme X-definici, ktera popisuje město, ve kterém jsou ulice a domy v nichž jsou nájemníci (soubor manual/town.xdef): <xd:def xmlns:xd="http://www.syntea.cz/xdef/3.1" xd:name="town" xd:root="town " > <Town Name = "required string()"> <Street xd:script="occurs 0..;" Name = "required string()" > <House xd:script="occurs 0..; ref House" /> </Street> </Town> <House Num = "required int()" Address = "optional string()"> <Person xd:script="occurs 0..; ref Person" /> </House> <Person FirstName = "required string()" LastName = "required string()" /> Data jsou uložena v následujícím XML (soubor manual/town.xml): <Town Name="Nicovice"> <Street Name="Dlouha"> <House Num="1"> <Person FirstName="Jan" LastName="Novak"></Person> <Person FirstName="Jana" LastName="Novakova"></Person> </House> <House Num="2"/> <House Num="3"> <Person FirstName="Josef" LastName="Novak"></Person> </House> </Street> <Street Name="Kratka"> <House Num="1"> <Person FirstName="Pavel" LastName="Novak"></Person> </House> </Street> </Town> X-definice s popisem X-komponent (soubor manual/town-xc.xdef): <xd:def xmlns:xd="http://www.syntea.cz/xdef/3.1" xd:name="town-xc"> <xd:component> /************************************************** * X-komponenty generovane z X-definice Town * **************************************************/ %class cz.syntea.tutorial.mesto %link Town#Town; %class cz.syntea.tutorial.dum %link Town#House; /* Vytvorime interface, který odpovídá X-komponente z Town#Person */ %interface cz.syntea.tutorial.obcan %link Town#Person; /* X-komponenta bude mit implementovan tento interface */ %class cz.syntea.tutorial.osoba implements cz.syntea.tutorial.obcan %link Town#Person; </xd:component> Z uvedených X-definic X-komponenty vygenerujeme binární soubor, ve kterém bude uložen XDPool a dále vygenerujeme soubory s java source X-komponent: 10 / 12

public static void main(string[] args) throws IOException { XDPool xdpool = XDFactory.compileXD(null, "data/manual/town.xdef", "data/manual/town-xc.xdef" ); xdpool.writexdpool(new File("resources/manual/XDPool.dat")); GenXComponent.genXComponent( xdpool, // XDPool new File("src/main/java").getAbsolutePath(), // adresář kam se bude generovat null // znakova sada (defaultne UTF-8) ); Nyní můžeme napsat program, bude používat X-komponenty. XDPool uložíme do statické proměnné XP (ze třídy Pool metodou getxdpool). Ze vstupního souboru manual/town.xml vytvoříme instanci X-komponenty Mesto a vytiskneme její obsah. Pak doplníme adresu každého domu a XML zapíšeme do souboru manual/town-processed.xml: public class Ukazka1 { // načteme již zkompilovaný XDPool public static final XDPool XD_POOL; static { try { XD_POOL = XDFactory.readXDPool("resources/manual/XDPool.dat"); catch (IOException e) { throw new RuntimeException(e); public static void main(string[] args) throws Exception { // 1. ziskame XDDocument XDDocument xd = XD_POOL.createXDDocument("Town"); // 2. vytorime instanci X-komponenty Mesto (unmarchall) File mestofile = new File("src/main/resources/manual/Town.xml"); Mesto mesto = (Mesto) xd.parsexcomponent(mestofile, Mesto.class, null); // 3. Vytiskneme obshah X-komponenty Mesto System.out.println("Mesto " + mesto.getname()); for (Mesto.Street ulice: mesto.listofstreet()) { System.out.println("Ulice " + ulice.getname() + ":"); for (Dum dum: ulice.listofhouse()) { System.out.print("Dum c. " + dum.getnum() + ". "); if (dum.listofperson().size() > 0) { System.out.println("Najemnici :"); for (Obcan osoba: dum.listofperson()){ System.out.println(osoba.getFirstName() + " " + osoba.getlastname()); else { System.out.println("Dum nema najemniky"); // 4. Doplnime adresu ke kazdemu domu. for (Mesto.Street ulice: mesto.listofstreet()) { for (Dum dum: ulice.listofhouse()) { dum.setaddress(mesto.getname() + ", " + ulice.getname() + " " + dum.getnum()); // 5. Ulozime XML s doplnenymi adresami do souboru Town_processed.xml (marshall) Element el = mesto.toxml(); KXmlUtils.writeXml("resources/manual/Town_processed.xml", el, true, false); 11 / 12

4.2 Ukázka transformace Zkusme definovat pomocí X-definice nové XML, obsahující seznam nájemníků ve městě a popišme pomocí klauzule create popsat, jak se má vytvořit ze vstupních dat (soubor Residents.xdef): <xd:def xmlns:xd="http://www.syntea.cz/xdef/3.1" xd:name = "Residents" xd:root = "Residents"> <Residents> <Resident xd:script="occurs 0..; create from('//person');" GivenName = "required string(); create from('@firstname')" FamilyName = "required string(); create from('@lastname')" Address = "required string(); create from('../@address')" /> </Residents> Nyní popíšeme X-komponenty pro práci s X-definicí Residents (soubor Residents-XC.xdef): <xd:def xmlns:xd="http://www.syntea.cz/xdef/3.1" xd:name = "Residents-XC"> <xd:component> /************************************************** * X-komponenty generovane z X-definice Residents * **************************************************/ %class cz.syntea.tutorial.najemnici %link Residents#Residents; %bind FirstName %link Residents#Residents/Resident/@GivenName; %bind LastName %link Residents#Residents/Resident/@FamilyName; </xd:component> Transformaci z komponenty Město do tvaru podle modelu Najemnici provedeme příkazem XCompomentUtil.toXComponent(...): public class Ukazka2 { public static void main(string[] args) throws Exception { // 1. ziskame XDPool a XDDocument XDDocument xd = Ukazka1.XD_POOL.createXDDocument("Town"); // 2. vytorime instanci X-komponenty Mesto (unmarchall) File mestofile = new File("resources/manual/Town_processed.xml"); Mesto mesto = (Mesto) xd.parsexcomponent(mestofile, Mesto.class, null); // 3. vytvorime transformaci do X-komponent Najemnici Najemnici najemnici = (Najemnici) XComponentUtil.toXComponent( mesto, Ukazka1.XD_POOL, "Residents#Residents"); // 4. uloxime do souboru Residents.xml Element el = najemnici.toxml(); KXmlUtils.writeXml("resources/manual/Residents.xml", el, true, false); // 5. Vytiskneme najemniky for (Najemnici.Resident x: najemnici.listofresident()) { System.out.println(x.getFirstName() + " " + x.getlastname() + "; " + x.getaddress()); 12 / 12