Realizzare un web service con Mirth

Finora ho realizzato applicazioni Mirth che leggevano da servizi web. E’ interessante anche sapere che i web service si possono fare con Mirth. Il contesto è questo: un’azienda “periferica” produce una informazione (ad esempio: un laboratorio che produce l’analisi di un campione di sangue) e il dato deve essere trasmesso all’azienda “madre” perché lo registri nel suo gestionale. L’azienda madre realizza un servizio web che verrà chiamato dal laboratorio il quale spedirà al servizio il referto con un messaggio HL7. All’arrivo del messaggio l’azienda madre esegue il parsing del messaggio e salva i dati nel gestionale (un database relazionale).

Nella fattispecie il messaggio viene “affettato” a righe e viene salvata una intestazione e una serie di dettagli collegati, uno per ogni riga del messaggio.

L’impianto è questo:

Il source

Il source è un SOAP listener che risponde con un WDSL che Mirth stesso genera e che mette a disposizione un metodo standard detto acceptMessage() (teniamo d’occhio ma per il momento soprassediamo sulla casella di selezione Respond from)

Le destination

Le destination sono parecchie perché la lavorazione del messaggio è piuttosto laboriosa: devo capire il tipo di messaggio (che leggo nell’intestazione del messaggio stesso) e a seconda di questo compiere diverse operazioni: per messaggi di un tipo estraggo dal file HL7 un file PDF che salvo nel NAS, e poi, in ogni caso, devo salvare in una tabella Oracle una intestazione e in una tabella figlia tutte le righe del messaggio numerandole e collegandole alla testata con un vincolo di chiave esterna:

Mirth2_destination
Mirth2_destination

Un passetto in più: lo script

Per questo tipo di applicazione devo personalizzare lo script che viene eseguito una volta eseguita l’applicazione del canale: con questo personalizzo la risposta del web service al programma che lo ha chiamato. Nelle figure precedenti si possono vedere questi punti in ciascuna delle 4 tab superiori.

Anche se ci sono diversi prodotti già attivi all’interno di Mirth per eseguire ognuna di queste operazioni atomiche, per convenienza o per forza alcune cose me le sono dovute scrivere a mano in JavaScript utilizzando classi embedded di Mirth, come la classe DatabaseConnectionFactory. Per esempio mi serviva eseguire una lettura di Oracle in una delle destinazioni, ma nelle destination non si può selezionare il tipo di connettore DatabaseReader che invece si può richiamare dal source. Quindi me lo sono fatto a mano. Inoltre, pur essendo possibile selezionare dei tipi di connettori standard che sono anche semplici da usare (ad esempio: FileWriter: gli passo la directory, il nome del file e il contenuto e lui me lo scrive dentro il filesystem), alcuni tipi di connettori dovevano comportarsi in modo non standard, ma Mirth è programmabile! per cui ho potuto estendere le funzionalità scrivendo i programmi a mano.

Per me, che non sono tanto in confidenza con il Java, scrivere in JavaScript (che è un po’ meno rigido del Java) in modo così approfondito è stata comunque un’esperienza formativa.

Alla fine di questo lavoro – salvare i dati – bisogna rispondere al software che ha chiamato il servizio e: come si fa? Non lo so.

Ho usato per la prima volta la quarta TAB (Scripts). Ho selezionato “Postprocessor” nella select Script in alto (vedi figura), ho definito una serie di variabili e una istruzione di scrittura nel log, e poi se la variabile di canale error è valorizzata (e, se succede qualcosa, la valorizzo nelle destinazioni precedenti – esse vengono eseguite nell’ordine una alla volta), istanzio un tipo di risposta altrimenti un’altra.

Il cuore di tutto è l’oggetto di Mirth responseMap che mi permette di modificare quel messaggio di risposta del metodo di default acceptMessageResponse che avevamo lasciato in sospeso nel primo punto. Il valore che questa variabile può assumere non è una stringa ma un oggetto che viene inizializzato dal metodo ResponseFactory.getSuccessResponse(ack) in caso di OK, oppure dal metodo ResponseFactory.getFailureResponse(ko) in caso di KO (ack e ko invece sono due stringhe che definisco io all’inizio dello script). La presenza dell’istruzione responseMap.put() in questo script mi fa comparire la voce acceptMessageResponse nella tendina di selezione Respond from del source! Il tutto è riportato in figura:

