• Non ci sono risultati.

3. Implementazione del prodotto OpenSPCoop

3.3 Libreria e-Gov

3.3.1 Imbustamento e Sbustamento di una busta SPCoop

L’utilizzo della libreria verrà illustrato in un contesto in cui non esistono porte di dominio. Nel nostro esempio il SIL1 ha bisogno di un servizio erogato dal SIL2. Gli amministratori dei due SIL possono utilizzare la libreria e-Gov per l’implementazione di due proxy applicativi che contengano la logica di cooperazione applicativa necessaria e mirata solo per i rispettivi Sistemi Informativi Locali. La Figura 3-8 illustra lo scenario citato:

Figura 3-8, Scenario esemplificativo per l'utilizzo della libreria e-Gov

Creazione di una busta e-Gov

La creazione di una busta e-Gov comporta l’aggiunta di un SOAPHeaderElement, nel SOAPHeader di un SOAPEnvelope utilizzato per lo scambio di dati tra due applicazioni (Client e WebService). Ad esempio, supponiamo di avere il seguente messaggio Soap, memorizzato in un file ‘Request.xml’, che rappresenta la richiesta di un servizio: <soapenv:Envelope xmlns:soapenv=http://schemas.xmlsoap.org/soap/envelope/ xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:getQuote xmlns:ns1="urn:xmethods-delayed-quotes" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:se="http://schemas.xmlsoap.org/soap/envelope/" se:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<symbol xsi:type="xsd:string">IBM</symbol> </ns1:getQuote>

</soapenv:Body> </soapenv:Envelope>

Il codice seguente fornisce un esempio di utilizzo della libreria org.openspcoop.egov, dove viene effettuata la creazione di una busta e-Gov.

3. Implementazione del prodotto OpenSPCoop 155 Dovrà essere importato innanzitutto il package, per un corretto funzionamento del

codice:

import org.openspcoop.egov.*; import org.openspcoop.utils.*; import org.openspcoop.uddi.*;

Per effettuare un imbustamento, deve innanzitutto essere creato un oggetto Busta, dove saranno memorizzate le varie informazioni sulle funzionalità e-Gov da associare ad una richiesta SOAP.

Busta busta_eGov = new Busta();

Dovranno poi essere impostati i campi Mittente, Destinatario, Servizio e Azione. In questo esempio il SIL1 vuole usufruire del servizio ‘Quote’, con la specifica azione ‘Get’ erogato dal SIL2. Queste informazioni devono essere definite precedentemente (al momento della definizione di un servizio, in un registro dei servizi, come ad es. un registro UDDI ).

// Definizione Porta Delegata:

private static final String tipoServiceProvider = "AOO"; private static final String serviceProvider = "SIL2"; private static final String tipoMittente = "AOO"; private static final String mittente = "SIL1"; private static final String servizio = "Quote"; private static final String azione = "Get";

busta_eGov.setTipoServiceProvider(tipoServiceProvider); busta_eGov.setServiceProvider(serviceProvider); busta_eGov.setServizio(servizio); busta_eGov.setTipoServizio(“test”); busta_eGov.setAzione(azione); busta_eGov.setTipoMittente(tipoMittente); busta_eGov.setMittente(mittente);

Dopodichè deve essere creato un Identificativo e-Gov da associare alla busta. Come da specifica, tra i vari campi posseduti da un identificativo, vi è anche il codice della porta di dominio che si occupa di gestire la richiesta di un servizio. Questo codice deve quindi essere fornito al metodo che permette di costruire l’identificativo, insieme al codice del mittente della richiesta di servizio.

private static final String ID_PDD = "PDP-Example";

busta_eGov.setID(Imbustamento.buildID_eGov(ID_PDD,mittente));

3. Implementazione del prodotto OpenSPCoop 156

String oraRegistrazione = Imbustamento.getDate_eGovFormat(); busta_eGov.setOraRegistrazione(oraRegistrazione);

Rimane da impostare le varie informazioni sulle funzionalità e-Gov da associare alla busta (es. ProfiloCollaborazione, ProfiloTrasmissione, Riscontri ecc…). Queste informazioni possono essere cablate direttamente all’interno di una porta di dominio (proxy Delegato) che si occupa di gestire una particolare richiesta di servizio, oppure possono essere ottenute interagendo con un registro dei servizi. Il codice seguente assume che le informazioni siano cablate all’interno di un proxy delegato.

busta_eGov.setProfiloDiCollaborazione(

Costanti.Profilo_MessaggioSingoloOneWay);

busta_eGov.setInoltro(Costanti.Trasmissione_PiuVolte); busta_eGov.setConfermaRicezione("False");

