GWT Frameworky
Ujorm 1.20 v prostředí Ext GWT (Sencha)
Google User Groups, Praha 9.6.2011, Autor: Pavel Ponec
Úvod
Ujorm je "lehko-tonážní" framework se silnou typovou kontrolou postavenou na Java <generikách>, který nabízí (prostřednictvím svých modulů) služby:
● perzitence objektů do relačích databází (ORM služby)● integrace s Ext GWT projektu Sencha (dále jen GXT)● API + serializace objektů do/z textových formátů
Ujorm pracuje s objekty implementující 2 interface:Ujo + Property
MotivaceProč použít Ujorm ?
● výčet Properties (podoba s Enum + PropertyDescriptor)○ překlepy odhalí kompilátor○ dostupná meta-data○ vhodné pro data binding
● nadstandardní typová kontrola ● bezpečný refactoring zdrojového kódu● snadná tvorba generických komponent ● používání UjoProperty je zábavné :)
Úspora zdrojů:
● úspora času● úspora finančních nákladů● vyšší produktivita
Ujorm pro GXTDva moduly:
● Ujo-gxt-core ○ nabzí klientskou verzi UJO objektů (Cujo) ○ cache Property vlastností (mandatory, length) ○ podpora pro mapování klientských UJO objektů na serverové○ nástroj pro automatizovanou konverzi klientských objektů ○ na serverové (doménové objekty, db dotazy)
Ujorm pro GXTDva moduly:
● Ujo-gxt-core ○ nabzí klientskou verzi UJO objektů (Cujo) ○ cache Property vlastností (mandatory, length) ○ podpora pro mapování klientských UJO objektů na serverové○ nástroj pro automatizovanou konverzi klientských objektů ○ na serverové (doménové objekty, db dotazy)
● Ujo-gxt-crud
○ grafické komponenty podporující DB operace:■ Create■ Read■ Update■ Delete
Class model Ujo + Property
Instance Ujo ● obsahuje data ● nabízí seznam Properties ● může splňovat specifikaci
JavaBeans (ale nemusí)
Class model Ujo + Property
Instance Ujo. . .
Instance UjoProperty● poskytuje meta-data
○ název a ○ typ property○ defaultní hodnotu ○ defaultní směr řazení
● nabízí řetězení s jinou UjoProperty● a různé užitečné metody ● včetně metod pro čtení a zápis ● statická neměnná instance
(immutable object)
GXT: ModelData
ModelData je datový model grafických GXT komponent - jedna instance reprezentuje například: jeden řádek tabulky
GXT: ModelData
ModelData je datový model grafických GXT komponent - příkladem použití je jeden řádek tabulky
Ujorm: CujoCujo je klientská verze rozhraní Ujo pro GXTCujo je potomkem ModelData !
Příklad implementace Cujo/UjoUkázka implementace Cujo pomocí abstraktní třídy:
public class Employee extends AbstractCujo implements Serializable {
/** Property List */ private static final CujoPropertyList pList = list(Employee.class);
@Override public CujoPropertyList readProperties() { return pList; }
Příklad implementace Cujo/UjoUkázka implementace Cujo pomocí abstraktní třídy:
public class Employee extends AbstractCujo implements Serializable {
/** Property List */ private static final CujoPropertyList pList = list(Employee.class);
/** Unique key */ public static final CujoProperty<Employee, Long> ID = pList.newProperty("id", Long.class); /** User name */ public static final CujoProperty<Employee, String> NAME = pList.newProperty("name", String.class); /** Hourly wage */ public static final CujoProperty<Employee, Double> WAGE = pList.newPropertyDef("wage", 0.0); /** A reference to Company */ public static final CujoProperty<Employee, Company> COMPANY = pList.newProperty("company", Company.class); @Override public CujoPropertyList readProperties() { return pList; }
Ukázka práce s datyJak zapsat hodnoty ? GXT: ModelData ModelData person = new ModelData();
// Write:person.set("ID", 7L);person.set("NAME", "Pavel");person.set("WAGE", 20.00);person.set("COMPANY", new Company());
Ukázka práce s datyJak zapsat hodnoty ? GXT: ModelData ModelData person = new ModelData();
// Write:person.set("ID", 7L);person.set("NAME", "Pavel");person.set("WAGE", 20.00);person.set("COMPANY", new Company());
Ujorm: Cujo import static Employee.* import static Company.CITY; Employee person = new Employee();
// Write:person.set(ID, 7L);person.set(NAME, "Pavel");person.set(WAGE, 20.00);person.set(COMPANY, new Company());
Ukázka práce s datyJak načíst data ? GXT: ModelData ModelData person = new ModelData();
// Write:person.set("ID", 7L);person.set("NAME", "Pavel");person.set("WAGE", 20.00);person.set("COMPANY", new Company());
// Read:Long id = person.get("ID");String name = person.get("NAME");double wage = person.get("WAGE"); Company address = person.get("COMPANY");
Ujorm: Cujo import static Employee.* import static Company.CITY; Employee person = new Employee();
// Write:person.set(ID, 7L);person.set(NAME, "Pavel");person.set(WAGE, 20.00);person.set(COMPANY, new Company());
Ujorm:
Ukázka práce s datyJak načíst data ? GXT: ModelData ModelData person = new ModelData();
// Write:person.set("ID", 7L);person.set("NAME", "Pavel");person.set("WAGE", 20.00);person.set("COMPANY", new Company());
// Read:Long id = person.get("ID");String name = person.get("NAME");double wage = person.get("WAGE"); Company address = person.get("COMPANY");
Ujorm: Cujo import static Employee.* import static Company.CITY; Employee person = new Employee();
// Write:person.set(ID, 7L);person.set(NAME, "Pavel");person.set(WAGE, 20.00);person.set(COMPANY, new Company());
// Read:Long id = person.get(ID);String name = person.get(NAME);double wage = person.get(WAGE); Company address = person.get(COMPANY);
Ukázka práce s datyJak na atributy relačních objektů ? GXT: ModelData ModelData person = new ModelData();
// Write:person.set("ID", 7L);person.set("NAME", "Pavel");person.set("WAGE", 20.00);person.set("COMPANY", new Company());person.set("COMPANY.CITY", "Prague"); // No
// Read:Long id = person.get("ID");String name = person.get("NAME");double wage = person.get("WAGE"); Company address = person.get("COMPANY");String cn = person.get("COMPANY.CITY"); // No
Ujorm: Cujo import static Employee.* import static Company.CITY; Employee person = new Employee();
// Write:person.set(ID, 7L);person.set(NAME, "Pavel");person.set(WAGE, 20.00);person.set(COMPANY, new Company());
// Read:Long id = person.get(ID);String name = person.get(NAME);double wage = person.get(WAGE); Company address = person.get(COMPANY);
Ukázka práce s datyJak na atributy relačních objektů ? GXT: ModelData ModelData person = new ModelData();
// Write:person.set("ID", 7L);person.set("NAME", "Pavel");person.set("WAGE", 20.00);person.set("COMPANY", new Company());person.set("COMPANY.CITY", "Prague"); // No
// Read:Long id = person.get("ID");String name = person.get("NAME");double wage = person.get("WAGE"); Company address = person.get("COMPANY");String cn = person.get("COMPANY.CITY"); // No
Ujorm: Cujo import static Employee.* import static Company.CITY; Employee person = new Employee();
// Write:person.set(ID, 7L);person.set(NAME, "Pavel");person.set(WAGE, 20.00);person.set(COMPANY, new Company());person.set(COMPANY.add(CITY), "Prague";
// Read:Long id = person.get(ID);String name = person.get(NAME);double wage = person.get(WAGE); Company address = person.get(COMPANY);String cn = person.get(COMPANY.add(CITY);
Kopie hodnot
Jak přepsat hodnoty z jednoho objektu do druhého
?
Kopie hodnotJak přepsat hodnoty do druhého objektu ? ModelData (GXT): ModelData emplA = findEmployee();ModelData emplB = new ModelData();
for (String p : emplA.getPropertyNames()) { Object o = emplA.get(p); emplB.set(p, o);}GWT.log("Employee B: " + emplB);
Kopie hodnotJak přepsat hodnoty do druhého objektu ? ModelData (GXT): ModelData emplA = findEmployee();ModelData emplB = new ModelData();
for (String p : emplA.getPropertyNames()) { Object o = emplA.get(p); emplB.set(p, o);}GWT.log("Employee B: " + emplB);
Cujo (Ujorm):
Cujo emplA = findEmployee();Cujo emplB = employee1.createInstance();
for (CujoProperty p : emplA.readProperties()) { p.copy(emplA, emplB);} GWT.log("Employee B: " + emplB);
Obnova defaultních hodnot
Jak obnovit defaultní hodnoty v objektu
?
Obnova defaultních hodnotJak obnovit defaultní hodnoty objektu ? ModelData (GXT): ModelData employee = findEmployee();
for (String p : employee1.getPropertyNames()) { Object o = employee1.get(p); p.set(p, null); // ??
}
GWT.log("Employee: " + employee);
Obnova defaultních hodnotJak obnovit defaultní hodnoty objektu ? ModelData (GXT): ModelData employee = findEmployee();
for (String p : employee1.getPropertyNames()) { Object o = employee1.get(p); p.set(p, null); // ?? p.set(p, getDefaultForProperty(p));}
GWT.log("Employee: " + employee);
Obnova defaultních hodnotJak obnovit defaultní hodnoty objektu ? ModelData (GXT): ModelData employee = findEmployee();
for (String p : employee1.getPropertyNames()) { Object o = employee1.get(p); p.set(p, null); // ?? p.set(p, getDefaultForProperty(p)); }
GWT.log("Employee: " + employee);
Cujo (Ujorm):
Cujo employee = findEmployee();
for (CujoProperty p : employee.readProperties()) { p.set(p, p.getDefault());
} GWT.log("Employee: " + employee);
CriterionTest platnosti (validace) objektu v run-time
ModelData (GXT):
?
Cujo (Ujorm):import static org.ujorm.gxt.client.cquery.COperator.*;
CCriterion<Employee> validWage, validStreet,validator;
validWage = CCriterion.where(WAGE, GT, 10.0);validStreet = CCriterion.where(COMPANY.add(CITY), "Prague");validator = validWage.or(validStreet);
Employee employee = findEmployee();boolean isValid = validator.evaluate(employee);
GXT.log("Is valid: " + isValid + " for " + employee);
Mapování klientských objektů
Klientská strana: CujoServerová strana: Ujo
Criterion v databázovém dotazuJak sestavit DB dotaz pro GRID na straně klienta ?
import static CEmployee.*;
CujoProperty[] gridColumns = new CujoProperty[] { NAME , WAGE , COMPANY.add(CCompany.NAME) , COMPANY.add(CCompany.CITY) };
CQuery<CEmployee> query = CQuery.newInstance(CEmployee.class, gridColumns);query.setCriterion(CCriterion.where(COMPANY.add(CCompany.CITY), "Prague")); grid = new Grid<CUJO>(createStore(query) query.getColumnModel();
Referenční aplikace Ujorm:● eCall● ÚZEI ● Inspectime (funkční demo: http://inspectime.com)
Dotazy
?
GWT Frameworky: Ujorm
Děkuji za pozornost
Odkazy:● Ujorm: http://ujorm.org● Ext GWT: http://www.sencha.com/products/extgwt/● Referenční demo aplikace: http://inspectime.com● Tato prezentace: http://ujorm.org/gxt ● Download: http://sourceforge.net/projects/ujoframework/● Maven repository: groupId=org.ujoframework,artifactId:ujo-*
Google User Groups, Praha 9.6.2011, Autor: Pavel Ponec