UNIVERSITA’ POLITECNICA DELLE MARCHE FACOLTA’ DI INGEGNERIA Corso di Laurea in Ingegneria Informatica e dell'Automazione Dipartimento di Elettronica, Intelligenza Artificiale e Telecomunicazioni PROGETTO E SVILUPPO DI UN SOFTWARE IN "JAVA" PER LA TELEREFERTAZIONE: SEZIONE AMMINISTRATIVA E FORMATI PER LA TRASMISSIONE DI DATI BIOMEDICI Tesi di Laurea di: Francesco Pongetti Relatore: Prof. Aldo Franco Dragoni Correlatore: Prof. Paolo Puliti Anno Accademico 2007-2008 Alla mia famiglia per il suo supporto morale e per avermi permesso di studiare A Raffaella perché senza la sua presenza arrivare fin qua sarebbe stato molto più difficile Un ringraziamento speciale al Prof. Aldo Franco Dragoni e a tutti i miei compagni con cui ho svolto il tirocinio INDICE INDICE ......................................................................................................... - 2 CAPITOLO 1. Telemedicina & Telerefertazione ......................................... - 4 1.1 Introduzione .......................................................................................... - 4 1.2 Telemedicina ......................................................................................... - 5 1.3 Vantaggi................................................................................................ - 6 1.4 Problematiche........................................................................................ - 8 1.5 Telerefertazione ................................................................................... - 10 CAPITOLO 2. Medical Telereporting System............................................ - 12 2.1 Introduzione ........................................................................................ - 12 2.2 Struttura e funzionamento.................................................................... - 14 2.3 Tecnologie utilizzate............................................................................ - 20 2.3.1 Java............................................................................................... - 23 2.3.1.1 Perché Java ............................................................................ - 26 2.3.1.2 Java Servlet: Tomcat .............................................................. - 28 2.3.2 Google Web Toolkit...................................................................... - 30 2.3.2.1 Funzionamento del GWT ....................................................... - 33 2.3.2.2 GWT-Ext ............................................................................... - 38 2.3.2.3 Altri vantaggi nell’uso del Google Web Toolkit ..................... - 38 2.3.3 MySQL......................................................................................... - 40 2.3.4 Altre librerie e strumenti utilizzati................................................. - 40 CAPITOLO 3. Sezione Amministrativa...................................................... - 42 3.1 Introduzione ........................................................................................ - 42 3.2 Manager & Super-Admin..................................................................... - 43 3.3 Funzionalità......................................................................................... - 45 3.4 Realizzazione tecnica........................................................................... - 48 3.4.1 Struttura, componenti e classi Java................................................ - 48 3.4.1.1 Admin.java............................................................................. - 50 3.4.1.2 Registration.java, RegistrationRMImpl.java ........................... - 54 - -2- 3.4.1.3 ListaUser.java, ListaUserRMImpl.java................................... - 62 3.4.1.4 ModRegistration.java, ModRegistrationRSImpl.java.............. - 69 3.4.1.5 UserArea.java, UserAreaRSImpl.java..................................... - 70 3.4.2 Struttura dei dati nel database........................................................ - 73 3.4.3 Gestione della sessione ................................................................. - 75 3.5 Problematiche di sicurezza................................................................... - 79 3.5.1 SSL e Login.................................................................................. - 79 3.5.2 Sicurezza del database................................................................... - 80 CAPITOLO 4. Dati Biomedici.................................................................... - 82 4.1 Dati biomedici ..................................................................................... - 82 4.2 DICOM ............................................................................................... - 83 4.2.1 Struttura dei file ............................................................................ - 85 4.3 Software open source........................................................................... - 88 4.4 Standard ECG...................................................................................... - 92 CAPITOLO 5. Conclusioni ......................................................................... - 94 5.1 Migliorare Medtel................................................................................ - 94 5.1.1 Compatibilità con i browsers......................................................... - 95 5.1.2 Velocità di esecuzione................................................................... - 97 5.1.3 Usabilità ....................................................................................... - 99 5.2 Integrazione....................................................................................... - 101 5.2.1 Servizi medici per altri software.................................................. - 101 5.2.2 Visualizzatori di dati biomedici................................................... - 102 5.2.3 Dispositivi medici ....................................................................... - 103 5.3 Conclusioni ....................................................................................... - 103 Bibliografia .................................................................................................- 106 - -3- CAPITOLO 1 Telemedicina & Telerefertazione 1.1 Introduzione Il continuo sviluppo delle tecnologie informatiche e telematiche, nonché il progressivo allargamento del bacino di utenti in grado di accedere ad esse, ha aperto ad un gran numero di nuove possibilità e prospettive. A partire dagli anni ’70 la rivoluzione informatica ha cominciato ad entrare con prepotenza in un numero sempre maggiore di settori industriali, commerciali e civili, investendo anche quegli ambienti che, allora, apparivano concettualmente non adatti ad essere reinterpretati in chiave informatica. I dispositivi di calcolo nascono con lo scopo di agevolare l’esecuzioni di compiti e nel tempo si è visto che esistono innumerevoli ambienti in cui i computer possono dare un sostanzioso contribuito. Detto questo, non si può fare a meno di osservare che la “rivoluzione digitale”, utilizzando un’espressione coniata da Nicholas Negroponte, non ha solamente permesso di eseguire più velocemente un gran numero di operazioni, ma ha anche avuto il merito di creare nuove possibilità impensabili in epoca preinformatica. Durante il lavoro di tirocinio ci si è potuti confrontare proprio con uno di questi nuovi orizzonti: la telemedicina. Il tirocinio ed il conseguente lavoro di tesi è stato totalmente incentrato su questa importante tematica e, di conseguenza, appare naturale spendere questo primo capitolo in un’introduzione all’argomento. Nei paragrafi successivi verranno quindi fornite molte informazioni per aiutare il lettore a farsi un quadro completo -4- ed accurato di cosa s’intenda oggi per telemedicina, quali siano i suoi vantaggi e svantaggi, nonché lo stato attuale dei lavori in questo campo. Nei capitoli due e tre invece verrà descritto il frutto del nostro lavoro di ricerca in campo telemedico: Medical Telereporting System. Medical Telereporting System è un software completo, sviluppato da noi durante il periodo di tirocinio, per risolvere uno specifico problema di telemedicina: la telerefertazione. Di seguito quindi, verrà trattato nel dettaglio anche questo specifico tema. 1.2 Telemedicina Si può cominciare ad affrontare l’argomento dando una definizione intuitiva del termine: la telemedicina è l'insieme di tecniche mediche ed informatiche che permettono la cura di un paziente a distanza o più in generale di fornire servizi sanitari in remoto. La telemedicina è il frutto del connubio di diverse tecnologie in rapido sviluppo che consentono di trasferire informazioni mediche a distanza attraverso il telefono, Internet o altri tipi di network, allo scopo di ottenere consulenze specialistiche o addirittura, a volte, per eseguire procedure mediche senza che il personale si trovi fisicamente nel luogo di residenza del paziente. In generale per telemedicina si possono intendere un’estrema eterogeneità di situazioni: dalla semplice conversazione telefonica tra due specialisti che si occupano del medesimo paziente o casi molto più complessi che coinvolgono tecnologie satellitari, apparati di videoconferenza e bracci meccanici controllati in real-time. Il concetto più importante che bisogna tenere a mente, è comunque lo stretto collegamento esistente tra scienza medica, tecnologia, informatica e telematica che si crea in ambito telemedico. -5- Guardando alla storia e allo sviluppo della telemedicina si può vedere che dei tentativi di curare pazienti a distanza erano già stati compiuti prima della rivoluzione informatica. Esiste infatti un lungo elenco di casi documentati di pazienti dell’800, guariti in seguito alle cure prescritte e inoltrate tramite la tradizionale posta cartacea, da specialisti risiedenti in altre città. Attualmente comunque quando si parla di telemedicina, si sottende sempre l’utilizzo di tecnologie informatiche ed è proprio questa eccezione del termine che verrà considera valida nel corso della trattazione. Per sottolineare l’importanza dell’argomento di cui si sta discutendo vale la pena citare alcuni lavori che la ricerca italiana ha prodotto proprio in tale ambito. I primi esperimenti di telemedicina sono stati condotti in Italia, per permettere un’adeguata assistenza nelle aree geografiche più remote o in situazioni disagiate (perforazioni petrolifere su piattaforma off-shore, spedizioni artiche) ed in particolare hanno riguardato la trasmissione sperimentale di elettrocardiogrammi a distanza, iniziata nel 1976, utilizzando le normali linee telefoniche. In seguito, negli anni ottanta, la SIP lanciò un vero e proprio “cardiotelefono”. Da allora, gli enti di ricerca, le università, le società scientifiche, il Consiglio Nazionale Ricerche (CNR) ed il Ministero della Sanità, lavorando a diversi progetti (ad esempio quelli strategici/speciali del CNR: “Sistemi Esperti in Medicina”, “Sistemi Informatici in Biomedicina”, “Robotica in chirurgia”, ecc.), hanno portato alla crescita esponenziale dei servizi disponibili, con 12.000 pazienti teleassistiti all’anno e 50 aziende operanti in questo settore (dati del 2002). 1.3 Vantaggi I vantaggi di cui la pratica medica può beneficiare grazie all’introduzione delle tecnologie legate alla telemedicina, dovrebbero risultare evidenti fin -6- dalla breve analisi iniziale svolta nei paragrafi precedenti. Si vuole fin da subito mettere in risalto uno degli aspetti che hanno promosso maggiormente gli investimenti, pubblici e privati, in tecnologie di questo tipo: i risparmi sui costi. La possibilità di effettuare diagnosi oppure analisi a distanza infatti, permette di diminuire notevolmente i costi legati alla delocalizzazione delle strutture sanitarie. Grazie alla telemedicina si può quindi pensare di concentrare il personale medico in pochi poli più grandi, avendo così tutti i vantaggi dati da effettive economie di scala. Allo stesso tempo però, i risparmi non si traducono in una diminuzione dei servizi per i pazienti, ma anzi, si potrebbe avere una copertura talmente capillare del territorio, da arrivare fino alle case dell’utenza attraverso i collegamenti a banda larga sempre più diffusi al giorno d’oggi. Oltre ai risparmi sul personale, specialmente quello medico, si può ottenere un ulteriori contenimento dei costi grazie alla minore necessità di complesse macchine per la diagnosi. Si può infatti decidere di acquistare una strumentazione magari più complessa, ma in quantità inferiori, ed utilizzando delle apparecchiature dalle funzionalità e dai costi più ridotti collegarsi alle prime da postazioni remote. La telemedicina non offre, naturalmente, solo dei vantaggi legati al contenimento dei costi, ma esistono molte altre ragioni che dovrebbero spingere verso una diffusione rapida di queste tecnologie. Ad esempio, si pensi alla situazione di pazienti affetti da patologie molto rare che non possono accedere alle cure di specialisti del settore perché impossibilitati a trasferirsi, anche a causa di ragioni economiche, e che quindi non possono ottenere un consulto importante. Attraverso la telemedicina, il medico curante di questi pazienti potrebbero richiedere un consulto a distanza da parte dello specialista, con evidenti vantaggi per i pazienti stessi. Ulteriori situazioni in cui si evidenziano i pregi dell’uso delle telemedicina, sono quelle in cui si deve far fronte alla cura e all’assistenza di persone che -7- vivono in paesi economicamente disagiati. Alcuni villaggi africani sono degli esempi lampanti di come l’introduzione di semplici infrastrutture telematiche (collegamenti dial-up), hanno permesso un notevole aumento della qualità di vita delle persone malate. Grazie a queste infrastrutture iniziali infatti, si è potuto accedere ai servizi di diagnostica sperimentale a distanza, messi in piedi da alcuni centri di ricerca situati nel ricco Occidente. In questo modo, zone estremamente povere hanno goduto dell’assistenza di personale specializzato, notevolmente carente in quasi tutto il territorio del continente africano. Il software sviluppato in fase di tirocinio nasce proprio per inserirsi nel contesto di aiuto ai paesi più deboli. Le soluzioni tecniche adottate sono infatti, il frutto di precise considerazioni su questo tema e sono state formulate anche grazie al contributo dato dallo studio in luogo delle esigenze di determinati ambienti più disagiati. Per finire la carrellata di ragioni a favore della telemedicina, bisogna segnalare anche l’utilizzo di questa per scopi didattici, anche se in questo caso sarebbe più giusto parlare di e-learning. La possibilità di seguire corsi in teleconferenza o anche di assistere ad operazioni chirurgiche eseguite da specialisti prestigiosi, è un ottimo modo per poter diffondere le conoscenze mediche in zone disagiate. 1.4 Problematiche A fianco dei risvolti positivi che la telemedicina promette di portare con sè, esistono comunque dei problemi insiti nella pratica telemedica stessa che ne possono compromettere l’uso su larga scala. L’elenco di problematiche legate alla medicina è infatti, abbastanza vasto anche se bisogna subito fare una distinzione tra problemi superabili con maggiori investimenti nel -8- settore e problemi invece, che non possono essere del tutto risolti con le tecnologie attuali. Le infrastrutture necessarie affinché la telemedicina possa essere messa in atto, sono il maggior handicap di questa tecnologia. Si è a lungo dibattuto dei vantaggi di cui i paesi poveri possono godere potendo rivolgersi a personale medico situato all’altro capo del mondo, ma forse non si è sottolineato abbastanza che la diffusione di tecnologie informatiche e soprattutto telematiche in questi paesi è notevolmente carente, impedendo di fatto un vero sviluppo del settore telemedico. Il problema infrastrutturale è un problema sostanzialmente economico e potrebbe essere risolto con una serie mirata di investimenti da parte dei paesi più ricchi. Dall’altro canto però, rappresenta anche una sfida tecnologica per tutto il mondo ingegneristico che è chiamato a costruire dei software e delle strumentazioni capaci di operare anche con risorse estremamente limitate. Appare chiaro comunque, che se si vuole veramente sfruttare i vantaggi della telemedicina a favore dei paesi più disagiati, occorre la volontà di eseguire degli investimenti iniziali. Al contrario si rischierebbe di aumentare ancora una volta il gap esistente tra chi può permettersi le cure più all’avanguardia e chi invece si deve accontentare delle briciole. Il rischio di digital divide e la necessità di expertise complesse rappresenta un altro problema che affligge la telemedicina e che deve essere affrontato. Sempre più spesso le persone si dividono tra quelle che sono in grado di sfruttare i vantaggi legati alle nuove tecnologie e quelle che invece mancano delle conoscenze per poterlo fare. Questo fenomeno prende il nome di digital divide ed è un problema sostanzialmente non economico, ma culturale, anche se spesso le due cose alla fine risultato collegate. La telemedicina deve quindi offrire la possibilità di accedere alle sue prestazioni anche a persone che non hanno delle determinate competenze. Gli studi in questo campo sono stati notevoli e si è arrivati a piattaforme che -9- permettono di fruire di servizi sanitari attraverso la tv digitale terrestre o cellulari, ma comunque resta ancora molto da fare per rendere veramente godibile a tutti l’esperienza telemedica. Non bisogna dimenticarsi inoltre, che queste tecnologie dovranno essere controllate da personale medico, a cui quindi non si può richiedere una competenza informatica troppo elevata. Altre problematiche sono quelle dovute a standard per il trasporto dei dati non completamenti maturi oppure all’opposto troppo vecchi e non adatti allo scopo. Spesso i collegamenti tra due postazioni distanti, si realizzano tramite i normali networks già esistenti, come per esempio Internet. Le comunicazione quindi viaggiano tramite protocolli, quali il TCP/IP, che non sono nati con lo scopo di trasmettere dati sensibili e che soprattutto non rispettano dei requisiti di QoS (quality of service). Questo porta a scenari estremamente inquietanti. Da un lato c’è il rischio che persone non autorizzate intercettino un flusso di dati medici sensibili, attaccando quindi la privacy dei pazienti o peggio modificandoli per i loro scopi, dall’altro gli alti tempi di lag e l’assenza di assicurazione circa la qualità dei collegamenti, impediscono ad esempio di eseguire le pratiche più avanzate come la chirurgia a distanza. Le aziende del settore hanno cercato di far fronte a questi problemi realizzando degli standard ad-hoc adatti ad essere utilizati in situazioni mission-critical come queste. Il gran numero di soggetti operanti nel settore non ha però raggiunto ancora uno standard unico e questo fatto rappresenta l’ultima nota negativa che affligge la telemedicina. 1.5 Telerefertazione Nell’ambito generale delle telemedicina si vuole a questo punto mettere in risalto il tema più specifico delle telerefertazione, che è anche l’argomento - 10 - di cui ci si è occupati nello sviluppo di Medtel. Come si è visto nei paragrafi precedenti, la telemedicina è un campo estremamente vasto, in cui informatica, telecomunicazione, medicina si fondono per raggiungere un’eterogeneità di scopi differenti. La telerefertazione è proprio uno di questi scopi. Per telerefertazioni si intende la possibilità di effettuare diagnosi ed ottenere consulenze mediche a distanza. E’ quindi uno dei cardini fondamentali di tutta la telemedicina. La telerefertazione è la pratica telemedica più semplice da effettuarsi al giorno d’oggi ed è anche probabilmente la più diffusa. E’ infatti una pratica consolidate, ad esempio, l’invio da parte delle strutture sanitarie più piccole, di dati clinici ai laboratori di analisi ubicati nei centri più grandi, affinché questi possano valutarli e dare la loro opinione. Medtel nasce proprio per agevolare situazioni come queste ed in particolare per essere utilizzato in zone disagiate. Lo scopo ultimo dell’applicativo è in definitiva, mettere in contatto medici e pazienti sfruttando le tecnologie telematiche, affinché si possa effettuare una diagnosi. Per far questo è stata allestita un’architettura che permette il trasporto e la memorizzazione dei dati clinici. Come questa sia stata realizzata è oggetto dei prossimi capitoli. - 11 - CAPITOLO 2 Medical Telereporting System 2.1 Introduzione Nel capitolo 1 si è definito cosa s’intende per telerefertazione e come questa venga realizzata al giorno d’oggi. In questo capitolo invece si descriverà il Medical Telereporting System e le tecnologie utilizzate per svilupparlo. Il Medical Telereporting System (d’ora in avanti semplicemente Medtel) nasce con lo scopo di creare un software completo per far fronte alle esigenze di telerefertazione attuali, così come sono state descritte nel capitolo 1. Nello sviluppo di Medtel si è prestata particolare attenzione a quelle che sono le problematiche dei software già sviluppati in passato e quindi si è cercato di realizzare un applicativo il più possibile completo ed usabile. Medtel però non è semplicemente un rivisitazione, magari migliorata e corretta, dei software di telerefertazione già esistenti, ma presenta tratti di sostanziale novità che lo rendono unico nel panorama attuale. L’idea che sta alla base del software e che in questo campo non trova altri riscontri, è l’idea di comunità. Gli utilizzatori di Medtel sono suddivisi in comunità, o gruppi, che comunicano tra di loro e si scambiano servizi di telerefertazione attraverso l’infrastruttura tecnologica fornita da Medtel stesso. Questi gruppi sono essenzialmente tre: medici, richiedenti ed amministratori. A questi tre gruppi se ne aggiunge un quarto, molto più ristretto, con compiti di supervisione e di cui si parlerà più in dettaglio nei capitoli successivi. L’idea di comunità è importante ed innovativa perché cambia completamente i paradigmi classici su cui si basa la telerefertazione. Fin - 12 - dall’inizio la telerefertazione è nata con lo scopo di essere un surrogato “a distanza” del rapporto medico-paziente quotidiano a cui tutti siamo abituati. In questa ottica gli sforzi propesi a migliorare la telerefertazione erano tutti indirizzati a cercare di ridurre gli effetti della distanza tra medico e paziente e rendere la diagnosi tramite queste nuove tecnologie, il più possibile simile a quella che si avrebbe nel caso tradizionale. Medtel invece nasce con lo scopo di sfruttare fino in fondo le tecnologie telematiche per fornire anche servizi innovativi, che non si articolino solamente in una rivisitazione a distanza del rapporto medico-paziente. L’idea di comunità si forma proprio seguendo questa linea innovativa. Perché fornire solamente un software per permettere il rapporto medico-paziente a distanza, quando si può fornire ai pazienti un’intera comunità di dottori? Nei paragrafi successivi sarà spiegato più in dettaglio lo schema di funzionamento e la struttura del Medical Telereporting System che si è sviluppato. Schermata principale (Screenshot tratto da Medtel) - 13 - 2.2 Struttura e funzionamento Come già messo in luce nell’introduzione, l’idea che sta alla base di Medtel è quella di comunità. In Medtel gli utenti sono suddivisi in tre gruppi principali: medici, richiedenti ed amministratori. Ogni gruppo riveste un ruolo all’interno del sistema complessivo e presenta delle caratteristiche peculiari. I richiedenti rappresentano le strutture sanitarie sparse nel globo che hanno bisogno di servizi di telerefertazione e telemedicina. I medici sono, naturalmente, gli individui chiamati a mettere a disposizione la loro esperienza medica e le loro competenze ai richiedenti. Infine, gli amministratori sono invece coloro che supervisionano il funzionamento di Medtel ed hanno il compito di gestire i permessi di accesso ai servizi da parte degli altri utenti. I richiedenti sono un tramite tra i pazienti veri e propri ed i dottori. I richiedenti possono essere degli ospedali che gestiscono un gran numero di pazienti, oppure semplicemente delle piccole comunità agricole africane. In generale comunque i richiedenti sono delle strutture sanitarie che nell’ipotesi più complessa potrebbero aver bisogno di prestazioni per un gran numero di pazienti. Alla luce di questo, è apparso chiaro fin da subito che il software di telemedicina in fase di sviluppo, dovesse permettere una facile gestione di un gran numero di pazienti, e che questa dovesse essere la più intuita ed agile possibile, soprattutto per permettere la fruizione dei servizi anche da parte di un personale non molto orientato alle tecnologie informatiche. La soluzione è stata trovata nella trasposizione informatica dell’intuitivo concetto di cartella clinica a cui tutti siamo abituati. Medtel infatti permette ai richiedenti di compilare per ogni loro paziente, una cartella clinica “virtuale” in cui sono contenuti tutti i parametri fisici e medici del soggetto in esame. In questa cartella clinica virtuale finiscono anche i dati storici sulle prestazioni richieste attraverso Medtel per il - 14 - paziente stesso. In questo modo i richiedenti possono avere facilmente un quadro completo dello stato medico del paziente e contemporaneamente questa strutturazione offre un facile accesso ai dati. Anche con questo tipo di struttura comunque, l’archivio dei dati clinici può diventare molto esteso e contenere una mole notevole di informazioni. Con centinaia o addirittura migliaia di pazienti in archivio, anche il semplice ritrovare di un dato importante, può diventare un compito arduo. Per far fronte a queste problematiche, si è pensato bene di mettere a disposizione dei richiedenti una comoda interfaccia per la ricerca dei pazienti attraverso i dati anagrafici. Cartella clinica di un paziente (Screenshot tratto da Medtel) Detto come vengano gestiti i dati clinici dei pazienti, bisogna definire come Medtel gestisca il processo di telerefertazione vero e proprio, cioè come si articoli il servizio principale per il quale è stato sviluppato. Per far questo bisogna prima parlare brevemente di come sia stata sviluppata la parte - 15 - concernente il personale medico. Medtel parte dal presupposto che i medici che offrono le loro competenze siano degli specialisti in particolari campi della medicina e non dei dottori generici di base. Questa ipotesi nasce dalla constatazione di quelli che sono gli scopi per il quale nasce il software stesso, cioè offrire dei servizi di telerefertazione e quindi dei consulti altamente specializzati per particolari problematiche mediche. Quando si definisco le credenziali di accesso per un nuovo medico quindi, oltre ai consueti dati anagrafici, viene anche richiesto di specificare quelle che sono le specializzazioni del medico stesso, come ad esempio medicina interna, gastroenterologia, ecc..Allo stesso tempo quando le strutture sanitarie richiedono un servizio di telerefertazione per un loro paziente, devono specificare il tipo di specializzazione che dovranno avere i medici per poter rispondere alla richiesta. Questo tipo di approccio comporta naturalmente dei vantaggi e degli svantaggi. Tra i vantaggi si possono elencare il fatto di avere delle diagnosi per i casi proposti più precise ed esatte ed in tempi più brevi. Inoltre si ottimizza la produttività del personale medico che infatti sarà chiamato a rispondere solo a casi che concernono le proprie specifiche attitudini. Dall’altra parte lo svantaggio principale, cioè la necessità da parte dei richiedenti di avere delle competenze mediche basilari per poter individuare almeno in linea di massima a quale categoria clinica appartenga un problema di un paziente, può essere facilmente superato inserendo la possibilità di cambiare nel tempo la categoria scelta per il caso clinico. L’inserimento di una nuova richiesta di consulto è effettuata compilando un apposito modulo, disponibile all’interno della cartella clinica del paziente per il quale si richiedono i servizi. Il modulo richiede di specificare i parametri biologici e fisiologici del paziente al momento della richiesta, come ad esempio pressione, ritmo cardiaco, peso ed altezza. A questo punto si da la possibilità di allegare dei files alla richiesta. Questa possibilità è un punto di notevole importanza per tutta la struttura del Medical - 16 - Telereporting System, perché in questo modo il software non solo funge da infrastruttura per mettere in contatto medici e richiedenti, ma allo stesso tempo diventa anche una piattaforma di storage remota per dati medici. Ciò apre a molte possibilità e problematiche che saranno trattate in maniera più esaustiva nei prossimi capitoli (cfr. Dati biomedici e Conclusioni). Nei paragrafi seguenti di questo capitolo saranno comunque trattate le tecnologie utilizzate per mettere l’upload/download dei files. I files allegati alle richieste sono essenzialmente dati in formato non testuale di interesse per la richiesta stessa, come ad esempio tracciati ECG, ecografie, radiografie, ecc.. Una volta effettuata la richiesta di un consulto, questa viene inserita nel database centrale ed è disponibile per essere visionata da parte di tutto il personale medico che, come detto in precedenza, abbia una specializzazione adeguata alla richiesta effettuata. E’ qui che si vede il vero punto di forza di Medtel rispetto agli altri software già presenti sul mercato, ed è qui che si esplicita l’innovativa idea di comunità di cui finora molto si è discusso. Tutta la comunità medica con una particolare specializzazione può dare il suo giudizio sui problemi proposti dai richiedenti. In questo modo i richiedenti possono ottenere molte più opinioni su un particolare problema rispetto quelle che avrebbero rivolgendosi solamente ad un medico come avviene nel mondo reale. Le tecnologie informatiche vengono sfruttate fino in fondo per permettere a molti medici sparsi nel globo di studiare il medesimo caso e di fornire diversi punti di vista che insieme permettano al richiedente di avere un consulto completo ed articolato. Inoltre Medtel mette in comunicazione tra di loro i medici stessi che possono quindi confrontarsi tra di loro producendo così dei risultati migliori di quelli che si avrebbero nel caso tradizionale di rapporto uno ad uno tra medico e paziente. - 17 - Modulo per la richiesta di un consulto (Screenshot tratto da Medtel) Anche i medici chiamati a dare il loro giudizio su un caso clinico possono visualizzare la cartella “virtuale” del paziente nella sua interezza allo stesso modo di come questa è disponibile per i richiedenti. Una volta inserita la richiesta di un consulto da parte di una struttura sanitaria, il richiedente detiene comunque il controllo sulla richiesta stessa. Infatti se il problema è stato risolto o il richiedente si ritiene soddisfatto dei dati raccolti, può chiudere la richiesta in modo che non sia più disponibile per ulteriori commenti da parte di altri specialisti. I dati storici rimarranno salvati nella cartella clinica del paziente, a disposizione per futuri consulti. I richiedenti possono avere un rapido riassunto dello stato dello loro richieste attraverso un’intuitiva interfaccia. Un’interfaccia molto simile permette anche ai medici di visualizzare lo stato dei casi clinici di cui si stanno occupando o di quelli più recenti che sono stati inseriti nel database. - 18 - Vista dello stato dei consulti clinici richiesti (Screenshot tratto da Medtel) Schema completo della logica di funzionamento di Medtel - 19 - 2.3 Tecnologie utilizzate Le tecnologie utilizzate per lo sviluppo di un software, soprattutto se si tratta di un software complesso e molto articolato, in genere riflettono le idee che stanno alla base dell’applicativo stesso. Medtel non fa accezione. Fin dall’inizio si è cercato di valutare con precisione quelli che erano i requisiti del programma e quindi di fare una scelta equilibrata delle tecnologie attraverso le quali implementarli. In questa scelta hanno pesato molto il fatto che Medtel dovesse risultare il più intuitivo possibile nell’utilizzo e contemporaneamente funzionare su insieme di macchine molto eterogeneo, sia da un punto di vista di potenza di calcolo che di ambiente di lavoro. L’attenzione si è quindi rivolta verso gli standard che, almeno sulla carta, fossero in grado di far fronte a queste problematiche. Il software più onnipresente e diffuso nei computer di tutto il mondo è sicuramente il browser Web. Al giorno d’oggi esistono moltissimi tipi di browser sul mercato, ma tutti sono sostanzialmente caratterizzati da un’interfaccia abbastanza omogenea a cui la maggior parte delle persone è abituata. A partire da questa constatazione si è pensato che il modo migliore per rendere Medtel disponibile ed utilizzabile dalla maggior parte delle persone, fosse quello di svilupparlo sotto forma di Web Application fruibile attraverso uno dei tanti browser presenti sul mercato. Le Web Application sono una novità nel mondo del software, sia da un punto di vista tecnologico che concettuale, ed attualmente stanno prendendo sempre più piede nell’informatica moderna. Definire cosa s’intenda per Web Application non è semplice perché esse presentano molto sfaccettature e caratteristiche eterogenee, ma comunque si può tentare di riassumere il tutto guardando al nome stesso: Web Application, cioè applicazione per il web. Le Web Application sono quindi un tentativo di portare le normali applicazioni desktop in una dimensione nuova: il web. Questo sforzo - 20 - presenta innumerevoli vantaggi e contemporaneamente molte nuove sfide tecnologiche. Il vantaggio principale, nonché il vero punto di forza delle Web Application, sta nel fatto che esse necessitano solo di un normale browser web per poter funzionare (anzi si dice che le Web Application “girano” all’interno di un browser) e quindi non sono legate a nessun sistema operativo particolare, rendendo di conseguenza, praticamente nulli i costi ed i tempi necessari per farle funzionari su O.S. diversi: si tratta solamente di verificare che per il sistema operativo in esame esista un browser capace di far girare la nostra Web Application. Altri vantaggi sono legati all’usabilità. Le Web Application funzionando tramite la normale interfaccia di un browser, presentano tutte quelle caratteristiche a cui il web ha abituato le persone, cioè nessuna necessità di installazione, raggiungibilità 24 su 24, nessuna manutenzione da parte degli utenti, necessità di un hardware limitato perché il grosso dei calcoli vengono effettuati alla fonte, lato server, così come la memorizzazione dei files, minori rischi di perdita dei dati ed infine nessun bisogno da parte degli utenti di dover aggiornare il software. Se però le Web Application presentano tutte queste note positive per i loro utilizzatori, il rovescio della medaglia è rappresentato dai notevoli sforzi che gli sviluppatori devono fare per realizzarle nel migliore dei modi. Le Web Application non sono e non vogliono essere semplicemente qualcosa di più evoluto dei siti web tradizionali, ma invece nascono per essere delle vere e proprie applicazioni. Tuttavia, il fatto di girare su dei browser, obbliga gli sviluppatori a confrontarsi con le tecnologie supportate da quest’ultimi, che in ultima analisi sono state sviluppate proprio per creare siti internet. Il cuore della questione è quindi in che modo realizzare applicazioni web che offrano un’esperienza il più possibile simile a quella dei normali software, utilizzando contemporaneamente tecnologie non sviluppate per questo scopo. Negli ultimi anni le organizzazioni, i consorzi - 21 - e le stesse aziende operanti nel mondo dell’informatica hanno cercato di coniugare i loro sforzi per risolvere la questione. Le risposte sono state diverse, tuttavia riassumibili in due categorie principali: l’introduzione di nuove tecnologie oppure il potenziamento di tecnologie già esistenti. Gli standard come Adobe Flash, Adobe Air o Microsoft SilverLight rientrano nella prima categoria. Il potenziamento delle tecnologie di scripting come Javascript, CSS e Ajax rientrano nella seconda. Nella fase iniziale di progettazione di Medtel ci si è ritrovati al centro del dibattito che vede contrapposti questi due diversi approcci e ci si è orientati sulla seconda soluzione. I motivi di questa scelta di campo così drastica sono da ricercare nell’osservazione che tecnologie “più vecchie” come il Javascript, CSS e Ajax, specialmente alla luce delle ultime rivisitazioni, rappresentano una piattaforma più solida sulla quale sviluppare. Adobe Flash e soprattutto Microsoft SilverLight presentano sicuramente delle potenzialità maggiori nel lungo periodo, ma proprio perché così innovativi non rispondono ai requisiti di stretta compatibilità con hardware e software esistenti che Medtel si prefigge. Medtel affonda quindi le proprie radici in tecnologie consolidate quali Javascript, CSS ed Ajax. Per poter sfruttare fino in fondo il potenziale degli standard adottati si sono utilizzate delle librerie di codice già esistenti sul mercato, totalmente gratuite ed open source, cioè il Google Web Toolkit e la sua estensione GWT-Ext. Trattandosi di una Web Application, Medtel è naturalmente anche un software costruito su un’architettura client/server. Di conseguenza esso è costituito da due parti principali: un’interfaccia grafica client che gira su un browser web e costruita tramite le tecnologie sopracitate, collegata poi ad una parte server, che completa il tutto fornendo i servizi di calcolo e di storage remoto. La parte server è stata sviluppata utilizzando il linguaggio Java, che inoltre è lo stesso linguaggio sfruttato da GWT e GWT-Ext. In - 22 - definitiva quindi Medtel è stato programmato essenzialmente in Java, anche se l’applicativo finale è il risultato di un connubio che vede uniti tra di loro Java, HTML, Javascript e CSS. Il perché di tutto questo è spiegato nei paragrafi successivi in cui si specifica nel dettaglio i vari aspetti delle tecnologie utilizzate. Schema completo delle tecnologie utilizzate in Medtel. Si noti la suddivisione tra la parte client e server del software stesso 2.3.1 Java Si è già sottolineato come in definitiva Java sia il linguaggio che sta alla base dello sviluppo di Medtel. In particolare si è visto che sia la parte client che la parte server sono state scritte in Java, anche se grazie alle tecnologie utilizzate, cioè Google Web Toolkit, la parte client viene per così dire tradotta dal linguaggio Java nei linguaggi HTML, Javascript e CSS. Questo è un punto focale di Medtel perché è proprio questa “trasformazione” da Java verso gli altri linguaggi che permette all’interfaccia utente del programma di poter funzionare all’interno di una finestra del browser web. Nei prossimi paragrafi vengono specificati i motivi che hanno portato a - 23 - preferire Java ad altri linguaggi e vengono inoltre illustrate le tecnologie che permettono di sposare il Java con il web, in particolare verrà trattato lo standard Java Servlet. In questo paragrafo si vuole invece fornire una breve panoramica sul linguaggio Java di per se stesso: quali sono le sue caratteristiche salienti, i suoi punti di forza e di debolezza, con un occhio infine al suo stato attuale di sviluppo e di supporto da parte delle comunità mondiale di informatici. Il linguaggio Java è un linguaggio di programmazione orientato agli oggetti, derivato dal C++ e creato da James Gosling e altri ingegneri di Sun Microsystems. Java fu annunciato ufficialmente il 23 maggio 1995 a SunWorld. La piattaforma di programmazione Java è fondata sul linguaggio stesso, sulla Java Virtual Machine (JVM) e sulle API. Java è stato creato per soddisfare tre scopi: essere orientato agli oggetti, essere indipendente dalla piattaforma e contenere strumenti e librerie per il networking. La prima caratteristica, si riferisce a un moderno metodo di programmazione e progettazione, la programmazione orientata agli oggetti (OOP). L'idea alla base della OOP è di rappresentare, nella progettazione del software, le entità reali o astratte che compongono il problema sotto forma di oggetti. Gli oggetti sono caratterizzati da delle proprietà (definite variabili o campi di istanza o di esemplare) e di metodi applicabili sugli oggetti stessi, che possono ad esempio modificarne lo stato o estrarne informazioni. Sebbene Java possa operare sia su oggetti che su tipi di dati primitivi, è considerato un linguaggio ad oggetti puro, ovvero nel quale gli oggetti sono le entità di base del linguaggio, anziché essere costruiti partendo da costrutti ad un inferiore livello di astrazione. La seconda caratteristica, l'indipendenza dalla piattaforma, significa che l'esecuzione di programmi scritti in Java deve avere un comportamento - 24 - simile su hardware diverso. Si dovrebbe essere in grado di scrivere il programma una volta e poterlo eseguire dovunque. Questo è fattibile con la compilazione del codice di Java in un linguaggio intermedio, bytecode, basato su istruzioni semplificate che ricalcano il linguaggio macchina. Il bytecode verrà quindi eseguito da una macchina virtuale (JVM), ovvero un software sviluppato dalla Sun Microsystem per un gran numero di ambienti diversi. Inoltre, vengono fornite librerie standardizzate per permettere l'accesso alle caratteristiche della macchina (come grafica e networking) in modo unificato. Java è un linguaggio meno efficiente dei linguaggi compilati come il C++, scontando il fatto di possedere degli strati di astrazione in più, e di implementare una serie di automatismi, come il garbage collector, che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi, dall'altro consumano memoria e tempo di CPU in fase di esecuzione del programma finito. Fra gli argomenti che depongono spesso a favore di Java nella scelta del linguaggio di implementazione di un progetto software moderno, si deve certamente contare la vastità delle librerie standard di cui il linguaggio è dotato, e che in particolare contribuiscono a renderlo altamente integrabile con le altre tecnologie. Alcuni esempi di funzionalità di libreria di Java sono: accesso ai database tramite JDBC e ai DBMS con driver ODBC, potenti strumenti per la programmazione lato server nel contesto Web, supporto nativo per gran parte dei protocolli della famiglia IP. Per quanto riguarda il suo stato attuale di sviluppo e il suo livello di popolarità, c’è solamente da notare che essendo arrivato alla versione 1.5, il linguaggio Java è un linguaggio altamente maturo e consolidato. Inoltre la sua popolarità è elevatissima. Java è sicuramente la tecnologia più diffusa ed utilizzati in ambito commerciale e non, per sviluppare software di ogni tipo. La sua alta flessibilità, il suo approccio moderno e i continui - 25 - aggiornamenti a cui è sottoposto, lo rendono un linguaggio adatto allo sviluppo di praticamente qualunque tipo di software in qualunque tipo di situazione. Come già sottolineato in precedenza, Java nasce con l’idea di essere notevolmente portabile. L’approccio fondato sulla Java Virtual Machine ed il bytecode lo rendono adatto alla creazione di applicativi che verranno eseguiti su server mainframe, come anche su cellulari, ed ultimamente su elettrodomestici ed orologi. La versione di Java utilizzata per programmare Medtel è stata la 1.4 perché la libreria Google Web Toolkit al momento dello sviluppo non supportava ancora la versione più recente del linguaggio. Questo non ha portato a nessun inconveniente. 2.3.1.1 Perché Java Nel paragrafo precedente si è illustrato il linguaggio Java e come questo venga utilizzato all’interno di Medtel. In questo paragrafo si cercheranno di specificare i motivi che hanno portato alla scelta di Java. I motivi possono essere riassunti in tre categoria principali: motivi di ordine logistico, motivi di ordine tecnologico ed infine altri motivi di varia natura non legati ai precedenti. I motivi di tipo logistico sono quelli legati a precise richieste che sono venute dal committente del progetto Medtel stesso, ovvero l’Azienda Sanitaria Locale di Ancona. Finora non è mai stato messo in luce il fatto che Medtel non è un progetto nato ex-novo di software per la telemedicina, ma è invece l’ultima tappa di un percorso che ha visto la creazione di diversi applicativi basati sugli stessi concetti di Medtel, via via migliorati costantemente e creati con le tecnologie più disparate. A fronte degli scarsi risultati avuti con le precedenti versione, si è deciso di cambiare la tecnologia e di rivolgersi con decisione verso Java. - 26 - I motivi di ordine tecnologico nascono invece dalla constatazione che le caratteristiche di Java, così come sono state illustrate nel paragrafo precedente, si adattano perfettamente ad un applicativo quale Medtel. Da un lato la programmazione ad oggetti permette di modellare agilmente le situazioni che si presentano nello sviluppo di un software di telemedicina, dall’altro l’estensivo supporto di Java alle tecnologie server per il Web, l’hanno reso la scelta perfetta. Occorre poi citare il fatto che la programmazione OOP è nata anche con lo scopo di poter agevolare il compito di chi sviluppa un software a più mani. Medtel è il frutto del lavoro di più persone che grazie alle scelta di Java e conseguentemente di OOP, hanno potuto facilmente suddividere il progetto nelle componenti più essenziali, poi affidate ad ogni singolo membro del gruppo di lavoro. Altri motivi che rendono Java preferibile ad altri linguaggi OOP come il C++, sono intanto la sua semantica molto semplice che permette di avere una curva di apprendimento molto più rapida e la sua gestione fortemente tipizzata dei dati che riduce notevolmente il quantitativo di errori che si producono in fasi di sviluppo, accorciando così i tempi di debug. La presenza di un gestore automatico della memoria, il garbage collector, non fa altro che rendere ancora più facile la stesura di applicativi complessi in tempo breve. Esistono molte altre ragioni che hanno portato alla scelta di Java e la maggior parte non sono né di natura tecnologica né di natura logistica, ma semplicemente legate ai gusti ed alle preferenze del team di sviluppo di Medtel. Non bisogna poi dimenticare il fatto che il linguaggio Java è anche oggetto di trattazione durante i corsi di laurea triennale in ingegneria informatica. Infine a favore di Java giocano la presenza di potenti strumenti di sviluppo, utilizzati anche per la creazione di Medtel, come l’ambiente Eclipse di cui si parlerà brevemente nei paragrafi successivi. - 27 - Ci si potrebbe domandare se la scelta di utilizzare il Google Web Toolkit sia nata conseguentemente all’utilizzo di Java o se invece GWT sia tra annoverare tra i perché di Java. In realtà si è partiti fin da subito con l’idea di utilizzare Java, mentre il Google Web Toolkit è un’idea apparsa successivamente come naturale complemento alla scelta. 2.3.1.2 Java Servlet: Tomcat Java offre un supporto esteso al Web attraverso diversi standard e metodi diffusi soprattutto in ambito enterprise. La parte server come detto in precedenza è stata tutta sviluppata in Java e senza ulteriori traduzioni verso altri linguaggi cosa che invece avviene per la parte client. In particolare si è scelto di utilizzare la tecnologia Java Servlet. Java Servlet permette agli sviluppatori di aggiungere contenuto dinamico alle loro pagine web usando la piattaforma Java. Per contenuto dinamico s’intende tutta una seria di dati ed informazioni che vengono generate in tempo reale al momento della richiesta da parte di un client e che non sono già memorizzate in una forma adatta all’invio immediato. Esempi di contenuto dinamico sono i risultati dell’interrogazioni di un database oppure le informazioni contenuti nei cookies del browser. Attraverso Java Servlet si possono creare dei mini-applicativi (cioè delle classi compilate in bytecode) che possono essere raggiunti ed interrogati come normali pagine web e che fornisco appunto questo tipo di informazioni dinamiche. Medtel fa ampio uso delle Java Servlet per gestire tutto il lato server dell’applicazione. Si è visto in precedenza infatti che tutti i dati (cartelle cliniche dei pazienti, dati di login) sono contenuti in un database centrale e quindi possono essere estrapolati solamente utilizzando uno standard quale Java Servlet. - 28 - Per poter utilizzare la tecnologia Servlet è necessario dotarsi di un ambiente adatto a supportala, cioè un web application server. I web application server si discostano profondamente dai tradizionale server web quali Apache, perché nascono per scopi diversi rispetto a quest’ultimi. I server web tradizionali sono stati sviluppati in un’epoca in cui ancora il contenuto delle pagine era sostanzialmente statico e non dinamico (nell’eccezione spiegata in precedenza) e quindi la loro funzione è essenzialmente quello di spedire ad un client che fa richiesta una pagine web memorizzata da qualche parte nel server attraverso il protocollo HTTP. In un’epoca di contenuti dinamici, questo modello tradizionale di server web ha dovuto essere rivisto: tecnologie quali Java Servlet non prevedono il semplice invio di una pagine web, ma addirittura la creazione in tempo reale della pagine e quindi l’esecuzione di veri e propri programmi, che hanno come risultato la produzione di informazioni, spedite poi al client in vari modi, tra i quali anche quello banale, di pagine web (si vedrà che essendo Medtel una vera e propria applicazione, non gestisce il flusso di dati in questo modo). Accanto ai tradizionali server web quindi si sono affacciati i moderni web application server che sono in grado di gestire un’architettura di questo tipo. In Medtel si è scelto di affidarsi ad uno dei più diffusi ed apprezzati, nonché open source, cioè Apache Tomcat. Apache Tomcat offre un ambiente di esecuzione lato server per le Java Servlet e contemporaneamente tutta l’infrastruttura necessaria a mettere in collegamento il server con il client attraverso il protocollo HTTP. Allo stesso tempo Apache Tomcat racchiude al proprio interno anche un tradizionale server web. Alla luce di tutto questo si può affermare che l’accoppiata Apache Tomcat e MySQL DB, che verrà trattato nei prossimi paragrafi, rappresentano completamente l’ambiente di esecuzione necessario per il funzionamento di Medtel. - 29 - 2.3.2 Google Web Toolkit Google Web Toolkit è una libreria open source sviluppata da Google per agevolare la costruzione di applicazioni web complesse, quali ad esempio lo stesso Medtel. Google Web Toolkit (d’ora in avanti semplicemente GWT) è allo stesso tempo un toolkit grafico, un compilatore Javascript ed un framework di sviluppo. Di seguito verranno definiti questi concetti nel dettaglio. GWT è un toolkit grafico, cioè una libreria di codice che mette a disposizione dei componenti (chiamati widgets) per permettere la costruzione di interfacce grafiche. Sotto questo punto di vista GWT può essere visto come un analogo della libreria SWT, che fa parte delle API Standard di Java, ma mentre SWT nasce con lo scopo di consentire lo sviluppo delle normali applicazioni desktop, GWT serve, come già messo in luce in precedenza, per scrivere software che sarà eseguito in una finestra di un browser. Tutta l’interfaccia grafica di Medtel è costruita attraverso i componenti del toolkit grafico di GWT. Esempi di questi componenti sono toolbar, menu a tendina, message box, pulsanti e campi di testo. La programmazione di GUI attraverso GWT è di tipo event-driven, in perfetta analogia con quello che avviene nelle applicazioni desktop. Questo significa che si possono definire eventi associati ai vari componenti della GUI, quali ad esempio il click di un bottone o la modifica di un campo di testo, che andranno poi ad attivare specifiche porzioni di codice. GWT è anche un compilatore Javascript. Questo è un punto molto importante su cui vale la pena fermarsi a riflettere. Tutto il codice che sfrutta GWT è scritto in Java. Se GWT si limitasse a fornire degli strumenti per costruire delle interfaccia grafiche in Java, la sua funzione sarebbe molto limita e comunque, per quanto potente e versatile, non sarebbe affatto diverso dalle altre decine di librerie nate per lo stesso scopo che si trovano - 30 - al giorno d’oggi in commercio. Quello che differenzia GWT dagli altri toolkit grafici è appunto il compilatore. Tutto il codice Java che sfrutta le primitive messe a disposizione da GWT, viene poi tradotto attraverso il tool presente nel SDK in codice HTML, Javascript e CSS. Le pagine prodotte in uscita sono quindi pronte per poter essere lette tramite un browser web. Qui sta tutta la potenza e l’innovazione di GWT rispetto ai competitors già presenti sul mercato. Prima dell’introduzione di questa libreria la prassi per la creazione delle web application era questa: si scriveva la GUI del client direttamente in HTML, Javascript e CSS, al più avvalendosi di strumenti visuali e di librerie di codice già pronto si scrivano le classi Java Servlet per svolgere i compiti di manipolazione ed estrazione di informazioni dinamiche lato server si scrivevano dei metodi che permettessero alla parte client di comunicare con la parte server. In particolare quest’ultima fase prevedeva spesso di dover mischiare pezzi di codice stesi in linguaggi diversi con conseguenti problemi di leggibilità e di debugging. GWT rivoluzione completamente questa situazione fornendo la possibilità di utilizzare un unico linguaggio di programmazione durante tutte le fasi di sviluppo di un prodotto. In questo modo i programmatori non devono più abbandonare Java al momento di creare la GUI, ma possono continuare ad utilizzarlo in tutti gli aspetti del loro software, sia che stia scrivendo la parte server che la parte client del programma. Penserà poi il compilatore GWT a fare in modo che la GUI scritta in Java venga tradotta in una serie di formati adatti ad essere interpretati da un browser, quali sono in effetti CSS, HTML e Javascript. Dovrebbe apparire chiaro fin da queste poche righe introduttive quali siano le potenzialità insite in una tecnologia come GWT ed i perché la scelta di utilizzarlo sia succeduta subito alla decisione di utilizzare Java. Attraverso GWT scompare definitivamente la separazione - 31 - tra i metodi di creazione di una Web Application e di una normale applicazione desktop. GWT è infine un completo framework per lo sviluppo di applicazioni. Accanto al compilatore Javascript e al toolkit grafico, GWT mette anche a disposizione dei metodi che permettono al programmatore di far dialogare la parte client, costituita dalla GUI, con la parte server, costituita dalle Java Servlet, in maniera totalmente trasparente, facendo quasi scomparire la distinzione tra le due parti dell’applicazione. Le Web Application scritte in GWT non hanno nulla in comune con i normali siti internet, nemmeno la tradizionale suddivisione in pagine. Dovendosi comportare come tradizionali software desktop, non avrebbe avuto alcun senso avere una divisione in pagine delle Web Application! Per questo tutto il codice della GUI viene eseguito a partire da un’unica pagina, i widgets vengono aggiunti e rimossi in tempo reale, senza che l’utente debba sottostare alle fastidiose attese dovute al caricamento delle pagine. (Fonte: sito ufficiale del Google Web Toolkit. Vedi sitografia) - 32 - 2.3.2.1 Funzionamento del GWT Schema completo del funzionamento di Google Web Toolkit in abbinamento con una base di dati e delle Java Servlet L’immagine qui sopra mostra in maniera schematica, ma precisa, in che modo funzioni un’applicazione web scritta sfruttando la libreria GWT. Si notano subito tutti gli elementi di cui si è parlato finora: la parte client, la parte server, il web application server Apache Tomcat, il browser degli utenti ed il database dei dati. Attraverso questo schema si possono capire bene quelli che sono i collegamenti vigenti tra le diversi parti dell’applicazione tra cui in particolare quelli tra la parte client e la parte server. All’estrema sinistra dell’illustrazione abbiamo il codice Java della parte server (più in alto) ed il codice Java che gestisce la GUI (più in basso). Quest’ultimo come già detto in precedenza è sviluppato a partire dalla API di GWT. Lato server invece si vede che la tecnologia utilizzata è naturalmente Java Servlet. Si nota poi che l’interazione tra l’applicazione e - 33 - la base di dati (all’estremo in alto a sinistra) avviene, come ci si aspettava, attraverso le Java Servlet. Uno volta scritte in Java, le servlet si comportano come normali applicazioni, quindi vengono compilate in bytecode e poi devono essere eseguite attraverso una Java Virtual Machine. Tutto il processo è illustrato muovendosi verso destra a partire dal codice Java lato server fino ad arrivare ad Apache Tomcat, che in questo contesto funge anche da JVM. Il codice Java della GUI invece viene dato in pasto al compilatore GWT che produce in uscita del codice Javascript, HTML e CSS. Questo poi viene di nuovo passato ad Apache Tomcat perché, come sottolineato nei paragrafi precedenti, esso è in grado di comportarsi anche alla stregua di un tradizionale server web per la distribuzione di contenuti statici. All’estrema destra del processo troviamo i browser degli utilizzatori finali che fruiscono dell’applicazione web. Quello che è interessante notare è come avvenga l’interazione tra il codice lato client ed il codice lato server. In fase di progettazione della GUI in Java, GWT mette a disposizione dei metodi che permettono di richiamare delle funzionalità remote fornite dal codice server-side. Questi metodi sfruttano una tecnica chiamata RPC, cioè Remote Procedure Call e molte delle proprietà del linguaggio Java. In particolare quando si vogliono attivare alcuni procedure lato server del nostro applicativo, ad esempio per accedere ad un database, è necessario seguire una serie di passaggi per rendere questa comunicazione possibile attraverso il GWT. Prima di tutto bisogna creare un’interfaccia Java che elenchi i metodi che sono messi a disposizione da una particolare servlet remota. Quest’interfaccia farà parte del codice lato client e non conterrà le istruzioni necessarie ad eseguire l’operazione richiesta, ma specificherà solamente il nome della procedura lato server che esegue il compito vero e proprio ed i parametri necessari a questa per poterlo eseguire. L’interfaccia è quindi il ponte esistente tra la - 34 - parte del client e quella del server ed espone i metodi di quest’ultima alla prima. Il passo successivo è quello di creare, durante la stesura della GUI, un oggetto a partire dall’interfaccia definita al passo precedente. Quest’oggetto avrà i metodi propri dell’interfaccia e quindi in definitiva della servlet remota. Richiamando i metodi dell’oggetto nel codice clientside si attivano procedure remote server-side. Tutto questo sarebbe vero solamente se tutto il codice, sia server che client, non venisse tradotto e rimanesse in Java. In realtà come è stato ribadito più volte, il codice client è poi tradotto dal compilatore Javascript. Ci si può domandare a questo punto che fine faccia il paradigma RPC e come avvenga quindi la comunicazione tra client e server. La risposta è fornita dal compilatore GWT stesso e dalla tecnologia Ajax. Ajax, acronimo di Asynchronous JavaScript and XML, è una tecnica di sviluppo web per creare applicazioni web interattive. L'intento di tale tecnica è quello di ottenere pagine web che rispondono in maniera più rapida, grazie allo scambio in background di piccoli pacchetti di dati con il server, così che l'intera pagina web non debba essere ricaricata ogni volta che l'utente effettua una modifica. Questa tecnica riesce, quindi, a migliorare l'interattività, la velocità e l'usabilità di una pagina web. Ajax è asincrono nel senso che i dati extra sono richiesti al server e caricati in background senza interferire con il comportamento della pagina esistente. Le chiamate a procedure remote scritte in Java in fase di sviluppo della GUI, vengono poi convertire in chiamate Ajax, e quindi in codice Javascript, dal compilatore GWT. In questo modo si può realizzare un intenso scambio di dati tra client e server senza compromettere le prestazioni dell’applicativo e senza dover mai ricaricare le pagine nel browser per aggiornarne il contenuto. Tutto il processo avviene in - 35 - background, come del resto avverrebbe se si stesse utilizzando un normale programma desktop. Lo schema seguente mostra in dettaglio la tecnica di comunicazione client/server prevista dal GWT. Schema di come funziona l’attivazione di una procedura remota utilizzando i metodi messi a disposizione dal Google Web Toolkit (Fonte: sito ufficiale del Google Web Toolkit. Vedi sitografia) Il codice qui di seguito invece mostra come si possano implementare effettivamente le tecniche viste finora. Creiamo una Java Servlet che ha un solo metodo (myMethod). Il metodo accetta una parametro stringa in ingresso e non fa altro che restituirlo in uscita. - 36 - package com.example.foo.server; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.example.client.MyService; public class MyServiceImpl extends RemoteServiceServlet implements MyService { public String myMethod(String s) { return s; } } Il codice dell’interfaccia di comunicazione tra client e server è il seguente: package com.example.foo.client; interface MyServiceAsync { public void myMethod(String s, AsyncCallback<String> callback); } Il codice che effettua la chiamata vera e propria a partire dall’interfaccia è il seguente: MyServiceAsync methodService = (MyServiceAsync) GWT.create(MyEmailService.class); AsyncCallback callback = new AsyncCallback() { public void onSuccess(Void result) { // fai qualcosa con result } public void onFailure(Throwable caught) { // si è verificato un errore } }; methodService.MyMethod(new String(‘ciao’), callback); - 37 - Prima di concludere la trattazione sui principi di funzionamento di GWT, non rimane altro che dire in che formato vengano scambiati i dati tra le procedure client e quelle server. GWT permette di trasferire dati sotto forma di oggetti Java. Affinché questo sia possibile però è necessario che gli oggetti siano serializzabili, cioè trasformabili in un formato adatto ad essere trasferito via HTTP. Praticamente tutti gli oggetti standard forniti dalla libreria di Java sono serializzabili, compresi quindi gli oggetti String e compresi inoltri dati che in realtà oggetti non sono, come gli interi. Un programmatore può comunque decidere di trasferire anche altri tipi di oggetti non standard, magari creati ex-novo per l’applicazione che sta scrivendo. Anche questi ultimi sono supportati da GWT, l’importante è che la classe che li definisce implementi l’interfaccia isSerializable. 2.3.2.2 GWT-Ext GWT-Ext è una libreria open source nata per aggiungere nuove funzionalità a quelle già presenti nella collezione standard di Google Web Toolkit. GWT-Ext fornisce moltissimi nuovi widgets da utilizzare per costruire le proprie web application, nonché molte altre interessanti novità non legate alla costruzione di interfacce grafiche, come per esempio metodi per la manipolazione di stringhe e date. Nello sviluppo di Medtel si è fatto ampio uso degli strumenti messi a disposizione da GWT-Ext in particolare per quello che riguarda la programmazione della GUI. 2.3.2.3 Altri vantaggi nell’uso del Google Web Toolkit Oltre ai vantaggi già citati di cui si è potuto beneficiare grazie all’adozione del Google Web Toolkit, vale la pena sottolineare altre interessanti note positive sempre legate al GWT. - 38 - Il compilatore è estremamente efficiente tanto che il motto di GWT, riportato nella documentazione ufficiale, è “Faster AJAX than you'd write by hand”, proprio a sottolineare il fatto di come il codice Javascript prodotto dal compilatore a partire dal codice Java sia molto più performante di quello che si sarebbe potuto scrivere a mano. Tutto questo grazie al gran numero di ottimizzazione automatiche, spesso anche frutto di un’analisi molto complessa, che vengono apportate al codice e che non sono alla portate del tradizionale programmatore, specialmente in progetti molto complessi. Un altro vantaggio risiede nella compatibilità delle web application scritte con il Google Web Toolkit, con una vasta gamma di browser web. Nella documentazione ufficiale viene in particolare specificato che il codice Javascript prodotto dal compilatore è compatibile con i seguenti browsers: Internet Explorer 6+, Firefox 2+, Safari ed Opera. Quindi si vede come si riesca a raggiungere praticamente tutte le quote del mercato dei web browsers. Nelle conclusione comunque verrà trattato in maniera più approfondita il tema della compatibilità, portando anche alcuni esempi di situazioni in cui ciò che viene specificato “su carta”, in realtà non trova riscontro nei fatti. L’ultimo vantaggio che è importante mettere in risalto è legato all’integrazione di Google Web Toolkit con l’ambiente di sviluppo Java più diffuso al mondo: Eclipse (di cui si parlerà brevemente nei prossimi paragrafi). Ciò permette di sfruttare tutti gli strumenti messi a disposizione da quest’ultimo per il debugging del codice. Inoltre l’alto livello di integrazione ha permesso di testare, compilare ed eseguire tutto il codice, utilizzando unicamente l’ambiente Eclipse. - 39 - 2.3.3 MySQL MySQL è un database management system (DBMS) relazionale, ovvero un sistema software progettato per consentire la creazione e la manipolazione efficiente di database (cioè collezioni di dati strutturati), solitamente da parte di più utenti. In tutte le applicazioni in cui si fa largo uso di grandi quantità di dati, come Medtel ad esempio, l’utilizzo di un DBMS è un fattore imprescindibile per il corretto funzionamento dell’applicazione stessa. Nella progettazione di Medtel si è scelto di utilizzare il DBMS MySQL DB per motivi di natura sia tecnica che commerciale. Per quanto riguarda le ragioni tecniche occorre notare che MySQL è un prodotto altamente maturo ed utilizzato da una vasta comunità di sviluppatori. Inoltre supporta tutte le più recenti tecnologie per la gestione dei dati (InnoDB, transizione atomiche, ecc…) ed allo stesso tempo è un software estremamente robusto e scalabile, adatto all’utilizzo in ambienti mission critical in cui si richiede di dover gestire grandi quantità di dati con sicurezza. Per quanto riguarda le ragione commerciale c’è solamente da sottolineare il fatto che MySQL DB è totalmente gratuito ed open source essendo rilasciato con licenza GPL. 2.3.4 Altre librerie e strumenti utilizzati Nello sviluppo di Medtel sono stati utilizzati moltissimi altri strumenti che finora non sono mai stati messi in luce. Il più importante di questi è sicuramente Eclipse. Eclipse è un completo ambiente di sviluppo per Java originariamente creato dalla IBM e poi rilasciato come software open source alla comunità mondiale. E’ totalmente gratuito, ma allo stesso tempo estremamente potente e versatile. Non a caso è l’ambiente Java più - 40 - utilizzato al mondo. Senza le tante funzionalità di Eclipse, lo sviluppo di Medtel sarebbe sicuramente risultato molto più difficoltoso. Il Google Web Toolkit Hosted Mode è un comodo tool fornito dal SDK di GWT che permette di testare le proprie applicazioni in un browser senza doverle ogni volta compilare, producendo così un notevole risparmio di tempo. phpMyAdmin è invece un completo software per la gestione dei database creati con MySQL DB, totalmente gratuito ed open source. La libreria Apache Commons File Upload permette infine, una facile gestione dell’upload dei files verso i server di storage di Medtel tramite il protocollo HTTP. - 41 - CAPITOLO 3 Sezione Amministrativa 3.1 Introduzione Nel capitolo due si è illustrato il funzionamento del Medical Telereporting System e si sono descritte le tecnologie adottate in sede di sviluppo. In questo capitolo si vuole invece parlare nel dettaglio della realizzazione di una particolare sezione di Medtel: la sezione amministrativa. Come si è visto in precedenza, Medtel è un software estremamente complesso e composto da moltissimi componenti, è chiaro quindi che una descrizione accurata di ogni sua singola parte è un compito che va oltre gli scopi di questo testo. Si è preferito di conseguenza concentrarsi solamente sulla parte che ha visto il coinvolgimento diretto dell’autore, che è appunto la sezione amministrativa. Quella amministrativa è sicuramente una delle sezioni più importanti e complesse di tutto l’applicativo, sia per i compiti che svolge, sia per le problematiche di sicurezza che inevitabilmente affliggono la componente chiamata a gestire le autorizzazioni degli utenti. Nei paragrafi seguenti verrà presentata la sezione amministrativa prima a grandi linee, poi via via più nel dettaglio. Per concludere il capitolo verranno anche proposte alcune riflessioni sui problemi riscontrati in fase di sviluppo. Nel capitolo sono presentati molti spezzoni di codice Java che stanno alla base di Medtel. Tutto il codice elencato qui di seguito è commentato in modo che anche i passaggi più complessi risultino chiari al lettore. Si tenga conto comunque, che il codice complessivo di Medtel è molto più vasto di quello mostrato in queste pagine. - 42 - 3.2 Manager & Super-Admin Prima di descrivere nel dettaglio le caratteristiche dell’area amministrativa è sicuramente importante sottolineare quali siano gli utenti che possono accedere ad essa ed utilizzarne le funzionalità. Si sottolinea fin da subito quindi, che solamente gli amministratori di Medtel possono accedere a questa sezione dell’applicativo. In questa sezione infatti, è possibile procedere alla creazione di nuovi utenti (di varia natura), nonché alla eliminazioni di essi. Si tratta di operazioni che possono con estrema facilità portare alla compromissione del servizio e di conseguenza dovrebbero apparire chiari i motivi che hanno portato alla scelta di restrizioni d’accesso di questo tipo. Come già accennato in precedenza nel testo, gli amministratori non sono un gruppo omogeneo, ma esiste invece, una divisione netta tra due tipi di admin chiamati a gestire il funzionamento di Medtel. Nel corso della trattazione quindi, si farà riferimento distintamente a super-admin e manager, tenendo a mente però, che ambedue le categorie sono comunque declinazione dell’insieme degli amministratori. Quello che differenzia le due classi di amministratori appena presentate, è il ruolo che esse rivestono all’interno della logica di Medtel. I super-admin e i manager gestiscono diverse tipologie di utenti. I manager si occupano della creazione ed eliminazione delle credenziali di accesso per i requester e per il personale medico, mentre i super-admin debbono gestire l’accesso per gli stessi manager. Si osserva quindi che nella scala gerarchica delle responsabilità, i super-admin rappresentano il gradino più alto, i manager quello subito successivo, ed infine a seguire si trovano sullo stesso livello i medici ed i requester. - 43 - Gerarchia degli utenti di Medtel. Salendo verso l’alto le responsabilità aumentano, scendendo verso il basso gli utenti aumentano Restano da illustrare i motivi che hanno portato alla scelta in fase di progettazione, di due figure diverse di amministratori. In realtà nelle prime fasi di design dell’applicativo, la distinzione non era stata introdotta. Successivamente si è evidenziato il fatto che una strutturazione di questo tipo era eccessivamente rigida e poco scalabile in situazioni in cui il numero di utenti registrati fosse aumentato esponenzialmente. In particolare con una configurazione improntata su una sola figura di amministratore e molti utilizzatori, il carico di lavoro per la prima poteva risultare eccessivo. Mancava inoltre un elemento di collegamento tra i vari amministratori che rimanevano troppo isolati tra di loro. Si è pensato quindi di aggiungere un ulteriore gradino alla struttura gerarchica di Medtel affinché tutto risultasse più dinamico ed adattabile a scenari complessi. Grazie all’introduzione dei super-admin, si è potuto moltiplicare il numero dei manager chiamati quindi a gestire un carico di lavoro minore, senza che la sicurezza generale di Medtel venisse in alcun modo compromessa, perché i compiti di supervisione più importanti sono comunque affidati ad numero esiguo di - 44 - utenti, non creabili tra l’altro tramite il software stesso, ma solamente tramite un utility apposita e scollegata dal resto della web application. Si può evincere da questa semplice descrizione l’importanza, sottolineata più volte nel corso del testo, di un’attenta fase di progettazione e design, imprescindibile per lo sviluppo di un software corretto ed esente da bug. 3.3 Funzionalità L’area amministrativa nasce con lo scopo di permettere una facile gestione degli utenti da parte degli amministratori del sito. In questo paragrafo vengono descritte le funzionalità che la sezione di amministrazione mette a disposizione. Dopo che un amministratore ha effettuato il login in Medtel, sia esso un super-admin o un manager, ha la possibilità di creare nuovi utenti, di visualizzare l’elenco degli utenti già creati con le relative informazioni ed infine di procedere con l’eliminazione di essi. Si fa notare fin da subito che un amministratore può visualizzare ed eliminare solamente gli utenti da lui stesso creati, per ovvie ragioni di sicurezza. Di seguito verranno descritte le operazioni di creazione, eliminazione e visualizzare, in dettaglio. Quando un amministratore decide di creare un nuovo utente, deve compilare un apposito form affinché i dati sul nuovo utente, possano venir memorizzati nel database principale. I dati che il super-admin o il manager deve specificare sono essenzialmente di due tipi: dati anagrafici comuni a tutti gli utenti, oppure informazioni specifiche di una particolare categoria di utenti. I primi sono: nome, cognome, username, password, indirizzo email, città ed indirizzo di residenza, CAP della città di residenza, nazione, numero di telefono, numero di fax e tipo di utente. I secondi invece variano a seconda del tipo di utenti che si sta creando. Nel caso dei requester è richiesto di specificare il nome della struttura sanitaria alla quale - 45 - afferiscono, nel caso dei dottori invece occorre specificare le specializzazioni, infine nel caso di creazione di un nuovo manager non è necessario fornire ulteriori informazioni. Non è obbligatorio compilare tutti i campi del modulo di registrazione, ma alcuni devono essere necessariamente specificati affinché il database centrale risulti coerente e quindi Medtel funzioni correttamente. I campi obbligatori sono: nome, cognome, username, password, indirizzo e-mail, tipo di utente, struttura sanitaria, specializzazioni. C’è da notare poi, che affinché in fase di creazione non si specifichi per errore una password diversa da quella desiderata, è richiesto di confermare la password inserita una seconda volta, compilando un apposito campo. Se le due password inserite sono diverse non si può procedere con l’inserimento. Vengono effettuati molti altri controlli sui dati inseriti, sempre per fare in modo che il database risulti il più coerente possibile nel corso del tempo. Ad esempio si controlla che l’indirizzo e-mail sia un indirizzo valido, cioè che sia nel formato [email protected]. Altri controllo riguardo il CAP ed i numeri di telefono o fax. Siccome questi dati sono necessariamente di tipo numerico, si impedisce che per errore vengano utilizzati dei caratteri alfabetici. L’ultima nota importante da aggiungere, riguarda il campo username. Questo campo insieme alla password, è il più importante di tutti, perché è solo tramite una combinazione di username e password che è possibile effettuare il login all’interno di Medtel. Bisogna prestare particolare attenzione quindi che due utenti non utilizzino la stessa username. Affinché questo non sia possibile, si è inserito un meccanismo di controllo real-time ad-hoc. Come si vede il processo di creazione di un nuovo utente, pur nella sua semplicità concettuale, nasconde diverse caratteristiche interessanti, soprattutto sotto l’aspetto tecnico. Il paragrafo seguente è infatti dedicato completamente agli aspetti realizzativi. - 46 - Nell’area di amministrazione gli utenti abilitati possono visualizzare un elenco degli utenti da loro creati e cliccando su un nominativo nella lista, avere maggiori informazioni sui dati di registrazione. Si è prestata particolare cura affinché sia possibile ritrovare facilmente un dato nell’elenco, anche nel caso questo diventi molto vasto. E’ stato quindi predisposto un motore di ricerca che permette di visualizzare solo i nomativi corrispondenti ad alcuni criteri, ad esempio si può richiedere di visualizzare solo gli utenti di un determinato tipo, creati in un particolare giorno, ecc…Naturalmente è prevista anche la possibilità di cercare per nome, cognome ed username. Per quanto riguarda l’elenco in quanto tale, anche questo presenta delle caratteristiche di sicuro interesse. Esso infatti supporta la paginazione dinamica, quindi l’utente può scegliere quanti elementi per pagina visualizzare, muoversi all’inizio o alla fine, ecc..Tutte queste caratteristiche per quanto banali, hanno richiesto notevoli sforzi tecnologiche perché bisogna ricordarsi che come al solito si sta parlando di una web application e non di una normale applicazione desktop. L’ultima possibilità che viene fornita agli amministratori è quella di poter eliminare gli utenti da loro stessi creati. Nello sviluppo di questa opzione si è dovuti procedere facendo molta attenzione che l’intero processo risultasse il più sicuro possibile e che fosse difficile compromettere il funzionamento di Medtel stesso. Cliccando su un nominativo nell’elenco si apre la finestra contenente i dati dell’utente e al contempo anche un bottone per procedere con l’eliminazione. Se si decide di eliminare l’utente bisogna cliccare sul bottone e subito appare un finestra di dialogo per confermare le proprie intenzioni. Questo è il primo meccanismo di sicurezza, il più semplice, affinché risulti difficile eliminare un utente per sbaglio. Il problema principale che si è dovuto affrontare però, non riguarda gli incidenti dovuti a cancellazioni casuali, ma quelli dovuti al collegamento tra gli utenti. In particolare si è visto che ogni utente è creato da un utente posto più in alto - 47 - nella scala gerarchica, e questo può arrivare a coinvolgere anche i pazienti, perché si sa che essi sono creati dai requester. Quando si elimina un utente c’è quindi il rischio che gli utenti da esso creati rimangano orfani. Nel caso di pazienti questo è un problema particolarmente serio perché i loro dati non sarebbero più accessibili e visualizzabili con notevoli ripercussioni sul funzionamento di Medtel. Per evitare che si presentino situazioni spiacevoli si è introdotto quindi il meccanismo di ereditarietà. Nel dettaglio significa fare in modo che al momento di eliminare un utente, venga effettuato un controllo per verificare che l’utente da eliminare non abbia a sua volta creato altri utenti o pazienti e nel qual caso, venga richiesto di specificare a chi riassegnare quest’ultimi. In questo modo si evita che si creino dei dati orfani nel database. Esiste comunque la possibilità di non riassegnare a nessuno gli utenti creati, ma viene specificato bene che si tratta di una scelta molto pericolosa e si richiede di confermare più volte le proprie intenzioni. Nel caso di dottori non ci sono problemi di eredità ed essi possono essere semplicemente eliminati senza ulteriori passaggi. Quella vista finora è una panoramica introduttiva delle funzionalità messe a disposizione dall’area di admin. Nel prossimo paragrafo verranno discussi gli aspetti tecnico-realizzativi. 3.4 Realizzazione tecnica 3.4.1 Struttura, componenti e classi Java La sezione di amministrazione è il risultato della collaborazione di molti componenti autonomi che svolgono funzioni più elementari e che nell’insieme formano la struttura di tutta l’area. Essendo Medtel programmato in Java e quindi con uno stile OOP, l’approccio possibile non poteva che essere quello scelto. In questo paragrafo si commenterà nel - 48 - dettaglio il codice Java che sta alla base della parte amministrativa, mettendo in risalto però, solamente i passi più interessanti da un punto di vista tecnico, ed evitando di evidenziare i tratti più manieristici o creati tramite procedure automatiche. La struttura della sezione amministrativa è definitiva dalla seguenti classi Java suddivise tra parte client e parte server: package com.uni.mirongwt.client (PARTE CLIENT) Admin.java Cntiene le altre componenti Registration.java Creazione di nuovi utenti RegistrationRM.java RegistrationRMAsync.java ListaUser.java Visualizzazione ed Eliminazione ListaUserRM.java ListaUserRMAsync.java ModRegistration.java Modica del proprio profile ModRegistrationRS.java ModRegistrationRSAsync.java UserArea.java Metodi comuni a tutto Medtel UserAreaRS.java UserAreaRSAsync.java Package com.uni.mirongwt.server (PARTE SERVER) RegistrationRMImpl.java ListaUserRMImpl.java ModRegistrationRSImpl.java UserAreaRSImpl.java Il codice di ogni singola classe verrà commentato nei prossimi paragrafi. - 49 - 3.4.1.1 Admin.java Per accedere alla sezione amministrativa è necessario passare tramite una procedura di login che controlla che le credenziali di accesso siano corrette e subito dopo carica il modulo principale che è rappresentato dalla classe Admin.java (per maggiori dettagli sulla procedura di login e logout vedi il paragrafo “Gestione della sessione”). Admin.java è il contenitore che unisce tra di loro tutte le varie componenti che formano l’area di amministrazione. Esso inoltre si occupa di creare la struttura a tab utilizzata per la presentazione delle informazioni. Ogni tab è definita da un titolo e contiene al suo interno un componente tra quelli elencati tra questi paragrafi. In particolare le tab sono in tutto tre: Home, New User e Created Users. New User contiene il componente per la creazione di nuovi utenti, Created Users invece quello per visualizzare ed eliminare gli utenti già creati. Si può facilmente intuire che grazie ad un design di questo tipo è facile agire su una sezione della parte amministrativa senza dover toccare il codice di un’altra area. Questo permette di limitare il più possibile errori accidentali dovuti a sviste ed inoltre preserva le area già sviluppate da quelle ancora in programmazione. Il tab Home non contiene altri componenti Java, ma è semplicemente una pagina HTML in cui è impostata un’immagine di sfondo e del testo di presentazione per l’area di admin. Il codice per la creazione della struttura a tab è il seguente: // creo un nuovo oggetto TabPanel di GWT TabPanel tabPanel = new TabPanel(); // costruttore della classe public Admin() { // imposta alcune proprietà del TabPanel tabPanel.setResizeTabs(false); tabPanel.setMinTabWidth(115); - 50 - tabPanel.setTabWidth(135); tabPanel.setWidth(700); tabPanel.setHeight(600); tabPanel.setTitle("Administrator Area"); // creo le componenti Panel insertedP = new Panel(); Panel newP = new Panel(); Panel homeP = new Panel(); // Tab New User newP.setTitle("New User"); newP.setPaddings(0); newP.setSize(699, 699); newP.add(new Registration(list,tabPanel,stype)); // Tab Created Users ListaUser list = new ListaUser(); insertedP.setTitle("Created Users"); insertedP.setPaddings(0); insertedP.setSize(699, 699); Panel pan = new Panel(); pan.setBorder(false); pan.setPaddings(20); pan.setLayout(new HorizontalLayout(15)); pan.add(list); insertedP.add(pan); // aggiungo le tab alla struttura tabPanel.add(homeP); tabPanel.add(newP); tabPanel.add(insertedP); tabPanel.setActiveTab(0); Il codice in Admin.java si occupa anche di creare la toolbar presente nella sezione d’amministrazione. La toolbar è analoga a quelle che si trovano in quasi tutte le normali applicazioni desktop e contiene al suo interno un menu a tendina da cui è possibile compiere due distinte operazioni: effettuare il logout ed accedere alla schermata che consente la modifica del proprio profilo. Nella toolbar inoltre, è presente un tasto per accedere all’aiuto contestuale di Medtel (cfr. “Usabilità”, cap. 5). Il codice qui di seguito illustra il meccanismo di creazione della toolbar: - 51 - // creo un nuovo oggetto Toolbar della libreria GWT Toolbar toolbar = new Toolbar(); // creo un nuovo bottone (HELP) ToolbarButton help = new ToolbarButton(); help.setIcon("help.png"); help.setTooltip("Help"); // aggiungo un listener di eventi per il click // sul bottone help.addListener(new ButtonListenerAdapter(){ public void onClick(Button button, EventObject e) { ….. // codice dell’evento click sull’HELP } }); // aggiungo il bottone alla toolbar toolbar.addButton(help); // aggiungo un separatore visivo toolbar.addSeparator(); // creo un nuovo menu a tendina Menu menu = new Menu(); // nuova opzione nel menu Item profile = new Item("Profile"); // listenr del click sull’opzione profile.addListener(new BaseItemListenerAdapter(){ public void onClick(BaseItem item, EventObject e) { … // codice del click sul Profilo } }); // aggiungo l’opzione logout Item logout = new Item("Logout"); // aggiungo il listener logout.addListener(new BaseItemListenerAdapter(){ public void onClick(BaseItem item, EventObject e) { …. // codice del click su Logout } }); - 52 - // aggiungo le opzioni al menu menu.addItem(profile); menu.addItem(logout); // aggiungo la toolbar alla struttura a tab tabPanel.setTopToolbar(toolbar); Anche se le righe di codice finora rappresentate sono un numero molto esiguo rispetto al totale di quelle che compongono Medtel, si possono comunque mettere in risalto alcuni passaggi interessanti. Come già detto in precedenza, Google Web Toolkit è una libreria per la programmazione di interfacce grafiche di tipo event-driven e quindi il codice viene eseguito in risposta alle azioni compiute dagli utenti come per esempio il click su un bottone. Per sfruttare questo approccio in GWT bisogna compiere diversi passaggi. Per prima cosa bisogna creare un oggetto listener istanziandolo dalla classe ButtonListenerAdapter(). A questo punto è necessario andare a ridefinire i metodi ereditati dalla classe madre a seconda dell’azioni di cui si vuole gestire l’attivazione. Per esempio nel codice precedente viene sempre definito il metodo OnClick(…) perché quello che si vuole è eseguire una determinata porzione di codice al click da parte dell’utente su un’area attiva della GUI. L’ultimo passo da compiere è collegare il listener all’oggetto di cui si vuole gestire il comportamento. Allo scopo è utile il metodo addListener che praticamente tutti gli oggetti della libreria GWT espongono. Si noti che nel codice precedente non è stato creato un oggetto nel modo standard, ma si è istanziata una classe anonima derivata direttamente dalla classe madre, contestualmente allla chiamata del metodo addListener. Questa tecnica è totalmente equivalente al procedura tradizionale, ma al vantaggio di permettere una scrittura più rapida del codice e allo stesso tempo permette al garbage collector di liberare la memoria per gli oggetti creati subito dopo che la loro esistenza non è più richiesta per l’esecuzione dell’applicazione. - 53 - 3.4.1.2 Registration.java, RegistrationRMImpl.java Le classi Registration.java e RegistrationRMImpl.java, insieme alle classi di servizio RegistrationRM.java e RegistrationRMAsync.java, contengono il codice del componente che si occupa di gestire il processo di creazione di un nuovo utente, così come questo è stato descritto nel paragrafo dedicato alle funzionalità. Registration.java, RegistrationRM.java e RegistrationRMAsync.java, appartengono alla parte client di Medtel, mentre RegistrationRMImpl.java è la Java Servlet che si occupa di fornire i servizi di connessione al database dalla parte del server. E’ chiaro quindi che la GUI del modulo per l’inserimento dei dati del nuovo utente, è definita nella classe Registration.java. Questa classe quindi, contiene tutti i metodi sviluppati per verificare che il form di registrazione venga compilato in maniera corretta insieme al codice per il collegamento con la Java Servlet. Si può cominciare ad illustrare il codice di Registration.java e RegistrationRMImpl.java, mettendo in risalto la parte che si occupa di controllare il tipo di utente che si sta creando e modificare il modulo di registrazione di conseguenza. In particolare, sono interessanti le righe, segnalate, che instaurano il collegamento con la Java Servlet allo scopo di ottenere l’elenco delle specializzazioni possibili per un medico, memorizzate nel database centrale. Questo è il codice client contenuto in Registration.java: // pannello con l’elenco delle specializzazioni final Panel resizablePanel = new Panel(); // setto alcune proprietà del pannello resizablePanel.setTitle("Doctor Specialization"); resizablePanel.setWidth(200); resizablePanel.setCollapsible(false); // creo un oggetto lista - 54 - final ListBox lb = new ListBox(); lb.setMultipleSelect(true); lb.setWidth("200"); lb.setHeight("70"); // // // // CONNESSIONE ALLA JAVA SERVLET RegistrationRMImpl.java RICHIAMO IL METODO special DEFINITO NELLA Servlet QUESTO METODO RESTITUISCE L’ELENCO DELLE SPECIALIZZAZIONI ESTRAPOLANDOLO DA UN DATABASE RegistrationRMAsync register = (RegistrationRMAsync) GWT.create(RegistrationRM.class); ServiceDefTarget endpoint = (ServiceDefTarget) register; String moduleRelativeURL = GWT.getModuleBaseURL() + "RegistrationRM"; endpoint.setServiceEntryPoint(moduleRelativeURL); AsyncCallback callback = new AsyncCallback() { public void onSuccess(Object result) { String[][] dati = (String[][])result; for (int i =0; i<dati.length; i++) { // Dati ricevuti dal server lb.addItem(dati[i][1],dati[i][0]); } } public void onFailure(Throwable caught) { MessageBox.alert("There was an error contacting the server. Please try again later"); } }; register.special(callback); // aggiungo la lista al pannello resizablePanel.add(lb); // inserisco nel modulo il radio box per la scelte // dell’utente, le opzioni possibili, variano a seconda // che sia un Super-Admin o un Manager // se 0 è un super-admin crea manager if (stype.equals("0")) { administrator = new RadioButton("userType"); absolutePanel.add(administrator, 253, 531); } // se 1 è un manager crea dottori e requester if (stype.equals("1")) { hospital = new TextField("Structure"); requester = new RadioButton("userType"); doctor = new RadioButton("userType"); - 55 - Come si vede nelle righe evidenziate dal commento in maiuscolo, in Registration.java viene richiamato il metodo special(…) definito nella servlet remota RegistrationRMImpl.java, di seguito quindi è illustrato il codice di questo metodo: public String[][] special(){ // creo una connessione al database MySQLDB // sfrutto l’oggetto db definito in Database.java // Questa classe è illustrata nei paragrafi successivi Database db = new Database("mironjava","mironjava","abppt_5"); // dati è la variabili di ritorno della funzione String[][] dati = new String[100][2]; // connessione db.connetti(); try { int i = 0; int rows = 0; // estraggo i dati db.query("SELECT * FROM exams ORDER BY name"); while (db.getResult().next()) { rows++; } dati = new String[rows][2]; db.getResult().beforeFirst(); while (db.getResult().next()) { dati[i] = new String[]{db.getResult().getString("id"),db.getResult().g etString("name")}; i++; } } catch (Exception e) { System.out.println(e.getMessage()); } return dati; } - 56 - La funzione special(…), è un metodo pubblico che restituisce un array multidimensionale di tipo String, come si vede fin dall’intestazione della procedura. L’array può essere visto come una tabella a due colonne, la prima contiene il codice numerico ed univoco della specializzazione, la seconda invece il nome vero e proprio. Il numero delle righe dell’array è naturalmente pari al numero di specializzazioni presenti nel database. Il codice visto fino a questo punto, permette già di farsi un’idea di come si possa costruire un’interfaccia grafica in GWT, di come si possano associare degli eventi agli oggetti della GUI ed infine di come avvenga il collegamento con le servlet remote. La maggior parte delle operazioni più comuni svolte in fase di sviluppo di Medtel sono quindi già stati illustrate. A questo punto è interessante mostrare il codice che si occupa di controllare che i campi obbligatori siano tutti compilati. Verranno inoltre evidenziati i meccanismi che consentono di verificare in tempo reale, che l’username scelta sia libera, che il formato dell’indirizzo e-mail sia corretto, che non si inseriscano caratteri alfabetici nelle textbox del numeri di telefono, del fax e del CAP ed infine che la password inserita e la sua conferma, siano idetiche. Il controllo della correttezza dell’e-mail è banale perché GWT mette a disposizione un metodo apposito: // creo il campo di testo per l’e-mail final TextField mail = new TextField("* E-mail"); // campo obbligatorio mail.setAllowBlank(false); // formato dei dati riconosciuti valida.VType.EMAIL è // una variabile di istanza statica della classe // VType di GWT mail.setVtype(VType.EMAIL); // Messaggio in caso di formato errato mail.setVtypeText("Plese enter a valid e-mail"); // Aggiungo il campo e-mail al form formPanel.add(mail); - 57 - Anche fare in modo che non si possano inserire caratteri nei numeri di telefono, fax e CAP è semplice grazie al fatto che GWT fornisce una classe da cui istanziare oggetti di tipo NumberField che in automatico disabilitano i caratteri quando sono attivati: // creo il campo per il CAP final NumberField cap = new NumberField("ZIP Code"); // creo il campo per il numero di telefono final NumberField telephone = new // creo il campo per il numero di fax final NumberField fax = new NumberField("Fax"); // aggiungo i campi al form di registrazione formPanel.add(cap); formPanel.add(telephone); formPanel.add(fax); Leggermente più complesso è verificare la coincidenza tra il campo password ed il campo conferma password. Allo scopo è necessario creare un oggetto validator. Questo tipo di oggetto va creato in un formato adatto affinché GWT possa utilizzarlo per verificare la validità di un campo. Va quindi creata una classe che implementa l’interfaccia Validator definendo l’unico metodo esposto dall’interfaccia stessa, cioè il metodo validate(…). A questo punto, bisogna collegare l’oggetto appena creato con il campo che si sta definendo, tramite il metodo setValidator(…). Il codice seguente illustra il funzionamento di tale meccanismo, si noti che la classe che implementa l’interfaccia Validator è una classe interna del componente definito in Registration.java: // campo per la password final TextField pass = new TextField("* Password"); pass.setPassword(true); pass.setAllowBlank(false); // classe da cui instanziare l’oggetto validator e che // implementa l’interfaccia Validator. Si noti che è // una classe interna - 58 - class validateConfirm implements Validator { boolean tmp = false; public boolean validate(String value) { if (value.equals(pass.getText())) { tmp = true; } else { tmp = false; } return tmp; } } // campo per la conferma final TextField confirm = new TextField("* Confim Password"); confirm.setAllowBlank(false); confirm.setPassword(true); // associo il validatore al campo confirm.setValidator(new validateConfirm()); // messaggio in caso di non conformità confirm.setInvalidText("Password mismatch"); Infine la parte più difficile di tutto il processo di verifica del modulo: il controllo che l’username scelta sia libera. Questo controllo richiede di estrapolare dei dati dal database e quindi l’interazione con metodi messi a disposizione dalla servlet remota definita in RegistrationRMImpl.java. Dalla parte del client il codice è pressoché identico a quello visto per la conferma della password. Si crea un oggetto validator a partire dall’interfaccia Validator e si definisce il metodo Validate(…). Quello che cambia è appunto il contenuto di questo metodo che questa volta deve effettuare una chiamata al codice remoto ed aspettare il risultato (sotto forma di un dato di tipo boolean). Ecco il codice commentato della parte client: // creo la classe da cui istanziare l’oggetto validator // si noti che la classe implementa l’interfaccia // validator class validateUser implements Validator { boolean tmp = false; public boolean validate(String value) { - 59 - // mi connetto alla Java Servlet remota tramite una // chiamata RPC RegistrationRMAsync register = (RegistrationRMAsync) GWT.create(RegistrationRM.class); ServiceDefTarget endpoint = (ServiceDefTarget) register; String moduleRelativeURL = GWT.getModuleBaseURL() + "RegistrationRM"; endpoint.setServiceEntryPoint(moduleRelativeURL); AsyncCallback callback = new AsyncCallback() { public void onSuccess(Object result) { if (result.toString().equals("true")) { tmp = true; // username libera } else { tmp = false; // username occupata } } public void onFailure(Throwable caught) { // se si verifica un errore non // accade nulla } }; // chiamo il metodo remoto free. Value è l’username che // voglio controllare register.free(value, callback); return tmp; } } // creo il campo username final TextField user = new TextField("* Username"); // imposto il testo da visualizzare in caso di errore // cioè quando la username è già occupata user.setInvalidText("Not Free"); // associo il validator user.setValidator(new validateUser()); // aggiungo il campo username al modulo formPanel.add(user); Il codice del client mostrato richiama la funzione free(…) sul server. Il metodo free è così definito: - 60 - // metodo richiamato dalla GUI public String free(String username) { // nuova connessione al database Database conn = new Database("mironjava","mironjava","abppt_5"); conn.connetti(); // query SQL per estrapolare le informazioni dal // database String query = "SELECT * FROM users WHERE username=\""+username+"\""; // esegui la query e ritorno i risulti in uscita try { conn.query(query); if(!conn.getResult().next()){ return "true"; } else { return "false"; } } // se si verifica un errore stampo un messaggio // e ritorno comunque il valore false catch (Exception e) { System.out.println(e.getMessage()); return "false"; } } Come si vede esso richiede di specificare in ingresso una username di cui si vuole controllare lo stato. In uscita abbiamo due possibili valori booleani: true se la username è libera, false se è già utilizzata da un altro utente. Logicamente se viene restituito il valore false non si può procedere con la registrazione del nuovo utente, senza cambiare prima l’username scelta. Il controllo viene effettuato in tempo reale mentre si inseriscono uno dopo l’altro i caratteri nel campo username. Il codice snello della procedura permette di minimizzare i rallentamenti che questa scelta inevitabilmente comporta. - 61 - 3.4.1.3 ListaUser.java, ListaUserRMImpl.java Le classi ListaUser.java e ListaUserRMImpl.java, rispettivamente appartenenti ai package client e server di Medtel, si occupano di visualizzare l’elenco degli utenti creati da un amministratore e di permettere di operare su di esso, ad esempio eliminando un nominativo. Questo componente è contenuto nel tab Created Users del modulo principale Admin.java. Si può cominciare col visionare il codice che si occupa di visualizzare l’elenco degli utenti. Come detto in precedenza per la visualizzazione è stato utilizzato un complesso widget messo a disposizione da GWT-Ext che supporta la paginazione dinamica. Oltre a ciò, esso consente di ordinare i dati in vario modo, ad esempio per nome, e di effettuare ricerche tra di essi. E’ quindi un oggetto molto potente, ma che richiede un’attenta configurazione in fase di programmazione. Di seguito è visualizzato il codice che lo gestisce. Il codice è commentato in modo che tutti i passaggi risultino chiari: // Creo un recordset per contenere i dati estrapolati // dal database recordDef = new RecordDef( new FieldDef[]{ new StringFieldDef("id"), new StringFieldDef("date_create"), new StringFieldDef("user"), new StringFieldDef("name"), new StringFieldDef("surname"), new StringFieldDef("type"), } ); // chiamata RPC alla funzione view_user contenuta nella // Java Servlet remota ListaUserRMImpl.java final ListaUserRMAsync list = (ListaUserRMAsync) GWT.create(ListaUserRM.class); - 62 - ServiceDefTarget target = (ServiceDefTarget) list; target.setServiceEntryPoint(GWT.getModuleBaseURL() + "ListaUserRM"); AsyncCallback callback = new AsyncCallback() { public void onSuccess(Object result) { // chiamata riuscita. Elaboro i dati ricevuti // In particolare copio i dati ricevuti dall’arrayList // result all’array di oggetti multidimensionale data Object[][] data; final ArrayList matrice = (ArrayList) result; if(matrice!=null){ int righe=matrice.size(); int colonne=((ArrayList)matrice.get(0)).size(); Object[][] table = new Object [righe][colonne]; for(int i = 0; i < matrice.size();i++){ for(int j = 0; j < ((ArrayList)matrice.get(i)).size(); j++) { table[i][j]=(String)((ArrayList)matrice.get(i)).get(j); } } data= table; proxy = new PagingMemoryProxy(data); } else { proxy=null; } // college i dati alla grid ArrayReader reader = new ArrayReader(recordDef); Store store = new Store(proxy, reader, true); grid.setStore(store); // configure le colonne della grid da visualizzare ColumnConfig[] columns = new ColumnConfig[]{ new ColumnConfig("ID", "id", 30,true, null, "id"), new ColumnConfig("DATE CREATE", "date_create", 100, true, null, "date_create"), new ColumnConfig("USERNAME", "user", 100, true, null, "user"), new ColumnConfig("NAME", "name", 100, true, null, "name"), }; - 63 - grid.setTitle("INSERTED USERS"); // Toolbar che contiene il motore di ricerca Toolbar topToolbar = new Toolbar(); grid.setTopToolbar(topToolbar); // motore di ricerca GridSearchPlugin gridSearch = new GridSearchPlugin( GridSearchPlugin.TOP ); grid.addPlugin(gridSearch); // toolbar in basso per gestire la paginazione final PagingToolbar pagingToolbar = new PagingToolbar(store); ... // setto alcune proprietà visive della toolbar grid.setBottomToolbar(pagingToolbar); // Listener per il click su un nominativo nell’elenco grid.addGridCellListener(new GridCellListenerAdapter() { public void onCellClick(GridPanel grid, int rowIndex, int colindex,EventObject e) { … // click su un nominativo nell’elenco } Dal codice riportato qui sopra si evince che per popolare l’elenco degli utenti è necessario estrapolare i dati di questi ultimi dal database. Quindi come normalmente accade, bisogna richiamare una funzione definita in una Java Servlet remota. Quest’operazione viene effettuata dalle righe che richiamano il metodo view_user(…), contenuto nella classe ListaUserRMImpl.java. Non verrà riportato il codice della servlet perché essa si limita ad instaurare una connessione al database principale ed eseguire una query SQL, con un procedimento analogo a quello visto già molte altre volte nel corso di questa trattazione. L’unica cosa che è importante evidenziare, è che i dati vengono passati attraverso un oggetto - 64 - che finora non era mai apparso tra questi paragrafi, cioè un ArrayList. Un ArrayList può essere visto come un normale array, ma con una differenza importante: mentre gli array tradizionali sono statici e quindi è necessario specificare le loro dimensioni in fase di creazione, gli ArrayList sono dinamici e di conseguenza le loro dimensioni variano a seconda dei dati che sono contenuti al loro interno. Java gestisce in maniera profondamente diversa i due tipi di dato, anche se per i programmatori il funzionamento è sostanzialmente identico. Non conoscendo a priori gli utenti da visualizzare, la scelta di un ArrayList come tipo di ritorno per la Java Servlet, è apparsa la più sensata. Nel codice precedente viene richiama la funzione grid.addGridCellListener(…). Questo metodo permette di associare all’oggetto grid un listener per la gestione dell’evento generato in seguito al click su un nominativo nell’elenco. La procedura si occupa quindi di creare una finestra in cui vengono riportati i dati dell’utente selezionato. Il codice lato client è il seguente // Chiamata RPC al metodo getData(…) nella Java // Servlet per ottenre i dati dell’utente selezionato ListaUserRMAsync listaUser = (ListaUserRMAsync) GWT.create(ListaUserRM.class); ServiceDefTarget endpoint = (ServiceDefTarget) listaUser; String moduleRelativeURL = GWT.getModuleBaseURL() + "ListaUserRM"; endpoint.setServiceEntryPoint(moduleRelativeURL); AsyncCallback callback = new AsyncCallback() { public void onSuccess(Object result) { // imposto i campi della window String[] dati = (String[])result; name.setText(dati[1]); - 65 - surname.setText(dati[0]); username.setText(dati[2]); type.setText(dati[6]); address.setText(dati[3]); cap.setText(dati[12]); email.setText(dati[7]); telephone.setText(dati[9]); createddate.setText(dati[10]); structure.setText(dati[11]); special.setText(dati[14]); // se è un medico, non mostro il campo // struttura, ma quello specializzazioni if (type.getText().equals("doctor")) { structure.setVisible(false); structureL.setVisible(false); specialL.setVisible(true); special.setVisible(true); } // se è un requester, mostro il campo // struttura e non quello specializzazioni if (type.getText().equals("requester")) { structure.setVisible(true); structureL.setVisible(true); specialL.setVisible(false); special.setVisible(false); } // se è un manager non mostro ne struttura // ne specializzazioni if (type.getText().equals("administrator")) { structure.setVisible(false); structureL.setVisible(false); specialL.setVisible(false); special.setVisible(false); } } public void onFailure(Throwable caught) { // si è verificato un errore, non mostro // la finestra, ma un messaggio window.hide(); MessageBox.alert("There was an error connecting to the remote service. Please try again"); } }; // chiamo la funzione per caricare i dati e poi mostro // la finestra listaUser.getData(…); window.show(); - 66 - Il codice lato server, cioè quello del metodo getData(…), si preferisci non riportarlo perché sostanzialmente si occupa di eseguire una normale query SQL sul database e riportare in uscita i dati di un utente attraverso un normale array di String, alla stregue del codice già visto più volte in precedenza. L’ultima procedura che il componente ListaUser,java mette a disposizione è quella di eliminazione di un utente. I meccanismi di ereditarietà e sicurezza che regolano il processo sono già stati ampiamente trattati nel paragrafo dedicato alla funzionalità, quindi in questa sede si mostrerà solamente il codice che gestisce il tutto, prima quello del package client e poi quello del package server. // creo il tasto per eliminare e aggiungo un listener // per il click final Button elimina = new Button("Delete user"); elimina.addListener(new ButtonListenerAdapter() { public void onClick(final Button button) { // dialog-box di conferma MessageBox.confirm(""Are you sure?", new MessageBox.ConfirmCallback() { // conferma ottenuta public void execute(String btnID) { // tipo di utente selezionato String tt = grid.getAsString("type"); // non è un dottore if (btnID.equals("yes") && !tt.equals("doctor")) { … // codice per la selezione di un nuovo // padre per gli utenti rimasti orfani public void onClick(final Button button) { … // chiamata RPC per eliminare i dati sul DB … // aggiorno l’elenco refreshGrid(); } - 67 - // l’utente da eliminare è un dottore, non devo // riassegnare nulla else if (btnID.equals("yes") && tt.equals("doctor")) { // elimino l’utente e aggiorno la griglia refreshGrid(); } public void refreshGrid() { Panel insertedP = new Panel(); ListaUser list = new ListaUser(); insertedP.setTitle("Created Users"); pan.add(list); insertedP.add(pan); tabpanel.add(newP); tabpanel.add(insertedP); } Del codice client qui riportato è interessante evidenziare il meccanismo per aggiornare l’elenco degli utenti dopo che un nominativo è stato eliminato dal database. Allo scopo è richiamata la funzione refreshGrid(…) che non fa altro che rimuovere il tab dalla struttura principale definita in Admin.java, ricrearlo ed infine aggiungerlo nuovamente. In questo modo la memoria occupata dal widget originario viene liberata per far posto ad un nuovo widget, identico, ma proprio perché appena istanziato, aggiornato all’ultima operazione eseguita. Un procedura analoga è sfruttata per aggiornare l’elenco anche quando si crea un nuovo utente. Di seguito invece è mostrata la Java Servlet che elimina l’utente dal database. Il nome del metodo, contenuto in ListaUserRMImpl.java, è delete(…), e sostanzialmente esegue solamente una serie di query SQL a cascata. public boolean delete(int id, int newid) { // Connessione al database Database conn = new Database("mironjava","mironjava","abppt_5"); // Query SQL per eliminare i dati dalle varie tabelle - 68 - String query = "DELETE FROM users WHERE id="+id; String query2 = "DELETE FROM exams_users WHERE // l’id dell’utente da eliminare è passato come // parametro alla funzione user_id="+id; String query3 = "UPDATE users SET creator_id ="+newid+" WHERE creator_id="+id; String query4 = "UPDATE patients SET user_id ="+newid+" WHERE user_id="+id; // eseguo le query una dopo l’altra try { conn.connetti(); conn.insert(query); conn.insert(query2); conn.insert(query3); conn.insert(query4); catch (Exception e) { return false; } return true; } 3.4.1.4 ModRegistration.java, ModRegistrationRSImpl.java Il componente ModRegistration.java, insieme alla sua controparte server ModRegistrationRSImpl.java, si occupa di mostrare un modulo per permettere ad un manager o ad un super-admin, di modificare parte del proprio profilo, in particolare i propri dati anagrafici, la propria e-mail e la propria password. Non è possibile invece cambiare l’username di registrazione perché grazie a questa scelta si mantiene il database centrale di Medtel il più coerente possibile. Il componente è attivabile attraverso la voce presente nel menu a tendina contenuto nella toolbar principale della sezione amministrativa, così come è stato illustrato nel paragrafo dedicato alle funzionalità. C’è ModRegistration.java, da non notare viene che utilizzata - 69 - la classe solamente definita nelle in parte amministrativa di Medtel, ma proprio perché a tutti gli utenti dell’applicazione, siano essi medici, amministratori o requester, è concesso di aggiornare il proprio profilo, essa viene richiamata in quasi tutti i contesti. In questo paragrafo non verrà riportato il codice del componente perché esso fa uso delle stesse tecniche viste per il modulo di creazione di un nuovo utente, comprese quelle per il controllo dei campi, e quindi la loro riproposizione anche in questa sede risulterebbe un’inutile ripetizione. 3.4.1.5 UserArea.java, UserAreaRSImpl.java Gli ultimi metodi utilizzati nella sezione amministrativa sono quelli messi a disposizione dalla classe UserArea.java. In realtà questa classe non è un componente specifico dell’area amministrativa, ma essa si occupa di definire delle funzioni di uso comune in tutto Medtel. E’ quindi una classe sicuramente molto importante e di cui vale la pena commentare qualche stralcio di codice. UserArea.java fa parte del package client e quindi non fornisce procedure per la connessione al database, ma in essa sono descritti tre metodi: 1) reload() 2) load_name(…) 3) logout() Tutte e tre le funzioni vengono utilizzate all’interno del codice dell’area amministrativa. In particolare load_name(…) si occupa di mostrare il nome dell’utente loggato in Medtel all’interno della toolbar, logout(…) gestisce il processo di uscita dall’applicativo e reload() è di supporto per l’esecuzione di logout(…). Nel suo funzionamento UserArea.java richiede di potersi interfacciare con il database. Nel packages server è quindi presente la Java Servlet UserAreaRSImpl.java complementare alla parte client. - 70 - Questo è il contenuto completo di UserArea.java, di seguito il codice verrà commentato: public class UserArea extends Composite { public static native void reload() /*-{ $wnd.location.reload(); }-*/; public static void load_name(){ final UserAreaRSAsync load = (UserAreaRSAsync) GWT.create(UserAreaRS.class); //crea il servizo ServiceDefTarget endpoint = (ServiceDefTarget) load; endpoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "UserAreaRS"); final AsyncCallback callback = new AsyncCallback() { public void onSuccess(Object result) { String name = (String) result; options.setText(name); } public void onFailure(Throwable caught) { } }; load.load(callback); } public static void logout(final Panel tab){ final UserAreaRSAsync logout = (UserAreaRSAsync) GWT.create(UserAreaRS.class); //crea il servizo ServiceDefTarget endpoint = (ServiceDefTarget) logout; endpoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "UserAreaRS"); final AsyncCallback callback = new AsyncCallback() { public void onSuccess(Object result) { tab.getEl().mask("Logging out...", "x-mask-loading"); Timer timer = new Timer() { public void run() { tab.getEl().unmask(); reload(); - 71 - } }; timer.schedule(2000); } public void onFailure(Throwable caught) { } }; logout.logout(callback); } } La classe presenta multi spunti interessanti. Tanto per cominciare viene sfruttata una caratteristica del Google Web Toolkit che finora non era mai stata messa in rilievo, ovvero la possibilità di inserire codice Javascript direttamente in quello Java. Nella documentazione del GWT questa tecnica viene chiamata inline Javascript ricalcando il nome con cui viene chiamata la procedura utilizzata dai programmatori C per inserire del codice assembler all’interno dei loro programmi. Per inserire del Javascript bisogna racchiuderlo all’interno di un commento, in modo che venga ignorato dal compilatore Java, altrimenti si solleverebbe un’eccezione. A questo punto è necessario far capire all’interprete GWT che si tratta di codice Javascript e non di un vero e proprio commento. Allo scopo è necessario precedere ogni istruzione dal carattere $. La funzione reload(…) usa l’inline Javascript per aggiornare la pagina, in modo da effettuare il logout. Un altro passaggio interessante è quello in cui viene creato un oggetto di tipo Timer. Gli oggetti timer permettono di eseguire una porzione di codice ad intervalli regolari che possono essere impostati in fase di creazione. Nel codice mostrato l’oggetto timer viene utilizzato per mostrare un messaggio di informazione all’utente che sta effettuando il logout, e per farlo poi - 72 - sparire dopo un intervallo di tempo di 2000 millesimi di secondo, ovvero due secondi. L’ultima nota che si può aggiungere a quanto appena visto, è il fatto che tutti i metodi raccolti in UserArea.java sono dei metodi statici. In questo modo si evita di dover istanziare un oggetto dalla classe per poterli richiamare. 3.4.2 Struttura dei dati nel database Si è visto più volte nel corso della presentazione dei componenti utilizzati per realizzare la sezione amministrativa, che essi richiedono di estrapolare un gran numero di informazioni memorizzate nel database principale. Questo è possibile tramite chiamate RPC/Ajax a metodi contenuti nel package server che si occupano della connessione al database e di lanciare query SQL. I dati contenuti nel database sono organizzati con la classica struttura che viene in genere utilizzata dai Database Management System di tipo relazionale, ovvero le tabelle di records. In questo paragrafo si vuole quindi fornire una panoramica delle tabelle che contengono dati di interesse per la parte amministrativa. In particolare le tabelle utilizzate sono le seguenti: 1) users 2) exams 3) exams_users La tabella users contiene la maggior parte delle informazioni sugli utenti registrati a Medtel. Viene quindi utilizzata nella procedura di login, in quanto in essa sono memorizzate tutte le coppie username/password, e poi in tutte le procedure di eliminazione, aggiunta ed elencazione degli utenti che vengono svolte nell’area amministrativa. E’ quindi una tabella molto - 73 - importante e che necessità di una cura particolare per quanto riguarda la sua sicurezza (si veda a questo proposito il paragrafo dedicato alla sicurezza del database). La tabella exams contiene invece l’elenco delle specializzazioni dei medici che sono riconosciute come valide da Medtel. Essa viene utilizzate in fase di creazione di un nuovo medico oppure quando si visualizzano le informazioni di un medico già registrato nel database. La tabella exams lavora a questo scopo con la sua complementare, ovvero la tabella exams_users, che contiene l’elenco delle specializzazione associate ai nominativi del personale sanitario. Per concludere il paragrafo, viene illustrata la struttura delle tre tabelle utilizzate, ovvero l’elenco dei campi e il tipo di dati in essi contenuti. Tabella Users id Identificativo numerico (INT) surname Cognome (VARCHAR) name Nome (VARCHAR) username Username (VARCHAR) hashed_password Password criptata (VARCHAR) address Indirizzo di residenza (VARCHAR) cap CAP di residenza (INT) telephone_number Numero di telefono (INT) mail Indirizzo e-mail (VARCHAR) fax Numero di Fax (INT) type Tipo utente: admim, doctor, requester (INT) creator_id Identifico dell’utente padre (INT) created_at Data ed ora di creazione dell’utente (DATE) structure Struttura per il requester (VARCHAR) - 74 - location Città di residenza (VARCHAR) state Nazione di residenza (VARCHAR) stype Super-admin o manager (INT) Tabella exams id Identificativo numerico (INT) name Nome specializzazione (VARCHAR) Tabella exams_users user_id Identificativo numerico dell’utente (INT) exam_id Identificativo numerico dell’esame (INT) 3.4.3 Gestione della sessione Per gestione della sessione s’intende il modo attraverso il quale vengono preservate le informazioni di login dopo che un utente si è identificato in Medtel, inserendo nome utente e password. Durante l’esecuzione infatti, risulta spesso necessario compiere operazioni che richiedono proprio questo tipo di informazioni, come ad esempio nel caso l’utente voglia modificare il proprio profilo. Questi dati devono quindi essere conservati da qualche parte durante tutto l’arco di tempo in cui l’utente rimane connesso a Medtel. Allo scopo si è scelto di memorizzate i dati sfruttando dei meccanismi messi a disposizione dalla tecnologia Java Servlet. In particolari questi meccanismi permettono di memorizzare degli oggetti Java in alcune variabili “virtuali”. Virtuali perché questo tipo di variabili saranno gestisce in maniera totalmente differente rispetto alla tradizionali variabili d’istanza - 75 - che si utilizzano in Java. La differenza principale sta nel fatto che, una volta memorizzati gli oggetti attraverso le procedure per la gestione della sessione, questi oggetti sono richiamabili da qualunque parte del codice contenuto nel package server, tramite dei metodi appositi. In questo modo si può facilmente gestire il passaggio di dati tra le varie componenti. Alla luce di tutto questo, si evince che per memorizzare i dati di un utente che si è accreditato presso Medtel, è necessario progettare un oggetto apposito che li contenga al proprio interno. La classe UserSession.java del package server definisce proprio questo oggetto. Il codice è il seguente: public class UserSession implements IsSerializable{ private private private private private private int id; String user; String name; String surname; String mail; String type; public UserSession(int id, String user,String name, String surname,String mail, String type){ this.id=id; this.user=user; this.name=name; this.surname=surname; this.mail=mail; this.type=type; } //metodi per impostare i valori public void setId(int id){ this.id=id; } public void setUser(String user){ this.user=user; } public void setName(String name){ this.name=name; } public void setSurname(String surname){ this.surname=surname; } public void setMail(String mail){ - 76 - this.mail=mail; } public void setType(String type){ this.type=type; } //metodi per prendere i valori public int getId(){ return id; } public String getUser(){ return user; } public String getName(){ return name; } public String getSurname(){ return surname; } public String getMail(){ return mail; } public String getType(){ return type; } } Si vede che la classe implementa l’interfaccia isSerializable affinché gli oggetti istanziati da essa possano essere trasferiti tramite chiamate a metodi remoti, così come è già stato illustrato nei capitoli precedenti. Oltre a questo, la classe definisce delle variabili che conterranno i dati dell’utente, e dei metodi per leggere il valore di questi variabili nonché di impostarlo. A questo punto si può illustrare quali siano i comandi che Java Servlet mette a disposizione per memorizzare delle variabili di sessione e successivamente per leggerle. Per memorizzare un oggetto all’interno di una variabili di sessione si utilizzano le seguenti istruzioni: // Creo un oggetto dalla classe UserSession // per contenare i dati dell’utente che effettua // il login in Medtel UserSession usersession = new UserSession(id,utente,name,surname,mail,type); - 77 - // Creo un oggetto per la gestione della sessione HttpServletRequest request = this.getThreadLocalRequest(); HttpSession session = request.getSession(); // Registro nella variabili virtuale us // l’oggetto UserSession creato in precedenza session.setAttribute("us", usersession); Il codice è estremamente semplice, Java Servlet permette infatti di gestire agevolmente il meccanismo di creazione e distruzione delle variabili di sessione. A questo punto se si vuole leggere una variabile di sessione creata con il metodo precedente, bisogna utilizzare questi comandi: // Creo un oggetto per gestire la sessione HttpServletRequest request = this.getThreadLocalRequest(); HttpSession session = request.getSession(); // Ottengo la variabili di sessione contenuta in “us” UserSession currentPatient=(UserSession) session.getAttribute("us"); Per concludere il paragrafo non resta altro che specificare dove effettivamente questi dati vengano tenuti durante l’esecuzione di Medtel. Gli oggetti memorizzati tramite la tecnica delle variabili di sessione vengono salvati nel computer dell’utente che utilizza l’applicativo, sotto forma di cookies. I cookies sono dei files gestiti dal browser su richiesta dei siti internet, e contenuti in genere nella cartella d’installazione del browser stesso. Si può quindi affermare che Java Servlet tramite la gestione delle sessioni permette ai programmatori di sfruttare la tecnologia dei cookies in maniera poco complessa ed efficace. - 78 - 3.5 Problematiche di sicurezza 3.5.1 SSL e Login La procedura di login di un utente all’interno di Medtel rappresenta uno dei momenti di maggior rischio durante tutta l’esecuzione dell’applicazione per quanto riguarda la sicurezza dei dati. Infatti è proprio durante la procedura di accesso che un utente è costretto a fornire le proprie username e password affinché si possano controllare le sue credenziali. Una volta che i dati sono partiti dalla postazione client dell’utente, questi viaggiano attraverso la rete fino ai server di Medtel dove poi vengono elaborati. Il rischio maggiore sta proprio nel passaggio attraverso la rete, un attaccante potrebbe infatti inserirsi nel traffico ed andare a leggere le informazioni di login. Se le credenziali sono di alto livello, mettiamo addirittura di un super-admin, i problemi diventano molto seri, perché a questo punto l’attaccante potrebbe sfruttare i privilegi per creare nuovi utenti, modificare utenti già creati, o più in generale per compromettere il normale funzionamento di Medtel. Ora che si è capito qual’è il potenziale di rischio insito nella stessa procedura di login, ci si deve chiedere quali siano le possibili soluzioni affinché il funzionamento dell’applicativo sia il più sicuro possibile. Tutto questo anche alla luce della constatazione che i dati trattati in Medtel sono dati medici e quindi estremamente sensibili. Le soluzione sono essenzialmente due: modificare la procedura con cui si accede ai servizi, oppure rendere il processo più sicuro, pur non modificandone sostanzialmente la dinamica. Prima di vedere nel dettaglio le due soluzioni, diciamo subito che Medtel, al momento, non implementa nessuno dei due meccanismi, perché si tratta di un prodotto ancora non completamente - 79 - maturo per essere distribuito sul mercato, e quindi in futuro potranno essere fatte ancora molte modifiche. Per quanto riguarda la prima soluzione, si potrebbe pensare di eliminare direttamente la necessità di inserire una username ed una password, passando ad un accesso tramite una procedura hardware e non software. In particolare si potrebbero distribuire insieme all’applicativo dei dispositivi da collegare ai computer degli utilizzatori, ad esempio delle chiavette USB, contenenti tutte le credenziali d’accesso. Medtel dovrebbe quindi andare a leggere in automatico il contenuto di queste smart card senza che all’utente venga richiesto nulla in fase di avvio. Questa soluzione da un lato offre il vantaggio di un altissimo grado di sicurezza, ma dall’altro è estremamente costosa e di conseguenza non adatta agli scopi che Medtel si prefigge, cioè di diffondersi nei paesi più poveri. L’altra soluzione prevede invece di utilizzare delle tecniche di criptazione dei dati in fase di login, in modo che essi non viaggino in chiaro lungo la rete, ma siano protetti durante il loro tragitto. Per far questo, si potrebbe quindi utilizzare il protocollo HTTPs invece del normale protocollo HTTP, perché esso prevede già nella propria architettura la criptazione dei dati tramite SSL. Questa soluzione appare di gran lunga più fattibile rispetto alla precedente, perché offre un ottimo rapporto tra vantaggi e costi. Il costo infatti sarebbe praticamente nullo, legato al più ad un leggero calo di prestazioni, dall’altro la sicurezza sarebbe comunque elevata e più che sufficiente per il funzionamento di Medtel. 3.5.2 Sicurezza del database Un’altra problematica di sicurezza oltre quella presentata nel paragrafo precedente è quella che coinvolge il database centrale dei dati. Il database è un elemento ad alto rischio nell’architettura di Medtel perché contiene al - 80 - suo interno le informazioni necessarie al funzionamento di Medtel, come ad esempio le username di accesso, nonché i dati medici dei pazienti. Un attaccante potrebbe tentare di arrivare ad esso e carpire informazioni cliniche con un evidente rischio per la privacy degli utilizzatori, oppure potrebbe tentare di ottenere delle credenziali di accesso. Per cercare di scongiurare questi eventi, bisogna fare particolare attenzione nel proteggere il database centrale ed i dati in esso contenuti. Il modo migliore per far questo sarebbe quello di installarlo su un server diverso rispetto a quello che ospita Medtel, e fare in modo che questo server sia irraggiungibile dall’esterno attraverso la rete. Cioè impedirebbe qualsiasi tipo di attacco, tranne l’ipotesi remota di un accesso fisico diretto ai laboratori dell’università. Se è impossibile dislocare il database su un altro computer si può comunque fare in modo che almeno le credenziali di accesso risultino inutilizzabili da parte di un attaccante che sia riuscito ad intrufolarsi all’interno della base di dati. Per far questo, Medtel memorizza le password nella tabella users, non in chiaro, ma in forma criptata. In particolare si utilizza una criptazione one-way ovvero dalla quale non è possibile risalire ai dati originali. Un attaccante che anche riuscisse a visionare la tabella users non potrebbe comunque scoprire la password degli amministratori e degli altri utenti. Naturalmente esistono molte altre tecniche che potrebbero venire usate per compromettere il funzionamento di Medtel a partire dal database centrale. Si potrebbero ad esempio, cancellare tutti i dati in maniera irreversibile. L’unica protezione da attacchi di questo tipo, come da molti altri, è quella di effettuare dei backup frequenti, e controllare costantemente l’attività, in modo che in caso di danneggiamenti sia facile ristabilire le condizioni originarie e limitare i danni. - 81 - CAPITOLO 4 Dati Biomedici 4.1 Dati biomedici La crescente diffusione dell’uso delle tecnologie informatiche ed elettroniche nella pratica medica, ha posto il mondo della ricerca e dell’industria di fronte a diverse problematiche circa il modo migliore per gestire ed ottimizzare le grandi quantità di dati digitali prodotti. Tra le molte problematiche a cui si è dovuto trovare soluzione, quella dei formati per i dati biomedici è una delle più interessanti. Essa infatti pone questioni che investono moltissimi settori dell’ICT, a partire dall’hardware per lo storage fino ad arrivare allo sviluppo di software per la lettura di questi dati. In questo capitolo ci si occuperà particolarmente proprio di quest’ultima tematica. La diagnostica per immagini (o imaging biomedico) è una delle metodologie mediche più diffuse in tutto il mondo. Attraverso di essa è possibile osservare un’area dell’organismo non direttamente raggiungibile dall’esterno, utilizzando dispositivi ed apparecchiature progettate per questo scopo. Questa strumentazione in genere produce in uscita dei dati in formato digitale e quindi direttamente manipolabili tramite dei computer. Affinché sia possibile l’interscambio dei dati tra i dispositivi sanitari ed i computer però, è necessario che questi siano espressi in un formato comprensibile ad ambedue i sistemi e quindi, è necessario progettare degli standard ampiamente riconosciuti a livello internazionale ed industriale. Questi formati devono essere per forza molto complessi perché le problematiche da affrontare nella gestione dei dati medici digitali sono - 82 - molto diversificate. Un tipico problema che si deve affrontare è ad esempio quello della dimensione dei dati in uscita. Spesso infatti le macchine per l’imaging biomedico, come un endoscopio, produco una notevole quantità di informazioni non compresse. Il formato dei dati che dovrà gestirle quindi è chiamato a trovare un modo per memorizzarle in maniera efficiente, senza però intaccarne la qualità che è imprescindibile per una corretta diagnosi medica. Un altro problema molto comune è dovuto al fatto che spesso questi dati sono di natura estremamente eterogenea, ad esempio un dispositivo potrebbe essere utilizzato per più scopi differenti e quindi, è necessario che il formato sia abbastanza versatile e scalabile in contesti differenti. L’ultima problematica che si vuole mettere in evidenza riguarda la velocità ed i costi. Il formato dei dati dovrebbe essere in grado di lavorare nel modo più efficiente possibile e con costi abbastanza contenuti. Tutti questi sono esempi delle difficoltà incontrata dalle aziende e dai centri di ricerca nell’affrontare lo sviluppo di formati per la gestione dei dati biomedici. Nonostante tutto però, la forte necessità di uno standard per l’interscambio dei dati, ha portato allo sviluppo di diverse soluzioni, tutte con i loro pregi e difetti. In questo capitolo si illustrerà una di queste soluzioni, ovvero il formato DICOM. Il formato DICOM è probabilmente lo standard che si è più affermato nel mondo industriale e medico mondiale grazie alle sue qualità ed ai suoi punti di forza. Il prossimo paragrafo è dedicato completamente ad una descrizione delle sue caratteristiche e del suo funzionamento. 4.2 DICOM Il Digital Imaging and Communications in Medicine (DICOM) è uno standard per la gestione, la memorizzazione, la stampa e la trasmissione di immagini mediche provenienti da strumentazioni diagnostiche. - 83 - Il DICOM è uno standard estremamente complesso, esso infatti nasce per far fronte ad esigenze eterogenee e quindi il suo sviluppo ha comportato scelte di design radicali. Di conseguenza il DICOM non può essere considerato solo un semplice formato dati ma invece sarebbe più corretto inquadrarlo come protocollo per l’interscambio di informazioni tra sistemi differenti, che al contempo definisce al proprio interno anche delle linee guida per i dati che transitano attraverso esso. Lo standard DICOM è sostanzialmente suddiviso in due parti principali: la prima descrive un formato per i file, la seconda invece il protocollo di comunicazione vero e proprio. Il protocollo di comunicazione è situato al livello più alto della pila ISO/OSI ed è quindi un protocollo applicativo che si basa sul TCP/IP per instradare la comunicazione tra le macchine coinvolte, che possono essere notebook, server mainframe oppure dispositivi elettromedicali. Lo standard è stato sviluppato da un comitato tecnico costituito all’interno della National Electrical Manufacturers Association (NEMA) che attualmente detiene ancora il copyright sulle specifiche. Il DICOM permette un’integrazione estesa tra i dispositivi che dichiarano di essere conformi alle sue linee guide. Occorre notare però, che il DICOM è uno standard industriale, e non uno standard ISO, quindi universale: ciò comporta una certa tolleranza nell'implementazione delle specifiche, al punto che attualmente forse non esistono apparecchiature che possano definirsi pienamente DICOM compliant, nel senso rigoroso che la definizione di uno standard imporrebbe. Nella maggior parte dei casi, infatti, un'apparecchiatura risulta conforme ad una parte dello standard (ad esempio la modalità di archiviazione delle immagini), mentre adotta tecnologie proprietarie per altre funzionalità (ad esempio la gestione delle liste pazienti). - 84 - La compatibilità DICOM deve essere certificata dal costruttore attraverso un documento autocertificativo, denominato Conformance Statement, che ne elenchi le funzionalità. I dati radiologici rappresentabili come immagini o le immagini vere e proprie che vengono archiviate secondo lo standard DICOM vengono comunemente chiamate immagini DICOM. L'errore più comune che viene fatto nell'interpretazione del termine è che queste siano assimilabili ad altri formati di compressione d’immagine. In verità lo standard DICOM applicato alla codifica dei file non è nient'altro che un metodo per incapsulare i dati e per definire come questi debbano essere codificati o interpretati, ma non definisce alcun nuovo algoritmo di compressione. L'immagine quindi viene archiviata in forma non compressa, secondo la codifica con la quale viene prodotta, oppure utilizzando degli algoritmi di compressione molto comuni, come ad esempio il JPEG. 4.2.1 Struttura dei file Il DICOM suddivide le informazioni in gruppi chiamati data sets. Questo significa ad esempio, che un’immagine DICOM di una lastra ad un ginocchio, in realtà può essere composta da due componenti, l’immagine stessa e le informazioni sul paziente. In questo modo le informazioni non saranno mai separate per errore. Come si vede quindi un’immagine DICOM consiste in un insieme molto più vasto di dati rispetto alla sola immagine di per se stessa. Di conseguenza sarebbe più opportuno parlare di DICOM Data Object piuttosto che di immagini DICOM. Un DICOM Data Object può contenere informazioni sul giorno nel quale l’immagine medica è stata creata, oppure informazioni sul paziente come il suo nome, cognome ed ID all’interno di un ospedale, nonché informazioni sull’immagine stessa, come - 85 - ad esempio, codifica, rapporto di compressione, dimensioni, risoluzione, ecc… Un file in formato DICOM può memorizzare anche più immagini al suo interno. Questo permette di utilizzare lo standard anche in situazioni in cui è richiesta una grande accuratteza dei dati e quindi si memorizza l’immagine totale suddividendola in molte sotto-immagini allo scopo di ottenere una risoluzione complessiva estremamente elevata. I dati contenuti in un file DICOM, siano essi immagini (pixel data) che informazioni testuali, possono essere compressi per ottimizzarne la distribuzione con vari algoritmi, sia di tipo lossy che che lossless. Esempi di questi algoritmi sono LZW e JPEG. Essendo un file DICOM una sorta di contenitore per altri dati in vari formati, è necessario che lo standard specifichi una serie di metodologie per informare i visualizzatori software sul tipo di dati che dovranno trattare. Allo scopo si utilizza quindi uno schema di codifica per segnalare e descrivere le varie componenti di un file costruito seguendo le linee guide DICOM. Di seguito viene fornito un elenco di alcuni istruzioni utilizzate per codificare le varie sezioni: DICOM Value Representations Value Representation Description AE Application Entity AS Age String AT Attribute Tag - 86 - CS Code String DA Date DS Decimal String DT Date/Time FL Floating Point Single (4 bytes) FD Floating Point Double (8 bytes) IS Integer String LO Long String LT Long Text OB Other Byte OW Other Word PN Person Name SH Short String SL Signed Long SQ Sequence of Items SS Signed Short ST Short Text TM Time UI Unique Identifier UL Unsigned Long - 87 - UN Unknown US Unsigned Short UT Unlimited Text Le istruzioni elencate in precedenza possono essere utilizzate per formattare un file DICOM allo stesso modo di come si può costruire una pagina Web utilizzando i tag HTML. Il processo è quindi molto semplice. 4.3 Software open source Dopo aver illustrato il formato DICOM ed alcune problematiche legate all’elaborazione digitale di dati biomedici, si vuole a questo punto offrire un elenco di software open source per gestire questo formato. Esistono moltissimi software creati per gestire i file DICOM, moltissimi sono di ottima fattura e supportano quasi completamente tutte le sfaccettature dello standard, altri invece sono più limitati e permettono di sfruttare solamente una minima parte delle possibilità che il protocollo sviluppato dalla NEMA prevede. In generale comunque tutti i software si suddividono tra commerciali, gratuiti ed open source. E’ importante sottolineare che open source non fa rima con gratis, anche se spesso accade proprio questo, e soprattutto che gratuito non equivale ad open source. Un software è open source solamente quando è rilasciato con una licenza che ne permette di vedere e modificare il codice. Esempi di queste licenze sono la LGPL, la GPL e la BSD. Si è scelto di mostrare solo dei software open source per gli indubbi vantaggi che essi presentano a degli utilizzatori accademici. Essi infatti - 88 - possono essere utilizzati liberalmente, il più delle volte anche per scopi commerciali, ed inoltre la possibilità di poter visionare il codice permette di integrarli molto più facilmente alle proprio esigenze. Lo spirito d’integrazione è infatti uno dei punti dai quali ha preso spunto lo sviluppo di Medtel e si vedrà nel capitolo conclusivo, che esistono diverse idee per integrare il Medical Telereporting System con i visualizzatori DICOM qui di seguito riportati. Oltre a degli indubbi vantaggi però, i software open source soffrono spesso di maggiori limitazioni rispetto ai corrispettivi commerciali ed in generale non offrono nessun supporto tecnico agli utilizzatori. AMIDE (Windows, Linux, MacOS) AMIDE è un programma completamente gratuito ed open source per visualizzare, analizzare e registrare data sets di immagini mediche volumetriche DICOM. L’interfaccia grafica con cui è costruito si basa sulle librerie GTK+. Caratteristiche: 1) Orientazione, thickness e periodo di visualizzazione arbitrari 2) Si possono visualizzare più data sets contemporaneamente e unirli insieme per formare un’immagine unica 3) Possibilità di zoom 4) Supporto ad immagini a colori 5) Possibilità di tagliare e pulire solo zone limitate dell’immagine 6) Possibilità di creare video a partire dalla rotazione di immagini DICOM 7) Possibilità di applicare filtri alle immagini: gaussiano, 1D Mediano e 3D Mediano Sito di riferimento: http://amide.sourceforge.net/packages.html - 89 - (Screenshot tratto dal sito) MRIcron (Windows, Linux, MacOS) MRIcron è un software open source gratuito, scritto in Free Pascal, che permette di visualizzare molti tipi di immagini DICOM. Offre un set di caratteristiche più limitato rispetto ad AMIDE e l’interfaccia, sempre in GTK+, è in generale più complessa da utilizzare. Ha comunque molte opzioni interessanti come per esempio la possibilità di convertire i file DICOM in molti altri formati oppure la possibilità di estrarre delle statistiche dai file che vengono visualizzati. Sito di riferimento: http://www.sph.sc.edu/comd/rorden/mricron/index.html (Screenshot tratto dal sito) - 90 - MRIcro (Windows, Linux) MRIcro permette di visualizzare immagini mediche in sistemi Windows e Linux. E’ un programma standalone, ma include al proprio interno alcuni tool per gestire i file SPM utilizzati nella neurologia. MRIcro permette di visualizzare in maniera efficace immagini del cervello ed inoltre permette ai neurologi di identificare regioni di interesse (ROI) all’interno di un’immagine. Caratteristiche: 1) Converte immagini DICOM nel formato SPM 2) Supporto per le codifiche big o little endian 3) Possibilità di creare regioni di interesse in 3D 4) Possibilità di ruotare ed ingrandire le immagini 5) Esportazione delle immagini nei formati BMP, JPEG, PNG e TIFF Sito di riferimento: http://www.sph.sc.edu/comd/rorden/mricro.html (Screenshot tratto dal sito) - 91 - DICOMscope (Windows, Linux, MacOS) DICOMscope è un programma gratuito ed open source, scritto in Java, per visualizzare immagini DICOM. Le immagine che è possibile visualizzare sono quelle non compresse e monocrome. L’ultima versione permette di gestire anche un server di stampa, i file DICOM criptati, firmi digitali e la calibrazione dei monitor così come specificata nel capitolo 14 del protocollo DICOM. Sito di riferimento: http://dicom.offis.de/dscope.php.en (Screenshot tratto dal sito) 4.4 Standard ECG In calce al capitolo si vuole parlare brevemente degli standard utilizzati nell’industria medica per gestire i dati prodotti dalle strumentazioni per l’elettrocardiogramma. L’elettrocardiogramma è uno strumento non invasivo che fornisce una rappresentazione grafico-visiva dell’evoluzione dei potenziali cardiaci nel tempo. - 92 - Rispetto allo standard DICOM che nasce per gestire i risultati dell’imaging biomedico, un formato file per l’ECG deve presentare delle caratteristiche sostanzialmente diverse. Le immagini DICOM sono infatti molto più complesse, spesso contengono al proprio interno dati per la visualizzazione in 3D e volumetrica, dati sul paziente, statistiche avanzate, ecc…I dati prodotti dall’ECG invece sono molto più semplice consistendo in una serie di forme d’onde sinuosidali poste su un sistema di assi cartesiani. Risulta evidente quindi che è possibile trattare questi valori non come un’immagine, ma invece come una serie storica di dati rappresentabili in formato alfanumerico. Sarà poi il visualizzatore che si occuperà di ricostruire la grafica dell’ECG. Purtroppo al momento non esiste uno standard unico per memorizzare i tracciati ECG, anche se esistono diverse soluzioni tutte molto valide e con specifiche aperte. Una di queste è l’HL7 (Health Livel 7), uno standard basato sull’XML per lo scambio di dati medici creato dall’omonima associazione no-profit americana che appunto si occupa di definire standard in medicina. Un’altra soluzione molto interessante è quella portata avanti dal consorzio europeo che ha sviluppato lo standard OpenECG. Esso permette di creare file con i dati sulle forme d’onda prodotte dagli elettrocardiogrammi, di dimensioni molto contenute ed inoltre fornisce diversi tool open source per gestirli. Inoltre esso è compatibile col DICOM nel senso che i file in formato OpenECG possono essere convertiti in immagini DICOM con appositi tool. In generale non esiste uno standard universalmente accettato e soprattutto non esiste uno standard ISO e quindi al momento si sente ancora l’esigenza di uniformità per quanto riguarda i dati prodotti dagli elettrocardiogrammi. Non bisogna dimenticare poi, che molte aziende forniscono delle soluzioni basate sullo stesso standard DICOM con opportune modifiche. - 93 - CAPITOLO 5 Conclusioni 5.1 Migliorare Medtel In quest’ultimo capitolo si vuole offrire una serie di spunti su cui lavorare per poter migliorare il lavoro fin qui sviluppato. Come detto più volte in precedenza infatti, Medtel nasce come evoluzione di altri software prodotti in passato e quindi nel suo sviluppo si è cercato di correggere ed arginare la maggior parte delle lacune che essi presentavano. Nonostante questo, anche lo stesso Medtel presenta delle problematiche irrisolte al momento della presente trattazione. In particolare questo problematiche discendono per la maggior parte, dalle scelte effettuate in fase di progettazione, come ad esempio l’utilizzo del Google Web Toolkit. Quando si valutano delle soluzioni in fase di design di un prodotto, sia esso software oppure no, bisogna sempre tenere a mente che ogni scelta comporta irrimediabilmente dei pro e dei contro. La libreria fornita da Google non fa eccezione. Finora si sono messi in luce principalmente gli aspetti positivi di cui si è potuto beneficiare grazie alla sua adozione, in questi paragrafi conclusivi invece, si vogliono evidenziare anche i contro che questa scelta ha portato con se. Tutto questo viene fatto nella speranza che le sfide tecnologiche di seguito riportate, vengano accolte da altri gruppi di lavoro, nel tentativo di migliore il software da noi prodotto in fase di tirocinio. Detto questo, si vuole sottolineare che anche con i suoi inevitabili problemi, Medtel rappresenta comunque un software completo e capace di assolvere egregiamente ai compiti per cui è stato sviluppato. I tratti negativi messi in evidenza nei prossimi paragrafi, in definitiva, non compromettono il funzionamento dell’applicativo stesso. - 94 - 5.1.1 Compatibilità con i browsers Uno dei motivi per cui si è scelto di sviluppare il Medical Telereporting System utilizzando il Google Web Toolkit è stato quello di sfruttare una delle sue principali potenzialità, ovvero quella di produrre codice Javascript compatibile con la maggior parte dei browsers. Come si è detto in precedenza infatti, Medtel nasce con lo scopo di diffondersi rapidamente ed inoltre uno dei vantaggi principali dello sviluppo di web application è dato dal fatto che esse sono eseguibili su un gran numero di sistemi diversi. In realtà, questo è vero, solamente facendo particolare attenzione al codice che dovrà essere eseguito dalla parte del client, e quindi dal browser dell’utilizzatore, affinché questo non nasconda delle problematiche legate all’incompatibilità con taluni browsers e/o sistemi. Il codice lato server, girando invece su delle macchine predisposte non presenta questi inconvenienti. Il linguaggio Javascript che viene prodotto in uscita dal compilatore GWT, almeno sulla carta, non dovrebbe presentare nessun problema di incompatibilità con la totalità dei browsers oggi in circolazione. Quando però si passa dalla teoria ai fatti, si nota che queste promesse, non sono completamente mantenute. Questo è in parte inevitabile perché nel corso degli anni, le diverse software house produttrici di browsers (Microsoft, Apple, Mozilla, …) hanno sviluppato interpreti Javascript per i propri applicativi notevolmente differenti tra di loro e questo ha portato a notevoli grattacapi per chiunque si trovi a dover affrontare la progettazione di una web application. Si è detto che Google Web Toolkit mantiene solo in parte le proprio promesse, perché durante la fase di test di Medtel su macchine differenti, si sono riscontrate discrepanze di funzionamento tra le varie configurazioni provate. Questo discrepanze sono comunque risultate notevolmente - 95 - marginali, confermando ancora una volta la bontà della scelta di utilizzare GWT. Le principali differenze hanno riguardo il rendering dell’interfaccia grafica dell’applicazione. In particolare si è visto che in alcuni browsers, i widgets apparivano di colori leggermente differenti, oppure spostati rispetto alla posizione scelta in fase di sviluppo. Si sottolinea con forza però, che ciò non incide minimamente sul normale funzionamento dell’applicativo, che quindi raggiunge gli obbiettivi di compatibilità che si erano fissati durante l’analisi dei requisiti. A questo punto, dopo aver parlato della problematiche in maniera più che altro speculativa, si vuole fornire al lettore dei dati sperimentali su cui riflettere. In particolare la tabella seguente mostra un elenco dei browsers più diffusi con a fianco i risultati di compatibilità ottenuti da Medtel: BROWSER COMPATIBILITA’ RAGGIUNTA Mozilla Firefox 2 Compatibilità Piena Mozilla Firefox 3 Compatibilità Piena Internet Exploter 6 L’interfaccia grafica non risulta centrata nel browser, per il resto piena compatibilità Internet Explorer 7 L’interfaccia grafica non risulta centrata nel browser, per il resto piena compatibilità Apple Safari Compatibilità Piena - 96 - Google Chrome Alcuni campi non vengono compilati automaticamente, il problema può essere aggirato facilmente compilandoli a mano. Come si vede Mozilla Firefox 2 e Mozilla Firefox 3 rappresentano i migliori candidati per l’esecuzione di Medtel, ma comunque apparte lievi errori di rendering, il funzionamento risulta ottimale in tutti i browsers. Particolarmente significativo è il fatto che Medtel possa essere eseguito in maniera corretta anche in un browser piuttosto datato, ma ancora diffusissimo nei paesi più poveri, come Internet Explorer 6. Per quanto riguarda invece problematiche di compatibilità in correlazione al sistema operativo in uso dall’utente, e non ad un browser specifico, si sono effettuati test sia su macchine equipaggiate con Linux, che con Winows XP, Vista e MacOS X. In tutti i casi la visualizzazione non è risultata dipendere dal sistema operativo, ma solo dal browser scelto per la prova. Per concludere il paragrafo si vuole sottolineare che molto probabilmente un’attenta analisi del codice HTML e Javscript che compone Medtel, potrebbe risolvere anche i pochi difetti di visualizzazione di cui si è parlato in precedenza. Questo dovrebbe essere uno dei primi punti da affrontare nello sviluppo delle successive versioni. 5.1.2 Velocità di esecuzione Con i termini velocità di esecuzione si intende definire in un unico concetto tutta una serie di caratteristiche di un applicativo, sia esso desktop o come nel caso di Medtel, web, quali ad esempio i tempi di risposta in seguito a comandi impartiti dall’utente, i tempi di caricamento dell’interfaccia grafica, ecc…In generale non è affatto semplice dare un giudizio sintetico - 97 - riguardo la velocità di esecuzione di un software, perché nel definirla concorrono moltissimi fattori, non ultimo la potenza della macchine stesse su cui l’applicativo gira. Quello che si può fare invece, è definire i requisiti minimi che dovranno avere le macchine sulle quali andrà a funzionare il software ed effettuare quindi dei test su delle configurazione di prova per verificare che la velocità in questi contesti sia accettabile. Diciamo subito, che la velocità di esecuzione è il vero e proprio tallone di achille di Medtel. Aldilà di questa premessa negativa si possono fare però diverse osservazioni per ridimensionare il quadro negativo che a prima vista parrebbe essere stato tracciato. Prima di tutto comunque bisogna specificare quali sono le cause della carenza di prestazioni mostrata da Medtel. La causa principale va quindi ricercata in Google Web Toolkit e di conseguenza nel Javascript. Come visto in precedenza infatti, Javascript non è un linguaggio di tipo compilato, ma invece è un linguaggio di scripting. Questo significa che il browser esegue l’istruzioni Javascript che costruiscono l’interfaccia grafica, una dopo l’altra senza apportare delle ottimizzazione quali ad esempio il Just-in-time Compiler che viene utilizzato dalla macchina virtuale Java. Inoltre gli interpreti Javascript inclusi nei più diffusi browsers in commercio non hanno mai brillato per prestazioni. Medtel quindi non può essere definitivo un prodotto performante. Nei computer più moderni sicuramente si, ma in macchine più datate, che sono poi il target del software, i rallentamenti sono abbastanza vistosi. A stemperare questo quadro negativo ci sono però diversi fattori. Tanto per cominciare negli ultimi mesi si è assistito ad una vera e propria corsa alle prestazioni per quanto riguarda il mercato browser e questa evoluzione ha sicuramente toccato molto profondamente anche gli interpreti Javascript. Firefox 3.1, Internet Explorer 8 e Google Chrome promettono prestazioni in esecuzione di istruzioni Javascript, migliorate anche del 50%-80%. Questo - 98 - non farà altro che rendere l’esecuzione di Medtel con questi browsers, notevolmente più veloce e rapida, venendo in contro anche alle esigenze dei paesi più poveri. Seconda punto, si sta assistendo ad un ricambio tecnologico anche nei paesi del terzo mondo, questo porta alla diffusione di PC più potenti anche in zone disagiate. Appare chiaro che entro breve i problemi di prestazione di Medtel, potrebbero risolversi da soli, grazie al lavoro sinergico di questi fattori. Ciò nonostante, i successivi sviluppi di Medtel dovrebbero tenere conto con maggior efficacia del lato performance, oltre che del lato funzionalità. 5.1.3 Usabilità Un’altra problematica molto importante riscontrata in fase di sviluppo del Medical Telereporting System, questa volta non legata alla scelta di utilizzare Google Web Toolkit, è quella dell’usabilità. Per usabilità s’intende il modo con il quale un applicativo si presenta agli utenti da un punto di vista della facilità di utilizzo. Essa coinvolge quindi la struttura della GUI, come anche la scelte circa i passaggi che un utente deve compiere per eseguire un’operazione. L’usabilità è un punto sul quale si è prestata una particolare attenzione in fase di progettazione perché, come messo in luce in precedenza, l’applicativo nasce per essere utilizzato da personale medico e requester in zone disagiate. Questo tipo di target in genere non presenta un alto grado di alfabetizzazione informatica e quindi è stato necessario costruire un applicativo che fosse il più intuitivo possibile. Andando a vedere la GUI di Medtel si può notare fin da subito che la struttura a tab permette una facile gestione delle operazioni. Infatti essa suddivide razionalmente i vari ambiti e quindi permette di accedere rapidamente alle opzioni volute. Inoltre la scelta di un colore diverso per - 99 - ogni sezione (requester, amministrativa, medica), agevola ulteriormente la navigazione all’interno dell’applicazione. Sono stati sfruttati molti altri accorgimenti per semplificare ancora di più il tutto. Per esempio si sono scelte dell’icone allo scopo di esemplificare l’azione eseguita da un pulsante. In questo modo l’utente può familiarizzare rapidamente con Medtel e la curva di apprendimento risulta notevolmente appiattita. L’ultimo accorgimento da sottolineare consiste nella guida in linea presente in ogni sezione dell’applicativo. Essa è raggiungibile semplicemente cliccando sul simbolo del punto interrogativo, in genere posto in alto a destra, e fornisce un aiuto contestuale ed immediato riguardo le operazioni che è possibile eseguire. Per versione future di Medtel si è pensato di provvedere all’internazionalizzazione dell’applicativo. Al momento infatti, esso è disponibile solo in lingua inglese, ma è molto sentita l’esigenza di versioni localizzate in altre lingue. L’internazionalizzazione non consiste semplicemente in una mera traduzione, ma richiede anche uno sforzo di programmazione e tecnologico, per rendere questo processo, quanto più possibile automatizzabile e rapido. Allo scopo la libreria GWT mette a disposizione diverse classi e funzioni, ad esempio per rilevare in fase di avvio dell’applicazione, la lingua del sistema dell’utente. Per concludere il paragrafo, si vuole sottolineare come solo il feedback della comunità di utilizzatori di Medtel, potrà fornire una adeguata base di partenza per migliorare l’usabilità dell’applicativo stesso in versioni successive. - 100 - 5.2 Integrazione In questo paragrafo si cercheranno di delineare alcune linee guida da seguire per cercare di integrare il lavoro svolto con Medtel con altri applicativi e dispositivi. Integrare significa fare in modo che Medtel possa dialogare con altri software oppure con particolari macchinari hardware che vengono utilizzati nella pratica clinica. Lo scopo di tutto questo è come sempre, cercare di offrire un software più completo e flessibile possibile, capace di adattarsi a contesti sanitari estremamente eterogenei e allo stesso tempo però, mantenere una struttura familiare per gli utilizzatori. Non si tratta assolutamente di un obbiettivo facile da perseguire per molti ordini di motivi: tecnologici, logistici e commerciali. Allo stesso tempo inoltre non è un contesto che si è potuto approfondire molto nel limitato tempo a disposizione del tirocinio. Qui di seguito quindi si forniranno solamente degli spunti, affinché in futuro questi argomenti possano venir sviluppati meglio. 5.2.1 Servizi medici per altri software Alcune applicazioni mediche potrebbero ad un certo punto aver bisogno di fornire ai proprio utilizzatori delle possibilità di telerefertazione. Le scelte in questo caso sarebbero essenzialmente due: scrivere ex-novo delle procedure adatte allo scopo, oppure evitare di reinventare l’acqua calda e vedere se sul mercato esistono già dei software specifici per lo scopo. E’ qui che entra in gioco Medtel, si potrebbe pensare infatti di esternalizzare i metodi che esso utilizza internamente, in modo che di essi possano usufruire anche altri applicativi. Ad esempio Medtel potrebbe fornire una libreria di classi che permettano ad altri programmi di interfacciarsi con - 101 - esso. Oppure si potrebbe progettare un servizio web (web service), ovvero una serie di routine a cui ci si può collegare attraverso la rete, in generale tramite il protocollo HTTP, e che ugualmente nascono con lo scopo di permettere di sfruttare le potenziale di Medtel a soggetti esterni. Logicamente tutte queste possibilità implicano la necessità di fare notevoli considerazioni legate alla sicurezza prima di compiere qualsiasi passo. Comunque sono degli esempi validi di come si potrebbe aprire al mondo esterno un applicativo quale Medtel. 5.2.2 Visualizzatori di dati biomedici Allo stesso modo di come altri software potrebbero beneficiare dell’integrazione con i servizi messi a disposizione da Medtel, così Medtel stesso potrebbe ottenere notevoli vantaggi se fosse in grado di sfruttare le funzionalità di altri applicativi. In particolare un’integrazione con visualizzatori di specifici formati dati utilizzati in medicina, farebbe guadagnare moltissimi punti in termini di usabilità a Medtel. Allo scopo si potrebbe rivolgere l’attenzione verso applicativi open source capaci di leggere i file DICOM che, come è stato già messo in luce nel capitolo 4, stanno acquisendo una diffusione via via maggiore in tutto il mondo medico. Purtroppo la struttura a web application non rende affatto facile quest’integrazione, perché in genere i visualizzatori sono invece delle applicazioni desktop. Una soluzione sarebbe quella di scrivere applet Java che fungano da ponte di interscambio tra i due mondi. Un’altra sarebbe invece quella di scrivere specifici plugin per i browser. Quest’ultima opzione è forse la più complessa, anche perché bisognerebbero scrivere molti plugin diversi se non si vuole limitare la scelta dell’utenza sul browser, dall’altra però offre le migliore garanzie di funzionalità. - 102 - 5.2.3 Dispositivi medici L’ultima integrazione che si può tentare non è di tipo software, ma di tipo hardware. Sebbene infatti molto complessa nella realizzazione tecnica, sarebbe comunque apprezzabilissima la possibilità di far interagire Medtel con apparecchiature elettromedicali in uso nelle varie strutture sanitarie. Si potrebbe pensare ad esempio di fare in modo che collegando il portatile ad un’apparecchiatura per l’ECG, i file prodotti in uscita dalla strumentazione, finiscano direttamente nel database centrale di Medtel, contemporaneamente all’apertura di un nuovo problema clinico. Cioè comporterebbe dei notevoli aumenti di produttività, nonché un uso ancora più semplificato dell’applicativo. Da un punto di vista tecnico la realizzazione può avvenire solo tramite la scrittura di plugin appositi che devono gestire il flusso di dati attraverso le porte di comunicazione del PC. Le politiche di sicurezza applicate dai browsers inoltre, rendono il processo ancora più difficoltoso, se non impossibile. 5.3 Conclusioni Il lavoro svolto in fase di tirocinio ha permesso di approfondire molte tematiche interessanti e ricche di spunti. Da un lato lo sviluppo di un applicativo complesso come Medtel, ha permesso di toccare con mano le problematiche che riguardano la progettazione ed il design di un software, nonché la gestione del lavoro di gruppo. Dall’altro la scelta di utilizzare il Java ed il Google Web Toolkit, ha permesso di studiare in maniera dettagliata tecnologie moderne e di successo, acquisendo in questo modo un bagaglio culturale sicuramente spendibile sia nel mondo del lavoro che in quello accademico. - 103 - Web Application, Java, Javascript e Ajax sono tutti termini che stanno diventando di uso comune all’interno della comunità informatica mondiale. L’aver approfondito tali concetti nel periodo di tirocinio è sicuramente stata un’imperdibile possibilità di entrare in un mondo innovativo e ricco di stimoli. Non bisogna dimenticarsi poi, che si è lavorato sul progetto di un software reale, destinato ad essere utilizzato in zona disagiate in cui quindi, si sente veramente l’esigenza di risolvere le problematiche mediche presentate in queste pagine. Questo è sicuramente motivo di orgoglio e allo stesso tempo accresce la sensazione di aver prodotto qualcosa di positivo nel corso delle ore spese nei laboratori dell’università. Come si dovrebbe aver capito leggendo questa trattazione, su Medtel si concentrato molte idee ambiziose che noi speriamo vengano tutte realizzate nel corso della varie versioni che saranno sviluppate. Il mio desiderio più grande è sicuramente di aver contribuito, con gli altri miei compagni, a sviluppare non solamente un software finito ed utilizzabile, ma anche una solida base dalla quale partire per apportare un gran numero di migliorie. Noi speriamo che le scelte fatte in fase di progettazione con l’aiuto di tutti quelli che ci hanno assistito, sia in sede universitaria che all’interno dell’Asur n.7 di Ancona, abbiamo permesso di imboccare la giusta direzione all’interno del mare di possibilità che l’informatica moderna mette a disposizione. In questo ultimo capitolo infine, si sono forniti diversi percorsi da seguire per migliorare il lavoro fin qui svolto, prestando particolare attenzione alle tematiche dell’integrazione. Spero che alcuni idee tra quelle presentate vengano riprese in futuro. Per concludere ci si augura che Medtel riesca veramente a dare un proprio contributo nel migliorare le condizioni sanitarie delle popolazioni più disagiate della Terra, come quelle africane. Se questo ambizioso obbiettivo - 104 - sarà anche solo in minima parte raggiunto, si sarà potuto dimostrare ancora una volta, che la speranza di una vita migliore passa attraverso il lavoro di tutti noi. - 105 - Bibliografia - TELEMEDICINA - Telemedicine at Wikipedia http://en.wikipedia.org/wiki/Telemedicine American Telemedicine Association http://www.americantelemed.org - JAVA & JAVA SERVLET - Java SE APIs & Documentation http://java.sun.com/javase/reference/api.jsp Primi passi con le Servlet Java http://java.html.it/articoli/leggi/1943/primi-passi-con-le-servlet - GOOGLE WEB TOOLKIT - Google Web Toolkit 1.5 Developer's Guide http://code.google.com/docreader Google Web Toolkit Official Blog http://googlewebtoolkit.blogspot.com DeveloperLife GWT Tutorials http://developerlife.com/tutorials - 106 - Working with GWT, ONJava.com http://www.onjava.com GWT-Ext Wiki http://www.gwt-ext.com/wiki/index.php/Main_Page - APACHE TOMCAT & MYSQL - Apache Tomcat 6.0 Documentation http://tomcat.apache.org/tomcat-6.0-doc MySQL Official Documentation http://dev.mysql.com/doc - DATI BIOMEDICI - DICOM Homepage http://medical.nema.org DICOM Introduction and free software list http://www.sph.sc.edu/comd/rorden/dicom.html OpenECG Portal http://www.openecg.net Health Level 7 http://www.hl7.org - 107 -