MokaByte 55 - 7mbre  2001
Foto dell'autore non disponibile
di
Luca Vetti Tagliati
L’architettura EJB
incontrò l'UML
prima parte
Obiettivo del presente articolo è intraprendere l’illustrazione del profilo UML per l’architettura Enterprise Java Bean della Sun Microsystem, iniziando proprio dal concetto stesso di profilo. Come visto nell’articolo precedente, si tratta di un meccanismo di estensione dello UML, o meglio di collezioni di estensioni predefinite, le quali nascono dall’esigenza di standardizzare l’utilizzo dello UML per domini, scopi e/o tecnologie ampiamente diffuse come per esempio le architetture CORBA, EJB e COM+.
I concetti illustrati in questo articolo verranno ripresi nel successivo, nel quale si entrerà nei dettagli tecnici del profilo EJB.


I profili dello UML
Uno degli obiettivi primari che ha guidato il lavoro dei Tres Amigos nel lavoro di progettazione dello Unified Modeling Languige è stato realizzare un linguaggio di modellazione il cui dominio di applicazione fosse il più esteso possibile. In prima analisi, si sarebbe potuto addivenire a tale risultato corredando il linguaggio di un vasto numero di elementi, in modo tale da fornire gli strumenti specifici per le esigenze dei più svariati ambienti ed architetture. Si sarebbe potuto, ad esempio, includere nello UML tutta una serie di elementi specifici per la modellazione di sistemi CORBA, EJB, COM+ ecc. Tutto ciò però avrebbe sicuramente portato ad un conflitto con un’altra esigenza, altrettanto importante: mantenere il linguaggio il più semplice possibile, al fine di massimizzare l’accettazione da parte della comunità Object Oriented. Inoltre, per quanto accurato fosse stato lo studio delle varie necessità, l’esperienza insegna che è sempre possibile trovare un progettista X che abbia bisogno di un elemento non contemplato (Marphy docet).
La soluzione a queste esigenze contrastanti è stato realizzare un nucleo del linguaggio basilare, valido per ogni ambiente, corredato da una serie di strumenti che consentano di aggiungere nuova semantica e sintassi al linguaggio stesso per utilizzi specifici dello UML. 
Tali strumenti, denominati meccanismi di estensione (estensibility mechanisms), sono:
  • stereotypes (stereotipi);
  • tagged values (valori etichettati);
  •  constraints (vincoli).


Brevemente, gli stereotipi permettono di estendere il vocabolario dello UML attraverso l’introduzione di nuovi elementi, definiti dall’utente, specifici per il problema oggetto di studio. Chiaramente la definizione degli stereotipi deve seguire regole ben precise: ciascuno di essi deve essere la specializzazione di un elemento presente nello UML (metamodello). In ultima analisi uno stereotipo è un nuova classe che viene (virtualmente) aggiunta al metamodello in fase di progettazione. 

I tagged value estendono le proprietà degli elementi dello UML aggiungendo informazioni supplementari a qualsiasi elemento. Sono a tutti gli effetti esempi di specificazioni. Si tratta di elementi costituiti dalla coppia (nome, valore), la cui interpretazione semantica esula (volutamente) dagli obiettivi dello UML. Si tratta di convenzioni interamente demandate ai tool e/o dell’utente e per questo sono definiti meta attributi virtuali.

I vincoli rappresentano restrizioni della semantica dei modelli. Una delle migliore definizioni formali sancisce che un vincolo è una restrizione di uno o più valori (o parti) di un modello object oriented o di un sistema. Tipicamente un vincolo può essere rappresentato attraverso qualsiasi formalismo: la selezione di quello ritenuto più idoneo è completamente demandata al progettista. Da notare però che, nella versione 1.3 dello UML è stato incorporato ufficialmente lo OCL (Object Constraint Language) dell’IBM: linguaggio object oriented per la formulazione di vincoli esenti da effetti collaterali. Quindi, sebbene non sia strettamente obbligatorio definire tutti i vincoli per mezzo dell’OCL, l’utilizzo, qualora possibile, ne è fortemente consigliato.
Per informazioni di dettaglio relative ai meccanismi di estensione è disponibile, nell’archivio di MokaByte, un articolo introduttivo allo UML, scritto dallo stesso autore.

