luni, decembrie 10, 2007

Spring Dynamic Modules for OSGi

OSGi ofera o facilitate foarte interesanta spre deosebire de serverele de aplicatii sau containerele usoare si anume injectarea de dependente in mod dinamic in runtime. Nici chiar Spring nu reuseste un astfel de lucru by default. In cazul Spring dependentele se injecteaza in runtime in mod static (o singura data si raman valabile pe tot parcursul existentei aplicatiei). In cazul severelor de aplicatiei resursele sunt luate explicit de pe JNDI. Spring beneficeaza de avantajele OSGi prin Spring Dynamic Modules for OSGi ajuns de curand la Release Candidate 1.

O lista de resurse pentru cei care vor sa invete Spring Dynamic Modules for OSGi:

  • De urmarit prezentarea de la 1.
  • De testat exemplele de la 2) in consola de Equinox (se poate descarca de aici sau se poate cauta printre plugin-uri din distributia voastra de Eclipse: org.eclipse.osgi.....). De asemenea o serie din exemplele de la 2) sunt prezentate folosind Plug-in Project wizard de la Eclipse (il puteti descarca de aici).
  • Documentatia de la 3) descrie modul in care Spring implementeaza OSGi. Un bun exemplu este sample-ul de pe site. Trebuie descarcata si testata.
  • La 4) se gaseste un blog cu o multime de resurse despre OSGi in geenral.
  • 5) este o relatare a unei prezentari a celor de la Spring Source (fostul Interface 21).
  • La 6) se poate vedea cum se poate scufunda Equinox intr-un server de aplicatii (pentru aplicatii web pluginabile).
  • La 7) snt o serie de interviuri care merita urmarite.

vineri, decembrie 07, 2007

Crearea unei librarii spre reutilizare aka expunerea unui API

Continut
  • un aspect important ar fi crearea de module distincte (Java jars, Osgi bundles) pentru partea publicata/publica (numita in continuare API) si partea de implementare/privata - Maven ca unealta de build incurajeaza o astfel de abordare (exemple:My Faces, si in general toate implementarile dupa API specifications - partea publica vine din specificatie; alte exemple SPI - interfete expuse spre implementare in JSE/JEE: driverele de JDBC, JNDI; connectorii JMS, JMX)
  • API-ul contine doar servicii - fara stare; DTO-uri - doar stare - pentru transport; exceptii - exceptii de business aruncate de API; enum-uri - colectii de constante (se va evita folosirea interfetelor pentru a defini constante)
  • impartirea librariei in mai multe module pe criterii tehnologice sau de business - utilizatorul poate sa creeze o dependenta numai de unele dintre ele - nu trebuie sa inghita tot (exemple de astfel de librarii: Compass, Spring)
  • dependentele intre pachete/module trebuie sa fie sub forma uneui DAG fara deepndente circulare - posibilitatea de a lucra in izolare pe pachete/librarii diferite releasate independent si cat mai des (evitarea share-ului in SCM a aplicatiei ca un intreg prin folosirea de proxy-uri de artifate - Artifactory)
  • cantainerele OSGi ofera un nivel avansat de incapsulare, permitand gestiunea dependentelor la o granularitate mai mica: la nivel de pachet
  • folosirea judicioasa a modificatorilor de acces (ex: field-uri private accesate prin mutators publici)
  • unitatea de relese este pachetul/modulul - pastrarea compatibilitatii inapoi intre versiunile majore (exemplu Spring)
  • un sistem clar de versionare a binarelor - regulile de la Apache sunt suficiente
  • reutilizare de cod reprezinta posibilitatea de a refolosi o librarie deja compilata (in compile time si runtime pentru client)

Integrare

  • distinctie intre partea publica si cea publicata (articol Martin Fowler)
  • dependente doar cu partea publicata dintr-o librarie straina utilizata in compile time si runtime (nici o dependenta de implemntare)
  • ascunderea sub key-uri a implementarilor (JNDI furnizat de serverul de aplicatii/registru de nume/Service Locator, IOC/fiseiere de configurare Spring/DI)
  • ascunderea implementarilor prin interfete din API-ul expus
  • injetarea de implementari in runtime (DI - implicit de catre container in boot time - Spring, Service Locator - explicit de catre client in runtime - EJB 3)
  • dependente injectate dinamic - serviciile OSGi - prin redepoyere si restartare de bundle-uri in containerul OSGi
  • partea publica va fi alcatuita dintr-un set de servicii expuse explicit prin care se da acces la businessul modelat de librarie - Services Facade Pattern
  • comunicarea se realizeaza prin Java Bean-uri DTO fara logica (functionalitate) - doar stare
  • clientul va folosi partea publicata a altei librarii doar printr-o zona de cod a sa Gateway Pattern fara a murdari restul
  • dependentele trebuie gestionate cu atentie (la nivel de module - Maven / la nivel de pachete si module OSGi)

duminică, decembrie 02, 2007

Eclipse shortcuts

Prezint o lista cu sortcut-uri folosite in mod curent in Eclipse. Cred ca IntelliJ Idea e totusi cel mai productiv IDE (unul in putinele produse care ar merita cumparate). As dori sa fac o palalela intre cele doua in masura timpului! Poate are cineva timp sa enumere shortcut-urile din IDEA?

  • setare shortcut-uri (WINDOW/PREFERENES/GENERAL/KEYS)
  • vizualizare shortcut-uri(CTRL+SHIFT+L)
  • auto complete (CTRL+SPACE)

  • formatare (CTRL+SHIFT+F)

  • inserare template (shortcut template + CTRL + SPACE si apoi se alege cu ENTER)
  • arata tooltip javadoc (F2 - initial trebuie atasate sursele)
  • supertype/subtype (CTRL+T - arata rapid ierarhia; F4 - arata ierarhia intr-un view separat)

  • cautare type (CTRL+T)

  • cautare resursa (CTRL+R)

  • pozitionare pe o linie (CTRL+L)
  • navigare intre editoare (CTRL+E; CTRL+F6)
  • sincronizare tree/sursa (butonul LINK WITH EDITOR)

  • expandare tree: (CTRL + numeric +) (CTRL + numeric *)

  • duplicare linie/selectie (CTRL+ALT+SAGEATA SUS/JOS)

  • stergere linie/selectie (CTRL+D)

  • mutare linie/selectie sus/jos (ALT+SAGEATA SUS/JOS)
  • comentare/adaugare comentariu javadoc (se scrie /** + ENTER)

  • comentare/decomentare linie/selectie (alternativ CTRL+/)

  • indentare (CTRL+I)
  • identare text stanga/dreapta linie/selectie (TAB/SHIFT+TAB)
  • selectare cuvant (CLICK DUBLU)
  • conversie litere mari/mici (CTRL+SHIFT+Y/X)
  • cautare/inlocuire in fisierul curent (CTRL+F)
  • cautare in fisierele din workspace (CTRL+H)
  • accesare surse - parte din proiect sau atasate explicit (CTRL + CLICK DREAPTA; F3; meniu contextual/ Open Declaration)
  • ierarhia de call-uri (meniu contextual/ Open Call History)