MokaByte 76 - Luglio Agosto 2003
Corso di Java Web Services
VI parte: Catalogare e scoprire: UDDI e JAXR
di
Massimiliano Bigatti
La visione dei servizi Web non può essere completa senza un punto di incontro tra fornitori e potenziali clienti dei servizi. Questa funzione è demandata ai registri di servizi Web, tra i quali UDDI (Universal Directory & Description Interface) è quello più consolidato.

Caratteristiche di UDDI
Il registro UDDI è supportato da una rete mondiale di nodi, collegati tra di loro in una sorta di federazione, in modo similare alla tecnologia DNS. Quando un client sottopone una informazione al registro, questo la propaga agli altri nodi. In questo modo si attua la ridondanza dei dati, fornendo una certa affidabilità. Il ruolo del singolo nodo rimane comunque fondamentale, poiché, nel momento in cui un client gli sottopone dei dati, questo ne diviene il proprietario, e sarà in futuro solo questo nodo a poter operare importanti operazioni sui dati, quali la loro eliminazione.
Le chiamate ad UDDI sono implementate tramite comunicazioni SOAP di tipo request-response e permettono sostanzialmente due operazioni: quella di pubblicazione delle informazioni e quelle di ricerca.
Le informazioni gestite dal registro UDDI sono di tre tipi:

  • pagine bianche. Contengono informazioni anagrafiche delle aziende, come l'indirizzo ed i numeri di telefono. Costituiscono un primo approccio alle aziende, di tipo umano prima che tecnico;
  • pagine gialle. Definiscono la categorizzazione (tassonomia) dei servizi e delle aziende. Un'aziende potrebbe essere infatti catalogata in base alla sua posizione geografica od al proprio settore industriale. Le tassonomie dovrebbero rispettare standard internazionali, quali quelli dettati da ISO;
  • pagine verdi. Costituiscono le informazioni tecniche dei servizi, quelle utili a livello informatico. Queste riguardano URL dei servizi o gli eventuali documenti WSDL.

Purtroppo ad oggi non sembra che il registro UDDI contenga molte informazioni, e le poche presenti risultano nella maggioranza dei casi non valide. In attesa che le aziende superino i timori relativi allo spostare i propri servizi sul Web, la piattaforma Java ha predisposto una opportuna API per l'accesso a questo ed altri registri.

 

JAXR
L'accesso ai registri di servizi Web dalla piattaforma Java avviene tramite le Java API for XML Registries (JAXR). Si parla di registri in generale perché JAXR ha un'architettura multiregistro, capace di accedere anche ad altre tipologie di registry, come ebXML R. Inoltre JAXR può propagare una singola ricerca di servizi a più registri contemporaneamente.
L'accesso ai registri avviene tramite una connessione, ottenuta dalla classe ConnectionFactory, che viene opportunamente configurata tramite una serie di proprietà che indicano, tra le altre cose, l'URL del registro al quale si vuole accedere.
Una volta in possesso della connessione è possibile eseguire ricerche e sottomettere la registrazione di aziende e servizi. Quest'ultima operazione è però sottoposta ad autenticazione e per poterla portare a termine è necessario essere registrati presso il particolare registro a cui si vuole accedere.
Un aspetto interessante di JAXR è il suo uso del pattern futures (anche detto lazy-loading): una ricerca su un registro mondiale può potenzialmente restituire una grande mole di informazioni che non è garantito venga poi analizzata tutta. Per ovviare a questo inconveniente, ad ogni ricerca, gli oggetti creati da JAXR non contengono tutte le informazioni, ma solo quelle indispensabili. Nel momento si renda necessario ottenere quelle mancanti, il runtime di JAXR esegue l'accesso ai dati necessari. Questa caratteristica ha due aspetti: per prima cosa, vengono recuperati solo i dati effettivamente necessari, con un guadagno in termini di performance; in secondo luogo, i client JAXR devono per forza essere sempre connessi alla rete, in modo che i successivi caricamenti dati possano essere eseguiti correttamente.

 