A questo punto sembrerebbe che tutti i problemi siano risolti, ed invece, si scoprì che, nella flessibilità offerta dallo UML; si annidava il rischio di una nuova babele, questa volta non di lingue ma di dialetti.

Il problema emerso era che le estensioni da apportare allo UML, al fine di adattarlo a tecnologie particolarmente ricorrenti in progetti object oriented, erano completamente demandate ai progettisti. Se da un lato è vantaggioso, per i motivi più volte elencati, disporre di un linguaggio di modellazione general pouposes, dall’altro la relativa flessibilità può creare non pochi problemi soprattutto ad un pubblico non espertissimo. Ciò, oltre ad esigere lavoro supplementare ai vari tecnici (il cui buon esito tra l’altro era tutt’altro che scontato), riesumava vecchi problemi dovuti alla mancanza di standard, quali l’incomunicabilità, la difficoltà da parte dei produttori di tool di fornire funzionalità sempre più raffinate (per esempio la funzione di riverse engineering di sistemi basati su specifiche architetture non solo erano difficili da realizzare, ma si correva anche il rischio di invalidare il lavoro di modellazione) e così via.

Onde evitare tutto ciò, lo OMG (Object Managment Group) decise di lavorare alla standardizzazione di tutta una serie di profili, tra i quali molto importanti sono quello CORBA e quello EJB per il quale, ovviamente, è stato richiesta la collaborazione con la Sun Microsytem.

Si tratta di un passo indietro? La risposta all’interrogazione retorica è ovviamente no. I meccanismi di estensione rimangono comunque strumenti molto validi, la cui efficacia, tra l’altro, è stata provata durante il lavoro di definizione degli stessi profili. Si tratta di un framework di base costituito da un numero di concetti relativamente contenuto, e quindi di “più facile comprensione”, utilizzabile per estendere efficacemente il linguaggio per gli usi più svariati secondo precise direttive. 
 
 
 

Definizione formale di profilo UML
Un profilo è uno stereotipo di un package contenente un insieme di elementi del modello opportunamente adattati ad uno specifico dominio o scopo. Tipicamente lo si ottiene estendendo il metamodello utilizzando adeguatamente i meccanismi di estensioni provvisti dallo UML (stereotipi, definizioni di tagged value, vincoli e icone). In tali casi si parla di profili “leggeri” (lightweight), in quanto ottenuti per mezzo dei meccanismi di estensione propri del linguaggio, in contrasto con quelli “pesanti” (heavyweight) ottenibili per mezzo dei meccanismi di estensione definiti dalle specifiche del MOF.

La definizione formale di un profilo, per essere consistente all’approccio utilizzato nel documento delle specifiche ufficiali, deve prevedere le seguenti sezioni:

  1. insieme delle estensioni standard che definiscono il profilo stesso, ottenuto attraverso l’opportuna applicazione dei meccanismi di estensione dello UML al sottoinsieme di interesse del metamodello;
  2. definizione della relativa semantica descritta attraverso il linguaggio naturale (americano ovviamente);
  3. insieme delle regole ben formate (well-formed rules), ossia insieme di vincoli, espressi in linguaggio naturale e, qualora possibile per mezzo dell’OCL, appartenenti agli elementi introdotti con il profilo;
  4. elementi comuni del modello (common model elements), ossia istanze predefinite di elementi del metamodello UML. La definizione di tali elementi può far uso delle estensioni standard definite nel profilo stesso secondo gli eventuali vincoli in esso presenti;
  5. eventuali estensioni al MOF (Meta Object Facility). Questa sezione, qualora presente, determina la transazione del profilo dalla caratterizzazione “leggero” a quella “pesante”. Si ottiene definendo nuove meta-classi da incorporare nella definizione formale del MOF. Chiaramente, si tratta di estensioni delicate a cui ricorrere solo dopo aver appurato l’inadeguatezza dei meccanismi standard ai fini richiesti.


Con la versione 1.4, i profili, sono finalmente entrati a far parte integrante del linguaggio. Attualmente sono stati formalmente incorporati due esempi: il profilo per il software development processes (processi di sviluppo del software) e quello per il business modeling (modellazione dell’area business).
 
 
 