Viene anche aggiunto un elemento Trasmissione, nella listaTrasmissioni, per registrare nella busta il proxy Delegato che si è occupato di crearla.

Trasmissione tras = new Trasmissione(); tras.setOrigine(mittente); tras.setTipoOrigine(tipoMittente); tras.setDestinazione(serviceProvider); tras.setTipoDestinazione(tipoServiceProvider); tras.setOraRegistrazione(oraRegistrazione); tras.setTempo(Costanti.LOCAL); busta_eGov.addTrasmissione(tras);

A questo punto l’oggetto Busta è stato correttamente creato ed inizializzato. Bisogna adesso leggere la richiesta SOAP dal file xml ‘Request.xml’:

byte [] soapEnvelope = lettura dal file xml ... ;

Procediamo con l’imbustamento.

byte [] bytes_busta_eGov =

Imbustamento.build_eGov(busta_eGov,soapEnvelope);

Dopo aver effettuato l’imbustamento, nell’array ‘bytes_busta_eGov’ si sarà ottenuto la seguente SOAPEnvelope: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Header> <eGov_IT:Intestazione soapenv:actor="http://www.cnipa.it/eGov_it/portadominio" soapenv:mustUnderstand="1" xmlns:eGov_IT="http://www.cnipa.it/schemas/2003/eGov_IT/Busta1_0/">

3. Implementazione del prodotto OpenSPCoop 157 <eGov_IT:IntestazioneMessaggio>

<eGov_IT:Mittente>

<eGov_IT:IdentificativoParte tipo="AOO" >

SIL1

</eGov_IT:IdentificativoParte> </eGov_IT:Mittente>

<eGov_IT:Destinatario>

<eGov_IT:IdentificativoParte tipo="AOO">

SIL2 </eGov_IT:IdentificativoParte> </eGov_IT:Destinatario> <eGov_IT:ProfiloCollaborazione> EGOV_IT_MessaggioSingoloOneWay </eGov_IT:ProfiloCollaborazione>

<eGov_IT:Servizio tipo=”test”>Quote</eGov_IT:Servizio> <eGov_IT:Azione>Ping</eGov_IT:Azione>

<eGov_IT:Messaggio>

<eGov_IT:Identificatore>

SIL1_PDP-Example_0000001_2005-10-26_16:48 </eGov_IT:Identificatore>

<eGov_IT:OraRegistrazione tempo="EGOV_IT_SPC"> 2005-10-26T16:48:15

</eGov_IT:OraRegistrazione>

</eGov_IT:Messaggio>

<eGov_IT:ProfiloTrasmissione confermaRicezione="False" inoltro="EGOV_IT_PIUDIUNAVOLTA" /> </eGov_IT:IntestazioneMessaggio> <eGov_IT:ListaTrasmissioni> <eGov_IT:Trasmissione> <eGov_IT:Origine>

<eGov_IT:IdentificativoParte tipo="AOO">

SIL1

</eGov_IT:IdentificativoParte>

</eGov_IT:Origine> <eGov_IT:Destinazione>

<eGov_IT:IdentificativoParte tipo="AOO">

SIL2

</eGov_IT:IdentificativoParte>

</eGov_IT:Destinazione>

<eGov_IT:OraRegistrazione tempo="EGOV_IT_SPC" > 2005-10-26T16:48:15 </eGov_IT:OraRegistrazione> </eGov_IT:Trasmissione> </eGov_IT:ListaTrasmissioni> </eGov_IT:Intestazione> </soapenv:Header> <soapenv:Body> <ns1:getQuote soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:xmethods-delayed-quotes"> <symbol xmlns="" xmlns:se="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi=http://www.w3.org/1999/XMLSchema-instance

xsi:type="xsd:string">IBM</symbol>

</ns1:getQuote> </soapenv:Body> </soapenv:Envelope>

3. Implementazione del prodotto OpenSPCoop 158 Validazione / Sbustamento di una busta e-Gov

La validazione di una busta e-Gov comporta la validazione del SOAPHeaderElement e-Gov, secondo requisiti definiti nella specifica CNIPA. Lo sbustamento comporterà invece la sua eliminazione dal SOAPHeader, riportando il SOAPEnvelope allo stato primitivo utilizzato per lo scambio di dati tra due applicazioni (Client e WebService).

Supponiamo che una busta e-Gov sia disponibile sotto forma di byte:

byte [] busta_eGov = ... ;

Bisognerà innanzitutto controllare, che esista realmente una busta e-Gov (header e-Gov nel SOAPHeader).

byte [] soapFault =

