InResponseHandler.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */
  20. package org.openspcoop2.pdd.core.handlers.transazioni;

  21. import java.io.ByteArrayOutputStream;
  22. import java.util.Date;

  23. import org.apache.commons.lang.StringUtils;
  24. import org.openspcoop2.core.constants.Costanti;
  25. import org.openspcoop2.core.constants.TipoPdD;
  26. import org.openspcoop2.message.OpenSPCoop2RestMessage;
  27. import org.openspcoop2.message.OpenSPCoop2SoapMessage;
  28. import org.openspcoop2.message.constants.MessageRole;
  29. import org.openspcoop2.message.constants.ServiceBinding;
  30. import org.openspcoop2.message.xml.MessageXMLUtils;
  31. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  32. import org.openspcoop2.pdd.core.CostantiPdD;
  33. import org.openspcoop2.pdd.core.connettori.ConnettoreBase;
  34. import org.openspcoop2.pdd.core.handlers.HandlerException;
  35. import org.openspcoop2.pdd.core.handlers.InResponseContext;
  36. import org.openspcoop2.pdd.core.transazioni.InResponseStatefulObject;
  37. import org.openspcoop2.pdd.core.transazioni.RepositoryGestioneStateful;
  38. import org.openspcoop2.pdd.core.transazioni.Transaction;
  39. import org.openspcoop2.pdd.core.transazioni.TransactionContext;
  40. import org.openspcoop2.pdd.core.transazioni.TransactionDeletedException;
  41. import org.openspcoop2.pdd.core.transazioni.TransactionNotExistsException;
  42. import org.openspcoop2.pdd.core.transazioni.TransactionStatefulNotSupportedException;
  43. import org.openspcoop2.pdd.logger.DumpUtility;
  44. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  45. import org.openspcoop2.utils.json.JSONUtils;
  46. import org.openspcoop2.utils.transport.http.HttpRequestMethod;
  47. import org.slf4j.Logger;

  48. import com.fasterxml.jackson.databind.JsonNode;

  49. /**    
  50.  * InResponseHandler
  51.  *
  52.  * @author Poli Andrea (poli@link.it)
  53.  * @author $Author$
  54.  * @version $Rev$, $Date$
  55.  */
  56. public class InResponseHandler extends FirstPositionHandler implements  org.openspcoop2.pdd.core.handlers.InResponseHandler{

  57.     @Override
  58.     public void invoke(InResponseContext context) throws HandlerException {
  59.        
  60.         OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  61.         if(op2Properties.isTransazioniEnabled()==false) {
  62.             return;
  63.         }

  64.         String idTransazione = null;
  65.         if(context!=null && context.getPddContext()!=null) {
  66.             idTransazione = (String) context.getPddContext().getObject(Costanti.ID_TRANSAZIONE);
  67.         }
  68.        
  69.         //System.out.println("------------- InResponseHandler ("+idTransazione+")("+context.getTipoPorta().getTipo()+") -------------------");
  70.        
  71.        
  72.        
  73.         // Gestione FAULT
  74.         String fault = null;
  75.         String formatoFault = null;
  76.         try{
  77.             if(context!=null && context.getMessaggio()!=null){
  78.                 if(ServiceBinding.SOAP.equals(context.getMessaggio().getServiceBinding())) {
  79.                     OpenSPCoop2SoapMessage soapMsg = context.getMessaggio().castAsSoap();
  80.                     if(soapMsg.hasSOAPFault()){
  81.                        
  82.                         ByteArrayOutputStream bout = new ByteArrayOutputStream();
  83.                         bout.write(context.getMessaggio().getAsByte(soapMsg.getSOAPPart().getEnvelope(), false));
  84.                         bout.flush();
  85.                         bout.close();
  86.                        
  87.                         Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioni(op2Properties.isTransazioniDebug());
  88.                         if(op2Properties.isTransazioniFaultPrettyPrint()){
  89.                             // Faccio una pretty-print: potevo fare anche direttamente passando il fault a metodo prettyPrint,
  90.                             // Pero' non veniva stampato correttamente il SOAPFault. Mi appoggio allora a SoapUtils.
  91.                             //byte [] content = org.openspcoop2.message.soap.TunnelSoapUtils.sbustamentoMessaggio(context.getMessaggio());
  92.                             byte [] content = bout.toByteArray();
  93.                             fault = DumpUtility.toString(MessageXMLUtils.getInstance(soapMsg.getFactory()).newDocument(content), log, context.getMessaggio());
  94.                             //System.out.println("IMPOSTATO FAULT IN TRANSACTION ["+fault+"]");
  95.                         }
  96.                         else{
  97.                            
  98.                             fault = bout.toString();
  99.                         }
  100.                        
  101.                         formatoFault = soapMsg.getMessageType().name();
  102.                        
  103.                     }
  104.                 }
  105.                 else {
  106.                     OpenSPCoop2RestMessage<?> restMsg = context.getMessaggio().castAsRest();
  107.                     if(restMsg.isProblemDetailsForHttpApis_RFC7807() || MessageRole.FAULT.equals(restMsg.getMessageRole())) {
  108.                         switch (restMsg.getMessageType()) {
  109.                         case XML:
  110.                            
  111.                             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  112.                             restMsg.writeTo(bout, false);
  113.                             bout.flush();
  114.                             bout.close();
  115.                            
  116.                             Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioni(op2Properties.isTransazioniDebug());
  117.                             if(op2Properties.isTransazioniFaultPrettyPrint()){
  118.                                 // Faccio una pretty-print: potevo fare anche direttamente passando il fault a metodo prettyPrint,
  119.                                 // Pero' non veniva stampato correttamente il SOAPFault. Mi appoggio allora a SoapUtils.
  120.                                 //byte [] content = org.openspcoop2.message.soap.TunnelSoapUtils.sbustamentoMessaggio(context.getMessaggio());
  121.                                 byte [] content = bout.toByteArray();
  122.                                 fault = DumpUtility.toString(MessageXMLUtils.getInstance(restMsg.getFactory()).newDocument(content), log, context.getMessaggio());
  123.                                 //System.out.println("IMPOSTATO FAULT IN TRANSACTION ["+fault+"]");
  124.                             }
  125.                             else{
  126.                                
  127.                                 fault = bout.toString();
  128.                             }
  129.                            
  130.                             formatoFault = restMsg.getMessageType().name();
  131.                            
  132.                             break;
  133.                            
  134.                         case JSON:
  135.                            
  136.                             bout = new ByteArrayOutputStream();
  137.                             restMsg.writeTo(bout, false);
  138.                             bout.flush();
  139.                             bout.close();
  140.                            
  141.                             if(op2Properties.isTransazioniFaultPrettyPrint()){
  142.                                
  143.                                 JSONUtils jsonUtils = JSONUtils.getInstance(true);
  144.                                 byte [] content = bout.toByteArray();
  145.                                 JsonNode jsonNode = jsonUtils.getAsNode(content);
  146.                                 fault = jsonUtils.toString(jsonNode);
  147.                                
  148.                             }
  149.                             else{
  150.                                
  151.                                 fault = bout.toString();
  152.                             }
  153.                            
  154.                             formatoFault = restMsg.getMessageType().name();
  155.                            
  156.                             break;

  157.                         default:
  158.                             break;
  159.                         }
  160.                     }
  161.                 }
  162.             }
  163.         }catch(Exception e){
  164.             throw new HandlerException("Errore durante il dump del soap fault",e);
  165.         }
  166.        
  167.        
  168.        
  169.        
  170.         if(context!=null && context.getTransazioneApplicativoServer()!=null) {
  171.            
  172.             try{
  173.            
  174.                 // date            
  175.                 context.getTransazioneApplicativoServer().setDataAccettazioneRisposta(context.getDataAccettazioneRisposta());
  176.                
  177.                 Date dataIngressoRisposta = context.getDataElaborazioneMessaggio();
  178.                 if(context.getDataTerminataInvocazioneConnettore()!=null) {
  179.                     dataIngressoRisposta = context.getDataTerminataInvocazioneConnettore(); // nella latenza porta deve rientrare anche la negoziazione della connessione
  180.                 }
  181.                 context.getTransazioneApplicativoServer().setDataIngressoRisposta(dataIngressoRisposta);
  182.                
  183.                 if(context.getDataPrimaInvocazioneConnettore()!=null) {
  184.                     // aggiorno informazione sulla data, poiche' piu' precisa (nella latenza porta deve rientrare anche il dump ed il rilascio della connessione)
  185.                     context.getTransazioneApplicativoServer().setDataUscitaRichiesta(context.getDataPrimaInvocazioneConnettore());
  186.                 }
  187.                
  188.                 if(context.getDataRichiestaInoltrata()!=null) {
  189.                     context.getTransazioneApplicativoServer().setDataUscitaRichiestaStream(context.getDataRichiestaInoltrata());
  190.                 }
  191.                
  192.                
  193.                 // return code
  194.                 context.getTransazioneApplicativoServer().setCodiceRisposta(context.getReturnCode()+"");
  195.                    
  196.                 // eventuali errori
  197.                 context.getTransazioneApplicativoServer().setUltimoErrore(context.getErroreConsegna());
  198.                
  199.                
  200.                 // aggiorno location
  201.                 if(context.getConnettore()!=null){
  202.                     context.getTransazioneApplicativoServer().setLocationConnettore(context.getConnettore().getLocation());
  203.                 }
  204.                
  205.                 // fault
  206.                 if(fault!=null){
  207.                     context.getTransazioneApplicativoServer().setFault(fault);
  208.                     context.getTransazioneApplicativoServer().setFormatoFault(formatoFault);
  209.                 }
  210.                
  211.             }catch(Exception e){
  212.                 throw new HandlerException("Errore durante il processamento delle informazioni relative alla consegna per l'applicativo '"+context.getTransazioneApplicativoServer().getServizioApplicativoErogatore()+"': "+e.getMessage(),e);
  213.             }
  214.            
  215.         }
  216.         else {
  217.        
  218.        
  219.             boolean gestioneStateful = false;
  220.             Transaction tr = null;
  221.             try{
  222.                 tr = TransactionContext.getTransaction(idTransazione);
  223.             }catch(TransactionNotExistsException e){
  224.                 gestioneStateful = true;
  225.             }
  226.            
  227.             try{
  228.            
  229.                 InResponseStatefulObject sObject = null;
  230.    
  231.                 if(tr==null && gestioneStateful){
  232.                    
  233.                     sObject = new InResponseStatefulObject();
  234.                    
  235.                     //System.out.println("@@@@@REPOSITORY@@@@@ InResponseHandler ID TRANSAZIONE ["+idTransazione+"] GESTIONE COMPLETA");
  236.                    
  237.                     Date dataRichiestaInoltrata = context.getDataRichiestaInoltrata();
  238.                     // La porta di dominio mi passa sempre questa informazione.
  239.                     // Nel PddMonitor, invece, la data deve essere visualizzata solo se la dimensione e' diverso da 0 e cioe' se c'e' un messaggio di risposta.
  240.                     //if(dimensione!=null && dimensione>0){
  241.                     // L'INFORMAZIONE DEVE INVECE ESSERE SEMPRE SALVATA PER LA SIMULAZIONE DEI MESSAGGI DIAGNOSTICI
  242.                     // INEFFICIENTE: RepositoryGestioneStateful.addDataAccettazioneRisposta(idTransazione, dataAccettazioneRisposta);
  243.                     sObject.setDataRichiestaInoltrata(dataRichiestaInoltrata);
  244.                    
  245.                     Date dataAccettazioneRisposta = context.getDataAccettazioneRisposta();
  246.                     // La porta di dominio mi passa sempre questa informazione.
  247.                     // Nel PddMonitor, invece, la data deve essere visualizzata solo se la dimensione e' diverso da 0 e cioe' se c'e' un messaggio di risposta.
  248.                     //if(dimensione!=null && dimensione>0){
  249.                     // L'INFORMAZIONE DEVE INVECE ESSERE SEMPRE SALVATA PER LA SIMULAZIONE DEI MESSAGGI DIAGNOSTICI
  250.                     // INEFFICIENTE: RepositoryGestioneStateful.addDataAccettazioneRisposta(idTransazione, dataAccettazioneRisposta);
  251.                     sObject.setDataAccettazioneRisposta(dataAccettazioneRisposta);
  252.                    
  253.                     Date dataIngressoRisposta = context.getDataElaborazioneMessaggio();
  254.                     if(context.getDataTerminataInvocazioneConnettore()!=null) {
  255.                         dataIngressoRisposta = context.getDataTerminataInvocazioneConnettore(); // nella latenza porta deve rientrare anche la negoziazione della connessione
  256.                     }
  257.                     // La porta di dominio mi passa sempre questa informazione.
  258.                     // Nel PddMonitor, invece, la data deve essere visualizzata solo se la dimensione e' diverso da 0 e cioe' se c'e' un messaggio di risposta.
  259.                     //if(dimensione!=null && dimensione>0){
  260.                     // L'INFORMAZIONE DEVE INVECE ESSERE SEMPRE SALVATA PER LA SIMULAZIONE DEI MESSAGGI DIAGNOSTICI
  261.                     // INEFFICIENTE: RepositoryGestioneStateful.addDataIngressoRisposta(idTransazione, dataElaborazioneMessaggio);
  262.                     sObject.setDataIngressoRisposta(dataIngressoRisposta);
  263.                    
  264.                     if(context.getDataPrimaInvocazioneConnettore()!=null) {
  265.                         // aggiorno informazione sulla data, poiche' piu' precisa (nella latenza porta deve rientrare anche il dump ed il rilascio della connessione)
  266.                         sObject.setDataUscitaRichiesta(context.getDataPrimaInvocazioneConnettore());
  267.                     }
  268.                    
  269.                     // INEFFICIENTE: RepositoryGestioneStateful.addCodiceTrasportoRichiesta(idTransazione, context.getReturnCode()+"");
  270.                     sObject.setReturnCode(context.getReturnCode()+"");
  271.                    
  272.                     if(context.getConnettore()!=null){
  273.                        
  274.                         // INEFFICIENTE: RepositoryGestioneStateful.addLocation(idTransazione, context.getConnettore().getLocation());
  275.                         sObject.setLocation(context.getConnettore().getLocation());
  276.                        
  277.                     }
  278.                    
  279.                     if(fault!=null){
  280.                         if(TipoPdD.APPLICATIVA.equals(context.getTipoPorta())){
  281.                             sObject.setFaultIntegrazione(fault);
  282.                             sObject.setFormatoFaultIntegrazione(formatoFault);
  283.                         }
  284.                         else{
  285.                             sObject.setFaultCooperazione(fault);
  286.                             sObject.setFormatoFaultCooperazione(formatoFault);
  287.                         }
  288.                     }
  289.                
  290.                 }else{
  291.                        
  292.                     if(tr==null) {
  293.                         throw new HandlerException("Transaction is null");
  294.                     }
  295.                     if(context==null) {
  296.                         throw new HandlerException("Context is null");
  297.                     }
  298.                    
  299.                     Date dataRichiestaInoltrata = context.getDataRichiestaInoltrata();
  300.                     // La porta di dominio mi passa sempre questa informazione.
  301.                     // Nel PddMonitor, invece, la data deve essere visualizzata solo se la dimensione e' diverso da 0 e cioe' se c'e' un messaggio di risposta.
  302.                     //if(dimensione!=null && dimensione>0){
  303.                     // L'INFORMAZIONE DEVE INVECE ESSERE SEMPRE SALVATA PER LA SIMULAZIONE DEI MESSAGGI DIAGNOSTICI
  304.                     try{
  305.                         tr.setDataRichiestaInoltrata(dataRichiestaInoltrata);
  306.                         //System.out.println("SET DATA ("+dataAccettazioneRisposta.toString()+")");
  307.                     }catch(TransactionDeletedException e){
  308.                         //System.out.println("@@@@@REPOSITORY@@@@@ InResponseHandler SET DATA ("+dataAccettazioneRisposta.toString()+")");
  309.                         // INEFFICIENTE: RepositoryGestioneStateful.addDataAccettazioneRisposta(idTransazione, dataAccettazioneRisposta);
  310.                         if(sObject==null)
  311.                             sObject = new InResponseStatefulObject();
  312.                         sObject.setDataRichiestaInoltrata(dataRichiestaInoltrata);
  313.                     }
  314.                    
  315.                     Date dataAccettazioneRisposta = context.getDataAccettazioneRisposta();
  316.                     // La porta di dominio mi passa sempre questa informazione.
  317.                     // Nel PddMonitor, invece, la data deve essere visualizzata solo se la dimensione e' diverso da 0 e cioe' se c'e' un messaggio di risposta.
  318.                     //if(dimensione!=null && dimensione>0){
  319.                     // L'INFORMAZIONE DEVE INVECE ESSERE SEMPRE SALVATA PER LA SIMULAZIONE DEI MESSAGGI DIAGNOSTICI
  320.                     try{
  321.                         tr.setDataAccettazioneRisposta(dataAccettazioneRisposta);
  322.                         //System.out.println("SET DATA ("+dataAccettazioneRisposta.toString()+")");
  323.                     }catch(TransactionDeletedException e){
  324.                         //System.out.println("@@@@@REPOSITORY@@@@@ InResponseHandler SET DATA ("+dataAccettazioneRisposta.toString()+")");
  325.                         // INEFFICIENTE: RepositoryGestioneStateful.addDataAccettazioneRisposta(idTransazione, dataAccettazioneRisposta);
  326.                         if(sObject==null)
  327.                             sObject = new InResponseStatefulObject();
  328.                         sObject.setDataAccettazioneRisposta(dataAccettazioneRisposta);
  329.                     }
  330.                    
  331.                     Date dataIngressoRisposta = context.getDataElaborazioneMessaggio();
  332.                     if(context.getDataTerminataInvocazioneConnettore()!=null) {
  333.                         dataIngressoRisposta = context.getDataTerminataInvocazioneConnettore(); // nella latenza porta deve rientrare anche la negoziazione della connessione
  334.                     }
  335.                     // La porta di dominio mi passa sempre questa informazione.
  336.                     // Nel PddMonitor, invece, la data deve essere visualizzata solo se la dimensione e' diverso da 0 e cioe' se c'e' un messaggio di risposta.
  337.                     //if(dimensione!=null && dimensione>0){
  338.                     // L'INFORMAZIONE DEVE INVECE ESSERE SEMPRE SALVATA PER LA SIMULAZIONE DEI MESSAGGI DIAGNOSTICI
  339.                     try{
  340.                         tr.setDataIngressoRisposta(dataIngressoRisposta);
  341.                         //System.out.println("SET DATA ("+dataElaborazioneMessaggio.toString()+")");
  342.                     }catch(TransactionDeletedException e){
  343.                         //System.out.println("@@@@@REPOSITORY@@@@@ InResponseHandler SET DATA ("+dataElaborazioneMessaggio.toString()+")");
  344.                         // INEFFICIENTE: RepositoryGestioneStateful.addDataIngressoRisposta(idTransazione, dataElaborazioneMessaggio);
  345.                         if(sObject==null)
  346.                             sObject = new InResponseStatefulObject();
  347.                         sObject.setDataIngressoRisposta(dataIngressoRisposta);
  348.                     }
  349.                        
  350.                     if(context.getDataPrimaInvocazioneConnettore()!=null) {
  351.                         // aggiorno informazione sulla data, poiche' piu' precisa (nella latenza porta deve rientrare anche il dump ed il rilascio della connessione)
  352.                         try{
  353.                             tr.setDataUscitaRichiesta(context.getDataPrimaInvocazioneConnettore());
  354.                             //System.out.println("SET DATA ("+dataElaborazioneMessaggio.toString()+")");
  355.                         }catch(TransactionDeletedException e){
  356.                             //System.out.println("@@@@@REPOSITORY@@@@@ InResponseHandler SET DATA ("+dataElaborazioneMessaggio.toString()+")");
  357.                             // INEFFICIENTE: RepositoryGestioneStateful.addDataIngressoRisposta(idTransazione, dataElaborazioneMessaggio);
  358.                             if(sObject==null)
  359.                                 sObject = new InResponseStatefulObject();
  360.                             sObject.setDataUscitaRichiesta(context.getDataPrimaInvocazioneConnettore());
  361.                         }
  362.                     }
  363.                    
  364.                     try{
  365.                         //System.out.println("SET CODICE TRASPORTO RICHIESTA ["+context.getReturnCode()+"]");
  366.                         if(context!=null) {
  367.                             tr.setCodiceTrasportoRichiesta(context.getReturnCode()+"");
  368.                         }
  369.                     }catch(TransactionDeletedException e){
  370.                         //System.out.println("@@@@@REPOSITORY@@@@@ InResponseHandler SET CODICE TRASPORTO RICHIESTA ["+context.getReturnCode()+"]");
  371.                         // INEFFICIENTE: RepositoryGestioneStateful.addCodiceTrasportoRichiesta(idTransazione, context.getReturnCode()+"");
  372.                         if(sObject==null)
  373.                             sObject = new InResponseStatefulObject();
  374.                         sObject.setReturnCode(context.getReturnCode()+"");
  375.                     }
  376.                    
  377.                     try{
  378.                         // update location impostata nel OutRequest (location modificata dal connettore)
  379.                         //System.out.println("SET LOCATION ["+context.getConnettore().getLocation()+"]");
  380.                         String connettoreRequestUrl = null;
  381.                         String connettoreRequestMethod = null;
  382.                         if(context.getPddContext()!=null) {
  383.                             if(context.getPddContext().containsKey(CostantiPdD.CONNETTORE_REQUEST_URL)) {
  384.                                 connettoreRequestUrl = (String) context.getPddContext().getObject(CostantiPdD.CONNETTORE_REQUEST_URL);
  385.                             }
  386.                             if(context.getPddContext().containsKey(CostantiPdD.CONNETTORE_REQUEST_METHOD)) {
  387.                                 Object o = context.getPddContext().getObject(CostantiPdD.CONNETTORE_REQUEST_METHOD);
  388.                                 if(o instanceof String) {
  389.                                     connettoreRequestMethod = (String) o;
  390.                                 }
  391.                                 else if(o instanceof HttpRequestMethod) {
  392.                                     HttpRequestMethod oConnettoreRequestMethod = (HttpRequestMethod) o;
  393.                                     connettoreRequestMethod = oConnettoreRequestMethod.name();
  394.                                 }
  395.                             }
  396.                         }
  397.                         if(!StringUtils.isEmpty(connettoreRequestUrl) && !StringUtils.isEmpty(connettoreRequestMethod)) {
  398.                             String prefix = "";
  399.                             if(ConnettoreBase.LOCATION_CACHED.equals(context.getConnettore().getLocation())){
  400.                                 prefix = context.getConnettore().getLocation()+ConnettoreBase.LOCATION_CACHED_SEPARATOR_REQUEST_URL;
  401.                             }
  402.                             tr.setLocation(prefix+CostantiPdD.getConnettoreRequest(connettoreRequestUrl, connettoreRequestMethod));
  403.                         }
  404.                         else {
  405.                             if(context!=null && context.getConnettore()!=null) {
  406.                                 tr.setLocation(context.getConnettore().getLocation());
  407.                             }
  408.                         }
  409.                     }catch(TransactionDeletedException e){
  410.                         //System.out.println("@@@@@REPOSITORY@@@@@ OutRequestHandler SET LOCATION ["+context.getConnettore().getLocation()+"]");
  411.                         // INEFFICIENTE: RepositoryGestioneStateful.addLocation(idTransazione, context.getConnettore().getLocation());
  412.                         if(sObject==null)
  413.                             sObject = new InResponseStatefulObject();
  414.                         sObject.setLocation(context.getConnettore().getLocation());
  415.                     }
  416.                    
  417.                     try{
  418.                         if(fault!=null){
  419.                             if(TipoPdD.APPLICATIVA.equals(context.getTipoPorta())){
  420.                                 tr.setFaultIntegrazione(fault);
  421.                                 tr.setFormatoFaultIntegrazione(formatoFault);
  422.                             }
  423.                             else{
  424.                                 tr.setFaultCooperazione(fault);
  425.                                 tr.setFormatoFaultCooperazione(formatoFault);
  426.                             }
  427.                         }
  428.                     }catch(TransactionDeletedException e){
  429.                         if(fault!=null){
  430.                             if(sObject==null)
  431.                                 sObject = new InResponseStatefulObject();
  432.                             if(TipoPdD.APPLICATIVA.equals(context.getTipoPorta())){
  433.                                 sObject.setFaultIntegrazione(fault);
  434.                                 sObject.setFormatoFaultIntegrazione(formatoFault);
  435.                             }
  436.                             else{
  437.                                 sObject.setFaultCooperazione(fault);
  438.                                 sObject.setFormatoFaultCooperazione(formatoFault);
  439.                             }
  440.                         }
  441.                     }
  442.                
  443.                 }
  444.                
  445.                 if(sObject!=null){
  446.                     // Gestione stateful
  447.                     RepositoryGestioneStateful.addInResponseStatefulObject(context.getProtocolFactory().getProtocol(),idTransazione, sObject);
  448.                 }
  449.                
  450.             }catch(TransactionStatefulNotSupportedException e){
  451.                 throw new HandlerException("Errore durante il processamento dell'handler: "+e.getMessage(),e);
  452.             }
  453.            
  454.         }
  455.        
  456.     }

  457. }