• Non ci sono risultati.

3. Implementazione del prodotto OpenSPCoop

3.3 Libreria e-Gov

3.3.2 Uno scenario di utilizzo

Vediamo uno scenario d’uso completo, dove un client vuole spedire un messaggio Soap (contenente dati applicativi) ad un Server. La spedizione è mediata da un proxyDelegato, con cui il Client è costretto a dialogare, e da un proxyApplicativo che deve essere interpellato per poter comunicare con il server. Il server, ricevuti i dati dal cliente, genera una risposta applicativa che dovrà essere restituita al client sempre dietro la mediazione del proxyApplicativo e del proxyDelegato. La Figura 3-9 illustra lo scenario.

3. Implementazione del prodotto OpenSPCoop 161

Figura 3-9, Uno scenario completo di utilizzo della libreria e-Gov

L'esempio, di cui è disponibile il codice completo all’indirizzo ‘http://www.openspcoop.org/openspcoop/download/esempi-libegov.zip’, realizza lo scenario attraverso l'implementazione di due servlet che fungono da proxy delegato e proxy applicativo. Nell’esempio un SIL1 vuole usufruire di un servizio ‘Quote’ con azione ‘Echo’ erogato da un SIL2. Il server utilizzato nell'esempio è un webService pubblico della XMethods (http://www.xmethods.net/), disponibile all'indirizzo 'http://64.124.140.30/soap’. Il codice del servlet proxyDelegato (che si occupa dell’imbustamento della richiesta, e della validazione/sbustamento della risposta) è il seguente:

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

public class ProxyDelegatoSincrono extends HttpServlet {

/** Logger utilizzato per riscontro errori di validazione. */ private static Logger log= Logger.getLogger(“ProxyDelegato”);

// Definizione Proxy Delegato

private static final String IDProxyDelegato = "PD-Sincrono"; private static final String portaApplicativa =

"http://localhost:8080/PROXY/ProxyApplicativo_Sincrono";

// Definizione Porta Delegata fornita:

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 = "Echo";

3. Implementazione del prodotto OpenSPCoop 162

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

/* ---- Ricezione richiesta del client ---- */

ServletInputStream sin = req.getInputStream();

ByteArrayOutputStream outStr = new ByteArrayOutputStream(); int read;

while( (read = sin.read()) != -1) outStr.write(read);

/* ---- Creazione Busta e-Gov ---- */

Busta busta_eGov = new Busta();

String oraRegistrazione = Imbustamento.getDate_eGovFormat();

// Destinatario e Mittente busta_eGov.setTipoServiceProvider(tipoServiceProvider); busta_eGov.setServiceProvider(serviceProvider); busta_eGov.setTipoMittente(tipoMittente); busta_eGov.setMittente(mittente); // Servizio e Azione busta_eGov.setServizio(servizio); busta_eGov.setTipoServizio(“test”); busta_eGov.setAzione(azione); // Messaggio busta_eGov.setID(Imbustamento.buildID_eGov(IDProxyDelegato, mittente)); busta_eGov.setOraRegistrazione(oraRegistrazione);

// Interazione con il registro UDDI

ServizioEGov infoServizio = new ServizioEGov();

infoServizio.setTipoServiceProvider(tipoServiceProvider); infoServizio.setServiceProvider(serviceProvider); infoServizio.setServizio(servizio); infoServizio.setAzione(azione); QueryEGov query = new QueryEGovXML(“http://www.server.it/uddi”); boolean serviceExist = query.getInfoServizio(infoServizio); if(serviceExist == false){

// Ritorno operazione non correttamente riuscita SoapUtils.build_Soap_Fault(

"Servizio non registrato nel Registro UDDI.",null, “Client.ServiceUnknown”,null,null,null);

ServletOutputStream sout = res.getOutputStream(); sout.write(soapFault); return; } busta_eGov.setProfiloDiCollaborazione( infoServizio.getProfiloDiCollaborazione()[0]); busta_eGov.setInoltro(infoServizio.getInoltro()); if(infoServizio.getConfermaRicezione()) busta_eGov.setConfermaRicezione("True"); else busta_eGov.setConfermaRicezione("False"); // Tracciamento

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);

3. Implementazione del prodotto OpenSPCoop 163 /* ---- Imbustamento ---- */

byte [] bytes_busta_eGov =

Imbustamento.build_eGov(busta_eGov,outStr.toByteArray());

/* -- Inoltro al proxy applicativo e ricezione risposta -- */

... byte [] risposta =... risposta...

/* ---- gestione eventuale Risposta con errori ---- */

if(Validazione.busta_eGov_Presente(risposta) == false){ // Ritorno operazione non correttamente riuscita SoapUtils.build_Soap_Fault(

"Trasmissione Fallita",null,

“Client.ServiceError”,null,null,null); ServletOutputStream sout = res.getOutputStream();

sout.write(soapFault); return;

}

