SlideShare a Scribd company logo
1
Università degli Studi dell’Aquila
Master in Web Technology
TECNOLOGIE XML E
SERVICE ORIENTED ARCHITECTURES
A.A. 2013/14
Docente: Giuseppe Della Penna
Studente Matricola Email
SilvioD’Orazio 234422 silvio.dorazio@gmail.com
SoniaBarbieri barbieri.sonia@gmail.com
AlessandraPonis 234457 alessadra.ponis@gmail.com
2
Indice
Tecnologie XML...................................................................................................................................... 3
Specifiche dell’applicazione................................................................................................................. 3
Parte I: ePubPackager........................................................................................................................ 3
Parte II:ePub Biblio............................................................................................................................. 5
La persistenza dati di ePUB Manager ................................................................................................... 6
Limiti dell’applicazione........................................................................................................................ 6
Architettura dell’applicazione.............................................................................................................. 6
Service Oriented Architectures................................................................................................................ 7
Adattamento di ePUB Manager ad un’architettura SOA ........................................................................ 7
Il servizio web di alto livello................................................................................................................. 8
La descrizione formale del WSDL...................................................................................................... 8
Il servizio web di basso livello .............................................................................................................16
3
Progetto ePUB Manager
Tecnologie XML
Specifiche dell’applicazione
Il sitoePUB Managercostituisce un’interfaccia web per la gestione di file ePub, abbrevazione che sta per
“electronic publication”, ovvero un formato file molto noto basato su uno standard aperto per la
pubblicazione degli ebook.
Ogni file .epub costituisce un file compresso che contiene svariati file e directory, ciascuno dei quali ha
caratteristiche specifiche, che permettono il funzionamento di una pubblicazione.
L’interfaccia utente permette di accedere tramite un menù globale alle due funzionalità principali
dell’applicazione: l’ “impacchettatore” di ePub e il micro gestore di una sorta di biblioteca per ePub.
Il progettosi divide,infatti, indue parti principali:
- la prima parte è incentrata sulla realizzazione e il funzionamento di un piccolo sistema di
“impacchettamento”perePub.Si trattadi un processodi creazione dell’ePubche parte dall’upload
dei file che costituiranno i contenuti della pubblicazione e termina con la generazione dei file
necessari alla costruzione di un file con estensione .epub completo.
- La seconda parte è, invece, incentrata sulla realizzazione di una mini biblioteca per ePub gestita
tramite l’applicazione e salvata su File System. Tale sistema, al contrario di quello descritto nel
puntoprecedente, si basa sul processo contrario partendo da un file già compresso che viene poi
decompresso per essere analizzato da parte del sistema.
Qualsiasi utente può accedere alle funzionalità del sito, indistintamente.
Parte I: ePub Packager
Di seguitovengono elencate le funzionalità della prima parte del sito:
- Accedendoall’interfacciautentedel Packagerper ePub, l’utente può inserire i metadati principali
relativi all’ePub che verrà successivamente creato e che serviranno per la creazione del file
4
content.opf.Tali metadativengonovalidati perverificare se aderiscono alle specifiche e salvati sul
database relazionale;
- Una volta aver inserito i metadati, all’utente viene richiesto di caricare dal File System: i file che
costituiranno i capitoli dell’ePub(si trattadi file con estensione .html o .xhtml che prima di essere
resi persistentiall’internodel DBvengonoopportunamente validati), i file .css per le impostazioni
sullo stile e le immagini. Tali file vengono salvati sia nel database che nel File System per poter
essere utilizzati in seguito;
- Una voltaaver inseritoi file necessari, l’utente viene rimandato verso una pagina che contiene la
listadei file xhtml (perciascunfile vengonoriportati:l’id,il nome,il path,l’indice perl’ordinamento
e il tipo),lalistadei fogli di stile e delle immagini caricate (nel caso dei csse delle immagini vengono
riportati soltanto:l’id,il nome e il pathpoiché lagestione dell’ordinamentoviene fattasoltanto per
i file con estensione .xhtml). Tali file possono essere, tramite questa interfaccia, modificati o
eliminati nel caso in cui l’utente voglia cambiare i contenuti dell’ePub prima della creazione
definitiva. E’, inoltre, possibile tramite la stessa interfaccia aggiungere nuovi file;
- Nel caso in cui l’utente cerca di aggiungere nuovi file xhtml, il sistema applica sia un controllo di
validità che un controllo per verificare se il file era stato già inserito in precedenza per evitare di
farlo uploadare nuovamente;
- Se nel passo precedente l’utente ha cliccato su “Modifica”, nel caso di un file xhtml, viene
rimandato verso una form dove poter eventualmente modificare il nome del file, l’indice (per
gestire l’ordinamento trai capitoli) e il tipo(il tipodeve,però,essere necessariamente unodi quelli
accettati dalle specifiche standard per la corretta costruzione della guide, per questo l’interfaccia
suggerisce all’utentequal è lalistadei tipi conformi alle specifiche); i file csse le immagini vengono
modificati allo stesso modo ad eccezione per l’ordinamento.
Se invece l’utente ha cliccato su “Elimina”, viene reindirizzato verso una form che permette di
eliminare definitivamente il file;
- Cliccando su “crea EPUB”, vengono creati i file e le cartelle che costituiscono le componenti
dell’ePub (la cartella META-INF con all’interno il file container.xml, il file toc.ncx e il file
content.opf), viene creato il file finale compresso e lo stesso viene salvato sul File System
dell’utente;
- Allafine del processo,l’utente viene rimandatosuuna nuova vista dove gli sarà possibile scaricare
sul proprio computer il file compresso precedentemente creato.
5
Parte II: ePub Biblio
Di seguitosono elencatele funzionalitàdellasecondaparte del progetto:
- Tramite l’interfaccia utente è possibile uploadare uno o più file .epub contemporaneamente, il
quale/i quali vengonosalvatiinunappositorepository sul File Systemdell’utente; nella fattispecie,
ad ogni upload il programma genera una cartella chiamata con l’id dell’ePub contenente i relativi
file dopoche lostessoè stato decompresso edinserisce il filezippato all’internodi una cartella che
raccoglie gli ePub uploadati;
- Una voltache ciascunePubè statoinseritoininput,ne viene estrapolata una serie di informazioni
dai metadati contenuti all’interno del file content.opf, tra cui: titolo, lingua, isbn, autore, editore,
formato,origine, tipo, data, collaboratore, relazione, diritti d’autore, destinazione, descrizione e
soggetto;oltre a questi dati,vieneinseritoanche il percorsodel file .epub presente all’interno del
File System dell’utente. Tali informazioni vengono registrate all’interno di un file xml chiamato
EPubBiblio.xml, che viene creato dal programma una volta che il primo ePub viene inserito
all’interno della biblioteca e che conterrà i metadati relativi a tutti gli ePub presenti nella stessa;
- Il file appenadescritto,oltre araccogliere i metadati dei file, riporta anche le statistiche relative al
numero di capitoli in ciascun ePub, al numero di parole presenti in tali capitoli, al numero di
immagini contenute all’interno del file .epub e alle statistiche riguardanti la frequenza di ciascun
autore registrato all’interno della biblioteca;
- Dall’interfaccia utente dell’applicazione è possibile visualizzare l’elenco degli ePub presenti
all’interno della biblioteca organizzati all’interno di una tabella, sincronizzata con il file
EPubBiblio.xml, che riportale informazioni principalidegli stessi, quali: id, titolo, autore, lingua ed
editore;
- Tramite la tabellaè possibile inoltre effettuare, per ciascun ePub, due azioni: il download del file
registratoall’internodel repositorynel FileSystemdell’utente e l’eliminazione del file ePub dalla
biblioteca (tale eliminazione è stata implementata tramite la definizione di un algoritmo
abbastanza complesso che gestisce non solo la rimozione di un file e dei relativi file dopo la
decompressione quanto anche la rimozione del nodo dell’ePub dal file ePubBiblio e
l’aggiornamento delle statistiche sugli autori);
- Infine, dall’interfaccia utente è possibile accedere ad una pagina che costituisce l’output della
trasformazione XSLT del file xml ePubBiblio in un file con estensione .xsl.
Tale paginariporta l’elencodegliebooksottoformatabellare (titolo, autore, lingua, numero delle
immagini, delle parole e dei capitoli presenti all’interno di ciascun file .epub nonché il percorso
dello stesso) più una tabella delle statistiche che presenta il numero di ePub registrati nella
biblioteca più il nome dell’autore che è presente con maggior frequenza.
6
La persistenza dati di ePUB Manager
La prima parte dell’applicazione gestisce la persistenza dei dati facendo affidamento sul database
relazionale MySql, aspetto che ha reso la definizione dell’architettura orientata ai servizi (SOA)
posteriormente realizzata sulla base di questo stesso progetto altamente flessibile. La connessione al
database viene fornitadal driverJDBCconfiguratoall’internodelprogettotramite il tag <Context>presente
nel file content.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/EPUBManager">
<Resource driverClassName="com.mysql.jdbc.Driver"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" logAbandoned="true" maxActive="100"
maxIdle="30" maxWait="50000" name="jdbc/EPUBManager" password="" removeAbandoned="true"
removeAbandonedTimeout="90" scope="Container" testWhileIdle="true"
timeBetweenEvictionRunsMillis="50000" type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/epubmanager" username="root" validationQuery="select 1"/>
</Context>
Limiti dell’applicazione
- La prima parte del progetto gestisce la creazione di ePub conformi alla specifica 2.0.1 mentre la
seconda parte del progetto consente di gestire entrambe le versioni 2.0.1 e 3.0.1. Quest’ultima
costituisce la versione attuale dello standard per la pubblicazione dei libri digitali;
- La seconda parte del progetto gestisce la persistenza dei dati su File System piuttosto che su un
database relazionale;
Architettura dell’applicazione
L’applicazione è stata implementata in base al pattern architetturale MVC e con l’aiuto del framework
Spring nella versione 3.2.8 il quale, tramite l’uso delle annotazioni, è stato di fondamentale importanza
poiché ha permesso di gestire con estrema facilità le richieste web e di costruire un sistema altamente
flessibile.
Allafine di ogni processodi gestionedelle richieste http, l’output viene renderizzato all’utente tramite la
tecnologia per implementare le view nota come JavaServerPages.
In realtà la costruzione della vista, e dunque delle jsp, viene delegata ad Apache Tiles: un framework di
templating atto ad assemblare frammenti di una pagina e a costruire la pagina stessa a tempo di
esecuzione.
7
Service Oriented Architectures
Adattamento di ePUB Manager ad un’architettura SOA
L’applicazioneePUBManagercreataperil corso di Tecnologie XML è stata successivamente riadattata per
il corso di SOA, Service Oriented Architectures. Per architettura orientata ai servizi si intende una tipologia
di sistemadistribuito basatosul protocollohttpe sullainterconnessione di agenti software che fornisconoe
usanouna serie di servizi. Il fatto che si stabilisca una comunicazione tra le varie componenti implica uno
scambio di messaggi e conseguentemente la presenza di una serie di meccanismi di comunicazione che
permettono lo scambio di tali messaggi.
Per realizzare una SOA di alto livello, ovvero caratterizzata da SOAP come formalismo per il trasporto dei
dati,è stata inizialmente realizzata una descrizione standard in WSDL per definire la struttura del servizio
webfacendousodel tool SOAEditor,il quale hapermessodi generare il codice in automatico.
Una voltadefinitoil WSDL, è stato possibile realizzare il relativoserviziowebutilizzandolatecnologiaSundi
JAX-WS, laquale hacompilatoil file .wsdl incorporato all’interno del progetto e si è creata delle strutture
dati java che corrispondono ai tipi dichiarati programmaticamente all’interno della descrizione della
strutturadel servizio.JAX-WSè unostrumentomoltoefficace che hapermesso di facilitare ampiamente la
programmazione del servizio web.
Dopo averconfigurato laparte server,ovveroquella che espone all’esternoi metodidellalogicadi business
tramite un’interfaccia,è statodefinitounclientstand-alone persimulare le chiamate alla business logic. Il
client è costituito da un’interfaccia proxy che permette di invocare i metodi remoti.
Durante la creazione del client, è stato necessario specificare l’indirizzo del WSDL generato da JAX-WS ed
esposto dal servizio al quale l’applicazione stand-alone si è potuta connettere.
E’ stato,inoltre, opzionalmente realizzatouna sorta di servizio web RESTful di modo da simulare anche un
servizio di bassissimo livello (al contrario di quello di massimo livello realizzato con JAX-WS).
8
Il servizio web di alto livello
La descrizioneformaledel WSDL
E’ stato già precedentemente accennato uno degli standard fondanti dei servizi web basato su XML: il
WSDL (Web Services Definition Language). Di seguito viene riportato il contenuto del file ePub.wsdl per
mostrare come tale specificaè statautilizzataperdefinire formalmente il servizio web dell’ePUB Manager:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
name="ePub"
targetNamespace="http://www.univaq.it/mwt/soa/ePub.wsdl"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.univaq.it/mwt/soa/ePub.wsdl"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsd1="http://www.univaq.it/mwt/soa/ePub.xsd1"
xmlns:xsd2="http://www.univaq.it/mwt/soa/ePub.xsd2">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">SOA: WSLD del progetto
ePubManager</wsdl:documentation>
<wsdl:types>
<xsd:schema
targetNamespace="http://www.univaq.it/mwt/soa/ePub.xsd2"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsd2="http://www.univaq.it/mwt/soa/ePub.xsd2">
<xsd:complexType name="tMetadata">
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="identifier"
type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="title" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="language" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="tEpubCss">
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="id" type="xsd:string"/>
9
<xsd:element maxOccurs="1" minOccurs="1" name="name" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="path" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="file"
type="xsd:base64Binary"/>
<xsd:element maxOccurs="1" minOccurs="1" name="contentType"
type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="epub" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="tEpubImage">
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="id" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="name" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="path" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="file"
type="xsd:base64Binary"/>
<xsd:element maxOccurs="1" minOccurs="1" name="contentType"
type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="epub" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="tEpubError">
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="code" type="xsd:int"/>
<xsd:element maxOccurs="1" minOccurs="0" name="message" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="eEpubError" type="xsd2:tEpubError"/>
<xsd:complexType name="tEpubXhtml">
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="id" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="name" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="path" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="file"
type="xsd:base64Binary"/>
<xsd:element maxOccurs="1" minOccurs="1" name="contentType"
type="xsd:string"/>
10
<xsd:element maxOccurs="1" minOccurs="1" name="index" type="xsd:int"/>
<xsd:element maxOccurs="1" minOccurs="0" name="type" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="epub" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="mMetadata">
<wsdl:part name="metadata" type="xsd2:tMetadata"/>
</wsdl:message>
<wsdl:message name="mInt">
<wsdl:part name="elemento" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="mError">
<wsdl:part element="xsd2:eEpubError" name="error"/>
</wsdl:message>
<wsdl:message name="mVoid"> </wsdl:message>
<wsdl:message name="mRemoveXhtml">
<wsdl:part name="token" type="xsd:long"/>
<wsdl:part name="xhtml" type="xsd2:tEpubXhtml"/>
</wsdl:message>
<wsdl:message name="mLong">
<wsdl:part name="token" type="xsd:long"/>
</wsdl:message>
<wsdl:message name="mRemoveCss">
<wsdl:part name="token" type="xsd:long"/>
<wsdl:part name="css" type="xsd2:tEpubCss"/>
</wsdl:message>
<wsdl:message name="mAddXhtml">
<wsdl:part name="token" type="xsd:long"/>
<wsdl:part name="xhtml" type="xsd2:tEpubXhtml"/>
</wsdl:message>
<wsdl:message name="mRemoveImage">
<wsdl:part name="token" type="xsd:long"/>
11
<wsdl:part name="image" type="xsd2:tEpubImage"/>
</wsdl:message>
<wsdl:message name="mAddStylesheet">
<wsdl:part name="token" type="xsd:long"/>
<wsdl:part name="css" type="xsd2:tEpubCss"/>
</wsdl:message>
<wsdl:message name="mBoolean">
<wsdl:part name="boolean" type="xsd:boolean"/>
</wsdl:message>
<wsdl:message name="mAddImage">
<wsdl:part name="token" type="xsd:long"/>
<wsdl:part name="image" type="xsd2:tEpubImage"/>
</wsdl:message>
<wsdl:portType name="ePubPortType">
<wsdl:operation name="startEpub">
<wsdl:input message="tns:mMetadata">
<wsdl:documentation
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">metadata</wsdl:documentation>
</wsdl:input>
<wsdl:output message="tns:mLong">
<wsdl:documentation
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">token</wsdl:documentation>
</wsdl:output>
<wsdl:fault message="tns:mError" name="epuberror"/>
</wsdl:operation>
<wsdl:operation name="addXhtml">
<wsdl:input message="tns:mAddXhtml"/>
<wsdl:output message="tns:mInt">
<wsdl:documentation
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">element</wsdl:documentation>
</wsdl:output>
<wsdl:fault message="tns:mError" name="epuberror"/>
</wsdl:operation>
<wsdl:operation name="addStylesheet">
<wsdl:input message="tns:mAddStylesheet"/>
<wsdl:output message="tns:mInt">
12
<wsdl:documentation
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">element</wsdl:documentation>
</wsdl:output>
<wsdl:fault message="tns:mError" name="epuberror"/>
</wsdl:operation>
<wsdl:operation name="addImage">
<wsdl:input message="tns:mAddImage"/>
<wsdl:output message="tns:mInt">
<wsdl:documentation
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">element</wsdl:documentation>
</wsdl:output>
<wsdl:fault message="tns:mError" name="epuberror"/>
</wsdl:operation>
<wsdl:operation name="finalizeEpub">
<wsdl:input message="tns:mLong"/>
<wsdl:output message="tns:mVoid"/>
<wsdl:fault message="tns:mError" name="epuberror"/>
</wsdl:operation>
<wsdl:operation name="removeXhtml">
<wsdl:input message="tns:mRemoveXhtml"/>
<wsdl:output message="tns:mBoolean"/>
<wsdl:fault message="tns:mError" name="epuberror"/>
</wsdl:operation>
<wsdl:operation name="removeStylesheet">
<wsdl:input message="tns:mRemoveCss"/>
<wsdl:output message="tns:mBoolean"/>
<wsdl:fault message="tns:mError" name="epuberror"/>
</wsdl:operation>
<wsdl:operation name="removeImage">
<wsdl:input message="tns:mRemoveImage"/>
<wsdl:output message="tns:mBoolean"/>
<wsdl:fault message="tns:mError" name="epuberror"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ePubSOAP" type="tns:ePubPortType">
13
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="startEpub">
<soap:operation soapAction="ePub#startEpub"/>
<wsdl:input>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:output>
<wsdl:fault name="epuberror">
<soap:fault name="epuberror" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="addXhtml">
<soap:operation soapAction="ePub#addXhtml"/>
<wsdl:input>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:output>
<wsdl:fault name="epuberror">
<soap:fault name="epuberror" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="addStylesheet">
<soap:operation soapAction="ePub#addStylesheet"/>
<wsdl:input>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:output>
<wsdl:fault name="epuberror">
14
<soap:fault name="epuberror" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="addImage">
<soap:operation soapAction="ePub#addImage"/>
<wsdl:input>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:output>
<wsdl:fault name="epuberror">
<soap:fault name="epuberror" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="finalizeEpub">
<soap:operation soapAction="ePub#finalizeEpub"/>
<wsdl:input>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:output>
<wsdl:fault name="epuberror">
<soap:fault name="epuberror" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="removeXhtml">
<soap:operation soapAction="ePub#removeXhtml"/>
<wsdl:input>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
15
</wsdl:output>
<wsdl:fault name="epuberror">
<soap:fault name="epuberror" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="removeStylesheet">
<soap:operation soapAction="ePub#removeStylesheet"/>
<wsdl:input>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:output>
<wsdl:fault name="epuberror">
<soap:fault name="epuberror" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="removeImage">
<soap:operation soapAction="ePub#removeImage"/>
<wsdl:input>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
</wsdl:output>
<wsdl:fault name="epuberror">
<soap:fault name="epuberror" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ePub">
<wsdl:port binding="tns:ePubSOAP" name="ePubSOAPPort">
<soap:address location="http://localhost:8084/EPUBManager/services"/>
</wsdl:port>
16
</wsdl:service>
</wsdl:definitions>
Le operazioni di base definite nel WSDLsono:
- startEpub;
- addXhtml;
- addStylesheet;
- addImage;
- finalizeEpub;
- removeXhtml;
- removeStylesheet;
- removeImage;
Il servizio web di basso livello
Come già accennatoinprecedenza,l’applicazione è stataimplementata con l’ausilio del framework Spring
che ha consentito,trale altre cose,di simulare un servizioweb RESTful che pubblicai metodi della logica di
businesse permette di effettuare delleoperazionisui dati del sistema tramite una semplice gestione delle
url; ciascuna url (composta da vari path che identificano le risorse) corrisponde ad un metodo particolare
del servizio.
Essendoil RepresentationalStateTransferProtocolil modobase di comunicare offerto dal protocollo http,
ciascunarichiestaviene gestita utilizzandounodei metodi di base per operare sui dati del protocollo: GET,
POST e DELETE.
Di seguitovieneriportatalaclasse annotata tramite l’annotazione @Controller che permette di gestire le
richieste http provenienti dal browser:
@Controller
@RequestMapping("/rest")
public class RESTController {
@Autowired
private EPubService service;
17
@RequestMapping(value="/epubs",method={RequestMethod.POST})
@ResponseBody
public String startEpub (Metadata metadata) {
long result = service.startEpub(metadata);
return Long.toString(result);
}
@RequestMapping(value="/epubs/{token}",method={RequestMethod.GET})
@ResponseBody
public void finalizeEpub (@PathVariable("token") String epub) {
long token = Long.parseLong(epub);
service.finalizeEpub(token);
}
@RequestMapping(value="/epubs/{token}/texts",method={RequestMethod.POST})
@ResponseBody
public int insertXhtml (@PathVariable("token") String epub, @RequestBody EpubXhtml epubXhtml) {
long token = Long.parseLong(epub);
int xhtml = service.addXHTML(token, epubXhtml);
return xhtml;
}
@RequestMapping(value="/epubs/{token}/texts/{id}",method={RequestMethod.GET})
@ResponseBody
public EpubXhtml getXhtml (@PathVariable("id") String id) {
// long token = Long.parseLong(epub);
EpubXhtml xhtml = service.getEpubXhtmlByPk(id);
if (xhtml == null) {
throw new NotFoundException();
}
return xhtml;
}
18
@RequestMapping(value="/epubs/{token}/texts/{id}",method={RequestMethod.DELETE})
@ResponseBody
public void deleteXhtml (@PathVariable("token") String epub, @PathVariable("id") String id) {
// long token = Long.parseLong(epub);
EpubXhtml xhtml = service.getEpubXhtmlByPk(id);
if (xhtml == null) {
throw new NotFoundException();
}
service.deleteEpubXhtml(xhtml);
}
@RequestMapping(value="/epubs/{token}/images",method={RequestMethod.POST})
@ResponseBody
public int insertImage (@PathVariable("token") String epub, @RequestBody EpubImage epubImage) {
long token = Long.parseLong(epub);
int image = service.addImage(token, epubImage);
return image;
}
@RequestMapping(value="/epubs/{token}/images/{id}",method={RequestMethod.GET})
@ResponseBody
public EpubImage getImage (@PathVariable("id") String id) {
// long token = Long.parseLong(epub);
EpubImage image = service.getEpubImageByPk(id);
if (image == null) {
throw new NotFoundException();
}
return image;
}
@RequestMapping(value="/epubs/{token}/images/{id}",method={RequestMethod.DELETE})
@ResponseBody
public voiddeleteImage (@PathVariable("token") String epub, @PathVariable("id") String id, EpubImage epubImage) {
19
// long token = Long.parseLong(epub);
if (epubImage == null) {
throw new NotFoundException();
}
service.deleteEpubImage(epubImage);
}
@RequestMapping(value="/epubs/{token}/stylesheets",method={RequestMethod.POST})
@ResponseBody
public int insertCss (@PathVariable("token") String epub, @RequestBody EpubCss epubCss) {
long token = Long.parseLong(epub);
int css = service.addStylesheet(token, epubCss);
return css;
}
@RequestMapping(value="/epubs/{token}/stylesheets/{id}",method={RequestMethod.GET})
@ResponseBody
public EpubCss getCss (@PathVariable("id") String id) {
// long token = Long.parseLong(epub);
EpubCss css = service.getEpubCssByPk(id);
if (css == null) {
throw new NotFoundException();
}
return css;
}
@RequestMapping(value="/epubs/{token}/stylesheets/{id}",method={RequestMethod.DELETE})
@ResponseBody
public void deleteCss (@PathVariable("token") String epub, @PathVariable("id") String id, EpubCss epubCss) {
// long token = Long.parseLong(epub);
if (epubCss == null) {
throw new NotFoundException();
}
20
service.deleteEpubCss(epubCss);
}
@ExceptionHandler(NotFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Not found")
void handleNotFound(NotFoundException exc) {
}
class NotFoundException extends RuntimeException {
private static final long serialVersionUID = 1L;
}
}

More Related Content

Similar to [MWT] XML - SOA

Drupal - per chi vuole iniziare
Drupal - per chi vuole iniziareDrupal - per chi vuole iniziare
Drupal - per chi vuole iniziare
Salvatore Paone
 
Il metacrawler di SBBL
Il metacrawler di SBBLIl metacrawler di SBBL
Il metacrawler di SBBL
bibliobioing
 
Introduzione CMS Alfresco
Introduzione CMS AlfrescoIntroduzione CMS Alfresco
Introduzione CMS Alfresco
Mirco Leo
 
SVILUPPO DI UNA APPLICAZIONE PER L’ACQUISIZIONE DI DATI DA SUPPORTO CARTACEO:...
SVILUPPO DI UNA APPLICAZIONE PER L’ACQUISIZIONE DI DATI DA SUPPORTO CARTACEO:...SVILUPPO DI UNA APPLICAZIONE PER L’ACQUISIZIONE DI DATI DA SUPPORTO CARTACEO:...
SVILUPPO DI UNA APPLICAZIONE PER L’ACQUISIZIONE DI DATI DA SUPPORTO CARTACEO:...
guest12aaa586
 
Alfresco System Administrator
Alfresco System AdministratorAlfresco System Administrator
Alfresco System Administrator
Mirco Leo
 
Il CMS Alfresco
Il CMS AlfrescoIl CMS Alfresco
Il CMS Alfresco
leo mirco
 
Epub - Corso CIERRE Edizioni
Epub - Corso CIERRE EdizioniEpub - Corso CIERRE Edizioni
Epub - Corso CIERRE EdizioniMatteo Ziviani
 
Installazione del cms alfresco
Installazione del cms alfrescoInstallazione del cms alfresco
Installazione del cms alfresco
Mirco Leo
 
EIP with Apache Camel
EIP with Apache CamelEIP with Apache Camel
EIP with Apache Camel
Andrea Torino Rodriguez
 
Html5 based
Html5 basedHtml5 based
Html5 based
Saverio Menin
 
Aderire Al Portale Della Cultura Italiana
Aderire Al Portale Della Cultura ItalianaAderire Al Portale Della Cultura Italiana
Aderire Al Portale Della Cultura Italiana
dmerlitti
 
Porting evolutivo di una applicazione per la gestione di riferimenti bibliogr...
Porting evolutivo di una applicazione per la gestione di riferimenti bibliogr...Porting evolutivo di una applicazione per la gestione di riferimenti bibliogr...
Porting evolutivo di una applicazione per la gestione di riferimenti bibliogr...Giulio Ambrogi
 
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
Alex Ronci
 
Shellmanager096
Shellmanager096Shellmanager096
Shellmanager096kleeph
 
Linux shell
Linux shellLinux shell
Linux shell
Marco Buttolo
 
Linux shell
Linux shellLinux shell
Linux shell
Marco Buttolo
 
Progetto e implementazione di un processo per l'assemblaggio di documenti htm...
Progetto e implementazione di un processo per l'assemblaggio di documenti htm...Progetto e implementazione di un processo per l'assemblaggio di documenti htm...
Progetto e implementazione di un processo per l'assemblaggio di documenti htm...Nicola Furlan
 
Applicazioni web based
Applicazioni web basedApplicazioni web based
Applicazioni web based
Marco Liverani
 
Programmazione mobile: ANDROID
Programmazione mobile: ANDROIDProgrammazione mobile: ANDROID
Programmazione mobile: ANDROID
Paolo Tosato
 

Similar to [MWT] XML - SOA (20)

Drupal - per chi vuole iniziare
Drupal - per chi vuole iniziareDrupal - per chi vuole iniziare
Drupal - per chi vuole iniziare
 
Il metacrawler di SBBL
Il metacrawler di SBBLIl metacrawler di SBBL
Il metacrawler di SBBL
 
Introduzione CMS Alfresco
Introduzione CMS AlfrescoIntroduzione CMS Alfresco
Introduzione CMS Alfresco
 
SVILUPPO DI UNA APPLICAZIONE PER L’ACQUISIZIONE DI DATI DA SUPPORTO CARTACEO:...
SVILUPPO DI UNA APPLICAZIONE PER L’ACQUISIZIONE DI DATI DA SUPPORTO CARTACEO:...SVILUPPO DI UNA APPLICAZIONE PER L’ACQUISIZIONE DI DATI DA SUPPORTO CARTACEO:...
SVILUPPO DI UNA APPLICAZIONE PER L’ACQUISIZIONE DI DATI DA SUPPORTO CARTACEO:...
 
Alfresco System Administrator
Alfresco System AdministratorAlfresco System Administrator
Alfresco System Administrator
 
Tesi
TesiTesi
Tesi
 
Il CMS Alfresco
Il CMS AlfrescoIl CMS Alfresco
Il CMS Alfresco
 
Epub - Corso CIERRE Edizioni
Epub - Corso CIERRE EdizioniEpub - Corso CIERRE Edizioni
Epub - Corso CIERRE Edizioni
 
Installazione del cms alfresco
Installazione del cms alfrescoInstallazione del cms alfresco
Installazione del cms alfresco
 
EIP with Apache Camel
EIP with Apache CamelEIP with Apache Camel
EIP with Apache Camel
 
Html5 based
Html5 basedHtml5 based
Html5 based
 
Aderire Al Portale Della Cultura Italiana
Aderire Al Portale Della Cultura ItalianaAderire Al Portale Della Cultura Italiana
Aderire Al Portale Della Cultura Italiana
 
Porting evolutivo di una applicazione per la gestione di riferimenti bibliogr...
Porting evolutivo di una applicazione per la gestione di riferimenti bibliogr...Porting evolutivo di una applicazione per la gestione di riferimenti bibliogr...
Porting evolutivo di una applicazione per la gestione di riferimenti bibliogr...
 
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
 
Shellmanager096
Shellmanager096Shellmanager096
Shellmanager096
 
Linux shell
Linux shellLinux shell
Linux shell
 
Linux shell
Linux shellLinux shell
Linux shell
 
Progetto e implementazione di un processo per l'assemblaggio di documenti htm...
Progetto e implementazione di un processo per l'assemblaggio di documenti htm...Progetto e implementazione di un processo per l'assemblaggio di documenti htm...
Progetto e implementazione di un processo per l'assemblaggio di documenti htm...
 
Applicazioni web based
Applicazioni web basedApplicazioni web based
Applicazioni web based
 
Programmazione mobile: ANDROID
Programmazione mobile: ANDROIDProgrammazione mobile: ANDROID
Programmazione mobile: ANDROID
 

[MWT] XML - SOA