Concetti base del profilo EJB
La formulazione del profilo EJB è frutto della collaborazione tra Sun Microsystem e l’Object Management Group (Java Specification Request JSR-26, richiesta di specificazione Java). Il risultato consiste nella versione draft (UML profile for EJB), pubblicata nel Maggio 2001, frutto del lavoro di Jack Greenfield coadiuvato da un team formato dai tecnici: James Abbott, Loïc Julien, David Frankel, Scott Rich e molti altri.

Obiettivo del profilo è definire un mapping standard tra lo UML e l’architettura Enterprise JavaBeans (EJB) (1). 

NOTA Si ritiene che benché l’illustrazione dell’architettura EJB esuli completamente dagli obiettivi del presente testo e che sebbene si tratti di una tecnologia che, più o meno approfonditamente, sia conosciuta da tutti i tecnici appartenenti alla comunità object oriented, una brevissima descrizione dei concetti citati più frequentemente sia doverosa. L’architettura EJB è una tecnologia server-side basata su componenti per lo sviluppo e l’installazione di applicazioni business organizzate in componenti distribuiti. L’utilizzo di tale tecnologia permette di realizzare sistemi scalabili, transazionali, multi-strato, sicuri, e così via, senza avere l’incombenza di dover progettare e realizzare una complicata infrastruttura. Ciò rende possibile realizzare rapidamente sistemi distribuiti ad oggetti, con rischi notevolmente ridotti e con l’enorme vantaggio che il sistema prodotto, qualora le direttive fornite della Sun Microsystem siano rispettate, sia in grado di essere eseguito virtualmente su qualsiasi piattaforma che supporti le specifiche EJB (write once run anywhere).
Un Enterprise Java Bean è un componente software, operante nel lato server, che può essere distribuito in un ambiente multi-tier. Tipicamente risulta costituito da diversi oggetti, sebbene la struttura interna è “nascosta” all’oggetto client (altro EJB, Servlet, JSP, Applet, ecc.) per mezzo di opportuna interfaccia. Gli oggetti client non possono richiedere l’esecuzione dei metodi esposti direttamente all’EJB, bensì devono necessariamente passare attraverso un apposito oggetto (detto EJB Object, oggetto EJB). Tale oggetto, pertanto, per poter svolgere il proprio ruolo di mediatore, deve clonare tutti i metodi business che il componente EJB fornisce, i quali vengono dichiarati esplicitamente dal componente in un’apposita interfaccia denominata remote interface (interfaccia remota). L’oggetto cliente, per ovvi motivi, non può neanche istanziare direttamente gli Oggetti EJB (per esempio potrebbero risiedere in un server diverso da quello in cui è in esecuzione il client), pertanto necessita di acquisirli. Ciò avviene richiedendo la loro “fornitura” ad un altro oggetto detto Home Object che funge da “factory” di EJB Object. A dir il vero è gravato da altre responsabilità oltre la creazione, come la ricerca, la rimozione ecc. degli EJB Object. A questo punto entra in gioco un’altra interfaccia detta Home interface (interfaccia casa), nella quale devono essere dichiarati i metodi per creare, reperire e distruggere gli oggetti EJB. Il tutto poi è soggetto alla gestione del famoso EJB container (contenitore EJB) il quale fornisce i servizi impliciti ai vari componenti EJB, in altre parole fornisce l’ambiente nel quale i componenti EJB vengono eseguiti. Il container a sua volta dovrebbe funzionare nell’ambiente fornito da un apposito EJB server. Tipicamente gli oggetti client dialogano sempre con il container, il quale interagisce con i vari EJB attraverso opportuni metodi dichiarati nelle interfacce di cui sopra. Si tratta di un vero e proprio mediatore “invisibile”, che assolve alle responsabilità di far comunicare i client con gli EJB, coordinare l’esecuzione delle transazioni, provvedere i servizi di persistenza, gestire il ciclo di vita degli EJB, ed altri compiti ancora.
Una volta generate le varie classi che realizzano l’Enterprise Java Bean, le home e le remote interface, il descrittore di dispiegamento e le proprietà dell’EJB stesso, è necessario impacchettare tutti questi file in un’unica entità denominata Ejb-jar file compresso secondo le direttive del formato .ZIP. 
 
 