Architettura
Una implementazione JAXR é detta JAXR Provider e può essere di livello 0 o livello 1. Questo indica quali elementi sono supportati dall'implementazione. Ad esempio, il supporto ad UDDI é di livello 0. Questo significa che qualsiasi prodotto che dichiari la compatibilità a JAXR dovrà per forza supportare l'accesso ad UDDI. Il supporto ebXML é invece posto a livello 1, quindi i prodotti JAXR level 1 complaint supporteranno sia UDDI che ebXML.
Il supporto a diversi registri di Web Services avviene tramite l'utilizzo di un modello informativo comune ma estendibile che é stato mutuato dal modello informativo di ebXML con aggiunte prelevate da UDDI. Questo ha consentito di risparmiare il tempo necessario a sviluppare un modello apposito e si traduce nelle specifiche come pochissime pagine dedicate alla mappatura di JAXR su ebXML.
In Figura 1 é possibile vedere l'architettura generale di JAXR: un client utilizza l'interfaccia RS (RegistryService) per ottenere informazioni sulla disponibilità delle funzionalità per lo specifico prodotto, come l'indicazione del livello di supporto dell'implementazione.


Figura 1
- Architettura JAXR

Le altre interfacce (C?) supportano le varie funzionalità, come la gestione del ciclo operativo e la gestione delle query.
Gli altri elementi dell'architettura sono il codice comune a tutti i registri, contenuto in "JAXR Pluggable Provider", e i componenti di accesso agli specifici registri ebXML, UDDI o altri.
L'implementazione delle API JAXR sono racchiuse in due package:

  • javax.xml.registry.infomodel che contiene le interfacce per modellare le informazioni supportate da JAXR, come pure la loro interrelazione;
  • javax.xml.registry contiene la definizione dell'interfaccia di accesso al registro.

 

Entità e classificazioni
Le specifiche JAXR definiscono una serie di entità che costituiscono il modello informativo su cui questo si basa. Come detto, queste sono entità presenti nel modello ebXML (anche i nomi sono sempre praticamente identici), con aggiunte mutuate da UDDI. Le principali sono:

  • Organization. Rappresenta una azienda, ad esempio quella che ha inviato informazioni sui propri servizi al registro. Può avere un riferimento alla "capogruppo" per modellare eventuali gruppi aziendali.
  • Service. E' il servizio offerto dall'azienda.
  • ServiceBinding. Sono le specifiche tecniche per l'accesso al servizio. Un servizio può avere più binding;
  • ClassificationScheme. Rappresenta la tassonomia che può essere usata per classificare o categorizzare altri elementi del registro.
  • Classification. Utilizzato per classificare concretamente un elemento del registro secondo uno specifico schema.

Attorno a queste entità ne esistono altre che consentono di collegarle tra di loro o di estendere il modello informativo, tra cui quelle per la gestione della tassonomia.
JAXR supporta due diverse tipologie di tassonomia: interna ed esterna. Queste sono relative al registro: quando una tassonomia é riconosciuta da quest'ultimo, potrà essere utilizzata come interna. In alternativa é possibile mischiare diverse tassonomie, o definirne di nuove, e creare così tassonomie esterne. Solitamente le tassonomie vengono definite da organismi nazionali od internazionali, come nel caso di NAICS (American Industry Classification System) - standard in uso nelle nazioni dell'America del nord. Entrambe le tipologie di tassonomie hanno vantaggi e svantaggi, ad esempio le tassonomie esterne sono molto più indefinite e difficile da gestire e manutenere, mentre quelle interne sono predefinite e quindi forniscono un riferimento più solido.
Quasi tutti gli elementi del modello informativo di JAXR sono associabili tra di loro. Le associazioni non hanno una tipologia fissa ma si basano sull'astrazione di concetto, rappresentata nel modello informativo di JAXR come Concept. Un Concept può essere combinato con altri Concept per costruire un alberatura che rappresenti una tassonomia.

 

Gestione del registro
Le JAXR consentono, ovviamente, la gestione delle informazioni presenti nel registro, come la creazione, l'aggiornamento e l'eliminazione di elementi. Inoltre é supportata l'interrogazione del registro per eseguire le ricerche di servizi ed aziende.
Ciascun elemento del registro é individuato univocamente da una UUID conforme al DCE 128 bit. Questa chiave é solitamente creata in modo trasparente dal registro anche se per alcuni registri (come ebXML) é possibile fornire dall'esterno la chiave da utilizzare.
Il ciclo di vita degli oggetti del registro inizia con l'operazione di creazione (l'interfaccia LifeCycleManager fornisce una serie di metodi di utilità per creare i differenti oggetti definiti nel modello informativo). Un oggetto creato non é ancora presente all'interno del registro e non può dunque essere oggetto di aggiornamenti o cancellazioni. Per inserire l'oggetto nel registro é necessario che questo passi attraverso un'operazione di salvataggio (save).
Una caratteristica interessante di JAXR é la possibilità di deprecare gli oggetti, con un concetto simile al tag @deprecated di Javadoc. Gli oggetti deprecati non consentono nuove referenze (come associazioni o classificazioni), ma continuano a funzionare normalmente.
Se da una parte l'interfaccia LifeCycleManager consente di gestire tutti gli elementi ad alto e basso livello del registro, può essere necessario concentrarsi più su elementi di business. L'interfaccia BusinessLifeCycleManager é contiene alcune importanti chiamate ad alto livello definendo una API simile alle Publisher API di UDDI. Con questa interfaccia non vengono introdotte nuove funzionalità ma viene allungata una mano agli sviluppatori UDDI che dovrebbero trovarsi ad operare con API più familiari. Un limite di JAXR in questa versione é che le operazioni sul ciclo di vita degli oggetti non sono applicabili a federazioni di connessioni. Non é, ad esempio possibile, creare la stessa entità direttamente in due registri differenti.

 

Interrogazione del registro
A differenza delle operazioni "dispositive" (come la creazione o la modifica di informazioni), le operazioni di ricerca avvengono in modo non privilegiato. Non é necessaria dunque l'autenticazione dell'utente.
L'interrogazione può avvenire in modo puntuale o tramite query. Nel primo caso viene utilizzata l'interfaccia BusinessQueryManager che, in modo similare a BusinessLifeCycleManager, ha una impostazione più ad alto livello e permette l'interrogazione delle interfacce più funzionali del modello informativo.
Molti metodi dell'interfaccia richiedono argomenti simili, alcuni tra i più importanti sono:

  • findQualifiers. Definiscono le regole di confronto di stringhe, ordinamento e operatori logici sui parametri di ricerca.
  • namePatterns. E' una Collection di stringhe che contengono nomi, anche parziali con eventuali wildcard come specificato nelle SQL-92 per la parola chiave LIKE.
  • classifications. E' una Collection di Classification che identifica in quali classificazioni eseguire la ricerca.

Nel secondo caso é possibile utilizzare una query dichiarativa, tramite l'interfaccia DeclarativeQueryManager. Ad oggi l'unico standard supportato é una derivazione di SQL-92, in particolare dell'istruzione SELECT, estese con le specifiche relative alle stored procedures.
Le query dichiarative sono supportate anche su connessioni federate ma sono una caratteristica opzionale dei provider JAXR 1.0.

 

Non solo SOAP/WSDL/UDDI
Sebbene questi siano gli standard consolidati per i servizi Web, non sono i soli. Prima di SOAP esisteva XML-RPC, uno standard più semplice per l'esecuzione di chiamate remote tramite XML su Internet. Un'altra iniziativa simile, promossa da OASIS, è ebXML (Electronic Business XML). L'obiettivo di SOAP/WSDL/UDDI è il medesimo di ebXML, ma con un approccio differente, se le tecnologie viste in questo capitolo hanno un approccio "dal basso" (a partire proprio dalla tecnologia), ebXML ha un approccio "dall'alto" - ovverossia dai requisiti funzionali. Sebbene i due mondi abbiano sviluppato fino ad ora in modo indipendente, si cominciano a notare elementi di convergenza: ebXML utilizza SOAP (esteso con header specifiche ed allegati) come protocollo di comunicazione ed il consorzio UDDI ha ceduto le specifiche della versione 3.0 al consorzio OASIS. Nell'interesse del successo della visione dei servizi Web, i due mondi, in un futuro non troppo remoto, potrebbero convergerr in uno standard unico.

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