Dnes si ukážeme práci s pokročilými typy vlastností Caché tříd a kolekcemi a jejich projekci do Javy.

K tomu si upravíme v Caché Studiu třídu ucto.demo.Denik; přidáme následující dvě vlastnosti

/// seznam oprávněných osob, které smí provádět účetní zápisy v dané úč. jednotce
Property opravneniUzivatele As list Of %String(JAVATYPE = "java.util.List");

/// různé dokumenty vztahující se k dané účetní jednotce
Property zivnostenskyList As %Stream.GlobalBinary;

Property poznamka As %GlobalCharacterStream;

Dále ještě přidáme definici projekce:

Projection Java As %Projection.Java(ROOTDIR = "C:\Software\Projects\Java\netbeans projects\mojeucto\src\mojeucto\");

Caché podporuje dva typy vícehodnotových vlastností, a to jednak pole (asociativní) a seznamy. Při generování projekce do Javy Caché automaticky převádí tyto struktury do standardních Java tříd java.util.Map, respective java.util.List. My jsme u vlastnosti opravneniUzivatele uvedli explicitně, prostřednictvím parametru JAVATYPE, že Caché seznam má být vystaven v Javě jako java.util.List. Toto v daném případě není třeba, generátor by to udělal automaticky, ale berte to jako ukázku toho, jak je možno uživatelsky ovlivnit datové typy vlastností proxy tříd.

Výsledný vygenerovaný zdrojový kód vlastnosti opravneniUzivatele v Javě tudíž vypadá takto:

public java.util.List getopravneniUzivatele() throws com.intersys.objects.CacheException {
... implementace
return (java.util.List)(cobj.newJavaInstance());
}

Pro vlastnost zivnostenskyList se vygenerují dvě metody, jedna pro vstupní a druhá pro výstupní operace:

public com.intersys.objects.CacheInputStream getzivnostenskyListIn() throws com.intersys.objects.CacheException {
... implementace
return (db.getInputStream (cobj));
}

public com.intersys.objects.CacheOutputStream getzivnostenskyListOut() throws com.intersys.objects.CacheException {
... implementace
return (db.getOutputStream (cobj));
}

K vlastnosti poznamka se též vygenerují dvě metody, ale budou vracet třídy Reader nebo Writer, neboť poznámka je znakový řetězec.

Máme-li vystavenou Java projekci třídy Denik, můžeme vložit nová data do databáze třeba takto:

//... deklarace a inicializace
String url="jdbc:Cache://localhost:56773/" + namespace;

/* Connect to this machine, in the SAMPLES namespace */
dbconnection = CacheDatabase.getDatabase (url, username, password);

// ! zjednoduseni: mame pouze jeden denik, s id = 1
denik = (Denik)Denik._open(dbconnection,new Id(1));
System.out.println(denik.getucetniJednotka());

// prida noveho opravneneho uzivatele;
denik.getopravneniUzivatele().add(ou);
denik.save();
System.out.println(denik.getopravneniUzivatele().size());
dbconnection.closeObject(denik.getOref());
denik = null;

// zmenime / pridame poznamku
denik.getpoznamkaOut().write("Toto je druhy test!");
denik.save();

// podobne i binarni data - viz plny priklad

/* Close the connection */
dbconnection.close();

Úplný zdrojový kód příkladu naleznete zde.

Nyní ještě probereme možnosti uživatelského upřesnění způsobu generování projekcí do java tříd, slíbené z minula.

Třída %Projection.Java, která je zodpovědná za tvorbu proxy tříd, má několik parametrů, určujících chování procesu projekce a výsledku.

Základním parametrem, s nímž jsme se již seznámili, je parametr ROOTDIR. Tento parametr určuje kmenový adresář, ve kterém se budou tvořit podadresáře podle balíčku Caché třídy a kde budou uloženy proxy třídy.

Dalšími parametry jsou mj. tyto, uvedené v tabulce:

Název Hodnoty Popis

JAVADOC

1, 0

Určuje, zda se bude automaticky generovat příslušná dokumentace

PRIMITIVEDATATYPES

1, 0

Určuje, zda datové typy Caché budou v proxy třídách vystaveny jako primitivní datové typy Javy

NEWCOLLECTIONS

1, 0

Tento parametr je užitečný hlavně u starších aplikací, určuje, zda se datové typy Caché typu seznam či pole budou v Javě vystavovat jako java.util.List či java.util.Map, nebo zda použijí dnes již zavržené třídy z knihovny CacheDB.jar

RECURSIVE

1, 0

Určuje, zda se při sestavování proxy třídy mají generovat i projekce závislých tříd

POJO

1, 0

Určuje, zda se vystavené třídy mají generovat jako POJO (klasické obyčejné Java třídy) objekty nebo jako původní proxy třídy

CHECKUPTODATE

1, 0

Určuje, zda se projekce mají generovat vždy, nebo jen pro třídy, které byly změněny od poslední kompilace

V příštím díle si ukážeme práci s vloženými dotazy Caché tříd.