Figura 1 - Versione di un diagramma di collaborazione atto ad illustrare 
il principio di funzionamento dell’architettura EJB. L’immagine in figura 
è una rielaborazione di quelle proposte nel libro “Mastering Enterprise Java Beans” 
scritto da Ed Roman e pubblicato dalla casa editrice Wiley. 

La definizione del profilo EJB, è composto essenzialmente da due parti: il profilo UML vero e proprio e il descrittore UML. Come lecito attendersi, la prima si occupa della semantica utilizzabile dall’architettura EJB, mentre la seconda introduce un modello UML relativo ai manufatti Java ed EJB che si possono essere memorizzati in un file EJB-JAR. 
In merito alla prima parte è necessario dar luogo ad una breve considerazione. Dalla lettura dei precedenti articoli dedicati allo UML, si è appreso che uno degli obiettivi consiste nel supportare specifiche che risultino indipendenti da particolari linguaggi di programmazione o processi di sviluppo. Ciò chiaramente è molto vantaggioso in quanto rende lo UML idoneo a supportare plausibilmente tutti i linguaggi di programmazione. Però, al tempo stesso, pone qualche problema, in quanto l’architettura EJB non è stata basata su un linguaggio di programmazione generale, bensì su uno ben preciso: Java. Ciò finisce per causare un primo ostacolo tra la definizione dello UML e il relativo utilizzo nel contesto EJB. In altre parole, la definizione del profilo EJB obbliga a definire, come requisito propedeutico, il mapping tra UML ed i costrutti e package del linguaggio Java utilizzati nell’architettura EJB. 


Figura 2 - Il profilo EJB estende opportune sezioni del profilo Java.

Come mostrato nella figura seguente, il profilo EJB è costituito da due componenti, il modello di disegno e quello di implementazione. 
Per quanto riguarda il primo (modello di disegno EJB) contiene i diagrammi delle classi che descrivono le interfacce e eventualmente le classi di implementazione di un Enterprise Java Bean. Al fine sia di incoraggiare l’anticipo della suddivisione del sistema in componenti già durante le prime fasi del ciclo di vita del software, sia di assecondare la netta separazione tra la specifica di un componente EJB e la relativa implementazione, il modello di disegno è suddiviso in due viste: esterna ed interna. La prima consente di specificare un EJB dall’esterno ossia dal punto di vista del cliente. A tal fine è importante la definizione delle interfacce home e remote istanze dell’apposito stereotipo dell’elemento Class (EJB Home Interface e EJB Remote Interface). 

NOTA: In questo contesto, quando si parla di stereotipo di un elemento UML, si fa riferimento alla relativa meta-classe appartenente al sotto package Core del package Foundation del MOF.

Nella vista interna, l’attenzione viene spostata alla definizione interna dell’EJB o, se si vuole, alla prospettiva dello sviluppatore. L’EJB viene modellato per mezzo di un opportuno stereotipo dell’elemento UML Subsystem contenente sia le interfacce del punto precedente, sia ulteriori stereotipizzazioni dell’elemento Class atte a descrivere l’implementazione dell’EJB.
Il modello di implementazione EJB (EJB Implementation Model) contiene diagrammi dei componenti atti a descrivere i manufatti fisici in cui sono memorizzati gli elementi logici di un EJB. In questo ambito viene utilizzato un apposito stereotipo dell’elemento component per rappresentare classi Java, file di risorse e EJB-JAR.
 


Figura 3 - Struttura del profilo EJB. La notazione utilizzata in figura 
(cerchio con inscritto il simbolo ‘+’) rappresenta un’alternativa fornita dallo UML 
per mostrare relazioni di annodamento tra gli elementi. In questo caso, 
per esempio,mostrano che il modello EJB Design è incluso nel profilo EJB.

Riassumendo brevemente, un Enterprise Java Bean viene modellato:

  • logicamente o come uno stereotipo dell’elemento Class (nella vista esterna) o dell’elemento Subsystem (nella vista interna); 
  • fisicamente come uno stereotipo dell’elemento Component.


