formato e trasmissione di messaggi di allerta per la gestione di emergenze ambientali
Post on 29-Nov-2014
540 Views
Preview:
DESCRIPTION
TRANSCRIPT
ANNO ACCADEMICO 2009/2010
UNIVERSITÀ DEGLI STUDI DI TRIESTE
FACOLTÀ DI INGEGNERIA
CORSO DI LAUREA IN INGEGNERIA INFORMATICA
TESI DI LAUREA
IN
INGEGNERIA INFORMATICA
FORMATO E TRASMISSIONE DI MESSAGGI DI ALLERTA PER LA
GESTIONE DI EMERGENZE AMBIENTALI
Laureando:
Simone Maver
Relatore:
Prof. Ing. Raffaela Cefalo
2
INDICE
1! INTRODUZIONE ........................................................................................................ 3!2! ANALISI E PROGETTAZIONE ............................................................................... 8!
2.1! CAP (Common Alerting Protocol) .......................................................................... 8!2.2! Definizione dei requisiti ........................................................................................ 12!2.3! Scelta delle tecnologie ........................................................................................... 12!2.4! Struttura dell’applicazione .................................................................................... 13!
3! REALIZZAZIONE .................................................................................................... 17!3.1! Interfaccia grafica .................................................................................................. 17!3.2! Implementazione ................................................................................................... 19!
3.2.1! Funzionamento generale ................................................................................. 19!3.2.2! La classe CapViewer ...................................................................................... 19!3.2.3! La classe MsgParser ....................................................................................... 20!
4! CONCLUSIONI ......................................................................................................... 23!Ringraziamenti ................................................................................................................. 24!Appendice A ..................................................................................................................... 25!Appendice B ...................................................................................................................... 27!Bibliografia ....................................................................................................................... 29!Indice delle figure ............................................................................................................. 29!
3
1 INTRODUZIONE
Le emergenze provocate dal verificarsi di eventi naturali straordinari è negli ultimi
anni un tema ricorrente nei fatti di cronaca, si pensi ad esempio ai terremoti verificatisi in
Abruzzo nel 2009 e sull’isola di Haiti nel 2010, fino al maremoto d’inizio 2011 nel
Pacifico, con il conseguente tsunami che ha interessato il Giappone. Considerando un
intervallo più ampio di tempo si nota che il numero di eventi disastrosi che accade nel
mondo è in evidente aumento, come si può apprezzare in Fig. 1.
Fig. 1: numero di eventi disastrosi rilevati tra il 1900 e il 2001 nel mondo [1].
L’UNISDR (United Nations International Strategy for Disaster Reduction) definisce il
rischio come la combinazione tra la probabilità di un evento e le sue conseguenze
negative [2]. Questi eventi di emergenza possono essere indotti da svariate cause, come
calamità naturali o incidenti industriali. L’aumento di queste cause negli ultimi anni
evidenzia la vulnerabilità della collettività, dal punto di vista sociale, economico e
territoriale.
Limitando la rilevazione degli eventi al solo territorio europeo l’andamento rimane
crescente e alcuni paesi europei sono interessati da una quantità considerevole di questi
avvenimenti in un arco temporale di circa dieci anni, com’è mostrato in Fig. 2. Questi
avvenimenti hanno conseguenze pesanti sia considerando il numero di persone coinvolte
(Fig. 3), sia sul fronte dei danni economici che provocano e delle risorse necessarie per
farvi fronte (Fig. 4).
4
Fig. 2: eventi disastrosi tra il 1998 e il 2009, nei paesi membri del EEA (European Environment Agency).
Fig. 3: perdite umane tra il 1998 e il 2009, nei paesi membri del EEA (European Environment Agency).
5
Fig. 4: perdite economiche complessive tra il 1998 e il 2009, nei paesi membri del EEA.
L’impatto che queste calamità hanno sui luoghi e sulle persone coinvolte varia
secondo il tipo di evento. Ma è possibile individuare uno schema generale per la gestione
della situazione d’emergenza che essi creano; la Fig. 5 descrive qual è la catena degli
interventi da attuare per fare fronte ai diversi aspetti che caratterizzano l’emergenza,
trattando sia le azioni da porre in atto nell’immediatezza dopo la calamità, sia le azioni a
lungo termine.
Fig. 5: ciclo di gestione delle calamità.
6
Si può suddividere la gestione in quattro ambiti principali:
1. Conoscenza del rischio:
• Raccolta sistematica di dati riguardanti gli eventi.
• Valutazione del rischio a seconda dei fattori geografici e ambientali.
2. Monitoraggio del territorio e servizio di allarme:
• Sviluppo di sistemi di monitoraggio dei parametri legati ai disastri.
• Creazione di un servizio di allarme accurato e tempestivo a tutti i livelli
(internazionale-nazionale-locale).
3. Diffusione e comunicazione, i cui obiettivi sono:
Massima capillarità nella distribuzione e forma chiara e semplice degli avvisi.
4. Miglioramento della capacità di risposta, in cui si vuole arrivare creazione di
apparati nazionali e locali capaci di fronteggiare le calamità.
Nel contesto appena delineato il lavoro presentato in questa tesi è focalizzato sui punti
2 e 3, in particolare su come avviene o potrebbe avvenire, lo smistamento delle
informazioni in seguito all’evento. Infatti, la possibilità di raggiungere in maniera rapida
ed efficace tutti i soggetti coinvolti è un obiettivo importante per prevenire e limitare i
danni provocati da questi eventi naturali. Prendendo come riferimento lo schema presente
in Fig. 6, verranno esaminati il formato da utilizzare per il messaggio di allerta e come
potrebbe usufruirne un utente che lo riceve su un dispositivo mobile.
Fig. 6: schema di gestione delle informazioni a seguito di una calamità
7
Uno dei sistemi già esistenti di gestione dell’informazione legata alle emergenze è
l’Emergency Alert System (EAS), attivo negli Stati Uniti d’America. Per una trattazione
completa ed esaustiva rimandiamo alla pagina dedicata sul sito della Federal
Communications Commission [3] del governo americano.
Il formato scelto in questo studio per la codifica dei messaggi di allerta è il CAP –
Common Alerting Protocol (d’ora in poi CAP). La scelta è ricaduta su questo formato
perché inquadrato in un progetto più ampio relativo al Disaster Management coordinato
dalla professoressa Raffaela Cefalo, relatrice di questa tesi. L’analisi del protocollo CAP
è riportata nella parte iniziale del capitolo 2.
Scopo del presente lavoro è giungere alla creazione di un prototipo di applicazione in
grado di gestire e visualizzare su un dispositivo mobile il contenuto di un messaggio di
allerta formato secondo il CAP.
Questa tesi è articolata come segue: nella prima parte avverrà un’analisi del CAP che
porterà a individuare alcuni requisiti del prototipo. Definiti tutti i requisiti nel paragrafo
2.2, seguirà una breve descrizione delle tecnologie utilizzate per lo sviluppo (cfr. §2.3) e
la struttura dell’applicazione (cfr. §2.4). Nel capitolo 3 verrà trattata la parte di
realizzazione, in cui tratteremo l’interfaccia grafica e il funzionamento interno
dell’applicazione.
8
2 ANALISI E PROGETTAZIONE
In questo capitolo vengono descritte le caratteristiche del protocollo CAP nel paragrafo
2.1, per passare nel paragrafo 2.2 alla definizione dei requisiti che dovrà soddisfare la
nostra applicazione e infine alle scelte per lo sviluppo nei paragrafi 2.3 e 2.4.
2.1 CAP (Common Alerting Protocol)
L'OASIS (Organization for the Advancement of Structured Information Standards,
http://www.oasis-open.org/) è un consorzio no-profit che coordina lo sviluppo e
promuove l’adozione di standard aperti per la distribuzione di informazioni a livello
globale. In particolare si occupa di standard per la sicurezza, per l'e-business e per
applicazioni di pubblica utilità.
Il CAP è uno di questi standard, in fase di approvazione, ed è un formato progettato
per lo scambio di avvisi d'emergenza su diversi tipi di rete. Il documento di riferimento
prodotto dall’OASIS è il Common Alerting Protocol Version 1.2 [4]. Il protocollo permette
di creare messaggi da poter distribuire contemporaneamente su diversi sistemi d'allerta,
incrementando l'efficacia degli avvisi e semplificandone la distribuzione. I principi alla
base dello sviluppo di questo protocollo sono i seguenti:
• Interoperabilità: possibilità di utilizzare i messaggi formati secondo il CAP su
tutti i tipi di sistemi di informazione per le emergenze.
• Completezza: un messaggio conforme al CAP deve poter contenere tutte le
informazioni essenziali caratterizzanti l’emergenza.
• Implementazione semplice: l’utilizzo dei messaggi CAP non deve richiedere
particolari competenze tecniche.
• Struttura XML semplice e portabile: la codifica di riferimento avviene tramite un
documento XML, ma la struttura del messaggio rimane sufficientemente astratta
per permetterne l’adattamento ad altri schemi di codifica.
• Formato multiuso: lo schema del CAP prevede diverse tipologie per il messaggio
stesso (allerta, aggiornamento, etc.), destinate a diversi utilizzi (allerta in corso,
esercitazione, test, etc.).
• Familiarità: l’informazione deve poter essere fruibile sia a utenza esperta, sia a
utenza generica.
• Utilizzo interdisciplinare e internazionale.
9
La struttura del messaggio offre le seguenti possibilità:
• Individuazione geografica flessibile, utilizzando modelli basati su
latitudine/longitudine e su rappresentazioni geospaziali in tre dimensioni.
• Invio di messaggi multilingua e con destinatari multipli.
• Validazione e scadenza temporale dei messaggi.
• Funzioni di cancellazione/aggiornamento dei messaggi.
• Modelli per la definizione di messaggi di allerta completi e validi.
• Compatibilità con sistemi di firma digitale.
• Supporto per immagini e audio digitali.
In Fig. 7 è illustrata la generica struttura del messaggio. Esso è articolato in quattro
parti più ampie, dette segmenti, le quali contengono a loro volta specifiche informazioni
riguardo all’evento cui si riferiscono. Segue una breve descrizione degli elementi del
messaggio. Per una trattazione più approfondita si rimanda al documento prodotto
dall’OASIS [4].
I segmenti sono:
1. <alert>: è il segmento principale ed è sempre presente, fornisce gli elementi
principali necessari a caratterizzare il messaggio. L’OASIS definisce come
obbligatori – cioè devono essere presenti nel messaggio – i seguenti elementi:
a. <identifier>: contiene il codice per identificare il messaggio.
b. <sender>: contiene l’identificatore del mittente.
c. <sent>: contiene data e ora di creazione del messaggio.
d. <status>: contiene il codice che indica il trattamento appropriato del
messaggio.
e. <msgType>: specifica la natura del messaggio di allerta.
f. <scope>: contiene un codice che indica l’utenza cui è rivolto il messaggio.
I restanti elementi sono opzionali.
2. <info>: questo segmento è opzionale ed è correlato con <alert>; contiene elementi
necessari per delineare e caratterizzare l’evento oggetto del messaggio. Nel caso
in cui sia presente, l’OASIS definisce come obbligatori i seguenti elementi:
a. <category>: contiene il codice che identifica la tipologia in cui rientra
l’evento.
b. <event>: contiene il nome dell’evento.
10
c. <urgency>: indica l’urgenza di eseguire le istruzioni contenute nel
messaggio.
d. <severity>: indica il livello di minaccia dell’evento, a persone/cose.
e. <certainty>: indica l’affidabilità delle informazioni contenute nel
messaggio.
I restanti elementi sono opzionali.
3. <resource>: questo segmento è opzionale ed è correlato con <info>; contiene
elementi utilizzati per specificare l’eventuale materiale allegato al messaggio
(foto, video, audio, etc., dell’evento). Nel caso in cui sia presente, i seguenti
elementi sono definiti come obbligatori:
a. <resourceDesc>: contiene un testo leggibile descrivente il tipo e il
contenuto della risorsa allegata, ad es. “foto” oppure “video”.
b. <mimeType>: contiene il codice del tipo e sottotipo dello standard MIME
[Multipurpuose Internet Mail Extension, cfr. RFC 2046] della risorsa.
I restanti elementi sono opzionali.
4. <area>: questo elemento è opzionale ed è correlato anch’esso con <info>;
contiene informazioni per descrivere l’area coinvolta nell’evento. se viene
utilizzato <area>, l’unico elemento obbligatorio è:
a. <areaDesc>: contiene una descrizione testuale dell’area interessata.
Anche in questo segmento, i restanti elementi sono opzionali.
11
Fig. 7: struttura del messaggio di allerta (fonte OASIS [4])
Dall’analisi appena compiuta del documento contenente le specifiche del protocollo CAP,
è possibile individuare alcuni requisiti che dovrà soddisfare l’applicazione che verrà poi
sviluppata.
alertMessage ID (identifier)Sender ID (sender)Sent Date/Time (sent)Message status (status)Message Type (msgType)Source (source)Scope (scope)Restriction (restriction)Addresses (addresses)Handling Code (code) *Note (note)Reference IDs (references)Incident Ids (incidents)
infoLanguage (language)Event category (category)*Event Type (event)Response Type (responseType)*Urgency (urgency)Severity (severity)Certainty (certainty)Audience (audience)Event Code (eventCode)*Effective Date/Time (effective)Onset Date/time (onset)Expiration Date/Time (expires)Sender Name (senderName)Headline (headline)Event Description (description)Instruction (instruction)Information URL (web)Contact Info (contact)Parameter (parameter)*
ResourceDescription (resourceDesc)MIME Type (mimeType)File Size (size)URI (uri)Dereferenced URI (derefUri)Digest (digest)
areaArea Description (areaDesc)Area Polygon (polygon)*Area Circle (circle)*Area Geocode (geocode)*Altitude (altitude)Ceiling (ceiling)
*
*
*
Legenda:Elementi in grassetto sono obbligatori;
Elementi in corsivo assumono valore predefinito quando non vengono specificati precisi valori;
L'asterisco (*) indica che l'elemento può avere più occorrenze nello stesso messaggio.
12
2.2 Definizione dei requisiti
In questo paragrafo verranno individuati e definiti i requisiti che l’applicazione dovrà
soddisfare, in funzione dell’analisi effettuata nel paragrafo 2.1 e di ulteriori esigenze.
Dall’analisi del paragrafo 2.1 si individua il principale requisito. Infatti, l’applicazione
dovrà essere in grado di gestire un messaggio conforme al CAP e quindi un file XML
(abbiamo preso come riferimento la struttura già fornita dall’OASIS [4]), estraendo le
informazioni utili all’utente e tralasciando le informazioni di formattazione necessarie per
formare il documento XML. Inoltre per restare concordi con la caratteristica di
interoperabilità e portabilità dello standard CAP, l’applicazione dovrà essere indipendente
dalla piattaforma sulla quale sarà eseguita.
Considerando dove il messaggio potrebbe essere utilizzato, si distinguono due ambiti
principali: una sala di coordinamento e/o smistamento delle informazioni di un ente che si
occupa di emergenze (ad es. protezione civile e forze dell’ordine) e l’utente in movimento
(ad es. un utente generico coinvolto nell’emergenza o un operatore afferente a uno degli
enti precedentemente citati). Nel nostro caso è stata scelta la seconda tipologia d’utenza –
l’utente in movimento. Perciò l’utilizzo si suppone che avverrà su dispositivi mobili, i
quali hanno due caratteristiche da considerare nello sviluppo: la dimensione dello
schermo su cui visualizzare le informazioni e le ridotte risorse di calcolo e
memorizzazione.
Riassumendo, viene stilato un elenco dei requisiti dell’applicazione:
1. Gestione ed estrazione di informazioni da un documento XML.
2. Indipendenza dalla piattaforma di esecuzione.
3. Necessità di esecuzione su dispositivi mobili.
2.3 Scelta delle tecnologie
In questo paragrafo ci si soffermerà su quali tecnologie sono state scelte e utilizzate
per lo sviluppo, alla luce dei requisiti individuati nel paragrafo 2.2.
Considerati il secondo e il terzo requisito, la scelta sul sistema di sviluppo è ricaduta
sul Java Micro Edition System Development Kit 3.0 [5](d’ora in poi Java ME SDK). Il
linguaggio Java in generale non dipende dall’architettura e dal sistema su cui viene
eseguito, purché questo sistema/architettura possieda gli strumenti per interpretare il
13
codice Java. Per una trattazione più dettagliata di Java si rimanda al sito dello
sviluppatore. [6]
Per il primo requisito e per la scelta del sistema di sviluppo appena compiuta, la
ricerca di una libreria che permettesse la gestione di un documento XML ha portato a
scegliere la libreria kXML la quale fornisce le funzionalità necessarie. Non verrà
approfondita in maniera esaustiva la composizione della libreria ma si rimanda al sito
dello sviluppatore [7] contenente il codice sorgente e la documentazione. Saranno trattati
comunque con la necessaria precisione nel capitolo 3 quegli elementi della libreria che
sono stati utilizzati per lo sviluppo.
2.4 Struttura dell’applicazione
Avendo fissato alcuni riferimenti per lo sviluppo nei paragrafi 2.2 e 2.3, verrà definita
in questo paragrafo la struttura che avrà l’applicazione. Innanzitutto viene scelto di
suddividerla in due parti: la prima destinata alla gestione della parte grafica, la seconda
alla gestione del codice XML componente il messaggio.
Per la parte grafica vengono effettuate le scelte che seguono: come si può vedere
nell’esempio 1, il codice XML è organizzato in una sorta di livelli – segmento <alert> da
cui discende il segmento <info> a cui fanno riferimento i segmenti <resource> e <area> –
e ogni livello a sua volta può contenere un numero variabile di elementi.
<?xml version = “1.0” encoding = “UTF-8”?> <alert xmlns = “urn:oasis:names:tc:emergency:cap:1.2”> <identifier>43b080713727</identifier> <sender>hsas@dhs.gov</sender> <sent>2003-04-02T14:39:01-05:00</sent> <status>Actual</status> <msgType>Alert</msgType> <scope>Public</scope> <info> <category>Security</category> <event>Homeland Security Advisory System Update</event> <urgency>Immediate</urgency> <severity>Severe</severity> <certainty>Likely</certainty> <senderName>U.S. Government, Department of Homeland Security</senderName> <headline>Homeland Security Sets Code ORANGE</headline> <description>The Department of Homeland Security has elevated the Homeland Security Advisory System threat level to ORANGE / High in response to intelligence which may indicate a heightened threat of terrorism.</description>
14
<instruction> A High Condition is declared when there is a high risk of terrorist attacks. In addition to the Protective Measures taken in the previous Threat Conditions, Federal departments and agencies should consider agency-specific Protective Measures in accordance with their existing plans.</instruction> <web>http://www.dhs.gov/dhspublic/display?theme=29</web> <parameter> <valueName>HSAS</valueName> <value>ORANGE</value> </parameter> <resource> <resourceDesc>Image file (GIF)</resourceDesc> <mimeType>image/gif</mimeType> <uri>http://www.dhs.gov/dhspublic/getAdvisoryImage</uri> </resource> <area> <areaDesc>U.S. nationwide and interests worldwide</areaDesc> </area> </info> </alert>
Esempio 1: codice XML di un messaggio di allerta conforme al CAP (fonte: OASIS [4])
Inoltre l’Esempio 1 evidenzia che gli elementi all’interno dei segmenti hanno contenuti
di lunghezza disomogenea tra loro e una visualizzazione completa – elemento insieme a
contenuto – potrebbe portare a saturare l’area visibile dello schermo costringendo l’utente
a scorrere un lista eccessivamente lunga. Allora si ritiene opportuno scegliere di
visualizzare la lista degli elementi senza il contenuto; sarà l’utente, selezionando
l’elemento, a visualizzare il contenuto cui è interessato.
Per quanto riguarda la parte di gestione del codice XML, l’applicazione dovrà essere
in grado di accedere al codice, scorrendolo per estrarre le informazioni richieste. In
particolare dovrà essere in grado di collezionare gli elementi contenuti in ogni segmento e
restituirli in una forma tale da permettere la creazione di una lista, oltre a poter estrarre il
valore che ogni elemento contiene, quando necessario. Il diagramma delle classi
visualizzato in Fig. 8 tiene conto delle scelte appena effettuate.
15
Fig. 8: diagramma delle classi
La classe CapViewer rappresentata in Fig. 8 sarà deputata alla gestione della grafica e
tra gli attributi (attributes) compaiono gli elementi necessari per la formazione delle liste
e per la visualizzazione del contenuto del messaggio. Tra i metodi (operations) di questa
classe quelli di maggior interesse sono CapViewer() e commandAction(), i quali
si occuperanno rispettivamente della gestione complessiva – grafica e logica – e della
gestione delle interazioni tra utente e applicazione. I restanti metodi sono necessari per la
gestione generica dell’applicazione e si occuperanno delle seguenti operazioni:
startApp() si occuperà dell’avvio e delle operazioni che avvengono durante il
normale funzionamento, pauseApp() di gestire un eventuale stato di applicazione in
pausa e, infine, destroyApp() si occuperà delle operazioni necessarie per terminare
l’applicazione.
16
Diversamente, la classe MsgParser sarà deputata alla gestione del codice XML con
due metodi (operations): MsgParser(), che si occuperà dell’accesso al file contenente
il codice XML e parseElement(), che si occuperà di estrazione/gestione
dell’informazione richiesta dall’utente.
L’interazione tra le due classi avverrà nel seguente modo: quando necessario, la classe
CapViewer invocherà uno dei due metodi della classe MsgParser, a seconda
dell’operazione da effettuare; in figura questa interazione è indicata con una generica
associazione di nome parser. Entrambe le classi faranno parte dello stesso package Java.
Questo significa che sono stati posti alcuni vincoli sull’accessibilità di attributi e metodi
di entrambe le classi. Infatti, mediante i modificatori di accesso – indicati dalle keyword
Java public, protected e private – gli elementi della classe saranno accessibili da
chiunque, se dichiarati public; solo da altri membri del package, se dichiarati protected; e
solo da membri della stessa classe, se dichiarati private. Una trattazione più completa di
metodi e attributi delle classi presenti nel diagramma avverrà nel capitolo 3.
17
3 REALIZZAZIONE
In questo terzo capitolo vengono trattati prima l’utilizzo dell’interfaccia grafica, nel
paragrafo 3.1, e in seguito come funziona internamente l’applicazione, nel paragrafo 3.2.
3.1 Interfaccia grafica
L’interfaccia all’avvio si presenta come in Fig. 9:
Fig. 9: applicazione avviata sull’emulatore facente parte del Java ME SDK
È presente una lista degli elementi contenuti nel segmento principale, cioè <alert> e il
tasto “Exit”, utilizzato per chiudere l’applicazione; per visualizzare il contenuto di un
elemento è necessario evidenziarlo e usare il tasto di selezione del dispositivo.
A seconda del contenuto dell’elemento verrà visualizzata una schermata differente:
• Per elementi contenenti solo informazioni testuali verrà visualizzata una
schermata come in Fig. 10, contenente il nome dell’elemento e il valore che esso
assume; se questo elemento ha più campi al suo interno, essi verranno elencati
come in Fig. 11, ma non sarà possibile interagire con essi.
18
Fig. 10: visualizzazione di un elemento testuale
Fig. 11: visualizzazione di un elemento testuale contenente più campi
• Per elementi composti a loro volta da liste complesse, cioè con elementi
contenenti ulteriori elementi testuali, sarà visualizzata una lista interattiva, come
in Fig. 12,in cui sarà necessario evidenziare e selezionare l’elemento desiderato:
Fig. 12: visualizzazione di un elemento complesso
19
3.2 Implementazione
In questo paragrafo verrà analizzato il funzionamento interno dell’applicazione,
commentando le scelte fatte per entrambe le classi progettate nel paragrafo 2.4. Nella
parte iniziale avverrà la descrizione della gestione delle operazioni dopo l’avvio
dell’applicazione e in seguito si entrerà nel dettaglio dei due moduli che la compongono,
identificabili nelle due classi CapViewer e MsgParser.
3.2.1 Funzionamento generale
Una volta avviata l’applicazione, il costruttore della classe CapViewer inizializzerà le
componenti necessarie a disegnare l’interfaccia grafica iniziale e successivamente fornirà
alla classe MsgParser le informazioni necessarie per individuare il file contenente il
messaggio che si vuole visualizzare. A questo punto, la classe MsgParser potrà accedere
al file rendendolo accessibile alla classe CapViewer, mediante i suoi metodi. Avendo
accesso al file, CapViewer potrà creare una lista degli elementi del primo livello (cioè
contenuti nel segmento <alert>) e renderla visibile sulla schermata corrente
dell’interfaccia grafica. Ora che l’interfaccia è visibile, l’applicazione reagirà solo a
un’azione dell’utente, che potrà scegliere di terminare l’applicazione oppure visualizzare
il contenuto di un elemento della lista appena generata.
3.2.2 La classe CapViewer
Tutti i numeri di linea di codice citati in questo paragrafo riguardano l’Appendice A.
Tralasciando le prime linee contenenti le dichiarazioni delle librerie da importare, si
ponga attenzione alle linee [10,18], contenenti le dichiarazioni delle variabili utilizzate in
seguito. L’unica variabile inizializzata è file, con la stringa contenente l’indirizzo della
risorsa. La variabile è stata inizializzata in questo modo perché l’individuazione e il
recupero dell’indirizzo della risorsa non sono tra gli obbiettivi del presente sviluppo.
All’interno del costruttore della classe – linee [20,29] – avviene l’inizializzazione delle
variabili necessarie per la gestione dell’interfaccia grafica. Segue il metodo
startApp(), al cui interno viene acquisito il controllo dello schermo del dispositivo su
cui è eseguita l’applicazione; inoltre alla linea [34] viene chiamata la classe MsgParser a
cui viene fornito l’indirizzo della risorsa su cui operare. Alle linee [36,37] viene creata la
lista degli elementi contenuti nel segmento <alert> del messaggio, in particolare
20
invocando il metodo parseElement(null, 1). Il significato dei parametri sarà
spiegato in seguito.
In questa parte verrà trattato il metodo commandAction(Command c,
Displayable d): viene attivato ogni volta che si verifica un evento su uno dei
componenti di tipo Command presenti in un componente di tipo Displayable e al suo
interno avvengono una serie di controlli su quale dei suddetti componenti ha originato
l’evento. Comprende la gestione di:
• Utilizzo del tasto “Exit” che porta a terminare l’applicazione.
• Selezione di un elemento di una lista, con gestione differente per elementi
differenti e appartenenti a diverse liste.
• Utilizzo del tasto “Back” per tornare alla visualizzazione precedente.
La parte più complessa e articolata è la gestione della selezione di un elemento di una
lista perché le operazioni da eseguire, oltre a dipendere dalla specifica lista, dipendono
anche da quale elemento viene scelto. Per alcuni sarà sufficiente mostrarne il contenuto in
un apposito componente grafico, per altri sarà necessario creare una nuova lista.
3.2.3 La classe MsgParser
Tutti i numeri di linea di codice citati in questo paragrafo riguardano l’Appendice B.
Le prime linee anche qui sono dedicate alla dichiarazione delle librerie necessarie per
permettere la regolare esecuzione. Seguono le dichiarazioni degli attributi di questa
classe. Questa classe espone i seguenti metodi, accessibili solamente all’interno del
package CapViewer grazie all’utilizzo del modificatore d’accesso protected: void
MsgParser(String filename) e String[] parseElement(String
el_name, int level).
Il primo metodo è il costruttore della classe e riceve come parametro, sotto forma di
stringa di caratteri, l’indirizzo dal quale recuperare la risorsa. Nell’intervallo di linee di
codice che va dalla linea [21] alla [32] viene utilizzato un costrutto try-catch nel quale
avviene un tentativo di aprire un canale di comunicazione verso il file contenente il
messaggio e, nel caso non dovesse andare a buon fine e fosse sollevata un’eccezione di
input/output, viene specificata la gestione dell’eccezione. La gestione dell’eccezione è
rimasta volutamente generica e allo stato attuale non fornisce nessuna notifica tramite
21
interfaccia grafica perché l’indirizzo viene fornito in maniera forzata (cfr. §3.2.2)
all’applicazione. In un eventuale sviluppo futuro in cui la risorsa sarà indicata dall’utente,
potrà essere implementata una gestione più specifica delle eccezioni. Invece nel caso in
cui si riesca ad avere accesso alla risorsa, viene estratto il suo elemento radice e associato
alla variabile root.
Creata un’istanza della classe MsgParser, sarà disponibile il metodo String[]
parseElement(String el_name, int level) per estrarre elementi dal
messaggio di allerta. Questo metodo accetta come parametri il nome dell’elemento che si
vuole estrarre (ricavato dalla selezione sulla lista corrente) e il livello della lista sulla
quale avviene la selezione (il livello è determinato dalla posizione che ha all’interno del
documento l’elemento che ha generato la lista); il metodo restituisce come risultato un
array di stringhe.
La scelta del tipo di variabile da restituire è basata sul fatto che nella gerarchia delle
classi che compongono la libreria LCDUI utilizzata per la parte grafica, è presente il
componente List che dispone di un costruttore che accetta un array di stringhe come
parametro per formare la lista. La possibilità appena descritta è stata valutata una scelta
più conveniente rispetto all’aggiunta di ogni voce della lista singolarmente.
All’interno del metodo parseElement(…), nelle prime due linee si trovano la
dichiarazioni di due variabili: un array di stringhe str_arr e una variabile v_str, di
tipo Vector. La prima serve per restituire il risultato dell’esecuzione del metodo ma non è
possibile crearla e modificarla in maniera dinamica, operazione di cui vi è necessità
perché il numero di elementi da inserire nell’array non è noto a priori in quanto
dipendente dalla scelta dell’utente. Ed è questo il motivo che porta a scegliere una
variabile di tipo Vector, che permette di aggiungere elementi in coda a quelli già presenti
fino al raggiungimento della sua capacità (di default pari a 10) e una volta raggiunta la
capacità corrente, viene raddoppiata. In alternativa è prevista la possibilità di specificare
capacità iniziale e la quantità di nuovi elementi da aggiungere al raggiungimento della
capacità specificata.
Nella parte successiva del metodo si trova la gestione dell’estrazione dell’elemento
selezionato. Questa sezione del codice organizzata in modo che il primo controllo venga
fatto sul livello della lista in cui è avvenuta la selezione – linee [39] e [65] – per poter
22
trattare opportunamente le possibili selezioni su ognuna di esse. Se la lista che ha
generato l’evento è di livello 1, allora vengono fatti una serie di ulteriori controlli sul
nome dell’elemento. Il primo controllo consiste nel verificare se il nome non è specificato
(ossia il parametro assume valore null) allora significa che bisogna generare la lista
degli elementi contenuti nella radice. Questa operazione viene fatta scorrendo tutto il
contenuto della radice e selezionando solo gli elementi XML (la libreria kXML prevede
dei valori fissi con cui confrontare il tipo dell’elemento). I controlli successivi sono
utilizzati per trovare ed estrarre il contenuto dell’elemento, il cui nome è stato passato
mediante l’apposito parametro el_name. Una volta estratto viene aggiunto alla variabile
v_str. Un controllo è destinato in maniera specifica alla selezione della voce <info>:
infatti questo segmento contiene a sua volta più elementi e viene ricavato solo il nome di
ciascun elemento e aggiunto a v_str, in modo da raccogliere le voci che comporranno
la lista da cui effettuare la selezione.
Se la selezione avviene su una lista di livello 2 il procedimento è simile: viene estratto
il contenuto dell’elemento selezionato e aggiunto a v_str. Gli elementi che godono di
una gestione particolare sono <eventCode>, <parameter>, <resource> e <area>. I primi
due contengono due attributi, di cui viene estratto il nome e il valore, aggiungendoli alla
variabile Vector. I secondi richiedono un’operazione più complessa simile a quella messa
in atto per <info>, perché contengono al loro interno un elenco di elementi di cui bisogna
ricavare il nome e il contenuto. La differenza rispetto a <info> sta nel fatto che anziché
creare una lista interattiva, viene generata una lista che mostra il nome e il contenuto
contemporaneamente.
Effettuati tutti i controlli necessari e debitamente arricchita la variabile Vector v_str,
quest’ultima avrà una dimensione che rimarrà fissa per la corrente esecuzione del metodo.
Quindi alle linee [124,126] avviene il trasferimento del contenuto di v_str nell’array
str_arr, che verrà restituito come risultato dell’esecuzione del metodo.
23
4 CONCLUSIONI
In questo capitolo verrà verificato se gli obiettivi che sono stati fissati nel capitolo 1 e
sviluppati nella fase di progettazione sono stati raggiunti. L’obiettivo primario era, a
partire dallo studio del protocollo CAP, la creazione di una applicazione in grado di
gestire un messaggio di allerta formato secondo il suddetto protocollo.
Il risultato raggiunto è un prototipo, infatti non è destinato all’utilizzo nella forma in
cui si trova ma necessita di alcune aggiunte e migliorie, che verranno illustrate tra breve.
Il prototipo nel suo insieme è composto da due classi che si occupano sia della gestione
della parte grafica, sia della manipolazione ed estrazione del contenuto del messaggio.
Riprendendo i requisiti esposti nel paragrafo 2.2, bisogna fare alcune considerazioni:
1. Gestione ed estrazione di informazioni da un documento XML:
questo requisito è stato parzialmente soddisfatto perché l’applicazione è in grado
di scorrere il documento XML con il quale viene formato il messaggio di allerta,
ma allo stato attuale non è sempre in grado di gestire correttamente la presenza di
occorrenze multiple di uno stesso elemento.
2. Indipendenza dalla piattaforma di esecuzione:
questo requisito è stato rispettato, infatti avendo utilizzato Java come linguaggio
per lo sviluppo è possibile servirsi del prototipo sviluppato su tutti i dispositivi che
possono adoperare la Java Virtual Machine, necessaria per interpretare ed eseguire
il codice Java.
3. Necessità di esecuzione su dispositivi mobili:
la scelta di utilizzare il linguaggio Java, in particolare nella versione dedicata ai
dispositivi mobili (Java ME [5]), permette l’esecuzione dell’applicazione su
dispositivi mobili. Sono state effettuate alcune prove sullo smartphone Sony-
Ericsson P1i ed è stata rilevata qualche incongruenza nella parte di interfaccia
grafica, rispetto all’emulatore utilizzato durante lo sviluppo. Queste incongruenze
sono dovute al fatto che le impostazioni del dispositivo possono sovrapporsi a
quelle specificate dall’applicazione in esecuzione.
24
Il prodotto del presente lavoro è, come in precedenza detto, un prototipo.
Nell’eventualità di proseguirne lo sviluppo, possiamo individuare alcune aggiunte o
migliorie che si potrebbero apportare. Innanzitutto è necessario rendere il modulo di
gestione del messaggio di allerta capace di gestire occorrenze multiple degli elementi del
messaggio, in modo da evitare problemi di visualizzazione qualora si presentasse un
messaggio contenente più occorrenze di alcuni elementi.
Allo stato attuale il file contenente il messaggio viene fornito in maniera forzata
all’applicazione, includendolo nei file che compongono l’eseguibile. Nel caso in cui si
decida di distribuire l’applicativo a più utenti questa soluzione non è più percorribile e
sarà necessario sviluppare un’alternativa alla situazione quella appena descritta. Una
possibile soluzione potrebbe essere permettere all’utente la selezione del messaggio da
visualizzare.
Un ulteriore sviluppo potrebbe essere restituire in formato grafico le informazioni
contenute nel messaggio di allerta, in modo che l’utente possa capire più rapidamente
quale area è interessata dall’evento e se potrebbe trovarsi coinvolto. A sfavore della
visualizzazione grafica potrebbero influire le risorse limitate di cui potrebbe disporre il
dispositivo mobile utilizzato.
Ringraziamenti
Un caloroso ringraziamento va alla mia famiglia e al dottor Ugo Cheracci che hanno
condiviso gioie e dolori di questo percorso di studi, insieme agli insostituibili compagni
di studio Andrea e Cristian.
Un grazie particolarmente affettuoso è per Claudia che mi ha incoraggiato nella parte
finale e più impegnativa del suddetto percorso.
E infine grazie alla professoressa Raffaela Cefalo e all’astrofisica Claudia Paparini per
il lavoro svolto assieme.
25
Appendice Apackage CapViewer; 1 2 import javax.microedition.lcdui.*; 3 import javax.microedition.midlet.*; 4 5 /** 6 * @author simonemaver 7 */ 8 public class CapViewer extends MIDlet implements CommandListener{ 9 private String file = "/files/ex2.xml"; 10 private MsgParser parser; 11 12 protected Display display; 13 protected List select1, select2, select3; 14 protected Form frm, frm2; 15 protected StringItem si, si2; 16 protected Command exitCmd; 17 protected Command backCmd; 18 19 public CapViewer(){ 20 exitCmd = new Command("Exit", Command.EXIT, 2); 21 backCmd = new Command("Back", Command.BACK, 2); 22 frm = new Form(""); 23 frm2 = new Form(""); 24 si = new StringItem("", ""); 25 si2 = new StringItem("", ""); 26 frm.append(si); 27 frm2.append(si2); 28 } //costructor 29 30 public void startApp(){ 31 display = Display.getDisplay(this); 32 33 parser = new MsgParser(file); // from source file create a MsgParser object 34 // create list containing the tags of the first level of CAP message 35 select1 = new List("Message Content: ", List.IMPLICIT, 36 parser.parseElement(null,1), null); 37 select1.addCommand(exitCmd); 38 select1.setFitPolicy(Choice.TEXT_WRAP_ON); 39 select1.setCommandListener(this); 40 display.setCurrent(select1); 41 frm.addCommand(backCmd); 42 frm.setCommandListener(this); 43 frm2.addCommand(backCmd); 44 frm2.setCommandListener(this); 45 } 46 47 public void pauseApp(){} 48 49 public void destroyApp(boolean unconditional){} 50 51 public void commandAction(Command c, Displayable d){ 52 // manage command events on Displayables like Form 53 if(c == exitCmd){ 54 destroyApp(false); 55 notifyDestroyed(); 56 } 57 if(c == List.SELECT_COMMAND){ // manage selection on a list 58 int list_level; 59 if(d == select1){ // if first level list is displayed 60 list_level = 1; // set the level of the selection 61 String selection = select1.getString(select1.getSelectedIndex()); 62 // get the text of the selected entry 63 if(selection.equals("info")){ 64 // info contains complex tags: a list of these tags will be created and shown 65 select2 = new List(selection.toUpperCase(), List.IMPLICIT, 66 parser.parseElement(selection, list_level), null); 67 select2.addCommand(backCmd); 68 select2.setFitPolicy(Choice.TEXT_WRAP_ON); 69 select2.setCommandListener(this); 70 display.setCurrent(select2); 71 } else{ 72 // for text-only tags a StringItem will be filled with tag content and shown 73 si.setLabel(selection); 74 si.setText(parser.parseElement(selection, list_level)[0]); 75
26
display.setCurrent(frm); 76 } 77 } else if(d == select2){ // if second level list is displayed 78 list_level = 2; // set the level of the selection 79 String selection2 = select2.getString(select2.getSelectedIndex()); 80 // get the text of the selected entry 81 if(selection2.equals("eventCode") || selection2.equals("parameter")){ 82 // eventCode & parameter contain more than one text-only tags 83 si2.setLabel(selection2 + "\n"); 84 // set on a StringItem all the tags and their contents 85 String str = ""; 86 for(int i = 0; i < parser.parseElement(selection2, list_level).length; 87 i++){ 88 str += parser.parseElement(selection2, list_level)[i]; 89 } 90 si2.setText(str); 91 display.setCurrent(frm2); 92 } else if(selection2.equals("resource") || selection2.equals("area")){ 93 // resource & area contain complex tags: a list will be created and shown 94 select3 = new List(selection2.toUpperCase(), List.IMPLICIT, 95 parser.parseElement(selection2, list_level), null); 96 select3.addCommand(backCmd); 97 select3.setFitPolicy(Choice.TEXT_WRAP_ON); 98 select3.setCommandListener(this); 99 display.setCurrent(select3); 100 } else{ 101 // for text-only tags a StringItem will be filled with tag content and shown 102 si2.setLabel(selection2); 103 si2.setText(parser.parseElement(selection2, list_level)[0]); 104 display.setCurrent(frm2); 105 } 106 } 107 } 108 if(c == backCmd){ // manage back-command events 109 if(d == frm || d == select2){ 110 display.setCurrent(select1); 111 } 112 if(d == frm2 || d == select3){ 113 display.setCurrent(select2); 114 } 115 } 116 } 117 } // class CapViewer118
27
Appendice B package CapViewer; 1 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.util.Vector; 6 import org.kxml.Xml; 7 import org.kxml.kdom.*; 8 import org.kxml.parser.*; 9 10 /** 11 * @author simonemaver 12 */ 13 public class MsgParser{ 14 private XmlParser parser = null; 15 private Document doc; 16 private Element root; 17 18 protected MsgParser(String filename){ 19 doc = new Document(); 20 try{ 21 InputStream in = this.getClass().getResourceAsStream(filename); 22 InputStreamReader is = new InputStreamReader(in); 23 parser = new XmlParser(is); 24 doc.parse(parser); 25 parser = null; 26 } catch(IOException ioe){ 27 System.err.println(ioe); 28 ioe.printStackTrace(); 29 parser = null; 30 doc = null; 31 } 32 root = doc.getRootElement(); 33 } 34 35 protected String[] parseElement(String el_name, int level){ 36 String[] str_arr = null; // string array for return results 37 Vector v_str = new Vector(); // vector for dynamic creation of results 38 if(level == 1){ // entered when user make choice on a first level list 39 if(el_name == null){ // used for alert element parsing 40 for(int i = 0; i < root.getChildCount(); i++){ 41 // to scroll through items that do concern us: 42 if(root.getType(i) == Xml.ELEMENT){ 43 // extracts the useful elements and add it to the Vector 44 v_str.addElement(root.getElement(i).getName()); 45 } 46 } // for(int i... 47 // if el_name is a only-text element: 48 } else if(root.getElement(el_name).getType(0) == Xml.TEXT){ 49 // extract the content and add it to the Vector 50 v_str.addElement(root.getElement(el_name).getText()); 51 } else if(el_name.equals("info")){ // if el_name is a info element 52 for(int j = 0; j < root.getElement("info").getChildCount(); j++){ 53 // to skip items that do not concern us: 54 if(root.getElement("info").getType(j) != Xml.ELEMENT){ 55 continue; 56 } 57 if(root.getElement("info").getElement(j).getType(0) == Xml.TEXT){ 58 v_str.addElement(root.getElement("info").getElement(j).getName()); 59 continue; 60 } 61 v_str.addElement(root.getElement("info").getElement(j).getName()); 62 } // for(int j... 63 } // else if(el_name.equals("info"))... 64 } else if(level == 2){ // entered when user make choice on a second level list 65 // if el_name is a only-text element: 66 if(root.getElement("info").getElement(el_name).getType(0) == Xml.TEXT){ 67 v_str.addElement(root.getElement("info").getElement(el_name).getText()); 68 // processes complex elements that contain only-text elements: 69 } else if(el_name.equals("eventCode") || el_name.equals("parameter")){ 70 for(int i = 0; i < 71 root.getElement("info").getElement(el_name).getChildCount(); i++){ 72 if(root.getElement("info").getElement(el_name).getType(i) != 73 Xml.ELEMENT){ 74
28
continue; 75 } 76 // if el_name is a only-text element: 77 78 if(root.getElement("info").getElement(el_name).getElement(i).getType(0) == Xml.TEXT){ 79 v_str.addElement("-" + 80 root.getElement("info").getElement(el_name).getElement(i).getName() + ": "); 81 82 v_str.addElement(root.getElement("info").getElement(el_name).getElement(i).getText() + 83 "\n"); 84 continue; 85 } 86 } // for(int i... 87 // processes complex elements that contain other complex elements: 88 } else if(el_name.equals("resource") || el_name.equals("area")){ 89 for(int i = 0; i < 90 root.getElement("info").getElement(el_name).getChildCount(); i++){ 91 if(root.getElement("info").getElement(el_name).getType(i) != 92 Xml.ELEMENT){ 93 continue; 94 } 95 96 if(root.getElement("info").getElement(el_name).getElement(i).getType(0) == Xml.TEXT){ 97 98 v_str.addElement(root.getElement("info").getElement(el_name).getElement(i).getName() + ":" 99 + 100 root.getElement("info").getElement(el_name).getElement(i).getText()); 101 continue; 102 } 103 104 v_str.addElement(root.getElement("info").getElement(el_name).getElement(i).getName()); 105 for(int j = 0; j < 106 root.getElement("info").getElement(el_name).getElement(i).getChildCount(); j++){ 107 108 if(root.getElement("info").getElement(el_name).getElement(i).getType(j) != Xml.ELEMENT){ 109 continue; 110 } 111 112 if(root.getElement("info").getElement(el_name).getElement(i).getElement(j).getType(0) == 113 Xml.TEXT){ 114 v_str.addElement("-" + 115 root.getElement("info").getElement(el_name).getElement(i).getElement(j).getName() + ": " 116 + root.getElement("info").getElement(el_name).getElement(i).getElement(j).getText()); 117 continue; 118 } 119 } // for(int j... 120 } // for(int i... 121 } // if(el_name.equals("resource")... 122 } // if(level == 2) 123 str_arr = new String[v_str.size()]; // conversion Vector to String[] 124 for(int i = 0; i < v_str.size(); i++){ 125 str_arr[i] = (String)v_str.elementAt(i); 126 } 127 return str_arr; 128 } // method parseElement 129 } // class MsgParser 130
29
Bibliografia [1] Edward Bryant, "Introduction to Natural Hazards," in Natural Hazards, 2nd ed.
Wollongong, New South Wales, Australia: Cambridge University Press, New York.
[2] UNISDR. United Nations International Strategy for Disaster Reduction —
Terminology. [Online].
http://www.preventionweb.net/english/professional/terminology/v.php?id=503
[3] Federal Communications Commission, governo USA. [Online].
http://www.fcc.gov/cgb/consumerfacts/eas.html
[4] OASIS, "Common Alertin Protocol version 1.2," OASIS, Techinal Committee
Standard Specifications 2010.
[5] Oracle. Java ME - the Most Ubiquitous Application Platform for Mobile Devices.
[Online]. http://www.oracle.com/technetwork/java/javame/overview/index.html
[6] Oracle. Oracle Technology Network for Java Developers. [Online].
http://www.oracle.com/technetwork/java/index.html
[7] kXML. [Online]. http://kxml.objectweb.org/software/downloads/
Indice delle figure Fig. 1: numero di eventi disastrosi rilevati tra il 1900 e il 2001 nel mondo [1]. ................... 3!Fig. 2: eventi disastrosi tra il 1998 e il 2009, nei paesi membri del EEA (European
Environment Agency). ......................................................................................................... 4!Fig. 3: perdite umane tra il 1998 e il 2009, nei paesi membri del EEA (European
Environment Agency). ......................................................................................................... 4!Fig. 4: perdite economiche complessive tra il 1998 e il 2009, nei paesi membri del EEA. 5!Fig. 5: ciclo di gestione delle calamità. ................................................................................ 5!Fig. 6: schema di gestione delle informazioni a seguito di una calamità ............................ 6!Fig. 7: struttura del messaggio di allerta (fonte OASIS [4]) ................................................ 11!Fig. 8: diagramma delle classi ........................................................................................... 15!Fig. 9: applicazione avviata sull’emulatore facente parte del Java ME SDK .................... 17!Fig. 10: visualizzazione di un elemento testuale ............................................................... 18!Fig. 11: visualizzazione di un elemento testuale contenente più campi ............................ 18!Fig. 12: visualizzazione di un elemento complesso ........................................................... 18!
Esempio 1: codice XML di un messaggio di allerta conforme al CAP (fonte: OASIS [4]) 14
top related