UJO Framework revoluční architektura beans
verze 0.80 http://ujoframework.org/
Pavel Pone(c), září 2008
Historie rok 2004 upravené objekty z frameworku Cayenne nevýhodou byla špatná typová kontrola rok 2007 využití generických datových typů Java 5.0 vzniká jádro aplikace jWorkSheet publikování samostatného projektu UJO Framework 0.70 v říjnu 2007
Co to je ? UJO - Unified Java Object jednotná architektura objektů společná metoda pro zápis atributů společní metoda pro čtení atributů Vlastnosti: typově bezpečné řešení pro ukládání atributů objektu snadná introspekce serializace do XML, CSV, Resource bundle podpora komponenty JTable implementace užitečných funkcí: toString(), clone(...), equals(ujo), textové konverze
Vize náhrada JavaBeans modelem Map odhalení chybných datových typů hodnot při kompilaci ! odhalení chybných properties (klíče jiných tříd) ! Java 5.0
UJO Framework:
Map<String,Object> bean = new HashMap();
Person bean = new Person();
bean.put("name", "Pavel"); bean.put("cash", 10.0);
bean.set(Person.NAME,"Pavel"); bean.set(Person.CASH, 10.0);
Double cash = (Double) bean.get("cash");
Double cash = bean.get(Person.CASH);
Srovnání JavaBeans a UJO (1) Informace o typu property jsou v UJO objektu na jednom místě
Java 5.0
UJO Framework:
class Person extends Object {
class Person extends MapUjoExt
{
private String name; public String getName() { return name; } public void setName(String name){ this.name = name; } }
public static final MapProperty NAME = newProperty("Name", String.class); }
Srovnání JavaBeans a UJO (2) Jak zacházet s atributy ? JavaBeans objekt class Person extends Object {
UJO objekt class Person extends MapUjoExt { ....
void addCash(double val) { double newCash = this.cash + val; this.cash = newCash; }
void addCash(double val) { double newCash = get(CASH) + val; set(CASH, newCash); }
}
....
}
Implicitní hodnoty atributů JavaBeans property může mít v deklaraci nastavenou implicitní hodnotu { Integer i=10; } UJO property může obsahovat defaultní hodnotu při čtení hodnoty je nedefinovaný výraz (NULL) nahrazován defaultní hodnotou dané UjoProperty ! defaultní hodnotu lze v UJO kdykoli obnovit (zápisem hodnoty NULL) class Person extends MapUjoExt { public static final MapProperty CASH = newProperty("Person", 0.0); /** Tato metoda nikdy nevrací NULL ! */ public Double getCash() { return get(CASH);
}
}
Řetězení properties volání UJO atributů lze řetězit přes více objektů volání je typově bezpečné, typ i pořadí properties se kontrolují při kompilaci v následující ukázce obsahuje třída Person také atribut ADDRESS import static Person.*; import static Address.*; Person bean = new Person(); bean.set(ADDRESS, new Address(); bean.set(ADDRESS, STREET, "Vídeňská"); bean.set(ADDRESS, CITY , "Brno"); String street = bean.get(ADDRESS, STREET); String city = bean.get(ADDRESS, CITY);
Řetězení setters volání metody set() lze řetězit pro zápis několika hodnot jednoho objektu na jeden řádek. import static Person.*; Person bean = new Person(); bean.set(NAME, "Pavel").set(CASH, 100.0); String name = bean.get(NAME); double cash = bean.get(CASH);
List UJO objektů atributem UJO může být také nějaký List, nicméně pro tento typ je vyhrazeno rozhraní UjoPropertyList . implementace UjoExt pro tento typ poskytuje několik užitečných funkcí class Person extends MapUjoExt { public static final MapPropertyList ADDRESSES = newPropertyList("Address", Address.class); void test() { add(ADDRESSES, new Address()); // list is created int count = getItemCount(ADDRESSES); Address ad = get(ADDRESSES, 0); // value from posit. 0 List adr1 = get (ADDRESSES); List adr2 = list(ADDRESSES); // not null allways } }
Práce s textem (1) reálné aplikace pracují s textovým formátem: editace hodnot v uživatelském rozhraní serializace z nebo do textových formátů (xml, csv, ...) parametry z HTTP requestu ladění aplikací
UJO Framework má integrovanou podporu pro konverzi atributů UJO do textového formátu.
Práce s textem (2) Tři způsoby konverze do textu: rodičovská třída SuperUjoExt podporuje nejpoužívanější Java objekty metodou: setText(UjoProperty property, String value) možnost vlastní implementace / překrytí metody UjoTextable.writeValueString(...) framework umí pracovat s objekty, které mají implementované chování PropertyTextable : konstruktor objektu s jedním parametrem typu String rozumí formátu, který vytváří metoda toString()
Práce s textem (3) Následující kód zapisuje a čte číslo ve formátu String: Person bean = new Person(); bean.setText(Person.CASH, "1.379"); String cash = bean.getText(Person.CASH); // PropertyTextable test: new Double(cash).toString().equals(cash);
Více informací je v popisu rozhraní PropertyTextable .
XML export (1) 6x vyšší rychlost ve srovnání s XMLEncoder/XMLDecoder deserializace je o 10% rychlejší ve srovnání s JAXB 2.1 při použití implementace ArrayUjo serializace je pomalejší o 44% ve srovnání s JAXB 2.1 Person person = new Person(); person.set(NAME , "Joseph"); person.add(ADDRESES, new Address("Brno", "Kocourova 16"));
// Make Serialization: UjoManagerXML.getInstance().saveXML(writer, person, null, "My Export"); // Make Deserialization: person = UjoManagerXML.getInstance().parseXML(inputStream, Person.class, "My Import");
XML export (2) potřebujete zakázat export některého atributu ? překryjte metodu Ujo.readAuthorization(), tato metoda slouží k autorizaci akce v závislosti na: property, hodnotě, typu akce a kontextu akce class Person extends MapUjoExt { public static final MapProperty NAME = newProperty("Person", String.class); .... /** Metoda potlačí XML export pro atribut NAME */ public boolean readAuthorization(UjoAction action, UjoProperty property, Object value) { return action.getType()==UjoActions.ACTION_XML_EXPORT && property==NAME ? false : super.readAuthorization( -"- ); } }
XML export (3) implicitně se každý atribut exportuje do samostatného elementu ve XML souboru libovolnou UJO property (nikoli však List) lze označit pro export jako atribut elementu jedním ze dvou způsobů: překrytím metody Ujo.readAuthorization() označením property anotací XmlAttribute (viz ukázka)
class Person extends MapUjoExt { @XmlAttribute public static final MapProperty NAME = newProperty("Person", String.class); }
Rozhraní Ujo a UjoExt všechny předchozí informace se týkaly rozhraní UjoExt (UJO extended) poskytuje konzervativnější a proto čitelnější API přináší nově možnost řetězení properties a setters je podporované od verze UJO Framework 0.80 možnosti obou rozhraní jsou však prakticky identické nástroje frameworku pracují výhradně původním Ujo rozhraním hlavní rozdíl je: objekt Ujo má část klíčových metod deklarovanou v UjoProperty !
Rozdíly Ujo a UjoExt Ujo
UjoExt
příliš revoluční API :-) snadná vlastní implementace lepší typová kontrola property při práci s potomky malé riziko kolize metod objektu s jiným rozhraním metody mohou být o málo rychlejší
čitelnější API pracnější vlastní implementace při dědění objektu je slabší typová kontrola properties větší množství metod nese vyšší riziko kolize s jiným rozhraním podpora řetězení properties a setters
Základ tvoří 2 rozhraní
Základ tvoří 2 rozhraní Interface Ujo: implementace obsahuje business data metoda pro autorizaci properties brána do introspekce (poskytuje seznam UjoProperties) Interface UjoProperty poskytuje vlastnosti property (meta data) obsahuje defaultní hodnotu poskytuje typově bezpečné metody pro čtení a zápis hodnoty nikdy neobsahuje business data !
Základní Ujo implementace Pro snadnou implementaci jsou připraveny abstraktní třídy, každá z nich má stejné API, ale různou implementaci MapUjo - je snadno použitelný s dostatečným výkonem pro běžné aplikace, je postavený na objektu HashMap. ArrayUjo - má vysoký výkon srovnatelný s rychlostí objektu JavaBeans, je implementovaný pomocí pole objektů PojoUjo - implementace volá přímo metody JavaBean podle property name a využívá Java reflexi XxxUjoExt - ke každému předchozímu typu existuje rozšířená implementace, název třídy končí Ext
Příklady použití Perzistentní tabulka
pouze 110 řádků kódu ve třech třídách odkaz na zdrojový kód včetně komentářů Parametry aplikace v jediném UJO objektu (odkaz)
Výhody a nevýhody snadno dostupná struktura objektu dostupné vlastosti atributů včetně defaultní hodnoty práce se seznamem properties (nikoli hodnot) objekt si sám autorizuje použití svých properties snadná tvorba generických funkcí, například: implementace proxy pro třídy se společným předkem generická implementace property listeneru, ... podpora komponenty JTable malá velikost frameworku (50 kB) open source netradiční architektura slabé reference zatím omezená přímá podpora služeb J2EE
Další vývoj výrazný rozvoj jádra už neplánuji spíše rozvoj modulů UJO dependency injection (?) data binding (?) DB perzistence (?) nabízí se mnoho jiných směrů pro rozvoj omezený čas na vývoj
Závěr 4.500 downloadů jWorkSheet za 10 měsíců malá velikost aplikace, výborná rychlost pozitivní ohlasy i recenze přístup na stránky i z velkých firem Epson, Fujifilm, Fujitsu, Siemens 210 downloadů UJO Framework za 10 měsíců prakticky bezproblémové jádro řada funkcí implementovaných přímo v objektu rychlý vývojový start aplikace jWorkSheet vítám připomínky, dotazy a upozornění na případné chyby (dokumentace, SW)
Děkuji za pozornost
UJO Framework homepage: http://ujoframework.org/ Odkaz na prezentaci: http://ujoframework.org/prezentace/
Pavel Pone(c), září 2008