Mirth3_script
Mirth3_script

Come ultimo passaggio ecco come si presenta la chiamata al WS fatta da soapUI (a sinistra) e la response del servizio (a destra):

SoapUI MSG
SoapUI MSG

Di soapUI ne parlo più avanti. Buona questa risposta nel forum di Mirth

Bottiglia di Klein

Un oggetto curioso, come il nastro di Möbius che è una varietà di dimensione 2 non orientabile: sul nastro di Möbius una formica che parte da un certo punto del nastro, cammina cammina e si ritroverà nello stesso punto (perché il nastro è chiuso) ma dall’altra faccia del nastro.

Come farsi un nastro di Möbius in casa, stile ArtAttack: prendete un foglio di carta A4, un paio di forbici e della “colllla vinilica”. Tagliate una strisciolina larga 5 cm nel senso della lunghezza. Fatto? Bene! Prendete in mano la strisciolina tenendola per i lati corti e fate ruotare un lato di mezzo giro come quando si scartano le caramelle. Fatto? Bene! Adesso unite i due lembi e attaccateli con la “colllla vinilica”, ed avrete il vostro nastro di Möbius fatto in casa! 🙂

La bottiglia di Klein è un oggetto simile ma un po’ più complicato. Il filmato spiega bene come ci si possa costruire una bottiglia di Klein in casa, ma non bastano carta, forbici e colla vinilica. Si parte da un cilindro che però deve autointersecarsi vivendo noi in uno spazio a 3 dimensioni. Se fossimo in uno spazio a 4 dimensioni potremmo anche farlo senza che si autointersechi, ma questo è Universo 2.0.

La stranezza di questa bottiglia, dotata di una auto-intersezione, è che non ha un dentro ed un fuori. Mentre la distinzione tra dentro e fuori, nello spazio tridimensionale, è supportata dall’esperienza – normalmente sappiamo distinguere tra il dentro ed il fuori di un pallone da calcio: se vogliamo entrarci dentro, dobbiamo fare un buco -, essa invece non è così chiara in questo oggetto, visto che con continuità possiamo passare dall’esterno all’interno senza dover bucare la superficie.

Questa animazione al computer (quanta grazia i computer in queste cose! Fossero vivi Klein e Poincaré…) spiega come si costruisca una bottiglia di Klein a partire da un cilindro elastico (sulla indicazione dello stesso Felix Klein).

Inoltre, sezionando la bottiglia di Klein, si passa per deformazione continua (diffeomorfismo) ad un nastro di Moebius. Oppure, incollando due nastri si ottiene la bottiglia. Anche la bottiglia di Klein è una superficie (una varietà) di dimensione 2 non orientabile. Tutto visibile nell’animazione.

Novità in Volunia

 Dal 18 maggio Volunia si è presentato ai suoi power user con alcune novità.

Nel comunicato del team, si sono spiegati i motivi del silenzio stampa degli ultimi mesi e sono stati ringraziati gli utenti che hanno testato il sistema fornito una messe di segnalazioni. Sulla base di queste si sono decisi tre passi innovativi:

  1. l’integrazione con un motore di ricerca commerciale per consentire un uso più estensivo delle funzionalità seek & meet, pur continuando a sviluppare il proprio motore di ricerca;
  2. è stata rinnovata la grafica, resa meno grezza, anzi decisamente più accattivante, dalle segnalazioni degli utenti
  3. è stato migliorato l’aspetto comunicativo aprendo un blog in cui lo staff riferirà regolarmente sugli sviluppi e sono stati precisati i documenti riguardanti termini e condizioni dell’uso del servizio e sul trattamento della privacy.

Il team di Volunia sta lavorando “con solerzia” per aprire a tutti il sito di ricerca sociale il 14 giugno 2012.

Yii reloaded

logo Yii

Yii è il frameword MVC del momento, lo sto studiando e mi sono preso la libertà di ripensare un po’ al pattern di sviluppo MVC secondo un contesto che mi ha aiutato a chiarire alcune cose sul suo funzionamento. Ho scritto questo articoletto per ricordarmi che questo modo di vedere le cose me le ha fatte capire un po’ meglio. E, magari, può servire a qualcuno.