if(Validazione.containsListaEccezioni(risposta)){

/* gestione busta e-Gov ritornata contentente eccezioni */

// Validazione Busta e-Gov

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

Validazione.validazioneBusta(risposta,

busta_eGov_Risposta,false, null, “idSessione”, null, false ); if(errors.size() != 0){

log.error(“Busta contenente eccezioni, malformata.”); return;

}else{

// Eventuale Gestione delle eccezioni ritornate // TO DO...

// Ritorno operazione non correttamente riuscita

SoapUtils.build_Soap_Fault(

"Trasmissione Fallita",null,

“Client.ServiceError”,null,null,null); ServletOutputStream sout = res.getOutputStream(); sout.write(soapFault);

return; }

}else{

/* Gestione Risposta Applicativa */

Busta busta_eGov_Risposta = new Busta(); java.util.Vector errorsRisposta =

Validazione.validazioneBusta(risposta,

busta_eGov_Risposta,true, null,

“idSessione”, null, false );

if(errorsRisposta.size() == 0) { // Ritorno risposta applicativa

byte [] soap = Sbustamento.remove_eGov(risposta); ServletOutputStream sout = res.getOutputStream(); sout.write(soap);

}else{

// Gestione eventuali errori }

} }

public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { doGet(req,res); } }

3. Implementazione del prodotto OpenSPCoop 164 Il codice del servlet proxyApplicativo (che si occupa della

validazione/sbustamento della richiesta e dell’imbustamento della risposta ) è il seguente:

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

public class ProxyApplicativoSincrono extends HttpServlet {

/** Logger utilizzato per debug. */

private static Logger log =Logger.getLogger(“ProxyApplicativo”);

// Definizione Proxy Applicativo

private static final String IDProxyApplicativo = "PA";

// Definizione Porta Applicativa fornita:

private static final String tipoServiceProvider = "AOO"; private static final String serviceProvider = "SIL2"; private static final String servizio = "Quote";

private static final String azione = "Echo"; private static final String urlConsegna =

"http://64.124.140.30/soap";

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

/* ---- Ricezione richiesta di un proxy delegato ---- */

ServletInputStream sin = req.getInputStream();

ByteArrayOutputStream outStr = new ByteArrayOutputStream(); int read;

while( (read = sin.read()) != -1) outStr.write(read);

/* ---- Controllo presenza di una busta e-Gov ---- */

byte [] soapFault = Validazione.controlloPresenza_Busta_eGov( outStr.toByteArray()); if (soapFault != null){

// Non è presente una busta e-Gov

ServletOutputStream sout = res.getOutputStream(); sout.write(soapFault);

return; }

/* ---- Validazione Busta e-Gov ---- */

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

Validazione.validazioneBusta(outStr.toByteArray(), busta_eGov, true, null,

“idSessione”, null, false );

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

// Aggiungo problemi riscontrati nella busta...

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

busta_eGov.addEccezione((Eccezione)errors.remove(0)); }

3. Implementazione del prodotto OpenSPCoop 165

// Creo e ritorno messaggio SPCoop di errore

byte [] bytes_busta_eGovFault =

Imbustamento.build_eGov_Fault(outStr.toByteArray(), busta_eGov);

ServletOutputStream sout = res.getOutputStream(); sout.write(bytes_busta_eGovFault);

return; }

/* ---- Sbustamento ---- */

byte [] soap = Sbustamento.remove_eGov(outStr.toByteArray());

/* ---- Consegna all'applicazione Destinataria ---- */

... byte [] risposta =... risposta...

/* ---- Imbustamento risposta applicativa ---- */

// Inverto Mittente con Destinatario

String mitt = busta_eGov.getMittente();

String tipoMitt = busta_eGov.getTipoMittente();

busta_eGov.setMittente(busta_eGov.getServiceProvider()); busta_eGov.setTipoMittente(busta_eGov.getTipoServiceProvider()); busta_eGov.setServiceProvider(mitt); busta_eGov.setTipoServiceProvider(tipoMitt); // Aggiungo RiferimentoMessaggio busta_eGov.setRiferimentoMessaggio(busta_eGov.getID());

// Creo nuovo identificatore Busta

busta_eGov.setID(Imbustamento.buildID_eGov(IDProxyApplicativo, busta_eGov.getMittente()));

// Creo nuova ora registrazione

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

// Aggiungo Trasmissione alla lista trasmissioni

Trasmissione tras = new Trasmissione(); tras.set(...);

busta_eGov.addTrasmissione(tras);

// Imbustamento

byte [] bytes_risposta_eGov =

Imbustamento.build_eGov(busta_eGov,outResponse.toByteArray());

/* ---- spedizione risposta applicativa ---- */

ServletOutputStream sout = res.getOutputStream(); sout.write(bytes_risposta_eGov);

}

public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doGet(req,res); }

3. Implementazione del prodotto OpenSPCoop 166