Project Specification `WikiService`

Master in Web Technology Corso di Web Services 2006/07
Progetti di fine corso
La valutazione di fine corso per ogni studente è soggetta alla realizzazione di un progetto che dimostri le conoscenze e le
abilità acquisite nell’uso delle tecnologie e delle metodologie legate allo sviluppo dei servizi web, stimolando anche
l’approfondimento di argomenti avanzati non trattati in aula.
- I progetti possono essere realizzati singolarmente o in piccoli gruppi. Ovviamente il numero di
persone coinvolte in un lavoro aumenterà le richieste di completezza e correttezza dello stesso.
- E’ ammissibile anche che gruppi diversi sviluppino versioni diverse dello stesso progetto lavorando
in parallelo.
- Gli studenti che avessero altre idee su progetti da realizzare possono sottopormele liberamente.
I progetti di fine corso per quest’anno accademico sono tutti incentrati sull’uso dei dati messi a
disposizione liberamente dalla più grande enciclopedia online a contributo pubblico, la Wikipedia
(http://it.wikipedia.org),
e
dai
suoi
servizi
complementari,
come
Wikitionary
(http://it.wiktionary.org).
La fondazione WikiMedia mette a disposizione i dati contenuti nella Wikipedia (per tutti i progetti ad
essa collegati, in tutte le lingue disponibili) in formato XML. Queste informazioni possono essere
prelevate dalla rete in due modi differenti:
- Tramite i dump completi eseguiti periodicamente dai server dell’enciclopedia (si veda
http://en.wikipedia.org/wiki/Wikipedia:Database_download).
- Tramite l’opzione di esportazione XML delle singole pagine (ottenibile tramite la URL speciale
http://it.wikipedia.org/wiki/Special:Export/titolo_articolo).
Lo scopo dei progetti che seguono è sfruttare le informazioni presenti negli articoli dell’enciclopedia,
attraverso la loro rappresentazione XML, per offrire alle applicazioni delle sorgenti dati accessibili
tramite servizi web. Ogni progetto prevede la realizzazione di un servizio e di un suo client. di prova.
Nota bene: nei progetti, per semplicità, utilizzeremo solo gli articoli presenti nella Wikipedia italiana e
non ci occuperemo del materiale esterno presente sulle pagine, come ad esempio le immagini.
WikiService
Lo scopo di questo progetto è realizzare un servizio che permetta a una vasta gamma di applicazioni
di accedere al contenuto (online) della Wikipedia senza dover effettuare complessi parsing o
conoscere la struttura dei documenti MediaWiki.
Riutilizzando (possibilmente) gli algoritmi già sviluppati per i progetti di tecnologie XML, il servizio
dovrà accedere alla Wikipedia online, scaricare le voci indicate e trasformarle nel formato richiesto,
restituendole poi all’utente.
Queste sono le operazioni che il servizio dovrà esporre:
− String getLemmaXML(String lemma) throws LemmaNotFound
restituisce il contenuto della voce specificata nel formato XML di MediaWiki. Solleva un’eccezione nel caso in cui
la voce non sia presente nella Wikipedia.
− String getLemmaHTML(String lemma) throws LemmaNotFound
restituisce il contenuto della voce specificata come testo HTML (formattato opportunamente in base alla struttura
dei tag MediaWiki). Solleva un’eccezione nel caso in cui la voce non sia presente nella Wikipedia.
− String getLemmaText(String lemma) throws LemmaNotFound
restituisce il contenuto della voce specificata come testo semplice (formattato opportunamente in modo da non
“perdere” tutta la struttura, come i titoli o le liste). Solleva un’eccezione nel caso in cui la voce non sia presente nella
Wikipedia.
− Timestamp getLemmaRevision(String lemma) throws LemmaNotFound
restituisce il timestamp dell’ultima revisione della voce selezionata. Solleva un’eccezione nel caso in cui la voce non
sia presente nella Wikipedia.
Master in Web Technology Corso di Web Services 2006/07
− void sendLemmaHTML(String lemma, String email)
invia all’indirizzo email specificato il contenuto della voce come testo HTML. Eventuali errori sono riportati
nell’email.
− void sendLemmaText(String lemma, String email)
invia all’indirizzo email specificato il contenuto della voce come testo semplice. Eventuali errori sono riportati
nell’email.
Dal lato client, è possibile realizzare due tipi di applicativo:
− Estendere WikiBrowser (progetto di Tecnologie XML) in modo che, oltre a visualizzare il
contenuto di una voce presa dal suo database offline, controlli sulla rete se la voce ha subito
aggiornamenti, offrendo eventualmente la possibilità di visualizzare la nuova versione.
− Estendere WikiOrganizer (progetto di Tecnologie XML) in modo che permetta di aggiornare
singole voci del database offline verificandone la data di revisione e scaricando le versioni
aggiornate tramite il servizio.
Il servizio e il suo client vanno realizzati tramite SOAP/HTTP utilizzando l’infrastruttura JAX-WS.
WikiWords
Lo scopo di questo progetto è realizzare un servizio di dizionario/thesaurus/traduttore basato sul
contenuto di Wikitionary (http://it.wiktionary.org/wiki/). In questo speciale wiki è possibile ricercare
qualsiasi parola (anche molte parole straniere, anche se in questo caso è più opportuno usare il
Wikitionary della lingua specifica) usando la url http://it.wiktionary.org/wiki/parola.
Ogni voce corrispondente a una parola (se esistente nel dizionario) può contenere diverse sezioni, che
vanno dalle definizioni, ai sinonimi, alle traduzioni in varie lingue. Osservando il sorgente XML delle
voci (http://it.wiktionary.org/wiki/special:export/parola) si nota come queste ultime abbiano una
struttura wiki piuttosto standard, caratterizzata da template che identificano le varie sezioni. Per
informazioni
approfondite,
potete
leggere
il
documento
presente
alla
url
http://it.wiktionary.org/wiki/Aiuto:Come_iniziare_una_pagina.
E’ quindi semplice creare un parser che estragga da queste pagine le informazioni che possono esserci
utili.
Queste sono le operazioni che il servizio dovrà esporre:
− String[] getWordDefinitions(String word)
restituisce un array contenente tutte le definizioni possibili per la parola data.
− String[] getWordSynonyms(String word)
restituisce un array contenente tutti i sinonimi possibili della parola data.
− String getWordTranslation(String word, String langid)
restituisce la traduzione della parola data nella lingua il cui codice è specificato come secondo parametro (i codici
sono scritti nelle pagine sorgente, prima di ogni traduzione).
Dal lato client, si richiede di realizzare una libreria di funzioni Javascript che permetta di incorporare
nelle pagine web le funzioni di ricerca del dizionario. La libreria deve esporre una funzione che
permette di creare, all’interno di una generica pagina HTML, un box di ricerca (o “dizionario
popup”), utile per comprendere o tradurre particolari pagine.
Per le caratteristiche del client, è opportuno che il servizio sia realizzato con XML-RPC.
Master in Web Technology Corso di Web Services 2006/07
WikiHistory
Con questo progetto intendiamo utilizzare un sottoinsieme della Wikipedia per realizzare un servizio
di informazioni storiche – o una sorta di almanacco online – che le applicazioni, specie quelle web,
potranno usare per arricchire i propri contenuti.
Le pagine della Wikipedia a cui ci riferiamo sono quelle che contengono i fatti di un particolare anno,
accessibili con url del tipo http://it.wikipedia.org/wiki/1974, o di un particolare giorno,
corrispondenti a url del tipo http://it.wikipedia.org/wiki/14_febbraio (notare l’underscore tra giorno
e mese). Le pagine hanno una struttura molto uniforme, quindi sarà semplice analizzarne il sorgente
XML ed estrarre le informazioni associate a ciascuna sezione.
Queste sono le operazioni che il servizio dovrà esporre:
− String[] getEvents(int year, int month, int day) throws InvalidRequest
restituisce un array contenente tutte le voci (“ripulite” dal markup wiki) nella lista “Eventi” presente nella pagina
indicata dai parametri del metodo. È possibile specificare solo il parametro year (pagina di un anno particolare) o
solo day e month (pagina di un giorno particolare): ogni altra combinazione genererà un’eccezione.
− String[] getPeople(int year, int month, int day) throws InvalidRequest
restituisce un array contenente i nomi di tutte le persone (nate o morte), elencate nella pagina del giorno/anno
indicato dai parametri del metodo. Ogni nome deve essere preceduto da un segno “*” per i nati o da un “+” per i
morti. Valgono le stesse regole del metodo getEvents per quel che riguarda le combinazioni di parametri
ammissibili.
− String[] getSaints(int month, int day) throws InvalidRequest
Restituisce la lista dei santi festeggiati nel giorni indicato. Genera un’eccezione se la combinazione giorno/mese non
è valida.
− String[] getHolydays(int month, int day) throws InvalidRequest
Restituisce la lista delle altre festività presenti nel giorni indicato. Genera un’eccezione se la combinazione
giorno/mese non è valida.
Dal lato client, si richiede la creazione di una timeline web-based, che permetta di sfogliare/scorrere
(nella maniera più semplice e intuitiva possibile) una linea temporale virtuale sulla quale siano
presentati gli eventi e i personaggi associati ai vari periodi. Deve essere possibile visualizzare la linea a
vari livelli di dettaglio (secoli, anni, mesi, giorni,…), e possibilmente i personaggi citati devono essere
collegati alle voci corrispondenti della Wikipedia. N.B.: questo client non utilizza le funzioni getSaints
e getHolydays del servizio, che devono essere comunque realizzate e documentate nel progetto.
Il servizio e il suo client vanno realizzati tramite SOAP/HTTP utilizzando l’infrastruttura JAX-WS.