Transcript
Page 1: Gwt frameworky GXT + UJORM

GWT Frameworky 

 Ujorm 1.20 v prostředí Ext GWT (Sencha)

Google User Groups, Praha 9.6.2011, Autor: Pavel Ponec

Page 2: Gwt frameworky GXT + UJORM

Ú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

Page 3: Gwt frameworky GXT + UJORM

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

Page 4: Gwt frameworky GXT + UJORM

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)

 

Page 5: Gwt frameworky GXT + UJORM

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

Page 6: Gwt frameworky GXT + UJORM

Class model Ujo + Property

Instance Ujo ● obsahuje data ● nabízí seznam Properties ● může splňovat specifikaci 

JavaBeans (ale nemusí)

Page 7: Gwt frameworky GXT + UJORM

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)

Page 8: Gwt frameworky GXT + UJORM

GXT: ModelData

ModelData je datový model grafických GXT komponent   - jedna instance reprezentuje například: jeden řádek tabulky

Page 9: Gwt frameworky GXT + UJORM

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 !

Page 10: Gwt frameworky GXT + UJORM

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;    }

Page 11: Gwt frameworky GXT + UJORM

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;    }

Page 12: Gwt frameworky GXT + UJORM

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());

 

Page 13: Gwt frameworky GXT + UJORM

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());

Page 14: Gwt frameworky GXT + 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());

Ujorm:

Page 15: Gwt frameworky GXT + 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);

Page 16: Gwt frameworky GXT + UJORM

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);

Page 17: Gwt frameworky GXT + UJORM

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);

Page 18: Gwt frameworky GXT + UJORM

Kopie hodnot

Jak přepsat hodnoty z jednoho objektu do druhého 

Page 19: Gwt frameworky GXT + UJORM

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);

Page 20: Gwt frameworky GXT + UJORM

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);

Page 21: Gwt frameworky GXT + UJORM

Obnova defaultních hodnot

Jak obnovit defaultní hodnoty v objektu 

 

Page 22: Gwt frameworky GXT + UJORM

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);

Page 23: Gwt frameworky GXT + UJORM

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);

Page 24: Gwt frameworky GXT + UJORM

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);

Page 25: Gwt frameworky GXT + UJORM

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);

Page 26: Gwt frameworky GXT + UJORM

Mapování klientských objektů

Klientská strana: CujoServerová strana: Ujo

Page 27: Gwt frameworky GXT + UJORM

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();

Page 28: Gwt frameworky GXT + UJORM

Referenční aplikace Ujorm:● eCall● ÚZEI ● Inspectime (funkční demo: http://inspectime.com)

Page 29: Gwt frameworky GXT + UJORM

Dotazy  

?

Page 30: Gwt frameworky GXT + UJORM

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