2012-12-11

Generátor getterů pro NetBeans

V repozitáři SourceForge je připraven ke stažení nový open-source pluggin určený pro IDE NetBeans 7.2, který slouží pro generování getterů a setterů UJO objektů podle jeho Klíčů. Pro ilustraci přikládám několik screenshotů:

1. Pro instalaci plugginu je třeba nejdříve stáhnout soubor typu "nbm" ze SourceForge do lokálního adresáře a pomocí NB-Pluggin manageru nainstalovat:




2. Nový pluggin pak najdeme v kontextovém menu, které se používá také pro generování getterů a setterů běžných JavaBeans:




3. Dialog umožňuje vybrat klíče, pro které se mají vytvořit gettery a settery. Poslední volba dole pod seznamem klíčů umožňuje zkopíruje také JavaDoc:



4. Výsledek: generovaný kód se bude podobat následující ukázce:



Za tento pluggin patří poděkování jeho autorovi Martinovi Mahrovi.

2012-11-27

Pokyny k migraci do Ujorm 1.30

Pokud zvažujete migraci do Ujorm 1.30, doporučuji použít tři jednoduché kroky:
  1. v Maven projektech upravte závislost na: groupId=org.ujorm + version=1.30
  2. nahraďte všechny texty "UjoProperty" za cílové "Key" ve vašem projektu a
  3. opravte použití metod označených jako @Deprecated
Volitelně lze nahradit použití statických továrních metod pro tvorbu klíčů za vhodnější použití třídy KeyFactory.

Doplněno 09.12.2012: po zkušenostech s několika projekty doporučuji porovnat popisy perzistentního meta-modelu před a po migraci. Úplný popis meta-modelu ve formátu XML se zapisuje do logu aplikace vždy po startu ORM. Pokud bude migrace  ok, budou obě verze identické. Tímto přístupem lze odhalit nejen překlepy v názvech klíčů UJO objektu.

2012-10-23

Ujorm verze 1.30


Po delší přestávce byla uvolněna verze Ujorm 1.30, která obsahuje několik důležitých změn v API, kde na prvním místě je třeba zmínit přejmenováni původního interface UjoProperty za nový název Key. Ten původní interface zůstal zachovaný jako @Deprecated, názvy implementačních tříd zůstávají. Důvody byly následující:
  • původní název UjoProperty byl trochu zavádějící a pro jeho neměnnou vlastnost a tak občas bylo obtížnější vysvětlit jeho význam. Nový název vychází z běžného pojmenování parametrů interface java.util.Map .
  • původní název byl dlouhý a tím hůře čitelný ve zdrojovém kódu
  • v poslední době vzniklo několik nových tříd, které se od názvu klíče (Property) odvíjí a bylo užitečné toto rozhodnutí urychlit, jedná se konkrétně o třídy KeyRing a KeyFactory.

Nový KeyRing slouží jako serializovatelná kolekce klíčů - protože klíče samy o sobě serializovatelné být nemohou - přišly by totiž o vlastnost unikátní instance v rámci class-loaderlu. Potřeba serializovat klíče může být v některých případech nezbytná, konkrétní příklad využití je ve Wicket frameworku.

Další nová třída třída se jmenuje KeyFactory a je určena k výrobě objektů typu Key. Výhodou továrny je, že ji lze použít i pro statické konstanty nějakého Interface. Užitečnou vlastností může být automatický tvorba názvu klíčů podle názvu jeho fieldu s volitelnou možností konverze jména na camel-case. Nově také není potřeba při tvorbě klíče posílat jeho datový typ parametrem, framework umí tento atributy získat z meta-modelu fieldů v době uzamčení továrny (případně při prvním načtení klíčů). Každý takový klíč obsahuje teď nový atribut své doménové třídy. Ukázka použití:

public class Person extends AbstractUjo {
  private static final KeyFactory f = newFactory(Person.class);
   
  public static final Key<Person,String > NAME = f.newKey();
  public static final Key<Person,Boolean> MALE = f.newKey();
  public static final Key<Person,Double > CASH = f.newKey();
   
  @Override public KeyList<?> readKeys() {
    return f.getKeys();
  }
}


Framework nabízí nový, zjednodušený klíč zvaný WeakKey, který neobsahuje doménový generický parametr. Jeho využití se nabízí jako náhrada konstant pro práci s objekty typu Map, List, případně pro čtení parametrů z objektu HttpRequest, kde provádí konverzi na požadovaný typ. Instance se pak vytváří pomocí WeakKeyFactory.

Framework je možné připojit do Maven projektu pomocí závislosti:

<dependency>
    <groupId>org.ujorm</groupId>
    <artifactId>ujo-core</artifactId>
    <version>1.30</version>
</dependency>


a pro případ využití ORM:

<dependency>
    <groupId>org.ujorm</groupId>
    <artifactId>ujo-orm</artifactId>
    <version>1.30</version>
</dependency>



Pro použití UJO objektů ve frameworku Wicket bude potřebná implementace třídy KeyModel, která je analogií ke standardní implementaci Wicket třídy PropertyModel. Třídu je možné získat pomocí závislosti:

<dependency>
    <groupId>org.ujorm</groupId>
    <artifactId>ujo-wicket/artifactId>
    <version>1.30</version>
</dependency>


Tento modul neobsahuje rozsáhlé služby, přesto přikládám pro inspiraci vytvoření jednoduché tabulky:

 List<ICellPopulator> columns = KeyPopulator.list
    ( Employee.ID
    , Employee.FIRSTNAME
    , Employee.LASTNAME
    , Employee.ADDRESS.add(Address.CITY)
    );

 final WebMarkupContainer table = new WebMarkupContainer("table");
 final DataGridView grid = new DataGridView("gridPanel", columns,

       new  InnerPeopleProvicer());
 table.setOutputMarkupId(true);
 grid.setItemsPerPage(20);
 add(table);
 table.add(grid);
 add(new AjaxPagingNavigator("tableNavigator", grid));


Za významnější změny API se všem uživatelům frameworku omlouvám, změny však byly nezbytné pro další rozvoj této knihovny.

V případě zájmu lze najít více informací najít v