Conclusioni
Nel presente capitolo si è avviata la descrizione del profilo UML dedicato all’architettura Enterprise Java Beans della Sun Micorsystem, ripresa ed approfondita nell’articolo successivo.
Si tratta di un mapping standard tra lo UML e l’architettura Enterprise JavaBeans (EJB), la cui definizione offre tutta una serie di vantaggi, come la definizione di un approccio standard da utilizzarsi per la modellazione di sistemi sfruttanti l’architettura EJB e quindi basati sul linguaggio di programmazione java, il supporto alle esigenze pratiche comunemente incontrate nel disegno di sistemi EJB-based, la semplificazione del disegno di sistemi basati sull’architettura EJB, in modo tale che gli “sviluppatori”, da un lato non siano costretti a definire per conto proprio tecniche per la modellazione di sistemi EJB e dall’altro possano confidare in tecniche di riverse engineering compatibili con quanto disegnato, e così via.
La definizione del profilo fornisce spunti interessanti anche per la risoluzione, limitatamente all’ambito dell’utilizzo dell’archiettura EJB, di problemi storici sia relativi allo stesso UML, ossia la definizione eccessivamente limitata del concetto di componente, e sia inerenti i processi di sviluppo formali, quali per esempio il RUP, legati alla tardiva introduzione del concetto di componente, tipicamente relegato ai diagrammi di dispiegamento. In particolare, grazie alla vista esterna, parte del modello di disegno, che permette di specificare un EJB dall’esterno, attraverso le relative interfacce, è possibile avviare la suddivisione del sistema in componenti, allocando le varie responsabilità, già nelle prime fasi del ciclo di vita del software. Infatti, inizialmente è sufficiente progettare il comportamento del componente, mentre per la relativa progettazione interna è possibile attendere le fasi successive.
Chiaramente ci sono anche dei contro, come si vedrà nel prossimo numero, probabilmente uno dei più seri è legato al numero di manufatti (artifact) che è necessario realizzare per descrivere ciascun componente EJB. Un altro grande svantaggio è che si limita l’esercizio di fantasia di molti tecnici prodigi nella definizione di nuovi standard del linguaggio UML.
 
 
 

Bibliografia
 “UML dalla teoria alla pratica” - di Luca Vetti Tagliati;
 “Mastering Enterprise Java Beans” – di Ed Roman, pubblicato dalla casa editrice Wiley;
 “UML profile for EJB” – di Jack Greenfield;
 “The Unified Modeling Language User Guide” – di Grady Booch, James Rumbaugh, Ivar Jacobson, pubblicato dalla casa editrice Addison Wesley;
 “The Unified Modeling Language Reference Manual” – di Grady Booch, James Rumbaugh, Ivar Jacobson, pubblicato dalla casa editrice Addison Wesley;
 

Biografia
Luca Vetti Tagliati è uno studioso e appassionato del linguaggio UML. Ha scritto diversi articoli “pubblicati” sulla rivista virtuale www.Mokabyte.it. Attualmente sta terminando di redigere il libro “UML dalla teoria alla pratica” presto disponibile sempre nel sito di Mokabyte.
Negli ultimi anni ha applicato la progettazione/programmazione component based in settori che variano dal mondo delle smart cards (www.datacard.com) a quello del trading bancario (www.hsbc.com). Lavora come consulente presso la banca londinese HSBC con funzioni di technical architect e team leader. È membro del gruppo di “processing engineering” (a cui partecipano personaggi del calibro di Frank Armour coautore del libro “Advanced Use Case Modeling” e John Daniles coautore del libro “UML components”). Si tratta di un gruppo ristretto di dieci tecnici istituito per stabilire ed attuare, una versione del RUP da utilizzarsi come standard interno della banca da applicarsi nello sviluppo di sistemi software.
E’ reperibile all’indirizzo LVetti@mokabyte.it.

Vai alla Home Page di MokaByte
Vai alla prima pagina di questo mese


MokaByte®  è un marchio registrato da MokaByte s.r.l.
Java®, Jini®  e tutti i nomi derivati sono marchi registrati da Sun Microsystems; tutti i diritti riservati
E' vietata la riproduzione anche parziale
Per comunicazioni inviare una mail a
info@mokabyte.it