  • 1. 1 Università degli Studi dell’Aquila Master in Web Technology TECNOLOGIE XML E SERVICE ORIENTED ARCHITECTURES A.A. 2013/14 Docente: Giuseppe Della Penna Studente Matricola Email SilvioD’Orazio 234422 silvio.dorazio@gmail.com SoniaBarbieri barbieri.sonia@gmail.com AlessandraPonis 234457 alessadra.ponis@gmail.com
  • 2. 2 Indice Tecnologie XML...................................................................................................................................... 3 Specifiche dell’applicazione................................................................................................................. 3 Parte I: ePubPackager........................................................................................................................ 3 Parte II:ePub Biblio............................................................................................................................. 5 La persistenza dati di ePUB Manager ................................................................................................... 6 Limiti dell’applicazione........................................................................................................................ 6 Architettura dell’applicazione.............................................................................................................. 6 Service Oriented Architectures................................................................................................................ 7 Adattamento di ePUB Manager ad un’architettura SOA ........................................................................ 7 Il servizio web di alto livello................................................................................................................. 8 La descrizione formale del WSDL...................................................................................................... 8 Il servizio web di basso livello .............................................................................................................16
  • 3. 3 Progetto ePUB Manager Tecnologie XML Specifiche dell’applicazione Il sitoePUB Managercostituisce un’interfaccia web per la gestione di file ePub, abbrevazione che sta per “electronic publication”, ovvero un formato file molto noto basato su uno standard aperto per la pubblicazione degli ebook. Ogni file .epub costituisce un file compresso che contiene svariati file e directory, ciascuno dei quali ha caratteristiche specifiche, che permettono il funzionamento di una pubblicazione. L’interfaccia utente permette di accedere tramite un menù globale alle due funzionalità principali dell’applicazione: l’ “impacchettatore” di ePub e il micro gestore di una sorta di biblioteca per ePub. Il progettosi divide,infatti, indue parti principali: - la prima parte è incentrata sulla realizzazione e il funzionamento di un piccolo sistema di “impacchettamento”perePub.Si trattadi un processodi creazione dell’ePubche parte dall’upload dei file che costituiranno i contenuti della pubblicazione e termina con la generazione dei file necessari alla costruzione di un file con estensione .epub completo. - La seconda parte è, invece, incentrata sulla realizzazione di una mini biblioteca per ePub gestita tramite l’applicazione e salvata su File System. Tale sistema, al contrario di quello descritto nel puntoprecedente, si basa sul processo contrario partendo da un file già compresso che viene poi decompresso per essere analizzato da parte del sistema. Qualsiasi utente può accedere alle funzionalità del sito, indistintamente. Parte I: ePub Packager Di seguitovengono elencate le funzionalità della prima parte del sito: - Accedendoall’interfacciautentedel Packagerper ePub, l’utente può inserire i metadati principali relativi all’ePub che verrà successivamente creato e che serviranno per la creazione del file
  • 4. 4 content.opf.Tali metadativengonovalidati perverificare se aderiscono alle specifiche e salvati sul database relazionale; - Una volta aver inserito i metadati, all’utente viene richiesto di caricare dal File System: i file che costituiranno i capitoli dell’ePub(si trattadi file con estensione .html o .xhtml che prima di essere resi persistentiall’internodel DBvengonoopportunamente validati), i file .css per le impostazioni sullo stile e le immagini. Tali file vengono salvati sia nel database che nel File System per poter essere utilizzati in seguito; - Una voltaaver inseritoi file necessari, l’utente viene rimandato verso una pagina che contiene la listadei file xhtml (perciascunfile vengonoriportati:l’id,il nome,il path,l’indice perl’ordinamento e il tipo),lalistadei fogli di stile e delle immagini caricate (nel caso dei csse delle immagini vengono riportati soltanto:l’id,il nome e il pathpoiché lagestione dell’ordinamentoviene fattasoltanto per i file con estensione .xhtml). Tali file possono essere, tramite questa interfaccia, modificati o eliminati nel caso in cui l’utente voglia cambiare i contenuti dell’ePub prima della creazione definitiva. E’, inoltre, possibile tramite la stessa interfaccia aggiungere nuovi file; - Nel caso in cui l’utente cerca di aggiungere nuovi file xhtml, il sistema applica sia un controllo di validità che un controllo per verificare se il file era stato già inserito in precedenza per evitare di farlo uploadare nuovamente; - Se nel passo precedente l’utente ha cliccato su “Modifica”, nel caso di un file xhtml, viene rimandato verso una form dove poter eventualmente modificare il nome del file, l’indice (per gestire l’ordinamento trai capitoli) e il tipo(il tipodeve,però,essere necessariamente unodi quelli accettati dalle specifiche standard per la corretta costruzione della guide, per questo l’interfaccia suggerisce all’utentequal è lalistadei tipi conformi alle specifiche); i file csse le immagini vengono modificati allo stesso modo ad eccezione per l’ordinamento. Se invece l’utente ha cliccato su “Elimina”, viene reindirizzato verso una form che permette di eliminare definitivamente il file; - Cliccando su “crea EPUB”, vengono creati i file e le cartelle che costituiscono le componenti dell’ePub (la cartella META-INF con all’interno il file container.xml, il file toc.ncx e il file content.opf), viene creato il file finale compresso e lo stesso viene salvato sul File System dell’utente; - Allafine del processo,l’utente viene rimandatosuuna nuova vista dove gli sarà possibile scaricare sul proprio computer il file compresso precedentemente creato.
  • 5. 5 Parte II: ePub Biblio Di seguitosono elencatele funzionalitàdellasecondaparte del progetto: - Tramite l’interfaccia utente è possibile uploadare uno o più file .epub contemporaneamente, il quale/i quali vengonosalvatiinunappositorepository sul File Systemdell’utente; nella fattispecie, ad ogni upload il programma genera una cartella chiamata con l’id dell’ePub contenente i relativi file dopoche lostessoè stato decompresso edinserisce il filezippato all’internodi una cartella che raccoglie gli ePub uploadati; - Una voltache ciascunePubè statoinseritoininput,ne viene estrapolata una serie di informazioni dai metadati contenuti all’interno del file content.opf, tra cui: titolo, lingua, isbn, autore, editore, formato,origine, tipo, data, collaboratore, relazione, diritti d’autore, destinazione, descrizione e soggetto;oltre a questi dati,vieneinseritoanche il percorsodel file .epub presente all’interno del File System dell’utente. Tali informazioni vengono registrate all’interno di un file xml chiamato EPubBiblio.xml, che viene creato dal programma una volta che il primo ePub viene inserito all’interno della biblioteca e che conterrà i metadati relativi a tutti gli ePub presenti nella stessa; - Il file appenadescritto,oltre araccogliere i metadati dei file, riporta anche le statistiche relative al numero di capitoli in ciascun ePub, al numero di parole presenti in tali capitoli, al numero di immagini contenute all’interno del file .epub e alle statistiche riguardanti la frequenza di ciascun autore registrato all’interno della biblioteca; - Dall’interfaccia utente dell’applicazione è possibile visualizzare l’elenco degli ePub presenti all’interno della biblioteca organizzati all’interno di una tabella, sincronizzata con il file EPubBiblio.xml, che riportale informazioni principalidegli stessi, quali: id, titolo, autore, lingua ed editore; - Tramite la tabellaè possibile inoltre effettuare, per ciascun ePub, due azioni: il download del file registratoall’internodel repositorynel FileSystemdell’utente e l’eliminazione del file ePub dalla biblioteca (tale eliminazione è stata implementata tramite la definizione di un algoritmo abbastanza complesso che gestisce non solo la rimozione di un file e dei relativi file dopo la decompressione quanto anche la rimozione del nodo dell’ePub dal file ePubBiblio e l’aggiornamento delle statistiche sugli autori); - Infine, dall’interfaccia utente è possibile accedere ad una pagina che costituisce l’output della trasformazione XSLT del file xml ePubBiblio in un file con estensione .xsl. Tale paginariporta l’elencodegliebooksottoformatabellare (titolo, autore, lingua, numero delle immagini, delle parole e dei capitoli presenti all’interno di ciascun file .epub nonché il percorso dello stesso) più una tabella delle statistiche che presenta il numero di ePub registrati nella biblioteca più il nome dell’autore che è presente con maggior frequenza.
  • 6. 6 La persistenza dati di ePUB Manager La prima parte dell’applicazione gestisce la persistenza dei dati facendo affidamento sul database relazionale MySql, aspetto che ha reso la definizione dell’architettura orientata ai servizi (SOA) posteriormente realizzata sulla base di questo stesso progetto altamente flessibile. La connessione al database viene fornitadal driverJDBCconfiguratoall’internodelprogettotramite il tag <Context>presente nel file content.xml: <?xml version="1.0" encoding="UTF-8"?> <Context antiJARLocking="true" path="/EPUBManager"> <Resource driverClassName="com.mysql.jdbc.Driver" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" logAbandoned="true" maxActive="100" maxIdle="30" maxWait="50000" name="jdbc/EPUBManager" password="" removeAbandoned="true" removeAbandonedTimeout="90" scope="Container" testWhileIdle="true" timeBetweenEvictionRunsMillis="50000" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/epubmanager" username="root" validationQuery="select 1"/> </Context> Limiti dell’applicazione - La prima parte del progetto gestisce la creazione di ePub conformi alla specifica 2.0.1 mentre la seconda parte del progetto consente di gestire entrambe le versioni 2.0.1 e 3.0.1. Quest’ultima costituisce la versione attuale dello standard per la pubblicazione dei libri digitali; - La seconda parte del progetto gestisce la persistenza dei dati su File System piuttosto che su un database relazionale; Architettura dell’applicazione L’applicazione è stata implementata in base al pattern architetturale MVC e con l’aiuto del framework Spring nella versione 3.2.8 il quale, tramite l’uso delle annotazioni, è stato di fondamentale importanza poiché ha permesso di gestire con estrema facilità le richieste web e di costruire un sistema altamente flessibile. Allafine di ogni processodi gestionedelle richieste http, l’output viene renderizzato all’utente tramite la tecnologia per implementare le view nota come JavaServerPages. In realtà la costruzione della vista, e dunque delle jsp, viene delegata ad Apache Tiles: un framework di templating atto ad assemblare frammenti di una pagina e a costruire la pagina stessa a tempo di esecuzione.
  • 7. 7 Service Oriented Architectures Adattamento di ePUB Manager ad un’architettura SOA L’applicazioneePUBManagercreataperil corso di Tecnologie XML è stata successivamente riadattata per il corso di SOA, Service Oriented Architectures. Per architettura orientata ai servizi si intende una tipologia di sistemadistribuito basatosul protocollohttpe sullainterconnessione di agenti software che fornisconoe usanouna serie di servizi. Il fatto che si stabilisca una comunicazione tra le varie componenti implica uno scambio di messaggi e conseguentemente la presenza di una serie di meccanismi di comunicazione che permettono lo scambio di tali messaggi. Per realizzare una SOA di alto livello, ovvero caratterizzata da SOAP come formalismo per il trasporto dei dati,è stata inizialmente realizzata una descrizione standard in WSDL per definire la struttura del servizio webfacendousodel tool SOAEditor,il quale hapermessodi generare il codice in automatico. Una voltadefinitoil WSDL, è stato possibile realizzare il relativoserviziowebutilizzandolatecnologiaSundi JAX-WS, laquale hacompilatoil file .wsdl incorporato all’interno del progetto e si è creata delle strutture dati java che corrispondono ai tipi dichiarati programmaticamente all’interno della descrizione della strutturadel servizio.JAX-WSè unostrumentomoltoefficace che hapermesso di facilitare ampiamente la programmazione del servizio web. Dopo averconfigurato laparte server,ovveroquella che espone all’esternoi metodidellalogicadi business tramite un’interfaccia,è statodefinitounclientstand-alone persimulare le chiamate alla business logic. Il client è costituito da un’interfaccia proxy che permette di invocare i metodi remoti. Durante la creazione del client, è stato necessario specificare l’indirizzo del WSDL generato da JAX-WS ed esposto dal servizio al quale l’applicazione stand-alone si è potuta connettere. E’ stato,inoltre, opzionalmente realizzatouna sorta di servizio web RESTful di modo da simulare anche un servizio di bassissimo livello (al contrario di quello di massimo livello realizzato con JAX-WS).
  • 8. 8 Il servizio web di alto livello La descrizioneformaledel WSDL E’ stato già precedentemente accennato uno degli standard fondanti dei servizi web basato su XML: il WSDL (Web Services Definition Language). Di seguito viene riportato il contenuto del file ePub.wsdl per mostrare come tale specificaè statautilizzataperdefinire formalmente il servizio web dell’ePUB Manager: <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions name="ePub" targetNamespace="http://www.univaq.it/mwt/soa/ePub.wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.univaq.it/mwt/soa/ePub.wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd1="http://www.univaq.it/mwt/soa/ePub.xsd1" xmlns:xsd2="http://www.univaq.it/mwt/soa/ePub.xsd2"> <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">SOA: WSLD del progetto ePubManager</wsdl:documentation> <wsdl:types> <xsd:schema targetNamespace="http://www.univaq.it/mwt/soa/ePub.xsd2" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd2="http://www.univaq.it/mwt/soa/ePub.xsd2"> <xsd:complexType name="tMetadata"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="identifier" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="title" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="language" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="tEpubCss"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="id" type="xsd:string"/>
  • 9. 9 <xsd:element maxOccurs="1" minOccurs="1" name="name" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="path" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="file" type="xsd:base64Binary"/> <xsd:element maxOccurs="1" minOccurs="1" name="contentType" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="epub" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="tEpubImage"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="id" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="name" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="path" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="file" type="xsd:base64Binary"/> <xsd:element maxOccurs="1" minOccurs="1" name="contentType" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="epub" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="tEpubError"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="code" type="xsd:int"/> <xsd:element maxOccurs="1" minOccurs="0" name="message" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:element name="eEpubError" type="xsd2:tEpubError"/> <xsd:complexType name="tEpubXhtml"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="id" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="name" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="path" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="file" type="xsd:base64Binary"/> <xsd:element maxOccurs="1" minOccurs="1" name="contentType" type="xsd:string"/>
  • 10. 10 <xsd:element maxOccurs="1" minOccurs="1" name="index" type="xsd:int"/> <xsd:element maxOccurs="1" minOccurs="0" name="type" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="epub" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> </wsdl:types> <wsdl:message name="mMetadata"> <wsdl:part name="metadata" type="xsd2:tMetadata"/> </wsdl:message> <wsdl:message name="mInt"> <wsdl:part name="elemento" type="xsd:int"/> </wsdl:message> <wsdl:message name="mError"> <wsdl:part element="xsd2:eEpubError" name="error"/> </wsdl:message> <wsdl:message name="mVoid"> </wsdl:message> <wsdl:message name="mRemoveXhtml"> <wsdl:part name="token" type="xsd:long"/> <wsdl:part name="xhtml" type="xsd2:tEpubXhtml"/> </wsdl:message> <wsdl:message name="mLong"> <wsdl:part name="token" type="xsd:long"/> </wsdl:message> <wsdl:message name="mRemoveCss"> <wsdl:part name="token" type="xsd:long"/> <wsdl:part name="css" type="xsd2:tEpubCss"/> </wsdl:message> <wsdl:message name="mAddXhtml"> <wsdl:part name="token" type="xsd:long"/> <wsdl:part name="xhtml" type="xsd2:tEpubXhtml"/> </wsdl:message> <wsdl:message name="mRemoveImage"> <wsdl:part name="token" type="xsd:long"/>
  • 11. 11 <wsdl:part name="image" type="xsd2:tEpubImage"/> </wsdl:message> <wsdl:message name="mAddStylesheet"> <wsdl:part name="token" type="xsd:long"/> <wsdl:part name="css" type="xsd2:tEpubCss"/> </wsdl:message> <wsdl:message name="mBoolean"> <wsdl:part name="boolean" type="xsd:boolean"/> </wsdl:message> <wsdl:message name="mAddImage"> <wsdl:part name="token" type="xsd:long"/> <wsdl:part name="image" type="xsd2:tEpubImage"/> </wsdl:message> <wsdl:portType name="ePubPortType"> <wsdl:operation name="startEpub"> <wsdl:input message="tns:mMetadata"> <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">metadata</wsdl:documentation> </wsdl:input> <wsdl:output message="tns:mLong"> <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">token</wsdl:documentation> </wsdl:output> <wsdl:fault message="tns:mError" name="epuberror"/> </wsdl:operation> <wsdl:operation name="addXhtml"> <wsdl:input message="tns:mAddXhtml"/> <wsdl:output message="tns:mInt"> <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">element</wsdl:documentation> </wsdl:output> <wsdl:fault message="tns:mError" name="epuberror"/> </wsdl:operation> <wsdl:operation name="addStylesheet"> <wsdl:input message="tns:mAddStylesheet"/> <wsdl:output message="tns:mInt">
  • 12. 12 <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">element</wsdl:documentation> </wsdl:output> <wsdl:fault message="tns:mError" name="epuberror"/> </wsdl:operation> <wsdl:operation name="addImage"> <wsdl:input message="tns:mAddImage"/> <wsdl:output message="tns:mInt"> <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">element</wsdl:documentation> </wsdl:output> <wsdl:fault message="tns:mError" name="epuberror"/> </wsdl:operation> <wsdl:operation name="finalizeEpub"> <wsdl:input message="tns:mLong"/> <wsdl:output message="tns:mVoid"/> <wsdl:fault message="tns:mError" name="epuberror"/> </wsdl:operation> <wsdl:operation name="removeXhtml"> <wsdl:input message="tns:mRemoveXhtml"/> <wsdl:output message="tns:mBoolean"/> <wsdl:fault message="tns:mError" name="epuberror"/> </wsdl:operation> <wsdl:operation name="removeStylesheet"> <wsdl:input message="tns:mRemoveCss"/> <wsdl:output message="tns:mBoolean"/> <wsdl:fault message="tns:mError" name="epuberror"/> </wsdl:operation> <wsdl:operation name="removeImage"> <wsdl:input message="tns:mRemoveImage"/> <wsdl:output message="tns:mBoolean"/> <wsdl:fault message="tns:mError" name="epuberror"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="ePubSOAP" type="tns:ePubPortType">
  • 13. 13 <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="startEpub"> <soap:operation soapAction="ePub#startEpub"/> <wsdl:input> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:input> <wsdl:output> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:output> <wsdl:fault name="epuberror"> <soap:fault name="epuberror" use="literal"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="addXhtml"> <soap:operation soapAction="ePub#addXhtml"/> <wsdl:input> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:input> <wsdl:output> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:output> <wsdl:fault name="epuberror"> <soap:fault name="epuberror" use="literal"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="addStylesheet"> <soap:operation soapAction="ePub#addStylesheet"/> <wsdl:input> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:input> <wsdl:output> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:output> <wsdl:fault name="epuberror">
  • 14. 14 <soap:fault name="epuberror" use="literal"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="addImage"> <soap:operation soapAction="ePub#addImage"/> <wsdl:input> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:input> <wsdl:output> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:output> <wsdl:fault name="epuberror"> <soap:fault name="epuberror" use="literal"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="finalizeEpub"> <soap:operation soapAction="ePub#finalizeEpub"/> <wsdl:input> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:input> <wsdl:output> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:output> <wsdl:fault name="epuberror"> <soap:fault name="epuberror" use="literal"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="removeXhtml"> <soap:operation soapAction="ePub#removeXhtml"/> <wsdl:input> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:input> <wsdl:output> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/>
  • 15. 15 </wsdl:output> <wsdl:fault name="epuberror"> <soap:fault name="epuberror" use="literal"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="removeStylesheet"> <soap:operation soapAction="ePub#removeStylesheet"/> <wsdl:input> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:input> <wsdl:output> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:output> <wsdl:fault name="epuberror"> <soap:fault name="epuberror" use="literal"/> </wsdl:fault> </wsdl:operation> <wsdl:operation name="removeImage"> <soap:operation soapAction="ePub#removeImage"/> <wsdl:input> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:input> <wsdl:output> <soap:body namespace="http://univaq.it/mwt/soa/epub/data" use="literal"/> </wsdl:output> <wsdl:fault name="epuberror"> <soap:fault name="epuberror" use="literal"/> </wsdl:fault> </wsdl:operation> </wsdl:binding> <wsdl:service name="ePub"> <wsdl:port binding="tns:ePubSOAP" name="ePubSOAPPort"> <soap:address location="http://localhost:8084/EPUBManager/services"/> </wsdl:port>
  • 16. 16 </wsdl:service> </wsdl:definitions> Le operazioni di base definite nel WSDLsono: - startEpub; - addXhtml; - addStylesheet; - addImage; - finalizeEpub; - removeXhtml; - removeStylesheet; - removeImage; Il servizio web di basso livello Come già accennatoinprecedenza,l’applicazione è stataimplementata con l’ausilio del framework Spring che ha consentito,trale altre cose,di simulare un servizioweb RESTful che pubblicai metodi della logica di businesse permette di effettuare delleoperazionisui dati del sistema tramite una semplice gestione delle url; ciascuna url (composta da vari path che identificano le risorse) corrisponde ad un metodo particolare del servizio. Essendoil RepresentationalStateTransferProtocolil modobase di comunicare offerto dal protocollo http, ciascunarichiestaviene gestita utilizzandounodei metodi di base per operare sui dati del protocollo: GET, POST e DELETE. Di seguitovieneriportatalaclasse annotata tramite l’annotazione @Controller che permette di gestire le richieste http provenienti dal browser: @Controller @RequestMapping("/rest") public class RESTController { @Autowired private EPubService service;
  • 17. 17 @RequestMapping(value="/epubs",method={RequestMethod.POST}) @ResponseBody public String startEpub (Metadata metadata) { long result = service.startEpub(metadata); return Long.toString(result); } @RequestMapping(value="/epubs/{token}",method={RequestMethod.GET}) @ResponseBody public void finalizeEpub (@PathVariable("token") String epub) { long token = Long.parseLong(epub); service.finalizeEpub(token); } @RequestMapping(value="/epubs/{token}/texts",method={RequestMethod.POST}) @ResponseBody public int insertXhtml (@PathVariable("token") String epub, @RequestBody EpubXhtml epubXhtml) { long token = Long.parseLong(epub); int xhtml = service.addXHTML(token, epubXhtml); return xhtml; } @RequestMapping(value="/epubs/{token}/texts/{id}",method={RequestMethod.GET}) @ResponseBody public EpubXhtml getXhtml (@PathVariable("id") String id) { // long token = Long.parseLong(epub); EpubXhtml xhtml = service.getEpubXhtmlByPk(id); if (xhtml == null) { throw new NotFoundException(); } return xhtml; }
  • 18. 18 @RequestMapping(value="/epubs/{token}/texts/{id}",method={RequestMethod.DELETE}) @ResponseBody public void deleteXhtml (@PathVariable("token") String epub, @PathVariable("id") String id) { // long token = Long.parseLong(epub); EpubXhtml xhtml = service.getEpubXhtmlByPk(id); if (xhtml == null) { throw new NotFoundException(); } service.deleteEpubXhtml(xhtml); } @RequestMapping(value="/epubs/{token}/images",method={RequestMethod.POST}) @ResponseBody public int insertImage (@PathVariable("token") String epub, @RequestBody EpubImage epubImage) { long token = Long.parseLong(epub); int image = service.addImage(token, epubImage); return image; } @RequestMapping(value="/epubs/{token}/images/{id}",method={RequestMethod.GET}) @ResponseBody public EpubImage getImage (@PathVariable("id") String id) { // long token = Long.parseLong(epub); EpubImage image = service.getEpubImageByPk(id); if (image == null) { throw new NotFoundException(); } return image; } @RequestMapping(value="/epubs/{token}/images/{id}",method={RequestMethod.DELETE}) @ResponseBody public voiddeleteImage (@PathVariable("token") String epub, @PathVariable("id") String id, EpubImage epubImage) {
  • 19. 19 // long token = Long.parseLong(epub); if (epubImage == null) { throw new NotFoundException(); } service.deleteEpubImage(epubImage); } @RequestMapping(value="/epubs/{token}/stylesheets",method={RequestMethod.POST}) @ResponseBody public int insertCss (@PathVariable("token") String epub, @RequestBody EpubCss epubCss) { long token = Long.parseLong(epub); int css = service.addStylesheet(token, epubCss); return css; } @RequestMapping(value="/epubs/{token}/stylesheets/{id}",method={RequestMethod.GET}) @ResponseBody public EpubCss getCss (@PathVariable("id") String id) { // long token = Long.parseLong(epub); EpubCss css = service.getEpubCssByPk(id); if (css == null) { throw new NotFoundException(); } return css; } @RequestMapping(value="/epubs/{token}/stylesheets/{id}",method={RequestMethod.DELETE}) @ResponseBody public void deleteCss (@PathVariable("token") String epub, @PathVariable("id") String id, EpubCss epubCss) { // long token = Long.parseLong(epub); if (epubCss == null) { throw new NotFoundException(); }
  • 20. 20 service.deleteEpubCss(epubCss); } @ExceptionHandler(NotFoundException.class) @ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Not found") void handleNotFound(NotFoundException exc) { } class NotFoundException extends RuntimeException { private static final long serialVersionUID = 1L; } }