Thursday, October 2, 2008

Tapestry rulz

In proiectul de care am amintit am avut un feature mai ciudatel de facut: pornind de la codul open source, dar fara a-l schimba, sa adaug un UI de licensing. Ceva de genul: ai un war pe care nu poti sa-l modifici dar trebuie sa mai apara si alte pagini in aplicatie prin simpla adaugare a unui jar. La inceput mi s-a parut putin bizar, dar citind mai multe despre Tapestry4 si HiveMind (folosite in proiect) am reusit sa fac asta. Treaba sta asa:

Tapestry4.0 foloseste containerul IoC HiveMind1.1 pentru a-si defini infrastructura - serviciile sunt create prin parsarea tuturor fisierelor META-INF/hivemodule.xml gasite in classpath. De asemenea, un astfel de serviciu poate fi suprascris in alt modul. Si in plus, in modulul tapestry.page mai exista definit serviciul tapestry.page.PageSpecificationResolver care, dupa cum ii zice si numele, are rolul de a "rezolva" specificatiile paginilor Tapestry (toate modulele sunt descrise aici).

Bun, deci taskul de care vorbeam se poate realiza prin crearea unui nou jar care sa fie pus in classpath-ul aplicatiei si care sa contina in META-INF un fisier hivemodule.xml in care se redefineste serviciul tapestry.page.PageSpecificationResolver, ceva de genul:

<implementation service-id="tapestry.page.PageSpecificationResolver">
<invoke-factory model="threaded">
<construct class="application.resolver.MyCustomPageSpecificationResolver">
...
</construct>
</invoke-factory>
</implementation>

unde clasa MyCustomPageSpecificationResolver extinde PageSpecificationResolverImpl si suprascrie metoda resolve.

Acceasi treaba se poate face si pentru componente, prin suprascrierea serviciului tapestry.page.ComponentSpecificationResolver si extinderea ComponentSpecificationResolverImpl.

No comments: