MokaByte 63 - Maggio 2002 
Web Services
VIII parte - Accedere ai registry di Web Services: JAXR
di
Massimiliano
Bigatti
Il terzo elemento chiave nei Web Services, dopo SOAP e WSDL é la tecnologia UDDI. Questo standard definisce modalità di accesso a registri mondiali di servizi web e modelli informativi per descriverne i contenuti.

Introduzione
Le JAXR (Java API for XML Registries) completano, insieme a JAXM (Java API for XML Messaging) e JAX-RPC (Java API for XML RPC), il supporto della piattaforma Java alle tecnologie dei Web Services. Come per molte altre tecnologie Java, che cercano di essere il più generico possibile, le JAXR consentono non solo l'accesso a registri UDDI ma anche ad altre tipologie di registri di servizi, come ad esempio ebXML.
Nel definire le specifiche JAXR sono stati tenuti in considerazione alcuni importanti obiettivi, tra cui:

  • definire una API che fosse l'unione delle migliori caratteristiche delle principali specifiche per registri di servizi web;
  • assicurare il supporto alle specifiche dominanti come UDDI ed ebXML;
  • assicurare la sinergia con le altre tecnologie Java legate ad XML.

Sicuramente, l'obbiettivo di assicurare il supporto UDDI é il primario scopo delle specifiche mentre il supporto ad ebXML appare più un tentativo di diffondere maggiormente quest'ultima tecnologia, inizialmente creata da SUN ed ora in mano al consorzio OASIS.

 

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 sicuramente l'interfaccia RS (RegistryService). Questa é sempre presente e consente di 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 entità 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.
Una delle caratteristiche più interessanti dei registri di Web Services, é infatti la possibilità di catalogare i servizi e le aziende secondo diverse tassonomie costruendo dunque un patrimonio informativo che consente di effettuare ricerche più puntuali. Ad esempio é possibile restringere la ricerca ai soli venditori di libri online che operano sul territorio italiano ma che magari hanno sede in Svizzera. 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, in JAXR, può rappresentare un qualsiasi concetto e viene combinato con altri Concept per costruire un alberatura che rappresenti una tassonomia. Azzardando un collegamento con DOM, si può dire che Concept di JAXR equivalga al Node di DOM. Con la differenza semantica che il primo rappresenta un concetto (p.e. l'Europa, l'Asia, la macchina o il pappagallo) mentre il secondo rappresenta un elemento di un documento XML.

 

Accedere ai registri
Come consuetudine nelle API Java, l'accesso alle informazioni avviene tramite una connessione restituita da una factory (altre API che utilizzano questo approccio sono JCA - Java Connector Architecture e JAXM - Java API for XML Messaging). La factory stessa può essere recuperata da un riferimenti JNDI (Java Naming and Directory Interface, ed é il metodo consigliato) o attraverso la chiamata ConnectionFactory.newInstance(). In ogni modo, prima di ottenere una connessione al registro, é necessario impostare sulla factory ottenuta alcune proprietà indispensabili come l'url del registro a cui si desidera accedere.
Una volta ottenuta la connessione é possibile:

  • indicare se l'accesso al registro é sincrono od asincrono. Nel caso di accesso sincrono, tutte le chiamate alle API che prevedono l'interazione con il registro risulteranno bloccanti per il thread chiamante. In caso di accesso asincrono, la chiamata termina subito, eventualmente restituendo un oggetto JAXRResponse. Questa instanza non avrà ovviamente i dati richiesti in quanto verranno caricati con una sorta di Lazy-Loading (detto anche Futures Pattern), o all'atto dell'effettiva interrogazione di un metodo di get, oppure tramite un thread apposito.
  • impostare le credenziali dell'utente. Non é possibile accedere ai registri quali UDDI o ebXML senza dichiarare la propria identità: nei casi più semplici (UDDI) di utilizza la coppia utente/password, ottenuta tramite la registrazione presso il fornitore del servizio (IBM, Microsoft); in casi più complessi é possibile utilizzare certificati digitali X500 (in ebXML). Sicuramente comunque tutte le implementazioni JAXR possono fare uso di SSL e, nel caso di JAXR level 1, anche di crittare la comunicazione in quanto JAXR é allineato a JAAS (Java Authentication and Authorization Specification) e JSSE (Java Secure Sockets Extensions).

Ma cosa accade se in una applicazione é necessario accedere a diversi registri, ad esempio, sia ad UDDI che ad ebXML? JAXR consente di stabilire più connessioni contemporanee a diversi registri e di "federare" queste connessioni in una entità logica unica in modo, ad esempio, di poter eseguire funzionalità di ricerca su tutti i registri con una singola chiamata.
Sopratutto in questo caso, ma anche nel caso di singole connessioni, é importante, al termine delle operazioni con il registro, operare la chiusura della connessione. Questa alloca un numero significativo di risorse, quali connessioni di rete e thread che devono essere rilasciate al più presto per non compromettere le prestazioni.

 

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.

 

Conclusioni
Con JAXR non é più tanto importante dove risiedano le informazioni, se in registri UDDI o registri ebXML, in quanto dal punto di vista dello sviluppatore la cosa é trasparente. Diventa più importante, ai fini del successo della visione dei Web Services, che il registro mondiale dei servizi - qualunque sia - sia completo e con informazioni consistenti e corrette, una cosa a tutt'oggi estremamente difficile. Come riportato anche nelle specifiche JAXR, una ricerca congiunta condotta da SalCentral e WebServicesArchitect ([4]) ha individuato che quasi il 48% degli URL nel registro UDDI non sono validi, rappresentando un'ostacolo concreto alla piena realizzazione della visione dei Web Services.

 

Bibliografia
[1] Consorzio UDDI - http:/www.uddi.org
[2] Massimiliano Bigatti - "Web Services (3) - la tecnologia UDDI", Mokabyte, Luglio 2001
[3] Specifiche "Java API for XML Registries (JAXR)", versione 0.75
[4] http://www.webservicesarchitect.com/content/articles/clark04.asp


Massimiliano Bigatti è SUN Certified Enterprise Architect for Java Platform, Enterprise Edition Technology. Si occupa di architetture applicative basate su Java ed Internet, technical writing e del portale www.javawebservices.it

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