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