Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Global Weather
Web Service
1/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Premessa
La presente documentazione viene redatta come progetto conclusivo del corso di Laboratorio di
Sistemi Distribuiti del corso di Laurea Specialistica in Informatica dell'Università di Roma – Tor
Vergata, svolto nell'a.a.2007-2008.
Sulla base di tali premesse è stata sviluppata una Web Application basata su tecnologie Web Service
denominata Global Weather , la quale, come si può intuire dal nominativo scelto, fornisce le
previsioni meteorologiche di una data città, previa selezione della nazione di appartenenza, i cui
valori delle misure rilevate vengono appositamente convertite da MP/H a KM/H.
Al fine di meglio strutturare la documentazione di tale applicazione, si è deciso di strutturare
l'argomentazione nei seguenti capitoli:
● Capitolo 1 : introduzione al concetto di architettura orientata ai servizi (SOA);
● Capitolo 2 : presentazione del modello Web Service, quale implementazione di un modello
SOA su rete Internet;
● Capitolo 3 : presentazione delle tecnologie utilizzate per l'implementazione del Web Service
Global Weather;
● Capitolo 4 : documentazione UML dell'applicazione Global Weather.
2/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Indice generale
Premessa............................................................................................................................................... 2
Introduzione..........................................................................................................................................5
1SOA: Service-Oriented Architecture.................................................................................................. 8
1.1Introduzione................................................................................................................................ 8
1.2Caratteristiche di una SOA......................................................................................................... 8
1.3Come funziona una SOA............................................................................................................ 9
2I Web Service....................................................................................................................................11
2.1Introduzione.............................................................................................................................. 11
2.2Scenari Complessi.....................................................................................................................12
2.3Tecnologie.................................................................................................................................13
2.4XML..........................................................................................................................................14
2.4.1Struttura di un documento XML....................................................................................... 14
2.4.2DTD: Document Type Definition..................................................................................... 16
2.4.3XML Schema.................................................................................................................... 16
2.4.4Namespece XML.............................................................................................................. 16
2.4.5Lavorare con i documenti XML........................................................................................17
2.4.5.1Elaborazione tramite SAX.........................................................................................17
2.4.5.2Elaborazione tramite DOM....................................................................................... 18
2.5Il protocollo SOAP................................................................................................................... 20
2.5.1Il messaggio SOAP e modelli di scambio.........................................................................21
2.5.2Utilizzo dell’intestazione.................................................................................................. 23
2.5.3Gestione degli Errori......................................................................................................... 23
2.5.4SOAP su HTTP................................................................................................................. 24
2.5.5SOAP e RPC..................................................................................................................... 25
2.5.6SOAP Encoding................................................................................................................ 26
2.5.7SOAP con Allegati............................................................................................................ 27
2.5.8SOAP e Java......................................................................................................................29
2.6Il linguaggio WSDL..................................................................................................................29
2.6.1L'elemento Type................................................................................................................ 32
2.6.2L'elemento Message.......................................................................................................... 33
2.6.3L'elemento PortType......................................................................................................... 34
2.6.4L'elemento Binding........................................................................................................... 35
2.6.5L'elemento Service............................................................................................................ 37
2.7Il protocollo UDDI....................................................................................................................43
2.7.1Il contesto architetturale di UDDI.....................................................................................44
2.7.1.1I ruoli in UDDI.......................................................................................................... 44
2.7.1.2Il registro UDDI........................................................................................................ 44
2.7.2Rappresentazione delle informazioni in UDDI.................................................................44
2.7.2.1Struttura di UDDI...................................................................................................... 45
2.7.2.2Interazioni con UDDI................................................................................................ 47
2.7.2.3Esempio..................................................................................................................... 48
2.8Tecnologie per Web Services di seconda generazione..............................................................51
3Web Services : tecnologie.................................................................................................................53
3.1Introduzione.............................................................................................................................. 53
3/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
3.2Java........................................................................................................................................... 53
3.3TomCat......................................................................................................................................53
3.4Axis........................................................................................................................................... 53
3.4.1L'architettura di Axis......................................................................................................... 54
3.4.2Installazione di AXIS........................................................................................................ 56
3.4.3Deployment di Web Service su Axis.................................................................................57
3.4.4Strumenti per il monitoraggio delle comunicazioni..........................................................62
3.5MySQL..................................................................................................................................... 65
3.6jUDDI....................................................................................................................................... 65
3.6.1Installazione di jUDDI...................................................................................................... 65
3.7UDDI4J..................................................................................................................................... 71
3.7.1Installazione di UDDI4J....................................................................................................72
3.8Tecniche di invocazione di Web Service.................................................................................. 72
3.8.1Stub creato da WSDL........................................................................................................72
3.8.2Dynamic Proxy................................................................................................................. 73
3.8.3Dynamic Invocation Interface (DII)................................................................................. 74
3.8.4Dynamic Discovery and Invocation (DDI)....................................................................... 76
4Global Weather Web Service............................................................................................................ 79
4.1Introduzione.............................................................................................................................. 79
4.2Il Workflow............................................................................................................................... 80
4.3 Class Diagram..........................................................................................................................87
4.3.1Class Diagram del presentation layer................................................................................87
4.3.2Class Diagram della business logic...................................................................................90
4.3.3Class Diagram del meteo fornito dal Web Service fittizio................................................93
4.3.4Class Diagram del Web Service di conversione................................................................95
4.4Use Cases.................................................................................................................................. 98
4.4.1Use Case Scelta Nazione...................................................................................................98
4.4.2Use Case Scelta Città........................................................................................................ 98
4.4.3Use Case Previsioni Meteorologiche................................................................................ 99
4.5Sequence Diagram.................................................................................................................. 100
4.5.1Sequence Diagram per la richiesta dell'elenco città........................................................100
4.5.2Sequence Diagram per la richiesta delle previsioni meteorologiche espresse in MPH. .101
4.5.3Sequence Diagram per la richiesta delle previsioni meteorologiche espresse in KMH. 102
5Bigliogragia.................................................................................................................................... 103
4/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Introduzione
Spiegare cosa sia il “Web 2.0”, ovvero cosa si nasconda dietro tale termine, è cosa veramente
ardua,. Questo perché oggi siamo di fronte più ad un cambiamento culturale che ad un'innovazione
tecnologica vera e propria come era stata Internet anni fa, possiamo dire oramai nella versione 1.0,
ovvero nell'oramai ex epoca della new economy, e sopratutto perché in linea di massima noi
informatici diventiamo matti quando una cosa è eterna e soprattutto siamo caratterizzati dal natuale
istinto di incatenare una definizione ad espressioni logiche (1.0, 1.03, 2.0beta, e così via).
Ad onor del merito, la paternità del termine è da attribuire a Tim O'Reilly, il quale coniò il termine,
verso la metà del 2004, durante una sessione di brainstorming volta a definire il tema di una nuova
conferenza sul Web.
In un primo momento l'idea di Tim O'Reilly fu oggetto di un aspro dibattito, sui primi WebLog del
tempo, tanto da far nascere una querelle tra lui e Tim Bray, inventore dell'XML, il quale in un suo
post intitolato “NOT 2.0”, ha dichiarato che l'espressione Web 2.0 era riconducibile a una vuota
operazione di marketing che richiamava i fantasmi della bolla.
Da quel momento, il termine new economy venne definitivamente sepolto e sostituito dal nuovo
slogan “Web 2.0”, il cui significato possiamo trovarlo anche su Wikipedia1, quale massimo
rappresentante della tecnologia proposta:
“Web 2.0 è un termine coniato da Tim O'Reilly e Dale Dougherty (della O'relly Media, casa
editrice americana specializzata in pubblicazioni riguardanti le nuove tecnologie ed Internet in
particolare) nel 2004 e fa riferimento ai cosiddetti servizi Internet di seconda generazione quali siti
di social networking, wiki2, strumenti di comunicazione e folksonomy3 che enfatizzano la
collaborazione e la condivisione tra utenti”
1 http://en.wikipedia.org/wiki/Web_2.0
2 Un wiki è un sito Web gestito da un sistema che permette a ciascuno dei suoi utilizzatori di aggiungere contenuti,
ma anche di modificare i contenuti esistenti inseriti da altri utilizzatori.
3 È un neologismo che descrive una categorizzazione collaborativa di informazioni mediante l'utilizzo di parole
chiave, dette tag, scelte liberamente.
5/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
6/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
RSS definisce una struttura adatta a contenere un insieme di notizie, ciascuna delle quali sarà composta da vari campi
(nome autore, titolo, testo, riassunto, ...). Quando si pubblicano delle notizie in formato RSS, la struttura viene
aggiornata con i nuovi dati; visto che il formato è predefinito, un qualunque lettore RSS potrà presentare in una
maniera omogenea notizie provenienti dalle fonti più diverse.
7/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
1.1 Introduzione
Una Service-Oriented Architecture (SOA, Architettura Orientata ai Servizi) è un modello
architetturale per la creazione di sistemi residenti su una rete che focalizza l’attenzione sul concetto
di servizio. Un sistema costruito seguendo la filosofia SOA è costituito da applicazioni, chiamate
servizi, ben definite ed indipendenti l’una dall’altra, che risiedono su più computer all’interno di
una rete (ad esempio la rete interna di una azienda o una rete di connessione fra più aziende che
collaborano: intracompany o intercompany network). Ogni servizio mette a disposizione una certa
funzionalità e può utilizzare quelle che gli altri servizi hanno reso disponibili, realizzando, in questo
modo, applicazioni di maggiore complessità.
SOA è una forma particolare di Distributed System, la cui definizione è la seguente:
Un Distributed System (Sistema distribuito) consiste di vari agenti software distinti che devono
lavorare insieme per svolgere alcuni compiti. Inoltre, gli agenti in un sistema distribuito non
operano nello stesso ambiente di calcolo, quindi devono comunicare per mezzo di stack di
protocolli hardware/software su una rete.
Questo significa che le comunicazioni in un sistema distribuito sono intrinsecamente meno veloci e
affidabili rispetto a quelle che utilizzano invocazione diretta del codice e memoria condivisa. Ciò ha
importanti implicazioni architetturali perché i sistemi distribuiti richiedono che gli sviluppatori (di
infrastruttura e applicazioni) considerino la latenza, fattore imprevedibile dell’accesso remoto, e
tengano presente questioni relative alla concorrenza e la possibilità di fallimenti parziali.
8/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Service Directory o Service Registry) ed accessibile in modo trasparente rispetto alla sua
allocazione. Essere disponibile sulla rete lo rende accessibile da quei componenti che ne
richiedono l’utilizzo e l’accesso deve avvenire in maniera indipendente rispetto
all’allocazione del servizio. La pubblicazione dell’interfaccia deve rendere noto anche le
modalità di accesso al servizio.
● fornire un’interfaccia possibilmente a “grana grossa” (coarse-grained). Deve mettere a
disposizione un basso numero di operazioni, cioè poche funzionalità, in modo tale da non
dover avere un programma di controllo complesso. Deve essere invece orientato ad un
elevato livello di interazione con gli altri servizi attraverso lo scambio di messaggi. Per
questo motivo e per il fatto che i servizi possono trovarsi su sistemi operativi e piattaforme
diverse è necessario che i messaggi siano composti utilizzando un formato standard
largamente riconosciuto (Platform Neutral). I dati che vengono trasmessi attraverso i
messaggi possono essere costituiti sia dal risultato dell’elaborazione di un certo servizio sia
da informazioni che più servizi si scambiano per coordinarsi fra loro.
● essere realizzato in modo tale da permetterne la composizione con altri. Nell’architettura
SOA le applicazioni sono il risultato della composizione di più servizi. È per questo motivo
che ogni servizio deve essere indipendente da qualsiasi altro, in modo tale da ottenere il
massimo della riusabilità. La creazione di applicazioni o di servizi più complessi attraverso
la composizione dei servizi di base viene definita Service Orchestration.
Queste dunque le caratteristiche di un sistema di tipo SOA, di cui adesso passiamo a descrivere il
funzionamento.
9/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Tutte queste interazioni passano attraverso quella che in figura viene genericamente definita Rete di
Comunicazione, la quale in un’implementazione reale di una SOA può essere costituita sia da
Internet sia da una intranet.
SOA definisce, dunque, le caratteristiche che i componenti facenti parte di un sistema devono avere
al fine di poter definire quest’ultimo un’architettura orientata ai servizi.
Dopo aver descritto cos’è l’architettura SOA ed il funzionamento di un sistema di questo tipo,
vediamo adesso cosa sono i Web Services, quali tecnologie utilizzano ed il loro legame con SOA.
10/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
2 I Web Service
2.1 Introduzione
Promossi da società del calibro di Microsoft ed IBM, i servizi Web promettono di far integrare
sistemi software in modo standard sulla rete, mediante l'impiego di protocolli e tecnologie concrete
come SOAP (Simple Object Access Protocol), WSDL (Web Services Description Language) ed
UDDI (Universal Description, Discovery and Integration).
I Web Service sono soluzioni adottabili in contesti:
● Enterprise Application Integration8 (EAI)
● Business-to-Business9 (B2B)
● Business-to-Customer10 (B2C)
Tale tecnologia è stata adottata in maniera ufficiale W3C 11 intorno al Dicembre del 2001, il quale ha
formalizzato l'architettura con la seguente definizione:
“Un Web Service (o servizio web) è un sistema software progettato per supportare l’interoperabilità
tra diversi elaboratori su di una medesima rete; caratteristica fondamentale di un Web Service è
quella di offrire un’interfaccia software attraverso la quale altri sistemi possono interagire con il
Web Service stesso tramite appositi messaggi: tali messaggi sono inviati tramite i protocolli di
livello applicativo (HTTP, FTP, SMTP ...) e formattati secondo lo standard XML.”
11/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Service Registry
Service Contract
Illustrazione 2.2: Workflow operativo che coinvolge registridi servizi Web
Inoltre, le componenti ingaggiate potrebbero essere molteplici, in modo da costituire un workflow
complesso di singoli elementi dallo scopo limitato e ben definito. Come un algoritmo svolge il suo
lavoro chiamando le singole routine e gestendo opportunamente i valori di ritorno per implementare
la logica richiesta, un workflow di servizi Web compone, anche in modo dinamico, singoli Web
Services in modo da ottenere la funzionalità richiesta.
Essendo per loro natura distribuiti, nelle tecnologie orientate ai servizi Web assumono una grande
importanza le problematiche classiche presenti nella programmazione distribuita classica, dove
giocano un ruolo determinante tecnologie come CORBA (Common Object Request Broker
Architecture) e RMI (Remote Method Invocation), ma anche RPC (Remote Procedure Call) e
DCOM (Distributed Component Object Model). I servizi web hanno però una serie di sostanziali
12/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
differenze rispetto alle altre tecnologie distribuite: utilizzano un protocollo testuale (XML) al posto
di quello binario costruito ad hoc, sfruttano le infrastrutture di trasporto già presenti di Internet
(HTTP, FTP, SMTP), non hanno ancora però prodotti e tecnologie così definiti come i loro
concorrenti di più lunga data.
Particolare rilevanza ha in quest’ambito la gestione delle transazioni: si ipotizzi che la richiesta
dell'elenco delle città di una data nazione non vada a buon fine, il sistema deve evitare lo stallo dei
flussi informativi, gestendo eventualmente anche un roll-back distribuito delle varie richieste
effettuate ai diversi fornitori di servizi.
2.3 Tecnologie
La visione dei Web Service è supportata da una serie di tecnologie sviluppate in fase iniziale dalle
maggiori aziende del settore, talvolta come membri di un consorzio.
Alcune tecnologie sono comunemente accettate, altre sono più conosciute, mentre altre ancora sono
proposte di singole aziende che non è chiaro se avranno successo in futuro.
Uno stack di tecnologie consolidato è presente nell'illustrazione 3.
13/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
2.4 XML
XML eXtensible Markup Language, è un linguaggio, indipendente dai sistemi e dall'hardware, che
permette di descrivere dei dati e la loro struttura all'interno di un documento XML, ovvero di un file
di testo UNICODE che contiene i dati e gli elementi di markup che definiscono la struttura dei dati
stessi.
Il markup XML assomiglia a quello del linguaggio HTML, in quanto consiste in un tag e attributi
aggiunti ai dati all'interno del file di testo. La somiglianza apparente tra XML e HTML si limita
comunque al loro aspetto superficiale: infatti XML e HTML sono profondamente differenti, sia per
il loro scopo sia che per la loro capacità.
Prima di tutto, sebbene un documento XML possa essere creato, letto e compreso da una persona, il
suo scopo primario consiste nella comunicazione di dati da un computer all'altro. Di conseguenza,
accade frequentemente che i documenti XML vengano generati ed elaborati da un programma e non
da un utente umano, anche se quest'ultimi sia in grado di farlo. Un documento XML definisce la
struttura dei dati contenuti al suo interno in modo che un programma che lo riceve sia in grado di
interpretarlo. È quindi possibile affermare che XML è uno strumento per trasferire informazioni e la
loro organizzazione da un programma all'altro. Lo scopo di HTML, dall'altra parte, consiste
essenzialmente nel fornire la descrizione di come i dati dovranno apparire quando vengono
visualizzati o stampati. Infatti le uniche informazioni strutturali che solitamente appaiono nei
documenti HTML sono relative all'aspetto dei dati dal punto di vista visivo.
In secondo luogo, HTML fornisce un insieme di tag essenzialmente prefissato e dedicato
principalmente alla presentazione dei dati, invece, XML è un linguaggio tramite il quale è possibile
definire nuovi insiemi di tag e attributi adatti a svariate tipologie di dati, anche di tipo
personalizzato.
Naturalmente, una volta inventato un insieme di elementi di markup XML adatti a descrivere un
tipo particolare di dato, sarà necessario rendere disponibile le regole per interpretare documenti
XML di quel tipo, in modo tale da poterli creare, leggere o modificare. La definizione di tali
elementi di markup utilizzati all'interno di un documento XML può essere inclusa direttamente
all'interno del documento, oppure sotto forma di un'entità separata come, ad esempio, un file
identificato da un URI, che possa essere referenziato all'interno di ogni documento di quel
particolare tipo.
Da un punto di vista implementativo, il linguaggio di programmazione Java, mette a disposizione
la libreria JAXP (Java API for XML Processing) la quale fornisce strumenti necessari per leggere,
creare e modificare documenti XML dall'interno dei nostri programmi. Per comprendere ed
utilizzare queste API, l'utente dovrebbe però acquisire una ragionevole familiarità oltre che con i
concetti fino ad ora esposti, anche il concetto di namespece XML, il quale verrà illustrato nel
paragrafo a seguire.
14/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Illustrazione
2.4: Struttura
logica di un file
XML
● il prologo fornisce le informazioni necessarie per interpretare il contenuto del corpo del
documento. Esso contiene due componenti opzionali: dato che entrambi possono essere
omessi, ne consegue che anche il prologo stesso è opzionale. Le due componenti del
prologo, nella sequenza in cui devono apparire sono:
○ una XML declaration che definisce la versione XML, applicabile al documento, e che
può inoltre specificare quale sia la particolare codifica UNICODE per i caratteri
utilizzata nel documento e se il documento stesso è di tipo standalone oppure no.
○ Una document type declaration che specifica quale sia la DTD12 esterna che fornisce le
dichiarazioni degli elementi di markup utilizzati nel corpo del documento, oppure
fornisce esplicitamente tali dichiarazioni, o infine che svolge entrambe le funzioni.
● Il body contiene i dati del documento stesso, costituito da uno o più elementi, ognuno dei
quali è definito da un tag d'inizio ed un tag di fine. Esiste sempre un singolo elemento root
che contiene tutti gli elementi.
<?xml version="1.0" encoding="utf-16"?>
<CurrentWeather> <!-- questa è il root tag -->
<Location>Roma / Urbe, Italy (LIRU) 41-57N 012-30E 24M</Location>
<Time>Jun 20, 2008 - 08:50 AM EDT / 2008.06.20 1250 UTC</Time>
<Wind> from the WSW (240 degrees) at 10 MPH (9 KT):0</Wind>
<Visibility> greater than 7 mile(s):0</Visibility>
<SkyConditions> mostly clear</SkyConditions>
<Temperature> 69 F (21 C)</Temperature>
<DewPoint> 60 F (16 C)</DewPoint>
<RelativeHumidity> 73%</RelativeHumidity>
<Pressure> 29.97 in. Hg (1015 hPa)</Pressure>
<Status>Success</Status>
</CurrentWeather>
12 Document Type Definition : è un documento nel quale vengono definite le regole mediante le quali si assicura che i
vari dati vengano rappresentati in maniera consistente e corretta all'interno di documenti differenti.
15/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
16/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
documento molto probabilmente non è stata definita tenendo presenti le caratteristiche degli
elementi della seconda DTD, esistono probabilità concrete che si verifichino delle collisioni tra i
nomi delle due tipologie di documenti. In tal caso, sarebbe impossibile riuscire a differenziare gli
elementi il cui nome è comune ad entrambe le DTD.
I namespace XML sono stati ideati per aiutarci ad affrontare questo tipo di problemi. Un namespace
XML non è altro che una collezione di nomi di elementi ed attributi identificata da un URI. Ogni
nome di un determinato namespace XML viene quindi qualificato tramite l'URI che identifica il
namespace stesso. In questo modo namespace XML differenti possono contenere nomi in comune
senza che questo causi confusione, in quanto ogni singolo nome viene qualificato, tramite l'URI
univoco del namespace che lo contiene.
Un esempio di notazione a cui si è appena fatto cenno è la seguente:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
In questo modo viene effettuata una dichiarazione di namespace utilizzando un nome di attributo
speciale e riservato, xmlns, all'interno della dichiarazione di un elemento; in questo esempio il
namespace viene applicato all'elemento <Envelope>. Il nome xsi separato da xmlns tramite un
carattere : rappresenta il prefisso di namespace mentre il suo valore,
http://www.w3.org/2001/XMLSchema-instance, specifica l'URI associato al namespace. Il solo
scopo dell'URI che identifica il namespace consiste nell'assicurare che i nomi all'interno del
namespace siano unici, indipendentemente dal fatto che l'URI esista oppure no. Come si nota
dall'esempio proposto, è possibile aggiungere un numero qualsiasi di dichiarazioni di namespace
all'interno di un elemento.
17/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
metodo viene spesso chiamato handler, oppure gestore dell'evento. Il compito del programmatore
consiste nell'implementare gli handler in modo da rispondere in maniera appropriata a ogni evento,
e quindi reagire al contenuto del documento in base alle esigenze dell'applicazione.
Il modo in cui lavora SAX si traduce necessariamente nel fatto che l'applicazione viene a
conoscenza del contenuto del documento un pezzo per volta, senza poter lavorare su una sua
rappresentazione totale. Ciò significa che, nel caso in cui il programma abbia la necessità di avere a
disposizione l'intero documento all'interno di una struttura che ne riproduca il contenuto, bisogna
costruire e riempire personalmente tale struttura con le informazioni invocate dai metodi di
callback.
<?xml version="1.0" encoding="utf-16"?> ----------> Inizio documento
<CurrentWeather> --------------------------------------------> Inizio elemento : CurrentWeather
<Visibility> -----------------------------------------------> Inizio elemento : Visibility
greater than 7 mile(s):0 -----------------------> Carattere : greater than 7 mile(s) : 0
</Visibility> ----------------------------------------------> Fine elemento : Visibility
<SkyConditions> -------------------------------------------> Inizio elemento : SkyConditions
mostly clear ------------------------------------------> Carattere : mostly clear
</SkyConditions> ------------------------------------------> Fine elemento : SkyConditions
<Temperature> ----------------------------------------------> Inizio elemento : Temperature
69 F (21 C)---------------------------------------------> Carattere : 69 F (21 C)
</Temperature> ---------------------------------------------> Fine elemento : Temperature
</CurrentWeather> --------------------------------------------> Fine elemento : CurrentWeather
18/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Per quanto riguarda il parsing di documenti XML JDOM fornisce i builder, oggetti che costruiscono
un documento a partire da diverse sorgenti dati come file, InputStream e InputSource. Sono
definiti due tipi di builder, DOMBuilder e SAXBuilder. Come è evidente dal nome DOMBuilder
carica un documento a partire da un oggetto org.w3c.dom.Document mentre SAXBuilder sfrutta
un parser SAX ed è quindi più performante.
Le seguenti righe di codice mostra come usare un SAXBuilder per eseguire il parsing di un file
istanziando un documento JDOM:
SAXBuilder builder = new SAXBuilder(true);
Document doc = builder.build(new File(args[0]));
// ...
19/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
20/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
SOAP
Envelope
Header
Entries
[Header
Element]
Body
Element
[Fault
Element]
[Attachment]
21/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
In particolare:
● il namespace di appartenenza. Gli elementi XML propri del messaggio SOAP
appartengono ad un namespace, il cui URI definisce la versione di SOAP utilizzata. Per
SOAP 1.1 il namespace è http://schemas.xmlsoap.org/soap/envelope/. In caso il
server riceva un messaggio la cui versione è diversa da quella attesa, viene generato un
errore (di tipo VersionMismatch);
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
● attributo encodingStyle. Indica quale standard è stato utilizzato per codificare il contenuto
del messaggio (si veda il paragrafo SOAP Encoding).
22/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
Nel caso in cui volessimo applicare la codifica di SOAP 1.2 bisogna sostituire la precedente URI
con http://www.w3.org/2001/09/soap-encoding.
23/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
</SOAP-ENV:Envelope>
● faultactor. Definisce quale nodo del percorso intrapreso dal messaggio, ha generato questo
errore;
● detail. Questo elemento può contenere un messaggio applicativo variabile, che può
descrivere nel dettaglio il problema occorso. Nel listato sottostante è mostrato un blocco
applicativo specifico, mentre spesso si inserisce uno stack trace della chiamata Java,
all’interno di un elemento CDATA.
<detail>
<e:myfaultdetails xmlns:e="Some-URI">
<message>My application didn't work </message>
<errorcode> 1001</errorcode>
</e:myfaultdetails>
</detail>
24/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Come si nota dal listato sottostante, SOAP su HTTP richiede che il content-type del messaggio sia
“text/xml”.
Content-Type: text/xml; charset=utf-8
La risposta segue poi le semantiche definite nei valori di stato di HTTP. Possiamo quindi avere:
● 200 se è andato tutto bene;
● 404 se il destinatario non è stato trovato;
● 500 se è avvenuto un errore interno (in questo caso il messaggio conterrà un elemento
Fault).
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope ...
25/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Non è però indispensabile utilizzare questo standard, è sufficiente utilizzarne uno che possa essere
intellegibile sia da parte del client che del server.
D’altra parte, Microsoft stessa non ritiene che l’encoding SOAP faccia parte del futuro dei servizi
Web, ed anche il W3C ne ha reso opzionale la sua implementazione in SOAP 1.2 e ne ha eliminato
il supporto da WSDL 1.2.
Inoltre, e questo è un aspetto molto importante, la WS-I (Web Services Interoperability
Organization), un consorzio di aziende che lavora per assicurare che le diverse implementazioni dei
servizi Web possano comunicare tra di loro correttamente, non ne consente l’utilizzo.
Alla luce di queste notizie, non appare utile investire su un aspetto della tecnologia che in futuro
non sarà più presente.
Per completezza, riportiamo comunque un esempio di blocco dati codificato in SOAP encoding .
<element name="age" type="int"/>
<element name="height" type="float"/>
26/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
<age>45</age>
<height>5.9</height>
<displacement>-450</displacement>
<color>Blue</color>
27/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Content-Type: image/tiff
Content-Transfer-Encoding: binary
Content-ID: <info@giuseppespecchio.it>
...binary TIFF image...
--MIME_boundary--
Illustrazione 2.11: La
struttura di un messaggio
SOAP con allegati
Questa possibilità consente di associare ad un messaggio SOAP un elemento binario, come ad
esempio un certificato di sicurezza o un blocco dati che risulta poco pratico o efficiente da
codificare in XML.
Una caratteristica interessante è la possibilità, da parte del messaggio SOAP, di puntare a URI
assoluti (quindi all’esterno del messaggio), ma anche interni, collegandosi dunque ad un altro
allegato al messaggio.
Si noti che il contenuto dell'allegato non deve per forza essere di tipo binario: è anche possibile
allegare ulteriori documenti XML, quando le informazioni in esse contenute non risultino
28/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
facilmente inseribili nel messaggio principale, o quando sia, dal punto di vista applicativo,
preferibile mantenerle come documenti separati.
29/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
formale in formato XML utilizzato per la creazione di “documenti” per la descrizione di Web
Service.
Mediante WSDL può essere, infatti, descritta l'interfaccia pubblica di un Web Service ovvero creata
una descrizione, basata su XML, di come interagire con un determinato servizio: un “documento”
WSDL contiene infatti, relativamente al Web Service descritto, informazioni su:
● cosa può essere utilizzato (le “operazioni” messe a disposizione dal servizio);
● come utilizzarlo (il protocollo di comunicazione da utilizzare per accedere al servizio, il
formato dei messaggi accettati in input e restituiti in output dal servizio ed i dati correlati)
ovvero i “vincoli” (bindings in inglese) del servizio;
● dove utilizzare il servizio (cosiddetto endpoint del servizio che solitamente corrisponde
all'indirizzo - in formato URI - che rende disponibile il Web Service)
Le operazioni supportate dal Web Service ed i messaggi che è possibile scambiare con lo stesso
sono descritti in maniera astratta e quindi collegati ad uno specifico protocollo di rete e ad uno
specifico formato.
Il WSDL è solitamente utilizzato in combinazione con SOAP e XML Schema per rendere
disponibili Web Service su reti aziendali o su Internet: un programma client può, infatti, “leggere”
da un registro UDDI il documento WSDL relativo ad un Web Service per determinare quali siano le
funzioni messe a disposizione sul server e quindi utilizzare il protocollo SOAP per utilizzare una o
più delle funzioni elencate dal WSDL.
La versione 1.1 di WSDL non è stata adottata come standard dal World Wide Web Consortium
(W3C).
Il 26 giugno 2007 la versione 2.0 è stata promossa a standard ufficiale (in forma di
“raccomandazione”) dal W3C.
All'interno del documento esistono quattro elementi principali:
● <types>
● <message>
● <portType>
● <binding>
● <service>
30/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
WSDL
Document
[Types]
{Messages}
[Operations]
{Port Types}
{Bindings}
[Ports]
{Services}
31/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
</definitions>
13 http://www.webservicex.net/WCF/ServiceDetails.aspx?SID=48
32/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
</s:complexType>
</s:element>
<s:element name="GetWeatherResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="GetWeatherResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
:::::
<!-- continua descrizione dei tipi previsti per il metodo GetCitiesByCountry -->
:::::
</s:schema>
</wsdl:types>
Listato 2.12 - Stralcio del tag Type del file WDSL del Web Service Global Weather
33/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Illustrazione 2.13:
Operazione One-Way
● Notification (notifica): il contrario dell'operazione one-way, ossia un messaggio dal servizio
al client;
Illustrazione 2.14:
Operazione
Notification
● Request-Response (richiesta-risposta): un messaggio da parte del client ed una risposta
proveniente dal servizio;
Illustrazione 2.15:
Operazione Request-
Response
● Solicit-Response (sollecito-risposta): il contrario dell'operazione di request-response. In
questo caso, il messaggio originale è trasmesso dal servizio ed è il client che risponde.
34/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Illustrazione 2.16:
Operazione Solicit-
Response
Proseguendo con l'esempio del metodo GetWeather è giunto il momento di analizzare anche
l'elemento portType.
<wsdl:portType name="GlobalWeatherSoap">
<wsdl:operation name="GetWeather">
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">
Get weather report for all major cities
around the world.
</documentation>
<wsdl:input message="tns:GetWeatherSoapIn" />
<wsdl:output message="tns:GetWeatherSoapOut" />
</wsdl:operation>
:::
</wsdl:portType>
35/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
:::
</wsdl:binding>
Una volta collegato il portType al binding possiamo proseguire con il secondo elemento di questo
tipo, quello appartenente a SOAP. Anche questo elemento ha due attributi: uno stile che può essere
inpostato a rpc o document
<soap:binding
transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
ed un attributo transport.
<soap:binding
transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
In questo caso abbiamo usato document come style poiché riceveremo una risposta sotto forma di
documento. L'attributo transport indica il protocollo da utilizzare con SOAP per comunicare e
come possiamo leggere nell'URI abbiamo scelto HTTP.
Giunti a questo punto, dopo aver definito i due elementi “binding” possiamo passare alla parte più
interessante: definire i dettagli per le operazioni.
Con il primo tag operation, quello più esterno, richiamiamo le operazioni che abbiamo già definito
nell'elemento <portType>
<wsdl:operation name="GetWeather">
::::
</wsdl:operation>
36/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
soap:operation.
<soap:operation
soapAction="http://www.webserviceX.NET/GetWeather"
style="document" />
Come valore di soapAction abbiamo inserito un URI che nel mezzo ha una servlet. Questo serve
per sottolineare che l'attributo soapAction è molto importante (oltre che indispensabile) poiché ci
servirà come descrizione dell'azione richiesta per il Web Service.
All'interno del tag operation, dopo aver impostato l'elemento <soap:operation> bisogna
elencare come saranno comunicati messaggi. Per farlo, ad ogni messaggio previsto dall'operazione
che stiamo descrivendo dopo aver specificato il tipo con gli appositi tag (input, output o fault).
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
<wsdlsoap:body> specifica come le parti del messaggio appariranno all'interno dell'elemento body
di SOAP ed imposta la codifica da utilizzare se si è deciso di utilizzarla. Se non si desidera la
codifica si può impostare l'attributo use con valore literal.
37/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
<soap:address
location="http://www.webservicex.net/globalweather.asmx" />
Finalmente abbiamo incontrato e realizzato tutte le parti di un documento WSDL. Possiamo quindi
vedere la versione integrale del nostro WSDL.
<?xml version="1.0" encoding="utf-8" ?>
<wsdl:definitions
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.webserviceX.NET"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
targetNamespace="http://www.webserviceX.NET"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified"
targetNamespace="http://www.webserviceX.NET">
<s:element name="GetWeather">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="CityName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1"
name="CountryName" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetWeatherResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="GetWeatherResult"
type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetCitiesByCountry">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="CountryName" type="s:string" />
</s:sequence>
</s:complexType>
38/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
</s:element>
<s:element name="GetCitiesByCountryResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1"
name="GetCitiesByCountryResult"
type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="string" nillable="true" type="s:string" />
</s:schema>
</wsdl:types>
<wsdl:message name="GetWeatherSoapIn">
<wsdl:part name="parameters" element="tns:GetWeather" />
</wsdl:message>
<wsdl:message name="GetWeatherSoapOut">
<wsdl:part name="parameters" element="tns:GetWeatherResponse" />
</wsdl:message>
<wsdl:message name="GetCitiesByCountrySoapIn">
<wsdl:part name="parameters" element="tns:GetCitiesByCountry" />
</wsdl:message>
<wsdl:message name="GetCitiesByCountrySoapOut">
<wsdl:part name="parameters"
element="tns:GetCitiesByCountryResponse" />
</wsdl:message>
<wsdl:message name="GetWeatherHttpGetIn">
<wsdl:part name="CityName" type="s:string" />
<wsdl:part name="CountryName" type="s:string" />
</wsdl:message>
<wsdl:message name="GetWeatherHttpGetOut">
<wsdl:part name="Body" element="tns:string" />
</wsdl:message>
<wsdl:message name="GetCitiesByCountryHttpGetIn">
<wsdl:part name="CountryName" type="s:string" />
</wsdl:message>
<wsdl:message name="GetCitiesByCountryHttpGetOut">
<wsdl:part name="Body" element="tns:string" />
</wsdl:message>
<wsdl:message name="GetWeatherHttpPostIn">
39/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
40/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
(full / part).
</documentation>
<wsdl:input message="tns:GetCitiesByCountryHttpGetIn" />
<wsdl:output message="tns:GetCitiesByCountryHttpGetOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:portType name="GlobalWeatherHttpPost">
<wsdl:operation name="GetWeather">
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">
Get weather report for all major cities
around the world.
</documentation>
<wsdl:input message="tns:GetWeatherHttpPostIn" />
<wsdl:output message="tns:GetWeatherHttpPostOut" />
</wsdl:operation>
<wsdl:operation name="GetCitiesByCountry">
<documentation xmlns="http://schemas.xmlsoap.org/wsdl/">
Get all major cities by country name
(full / part).
</documentation>
<wsdl:input message="tns:GetCitiesByCountryHttpPostIn" />
<wsdl:output message="tns:GetCitiesByCountryHttpPostOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="GlobalWeatherSoap" type="tns:GlobalWeatherSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<wsdl:operation name="GetWeather">
<soap:operation
soapAction="http://www.webserviceX.NET/GetWeather"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetCitiesByCountry">
<soap:operation
soapAction="http://www.webserviceX.NET/GetCitiesByCountry"
style="document" />
<wsdl:input>
41/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
42/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetCitiesByCountry">
<http:operation location="/GetCitiesByCountry" />
<wsdl:input>
<mime:content
type="application/x-www-form-urlencoded" />
</wsdl:input>
<wsdl:output>
<mime:mimeXml part="Body" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="GlobalWeather">
<wsdl:port name="GlobalWeatherSoap" binding="tns:GlobalWeatherSoap">
<soap:address
location="http://www.webservicex.net/globalweather.asmx" />
</wsdl:port>
<wsdl:port name="GlobalWeatherHttpGet" binding="tns:GlobalWeatherHttpGet">
<http:address
location="http://www.webservicex.net/globalweather.asmx" />
</wsdl:port>
<wsdl:port name="GlobalWeatherHttpPost"
binding="tns:GlobalWeatherHttpPost">
<http:address
location="http://www.webservicex.net/globalweather.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Listato 2.17 - Listato completo del WSDL del Web Service Global Weather
43/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Registro
UDDI
Publisher Utente
44/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Concettualmente, queste informazioni che devono essere fornite, coerentemente con le specifiche
previste da UDDI, possono essere divise in tre blocchi fondamentali: White Pages, Yellow Pages e
Green Pages.
45/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
46/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
</choice>
<element ref = “tModelInstanceDetails”/>
</sequence>
<attribute ref = “bindingKey” use = “required”/>
<attribute ref = “serviceKey”/>
</complexType>
</element>
47/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
2.7.2.3 Esempio
Richiesta:
48/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
49/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
<contact useType="publisher">
<personName>ROOT</personName>
</contact>
</contacts>
<businessServices>
<businessService
businessKey="6738A270-8718-11D9-BE19-E3A8EDD29D26"
serviceKey="7CD2E0A0-8718-11D9-BE19-CCA88D805CB7">
<name>MergeService</name>
<bindingTemplates>
<bindingTemplate
bindingKey="D38E48A0-87E8-11D9-B722-A26BE7DE4B86"
serviceKey="7CD2E0A0-8718-11D9-BE19-CCA88D805CB7">
<accessPoint URLType="http">
http://localhost:8080/axis/services/MergeService
</accessPoint>
<tModelInstanceDetails>
<tModelInstanceInfo
tModelKey="uuid:B5CA6C80-8717-11D9-BE19-FAE3FA307183">
<instanceDetails>
<overviewDoc>
< overviewURL>
http://localhost:8080/axis/services/MergeService?wsdl
</overviewURL>
</overviewDoc>
</instanceDetails>
</tModelInstanceInfo>
</tModelInstanceDetails>
<categoryBag/>
</bindingTemplate>
</bindingTemplates>
<categoryBag/>
</businessService>
</businessServices>
<identifierBag/>
<categoryBag/>
</businessEntity>
</businessEntityExt>
</businessDetailExt>
50/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
</soapenv:Body>
</soapenv:Envelope>
51/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Quando si progettano e sviluppano business process che coinvolgono molti web service e la cui
esecuzione può avere un tempo di durata elevato bisogna tenere presenti alcuni requisiti tecnici
molto importanti. Per prima cosa è necessario che i servizi possano essere invocati in modo
asincrono; in questo modo un business process può invocare concorrente più Web Service per
migliorare le prestazioni. Devono poi essere gestite le eccezioni e l’integrità delle transazioni,
definendo il comportamento del sistema in caso di errore o di mancata risposta di un servizio
invocato entro un certo limite di tempo. Infine caratteristiche importanti nell’attività di
coordinamento dei Web Service sono dinamicità, flessibilità, adattabilità e riutilizzabilità; tenendo
separata la logica del processo dai Web Service che lo realizzano si ottiene un alto livello di
flessibilità che permette al business process di essere dinamicamente adattato per vari scopi,
semplicemente richiamando i servizi necessari; inoltre un business process può essere visto come
un qualsiasi servizio ed essere invocato da altri, riutilizzandolo all’interno di vari processi costituiti
cosa da una composizione ricorsiva di Web Service.
Vi sono molte tecnologie, sviluppate autonomamente o in collaborazione da grandi organizzazioni
come IBM, Microsoft, BEA, SUN o altre, il cui scopo è quello di gestire le due attività di
Orchestration e Choreography.
All’interno di queste tecnologie la distinzione fra Orchestration e Choreography spesso si perde,
perciò nel seguito considereremo semplicemente la Web Services Orchestration come l’attività
che le comprende entrambe.
Le tecnologie più promettenti in ambito di Web Services Orchestration sono BPEL4WS, WSCI e
BPML.
52/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
3.1 Introduzione
L’implementazione e l’esecuzione di Web Service richiedono l’adozione di alcune tecnologie
necessarie al loro funzionamento. Di tali tecnologie fanno parte ad esempio il supporto al
linguaggio di programmazione e il Web Server.
Grande parte del tempo impiegato per la realizzazione di questo progetto è stato dedicato allo studio
di queste tecnologie, per comprendere la loro struttura ed il loro funzionamento e per effettuare
correttamente la loro installazione e configurazione. Le tecnologie utilizzate sono state scelte in
base a semplici criteri di valutazione del prodotto come il fatto di essere software Open Source o
meno, la libertà di utilizzo, di modifica e di personalizzazione, chiarezza e semplicità d’uso, costo
ridotto o nullo ed infine inesistenza di alternative valide.
Vediamo adesso una per una le tecnologie utilizzate spiegando quale compito assolvono, come
funzionano.
3.2 Java
Il linguaggio di programmazione scelto per l’implementazione dei Web Service che compongono il
progetto è JAVA. Linguaggio molto diffuso, Java è utilizzabile pressoché su qualsiasi macchina
semplicemente installando l’opportuna JVM (Java Virtual Machine), disponibile per i principali
sistemi operativi, quali Windows, Linux, Mac o Solaris.
Il supporto Java utilizzato per questo progetto `e il J2SDK 1.4.2 05 (Java 2 Starndard Development
Kit, versione 1.4.2 05).
È stato scelto Java come linguaggio di programmazione perché, oltre al fatto che è semplice trovare
una grande quantità di informazioni che lo descrivono, è su di esso che sono basati molti dei
software che abbiamo adottato e che vedremo più avanti.
3.3 TomCat
Tomcat è un Application Server basato sulla tecnologia Java, un Web Server ed un contenitore di
servlet e JSP. Tomcat è necessario per fare del nostro pc o del computer che vogliamo connettere
alla rete un server che possa ospitarele nostre applicazioni che desideriamo siano utilizzate da altri
utenti via web. Su Tomcat possono essere caricate semplici pagine HTML come anche servlet e JSP.
Relativamente semplice da configurare ed utilizzare, Tomcat è Open Source, cioè con codice
liberamente visibile e modificabile, al contrario di prodotti analoghi, come ad esempio IIS (Internet
Infomation Service) di Microsoft ed inoltre è liberamente scaricabile ed utilizzabile. La versione di
Tomcat scelta `e la 5.0.27.
3.4 Axis
Axis è l'acronimo di Apache eXtendable Interction System, si tratta di un'API di programmazione e
deployment di Web Service che permette di lavorare ad un livello di astrazione elevato, evitando
così di dover maneggiare direttamente l’envelope SOAP.
Axis è una piattaforma Java per la creazione e l’utilizzo di applicazioni che si basano sui Web
53/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
54/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
55/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Si noti come ora nel Transport è presente l'Handler Sender che è responsabile di mandare la
richiesta SAOP all'Axis Server ed ottenere da quest’ultimo una risposta.
axis-1_2
axis
WEB-INF
lib
classes
web.xml
……
Illustrazione 3.3: Installazione
AXIS
In questo caso, dunque, la cartella va brutalmente copiata sotto la webapps di Tomcat. In questo
modo avremo dotato il nostro server di un Web Service engine (di fatto una struttura Servlet) in
grado di esaudire richieste provenienti da qualsiasi client WS.
A questo punto, dopo aver riavviato Tomcat, apriamo il browser ed inseriamo l’indirizzo
“http://localhost:8080/axis” al quale si trova la prima pagina di Axis. Se la pagina viene visualizzata
significa che Axis è presente ma dobbiamo controllare che siano presenti tutti i pacchetti necessari
al suo corretto funzionamento.
Sulla prima pagina di Axis possiamo notare alcuni link il primo dei quali è Validation. Facendo
click su di esso ci viene restituita una pagina chiamata “Axis Happiness Page” che riporta i risultati
dell’analisi della configurazione di Axis. Vengono riportati i componenti necessari ed opzionali al
funzionamento di Axis ed il path ai relativi pacchetti nel caso in cui siano stati trovati.
56/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Illustrazione 3.4: Axis - Home Page su TomCat Illustrazione 3.5: Axis Happiness Page
I componenti necessari devono ovviamente essere tutti presenti, poiché senza di essi Axis non
funzionerà correttamente. I componenti opzionali devono essere presenti solo nei casi in cui le
applicazioni da noi sviluppate ne facciano uso.
I pacchetti mancanti, nel caso ve ne siano, devono essere inseriti nella directory “$CATALINA
HOME/common/lib/”16; riavviando Tomcat tali pacchetti vengono rilevati automaticamente e ciò
può essere verificato semplicemente ricaricando la pagina di validazione di Axis (“Axis Happiness
Page”, raggiungibile dall’indirizzo http://localhost:8080/axis).
57/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
58/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
</requestFlow>
<!-- STOP define the service, using the log handler we just defined -->
</service>
</deployment>
Listato 3.1 - deployment descriptor dell'applicazione Global Weather – deploy.wsdd
All’interno dell’elemento deployment, che riporta i namespace a cui si fa riferimento, si trova
l’elemento service che specifica le informazioni relative al servizio di cui vogliamo fare il
deployment.
<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
...
<service name="Dispatcher" provider="java:RPC" style="rpc" use="encoded">
...
</service>
</deployment>
Nel tag service possiamo vedere due attributi con i quali vengono specificati il nome del servizio e
59/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
tra i quali evidenziamo, quello che specifica il nome della classe che implementa il servizio ed il
package in cui si trova mentre il secondo riporta i metodi che possono essere esposti
(“allowedMethods”: metodi concessi) ad un utilizzo diretto da altri servizi (in questo esempio
avremmo potuto inserire il carattere asterisco “*” al posto dei valori, in modo tale che tutti i metodi
della classe siano utilizzabili dall’esterno).
Tra i vari elementi che compongono il file deploy.wsdd sono presenti anche i tag operation il quali,
specificano le caratteristiche di un metodo ed i suoi parametri. Ad esempio il metodo getMeteoS
viene così definito:
...
<operation name="getMeteoS" qname="operNS:getMeteoS"
xmlns:operNS="urn:com.service.specchio"
returnQName="getMeteoSReturn" returnType="rtns:string"
xmlns:rtns="http://www.w3.org/2001/XMLSchema" soapAction="" >
<parameter qname="in0" type="tns:string"
xmlns:tns="http://schemas.xmlsoap.org/soap/encoding/"/>
<parameter qname="in1" type="tns:string"
xmlns:tns="http://schemas.xmlsoap.org/soap/encoding/"/>
</operation>
...
dall'analisi del suo è facile evincere che questi restituisce un parametro di tipo string ed accetta due
parametri di input di ugual tipologia.
Infine evidenziamo la presenza del tag handler definito immediatamente dopo il tag deployment:
<handler name="track" type="java:com.service.specchio.LogHandler">
<parameter name="filename" value="MyService.log"/>
</handler>
<!-- STOP define the logging handler configuration -->
...
<!-- START define the service, using the log handler we just defined -->
<requestFlow>
<handler type="track"/>
</requestFlow>
anche tale elemento è caratterizzato da un proprio nome univoco, il nome della classe che
implementa l'handler, ed il file in cui salverà le sue elaborazioni; infatti, tale hadler effettua un log
dell'utilizzo del Web Service.
Una volta creato il file deploy.wsdd, dobbiamo per prima cosa copiare il package contenente le
classi che realizzano il Web Service nella directory “$CATALINA HOME/webapps-/axis/WEB-INF/
classes” e, successivamente, da tale posizione eseguire l’operazione di deployment utilizzando un
60/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
<service name="Dispatcher"/>
</undeployment>
La lista di tutti i servizi disponibili può essere ottenuta dalla prima pagina di Axis
“http://localhost:8080/axis/” , cliccando sul link View.
61/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
62/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Si osservi che se axis.jar è nel classpath non è necessario specificare l’opzione -classpath ma è
sufficiente eseguire “javac SOAPMonitorApplet.java”.
Dopo aver compilato l’applet, dobbiamo effettuare il deployment, esattamente come visto in
precedenza, creando un file di deployment per SOAPMonitor come il seguente:
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<handler name="soapmonitor"
type="java:org.apache.axis.handlers.SOAPMonitorHandler">
<parameter name="wsdlURL"
value="/axis/SOAPMonitorService-impl.wsdl"/>
63/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
<parameter name="namespace"
value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
<parameter name="serviceName" value="SOAPMonitorService"/>
<parameter name="portName" value="Demo"/>
</handler>
<service name="SOAPMonitorService" provider="java:RPC">
<parameter name="allowedMethods" value="publishMessage"/>
<parameter name="className"
value="org.apache.axis.monitor.SOAPMonitorService"/>
<parameter name="scope" value="Application"/>
</service>
</deployment>
Dopo aver effettuato tali operazioni, il servizio SOAPMonitor è abilitato ed infatti viene inserito tra
i servizi disponibili alla pagina “http://localhost:8080/axis/servlet/AxisServlet”, raggiungibile dalla
prima pagina di Axis tramite il link “List”.
A questo punto dobbiamo specificare i Web Service dei quali vogliamo monitorare i messaggi in
arrivo ed in partenza. Per fare questo dobbiamo effettuare una modifica al file di deployment di tali
Web Service, inserendo, immediatamente dopo al tag di apertura dell’elemento <service>, le
definizioni dei due elementi requestFlow e responseFlow, come riportato nel seguente codice:
...
<service name="MergeService" provider="java:RPC">
<requestFlow>
<handler type="soapmonitor"/>
</requestFlow>
<responseFlow>
<handler type="soapmonitor"/>
</responseFlow>
...
Con questi due elementi viene specificato soapmonitor come gestore del flusso dei messaggi di
richiesta e del flusso dei messaggi di risposta. Affinché queste modifiche abbiano effetto dobbiamo
effettuare il deployment del servizio, come visto in precedenza, ma non prima di averne eseguito
l’undeployment nel caso in cui tale servizio fosse già attivo su Axis.
A questo punto possiamo lanciare SOAPMonitor, caricando da browser l’URL
“http://localhost:8080/axis/SOAPMonitor”, ed ogni messaggio ricevuto ed inviato dai Web Service
che vengono monitorati apparirà nei relativi box dell’interfaccia di SOAPMonitor, come si può
vedere in figura
64/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
3.5 MySQL
Il progetto ha richiesto l’utilizzo di un database che permettesse di immagazzinare informazioni
relative al registro UDDI e la scelta è ricaduta su MySQL. MySQL è un Database Management
System (DBMS) relazionale, cioè un sistema per la gestione di database relazionali, potente e facile
da usare. Le alternative a MySQL sono molte; vi sono ad esempio DB2, Oracle, PostgreSql. Fra
tutti è stato però scelto MySQL per il fatto di essere Open Source e, soprattutto, gratuito.
3.6 jUDDI
jUDDI è l’implementazione Java delle specifiche di UDDI, di cui abbiamo parlato in precedenza.
Progetto Open Source sviluppato anch’esso da Apache, jUDDI mette a disposizione il servizio
UDDI attraverso l’uso di un database, che nel nostro caso è fornito da MySQL, e delle API già
descritte in passato, implementate in Java.
L’utilizzo diMySQL, come già accennato nel paragrafo ad esso relativo, è stato necessario
esclusivamente come supporto per jUDDI.
Vediamo adesso la procedura da seguire per ottenere un servizio UDDI implementato utilizzando
jUDDI e MySQL.
65/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Dal prompt di MySQL dobbiamo inserire le seguenti istruzioni, per configurare il database e
prepararlo all’utilizzo di jUDDI.
Creazione del database jUDDI:
DROP DATABASE IF EXISTS juddi;
CREATE DATABASE juddi;
66/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
67/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
68/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<!-- MySQL dB username e password per la connessione al dB -->
<parameter>
<name>username</name>
<value>juddi</value>
</parameter>
<parameter>
<name>password</name>
<value>123456</value>
</parameter>
<!-- ClassName per mm.mysql JDBC driver -->
<parameter>
<name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value>
</parameter>
<!-- JDBC connection url per la connessione al dB MySQL.
L’argomento autoReconnect=true in fondo all’URL garantisce
che il mm.mysql JDBC Driver si riconnetter\‘a automaticamente
nel caso in cui mysqld chiuda la connessione. mysqld per
default chiude le connessioni inattive dopo 8 ore. -->
<parameter>
<name>url</name>
<value>
jdbc:mysql://host.domain.com:3306/juddiautoReconnect=true
</value>
</parameter>
<parameter>
<name>validationQuery</name>
<value>select count(*) from PUBLISHER</value>
</parameter>
</ResourceParams>
</Context>
69/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
70/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
3.7 UDDI4J
UDDI4J è una libreria di classi Java che fornisce un’API per interagire con un registro UDDI.
Questa libreria genera i messaggi da spedire ad un server UDDI ed effettua il parsing di quelli
ricevuti da un server UDDI.
La classe principale in quest’insieme di API è org.uddi4j.client.UDDIProxy.
Attraverso di essa viene creato un proxy per l’accesso al server UDDI, mettendo a disposizione dei
metodi che rispettano le specifiche delle API di UDDI (UDDI Programmer’s API Specification).
71/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Le classi all’interno di org.uddi4j.datatype rappresentano gli oggetti utilizzati per spedire o ricevere
informazioni da UDDI; datatype è suddiviso in sottopacchetti relativi ai vari argomenti trattati da
UDDI, come business, service, tmodel, binding e assertion.
Vi sono poi i due sottopacchetti org.uddi4j.request e org.uddi4j.response che contengono
rispettivamente i possibili messaggi di richiesta di informazioni al server UDDI e quelli che
quest’ultimo può inviare come risposta.
Infine in org.uddi4j.transport si trovano i supporti ai protocolli di trasmissione che possono essere
utilizzati per l’invio dei messaggi.
72/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
definisce i metodi utilizzati dal client per interagire con il Web Service. Come abbiamo già detto la
SEI è generata prima della fase di esecuzione; la sua creazione avviene attraverso l’uso di appositi
tool per il mapping da WSDL a Java, come ad esempio WSDL2Java di Apache Axis.
Lo stub è quindi una classe che agisce da proxy per un servizio remoto.
Il vantaggio del metodo stub è la semplicità; servono infatti poche linee di codice, come si può
vedere dal seguente frammento, per invocare un Web Service.
// StubName: nome di esempio della classe che costituisce lo stub.
StubName stub = (StubName) service.getStubName();
// Invocazione del metodo di esempio StubMethod del web service
stub.getStubMethod("...");
73/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
effettuare l’invocazione di un’operazione di un Web Service facendo uso del metodo Dynamic
Proxy.
// WSURL.com: indirizzo d’esempio al quale si trova il web service
// che vogliamo invocare.
String namespace = "http://WSURL.com";
// WSName: nome d’esempio del web service che vogliamo invocare.
String portName = "WSName";
// portQN: porta alla quale effettuare l’invocazione.
QName portQN = new QName(namespace, portName);
// WSName: nome della classe generata, che rappresenta il proxy.
WSName proxy = service.getPort(portQN, ProxyName.class);
// Invocazione del metodo di esempio ProxyMethod del web service
proxy.getProxyMethod("...");
74/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
75/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
import java.net.*;
import java.util.*;;
import javax.wsdl.*;;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.uddi4j.*;
import com.ibm.wsdl.factory.WSDLFactoryImpl;
::::
76/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
throws java.rmi.RemoteException {
Vector listBTemplate=null;
System.out.println("Avvio chiamata a UDDI .....");
try{
System.out.println("getMeteoService: Cerco i binding Template...");
listBTemplate=findBindinTemplate( tmodelFingerPrint);
System.out.println("getMeteoService: Fine ricerca binding Template.
Trovati: "+listBTemplate.size());
}catch(Exception e){
System.out.println("ERRORE : Container non attivo!");
}
Object risposta=null;
if (listBTemplate!=null){
}//if
77/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
continue;
}//catch
}//for
}catch (WSDLException e) {
// TODO Auto-generated catch block
continue;
}//catch
}//for
}else
return (String)null;
System.out.println("FINE CHIAMATA");
System.out.println("\t \t \t");
String temp= ""+risposta.toString();
return (java.lang.String)temp;
}//getCittas
::::
}// DispatcherSoapBindingImpl
78/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
4.1 Introduzione
In questo capitolo, verrà presentata la parte implementativa del progetto Global Weather, mediante
realizzazione di diagrammi UML, ovvero Class Diagram, Use Cases, e Sequence Diagram, in modo
tale da fornire una quanto più esaustiva visita correlata del sistema proposto, ed ottenere quindi un
buon livello di comprensione dell'architettura posta in esame.
A tal proposito, risulta doveroso evidenziare che trattandosi di un'applicazione Web, se pur basata
su Web Service, questi risulta sempre essere basata su sistemi ad oggetti che hanno alcune
peculiarità: l'interfaccia utente che coincide con un Internet browser e la comunicazione tra il
cliente e il server la quale avviene tramite il protocollo HTTP mediante scambio di messaggi SOAP.
Si tratta quindi di un'applicazione che rispecchia perfettamente il pattern MVC (Model View
Controll) dove:
● la Vista è l'interfaccia per l'interazione con l'utente, come vedremo tale livello coinciderà con
delle pagine web che verranno presentate all'utente finale da parte di alcune servlet dedite
alla raccolta dei dati inseriti ed alla successiva richiesta di elaborazione degli stessi da parte
della logica di controllo;
● il Controllo è appunto la logica per la gestione del flusso di dati tra gli schemi e le
operazioni sul modello, come vedremo tale livello coinciderà con Web Service locale, il
quale fungerà da intermediario tra i Web Service remoti ed il Service Registry;
● il Modello sono i componenti che rappresentano i dati e la logica del problema, come
vedremo tale livello coinciderà con i Service Provider che risponderanno alla richieste;
79/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
4.2 Il Workflow
L'applicazione fornisce le previsioni meteo della città di una data nazione scelta, i cui valori delle
misure rilevate vengono appositamente fornite in KM/H. Tale risultato, risulta essere l'esito delle
seguenti attività:
2. La richiesta di elenco delle città, viene raccolta e gestita da un apposito Web Service locale,
denominato DispatcherService, il quale funge da interfaccia per la classe
DispatcherSoapBindingImpl mediante la quale si implementa un Web Service coordinatore
verso altri servizi web dedicati, invocati attraverso la metodologia Dynamic Discovery and
Invocation (DDI). Nella fattispecie tale operazione consiste nei seguenti passi:
■ il DispatcherService, richiedere al servizio UDDI locale informazioni relative al Web
Service che vogliamo invocare tramite il rispettivo Tmodel FingerPrint, ed ottiene
una lista di URL di file WSDL che soddisfano tale richiesta, ovvero un Binding
Template.
//t-model finger print associato al servizio
String tmodelFingerPrint=
"uuid:E470C400-0269-11DD-ACCE-D6A9BB0AE7F0";
...
listBTemplate=findBindinTemplate( tmodelFingerPrint);
...
■ Ottenuto il Binding Template, il DispatcherService, man mano che effettua la
scansione della lista di Binding Template, esegue il parsing del documento WSDL,
attraverso l’utility WSDL4J di Axis realizzata nel metodo parseWSDLCittas, ed
ottiene le informazioni necessarie all’invocazione del Web Service come namespace,
80/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
81/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
82/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Nel caso particolare la richiesta verrà invocata con il metodo getWeather(), mentre la
risposta gli verrà fornita dal metodo getWeatherReturn(). Si noti che, anche in questo caso,
il DispatcherService può ottenere le previsioni meteo essenzialmente da due Service
Provider registrati nel Service Registry locale, nella fattispecie verranno invocati in primis i
servizi della società WebServiceR se disponibile una connessione alla rete Internet,
altrimenti, al fine di garantire un discreto livello di fault tollerance verrà invocato il servizio
meteo locale fittizio fornito dalla società SpecchioLocale, la quale fornisce le previsioni
meteo per i soli comuni di Roma, Milano o Napoli.
8. Ottenuta la risposta da uno dei service provider, il DispatcherService inoltra una risposta
XML, contenente le previsioni meteo della città prescelta, alla servlet
CallDispatcherServices, tramite il metodo getMeteosReturn().
...
String temp= ""+risposta.toString();
return (java.lang.String)temp;
83/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
11. Il Web Service coordinatore, a questo punto, applica la stessa metodologia esposta al
precedente punto 2, otterrà quindi una lista di Binding Template che gli permetteranno di
inoltrare a sua volta la specifica richiesta di conversione di unità di misura (da MPH a
KMH) ai Service Provider che soddisfano tale tipo di richiesta. Nel caso particolare la
richiesta verrà invocata con il metodo ChangeLengthUnit(), mentre la risposta gli verrà
fornita dal metodo ChangeLengthUnitReturn().
String tmodelFingerPrint="uuid:4ADF92C0-43C4-11DD-92C0-E3E95A90B2AF";
...
listBTemplate=findBindinTemplate( tmodelFingerPrint);
...
if (listBTemplate!=null){
// Intercetto il binding associato e scorro la lista.
...
for(int i=0; i<listBTemplate.size(); i++) {
try {
//Cerco il binding template con un punto di accesso HTTP
bindingTemplate = (BindingTemplate)
listBTemplate.elementAt(i);
accessPoint = bindingTemplate.getAccessPoint();
// ottenuta la lista di binding template, possiamo
// ottenere la lista delle URL associate
Vector tmodelInstanceInfoVector = bindingTemplate.
GetTModelInstanceDetails().
84/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
getTModelInstanceInfoVector();
for(int k=0; k<tmodelInstanceInfoVector.size(); k++) {
TModelInstanceInfo instanceInfo =
(TmodelInstanceInfo)
tmodelInstanceInfoVector.elementAt(k);
InstanceDetails details =
instanceInfo.getInstanceDetails();
OverviewDoc wsdlImpl = details.getOverviewDoc();
try {
risposta= (Double) parseWSDLConversione(
wsdlImpl.getOverviewURLString(), param);
Si noti che, anche in questo caso, il DispatcherService può ottenere le conversioni da MPH
a KMH essenzialmente da due Service Provider registrati nel Service Registry locale, nella
fattispecie verranno invocati in primis i servizi della società WebServiceR se disponibile una
connessione alla rete Internet, altrimenti, al fine di garantire un discreto livello di fault
tollerance verrà invocato il servizio di conversione fornito dalla società SpecchioLocale.
12. Ottenuta la risposta da uno dei service provider presenti nel Binding Template, il
DispatcherService inoltra una risposta XML, contenente il valore MPH convertito in KMH,
alla servlet CallDispatcherServices, tramite il metodo getMPHtoKMHReturn().
13. La servlet CallDispatcherServices, estrapolerà dal namespace <double> il valore convertito
da MPH a KMH.
85/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
86/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Come già descritto nel paragrafo dedito alla descrizione del workflow, la servlet
DispatcherServices, viene utilizzata per intercettare la richiesta HTTP da parte dell'utente per al fine
di inoltrare una richiesta di una lista di città associate ad una data nazione, appositamente parsate
con la classe ReadXmlCitta.
87/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
La servlet CallDispatcherServices, viene utilizzata per intercettare la coppia (nazione, città) fornita
dalla servlet DispatcherServices al fine di gestire il flusso dati relativo alle previsioni
meteorologiche, il quale verrà appositamente parsato con la classe ParsRisposta .
88/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
89/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
90/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
91/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
92/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
4.3.3 Class Diagram del meteo fornito dal Web Service fittizio
Il diagramma del Web Servizio fittizio ideato al fine di garantire un discreto livello di fault
tollerace, viene strutturato su un'architettura simile a quella del Web Service coordinatore
DispatcherService, fatta eccezione nel mancato uso dell'Handler.
Anche questi, viene realizzato all'interno di un package dedicato, denominato
NET.webserviceX.www.
93/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
94/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Illustrazione 4.18:
package del WS di
conversione fittizio
La definizione dei metodi è racchiusa nell'interfaccia LengthUnit, mentre l'accesso a tale servizio
95/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
96/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
97/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
98/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
99/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Illustrazione 4.22: Sequence Diagram relativo alla richiesta di un elenco di città di una data
nazione
100/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Illustrazione 4.23: Sequence Diagram relativo alla richiesta di previsioni meteorologiche espresse
in MPH
101/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
Illustrazione 4.24: Sequence Diagram relativo alla conversione delle misure espresse in MPH a
KMH
102/103
Progetto Laboratorio di Sistemi Distribuiti Giuseppe Specchio
5 Bigliogragia
1. Dispense fornite dal Prof. M. Bianchi durante il corso di Laboratorio di Sistemi Distribuiti
del corso di Laurea Specialistica in Informatica dell'Università di Roma – Tor Vergata.
2. Building Web Services with Java – Second Edition – S. Graham e altri.
3. Java Web Service , tutto ed altre – Apogeo
4. Java 2 SDK 1.4 Edition - Apogeo
103/103