joi, septembrie 07, 2006

Thinking in Java

In final mi-am achizitionat Thinking in Java 4. Dupa cum se stie Bruce Eckel nu mai ofera versiunea 4 din TIJ pe net. Se pare ca s-a hotarat sa stranga niste bani pentru batranete.

Cartea este o caramida (chirpici in traducere libera), numai buna de a o pune la temelia unei case. Groasa si scrisa cu caractere destul de mari.

De remarcat faptul ca se refera la JDK 5 si 6. Deci este o carte actuala. A introdus capitol de Generics. De asemenea a modificat fundamental Concurenta adaugand modificarile din JDK 5. Si altele.

vineri, septembrie 01, 2006

Modularizarea aplicatiilor Web

Am admirat intotdeauna Eclipse prin modul plugin-abil in care este construit. De fapt cred ca acest aspect face diferenta intre Eclipse si alte IDE-uri care nu au fost costruite modular de la inceput. In fapt Eclipse este un nucleu care permite integrarea de plugin-uri. Acestea se incarca dinamic in runtime cand este nevoie de ele. Un fel de initializare tarzie (lazy initialization) - programatorii vor intelege. Platforma Eclipse inseamna cam 100 de plugin-uri care lucreaza impreuna.

Cum se pot construi aplicatii Web modulare? Mai intai, prin modularitate intelegem gruparea functionalitatilor aplicatiei in module distincte. Poate fi vorba despre o simpla inpartire a aplicatiei prin separarea modulelor componente in directoare diferite. Sau poate fi mai mult. Se poate ca fiecare modul particular sa contribuie la un anumit aspect generic al aplicatiei introdus probabil de un alt plugin. Spre exemplu fiecare modul sa aduca propriile intrari in meniul bara al aplicatiei. In momentul in care un modul este scos din aplicatie si intrarile lui din bara de meniu devin inaccesibile. Acesta este un mic exemplu.

In primul caz, daca este vorba despre o inpartire a aplicatiei pe directoare lucrurile sunt destul de simple. In principiu, pentru fiecare modul de business se poate construi un modul in aplicatie. Se creaza cate un director pentru fiecare modul in care se pun fisierele de configurare si sursele corespunzatoare modulului. Struts, Hibernate si alte framework-uri Web permit fisiere de configurare per module si deci acestea vor fi trimise in deployment la locul dorit. In cazul in care framework-ul dorit nu ofera asa ceva, se poate folosi urmatoarea strategie. Se editeaza in local fragmente de fisiere XML care sunt asamblate in deployment via ant. Deci in deployment se recompune fiierul de configurare final obtinut prin asamblarea de fragmente. La fel si sursele prin compilare ajung drept clase la locul dorit in deployment. Structurarea lor pe module poate fi data de numele ales pentru pachete.

In cel de al doilea caz lucrurile sunt mai complicte. Sa luam cazul IDE-ului Elipse. Fiecare modul=plugin al IDE-ului Eclipse poate oferi puncte de extensie pentru celelalte module prin declararea unui punct de extensie. Astfel altii pot contribui la propia ta contributie. Punctul de extensie se declara folosindu-se id sau nume in fisierul plugin.xml din modulul respectiv. De asemenea se specifica print-un template xml valid si ce atribute si proprietati trebuie sa aduca plugin-ul care implementeaza punctul de extensie. Acesta (alt plugin) trebuie sa dea valori reale variabilelor din template pastrand sintaxa. Se poate defini si o clasa care va parsa xm-ul in momentul incarcarii plugin-ului si care va dicta funtionalitatea.

Alte module sau chiar modulul in cauza pot aduce implementari acestor puncte de extensie. In declararea si implementarea de extensii pot aparea nume de clase. Ele se dau in forma completa continand si numele pachetul si trebuie sa se afle in CLASSPATH pentru runtime. Se poate preciza si o dependenta intre plugin-uri specificand pe cele ce se vor incarca inaintea plugin-ului curent.

Asa e cu Eclipse care permite prin acest sistem constructia de clienti bogati peste platforma Eclipse (desigur trebuie ceva dexteritate pentru ca pare o altfel de programare). Dar cum ramane cu Web-ul? Dupa cateva rataciri am gasit un raspuns: HiveMind. Initial am crezut ca Spring-ul pe care l-am folosit cu succes in trecut poate fi solutia, dar Spring e doar un container de servicii si un integrator de framework-uri. El singur nu ofera un mecanism de modularizare pentru aplicatiile Web asa cum e Eclipse pentru clientii grei. O posibila solutie auxiliara poate fi extensia pe care o ofera in Spring Modules pentru Hivemind, EL4J sau noile posibilitati de a defini fisierele de configurare din 2.0.

Daca ati lucrat cu HiveMind va puteti impartasi experienta la comments!