Un altro modo di pensare al pattern MVC.

JDK vs JRE

Sempre nell’ambito della guerra degli acronimi, un dubbio lecito che può venire quando qualche software ci richiede Java a bordo (lecito visto che lo mettono in evidenza nel sito dell’Oracle quando si vuole scaricare un ambiente di sviluppo o di esecuzione) è:

Ho bisogno di JDK o di JRE?

Qui la semplice risposta dell’Oracle:

“What Java Do I Need?” You must have a copy of the JRE (Java Runtime Environment) on your system to run Java applications and applets. To develop Java applications and applets, you need the JDK (Java Development Kit), which includes the JRE.

Il sito di Oracle con le pagine di download.

Earth Day 2012

22 aprile 2012

Earth Day 2012

WikipediaGoogleEarth day networkYouTube

Esperimenti con HL7

Healt Level Seven è uno standard di comunicazione che definisce di tutti gli standard per lo scambio, la gestione, l’integrazione, la condivisione e il reperimento di dati sanitari in formato elettronico.

Il messaggio Hl7 è un file di testo, una sorta di XML, ma non in formato markup.

Un messaggio Hl7 può essere di diversi tipi: contenere un referto strutturato (ad esempio i risultati di una analisi del sangue o di una spirometria), un referto PDF firmato digitalmente, una comunicazione di allineamento tra archivi o altro ancora.

Un messaggio è un testo distinto su più righe (segments). Ogni segmento ha un codice che ne definisce il contenuto (ad esempio PID, come Patient IDentification)

Ogni segmento è composta di campi (fields): nelle esempio del PID troveremo, in posizioni ben definite , informazioni come il cognome, il nome, il codice fiscale, la data di nascita del paziente. Ciascuna di queste informazioni è delimitata, all’interno della stessa riga, dal carattere pipe (|) e, al suo interno, lo stesso campo può anche essere suddiviso in più sottocampi delimitati dal carattere ^ (ad esempio, sempre in un segmento PID, l’indirizzo è contenuto tra due pipe e si trovano i campi, via, civico, cap, città, provincia delimitati da ^).

Analisi complessa

GNU OctaveSono tornato a far visita al mio Relatore di tesi, il prof. Mauro Bisiacco del Dipartimento Di Ingegneria dell’Informazione dell’Università di Padova. E’ stato un incontro piacevolissimo con una persona davvero speciale. Gli studenti lo adorano!

Incidentalmente, durante la chiacchierata, sono stato coinvolto in una questione riguardante un compito di Controlli Automatici, un dubbio sull’andamento di una funzione di trasferimento. La sera ho fatto ripartire i neuroni acciaccati che si occupavano di quegli argomenti e ne ho tratta una botta di gioventù. La mattina seguente gli ho mandato una mail con la soluzione qualitativa, era anche giusta. Mi sono preso lo sfizio di metterla in bella copia.

Il testo, redatto con LaTeX e con l’ausilio di GNU Octave per i grafici, un bellissimo clone open source di Matlab.

Alfresco: problemi a migrare verso la versione 4?

Ho trovato una interessantissima diatriba sui problemi incontrati nel migrare alla versione 4. Si è scomodato ad intervenire perfino il CEO di Alfresco Software.

Fino a metà il tono è costruttivo, poi ho lasciato stare. Vale la pena di leggerlo: http://bit.ly/HJDK4L

Lorem ipsum dolor sit amet…

Questo testo, scritto in un latino a dir poco maccheronico, è in uso dal XVII secolo come testo “demo”, come si direbbe adesso, per valutare l’impatto visivo di un testo scritto, il cui significato non è importante quanto la resa visuale dell’impaginazione.

La storia di questo strano testo, e di come sia coinvolto Cicerone, si trova tranquillamente su Wikipedia, ma in questo sito c’è addirittura un generatore di Lorem Ipsum 🙂

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam metus est, ultricies non feugiat eu, rhoncus et felis. Morbi in lorem in nisl ultricies ullamcorper. Etiam pretium adipiscing lorem, et congue…