Validazione.controlloPresenza_Busta_eGov( busta_eGov ); if (soapFault != null ){

log.info("Error: il soap message non contiene una busta eGov“); return;

}

Dopodichè sarà possibile procedere con la validazione. Durante la validazione, sarà anche letto il contenuto della busta, che sarà incluso nell’oggetto, di tipo ‘Busta’, passato come parametro al metodo di validazione (gli altri parametri del metodo racchiudono aspetti di validazione avanzata non illustrati in questo esempio). Il metodo di validazione, ritorna un ‘Vector’, contenente eventuali errori di validazione, in caso di validazione senza successo.

+

Busta busta = new Busta(); java.util.Vector errors =

Validazione.validazioneBusta( busta_eGov, busta,

true, null, “idSessione”, null, false );

if(errors.size() != 0){

log.info("Error: SoapMessage con busta e-Gov non valida."); }

Nel caso siano ritornati degli errori di validazione è possibile esaminare gli errori attraverso il seguente codice:

for(int i=0; i< errors.size(); i++){

Eccezione ecc = busta.getEccezione( i ); log.info( ecc.getContestoCodifica() );

log.info( ecc.getCodiceEccezione() ); log.info( ecc.getRilevanza() );

3. Implementazione del prodotto OpenSPCoop 159 Mentre con il seguente codice è possibile creare una busta e-Gov Fault, contenente

gli errori riscontrati durante la validazione effettuata nel codice precedente:

if(errors.size() != 0){

// Aggiungo problemi riscontrati nella busta. while(errors.size() != 0){ busta_eGov.addEccezione((Eccezione)errors.remove(0)); } // Creo e-GovFault byte [] bytes_busta_eGovFault = Imbustamento.build_eGov_Fault(busta_eGov, busta ); // Spedizione al mittente della busta originale

// la busta contenente le eccezioni riscontrate // durante la validazione

SEND_TO_MITT(bytes_busta_eGovFault); }

Se la validazione ha successo è possibile effettuare l’estrazione dell’header e-Gov con il seguente metodo:

byte [] soap = Sbustamento.remove_eGov(busta_eGov);

Interazione con il registro dei servizi

Precedentemente, è stato illustrato un esempio riguardante la creazione di una busta. Nell’esempio è stato supposto che le informazioni e-Gov associate ad una richiesta SOAP siano cablate direttamente all’interno del proxy che si occupa di gestire la richiesta di servizio. Se invece le varie funzionalità e-Gov (es. ProfiloCollaborazione, ProfiloTrasmissione, Riscontri ecc….). sono state registrate in un registro dei servizi è possibile utilizzare un oggetto che implementi l’interfaccia org.openspcoop.uddi.QueryEGov per prelevarle da esso.

Le informazioni che identificano un servizio univocamente, all’interno del registro UDDI, sono:

[ tipoServiceProvider, serviceProvider, servizio, tipoServizio, azione ]. Queste devono essere quindi precedentemente impostate in un oggetto di tipo ‘ServizioEGov’, per poter effettuare la ricerca nel registro.

ServizioEGov infoServizio = new ServizioE-ov();

infoServizio.setTipoServiceProvider(tipoServiceProvider); infoServizio.setServiceProvider(serviceProvider);

infoServizio.setServizio(servizio);

infoServizio.setTipoServizio(tipoServizio); infoServizio.setAzione(azione);

3. Implementazione del prodotto OpenSPCoop 160 Dopodichè deve essere creato un oggetto specifico per il particolare tipo di registro

con cui si intende interagire. L’oggetto può essere implementato utilizzando la classe org.openspcoop.uddi.QueryEGovUDDI, se si intende effettuare ricerche su di un registro dei servizi UDDI, o la classe org.openspcoop.uddi.QueryEGovXML se si intende utilizzare un registro implementato come file XML. Supponiamo di utilizzare il registro in formato XML, che è posto localmente, sui due proxy, nella posizione ‘/etc/registroServizi.xml’.

org.openspcoop.uddi.QueryEGov query =

new org.openspcoop.uddi.QueryEGovXML(“/etc/registroServizi.xml”);

Adesso è possibile effettuare la ricerca nel registro dei servizi. Se la ricerca ha successo, l’oggetto di tipo ‘ServizioEGov’, sarà popolato con le varie informazioni e-Gov associate al servizio.

boolean serviceExist = query.getInfoServizio(infoServizio); if(serviceExist != true) {

log.info(“Servizio richiesto non esistente”); return; } busta.setProfiloDiCollaborazione( infoServizio.getProfiloDiCollaborazione()[0]); busta.setInoltro(infoServizio.getInoltro()); if(infoServizio.getConfermaRicezione()) busta.setConfermaRicezione("True"); else busta.setConfermaRicezione("False"); ...