Tracciamento.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.logger;

  21. import java.io.ByteArrayOutputStream;
  22. import java.sql.Connection;
  23. import java.util.Date;
  24. import java.util.List;
  25. import java.util.Map;

  26. import javax.mail.BodyPart;
  27. import javax.xml.soap.AttachmentPart;
  28. import javax.xml.soap.SOAPBody;

  29. import org.openspcoop2.core.constants.TipoPdD;
  30. import org.openspcoop2.core.id.IDSoggetto;
  31. import org.openspcoop2.message.OpenSPCoop2Message;
  32. import org.openspcoop2.message.constants.MessageRole;
  33. import org.openspcoop2.message.constants.MessageType;
  34. import org.openspcoop2.message.constants.ServiceBinding;
  35. import org.openspcoop2.message.rest.MultipartContent;
  36. import org.openspcoop2.message.soap.SoapUtils;
  37. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  38. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  39. import org.openspcoop2.pdd.core.CostantiPdD;
  40. import org.openspcoop2.pdd.core.PdDContext;
  41. import org.openspcoop2.pdd.core.connettori.ConnettoreUtils;
  42. import org.openspcoop2.pdd.core.handlers.GeneratoreCasualeDate;
  43. import org.openspcoop2.pdd.core.transazioni.RepositoryGestioneStateful;
  44. import org.openspcoop2.pdd.core.transazioni.Transaction;
  45. import org.openspcoop2.pdd.core.transazioni.TransactionContext;
  46. import org.openspcoop2.pdd.core.transazioni.TransactionDeletedException;
  47. import org.openspcoop2.pdd.core.transazioni.TransactionNotExistsException;
  48. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  49. import org.openspcoop2.protocol.engine.builder.TracciaBuilder;
  50. import org.openspcoop2.protocol.sdk.Allegato;
  51. import org.openspcoop2.protocol.sdk.Busta;
  52. import org.openspcoop2.protocol.sdk.BustaRawContent;
  53. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  54. import org.openspcoop2.protocol.sdk.SecurityInfo;
  55. import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
  56. import org.openspcoop2.protocol.sdk.constants.TipoSerializzazione;
  57. import org.openspcoop2.protocol.sdk.state.IState;
  58. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  59. import org.openspcoop2.protocol.sdk.state.StateMessage;
  60. import org.openspcoop2.protocol.sdk.tracciamento.EsitoElaborazioneMessaggioTracciato;
  61. import org.openspcoop2.protocol.sdk.tracciamento.ITracciaProducer;
  62. import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
  63. import org.openspcoop2.protocol.sdk.tracciamento.TracciamentoException;
  64. import org.openspcoop2.utils.MapKey;
  65. import org.openspcoop2.utils.date.DateManager;
  66. import org.openspcoop2.utils.mime.MimeMultipart;
  67. import org.openspcoop2.utils.transport.http.HttpConstants;
  68. import org.slf4j.Logger;


  69. /**
  70.  * Contiene la definizione un Logger utilizzato dai nodi dell'infrastruttura di OpenSPCoop
  71.  * per il tracciamento di buste.
  72.  *
  73.  * @author Poli Andrea (apoli@link.it)
  74.  * @author $Author$
  75.  * @version $Rev$, $Date$
  76.  */

  77. public class Tracciamento {

  78.     /** Indicazione di un tracciamento funzionante */
  79.     public static boolean tracciamentoDisponibile = true;
  80.     /** Primo errore avvenuto nel momento in cui è stato rilevato un malfunzionamento nel tracciamento */
  81.     public static Exception motivoMalfunzionamentoTracciamento = null;
  82.    
  83.     /**  Logger log4j utilizzato per scrivere i tracciamenti */
  84.     protected Logger loggerTracciamento = null;

  85.     /** Tipo Gateway */
  86.     private TipoPdD tipoPdD;
  87.    
  88.     /** Soggetto che richiede il logger */
  89.     private IDSoggetto idSoggettoDominio;
  90.    
  91.     /** PdDContext */
  92.     private PdDContext pddContext;
  93.    
  94.     /** RequestInfo */
  95.     private RequestInfo requestInfo = null;
  96.    
  97.     /** Protocol Factory */
  98.     private ProtocolFactoryManager protocolFactoryManager = null;
  99.     private IProtocolFactory<?> protocolFactory;
  100.     private boolean tracciamentoSupportatoProtocollo = true;
  101.    
  102.     /** Appender personalizzati per i tracciamenti di OpenSPCoop */
  103.     private List<ITracciaProducer> loggerTracciamentoOpenSPCoopAppender = null;
  104.     private List<String> tipoTracciamentoOpenSPCoopAppender = null;

  105.     /** Reader della configurazione di OpenSPCoop */
  106.     private ConfigurazionePdDManager _configurazionePdDReader;
  107.    
  108.     /** Stati */
  109.     private StateMessage state = null;
  110.     private StateMessage responseState = null;
  111.    
  112.     /** XMLBuilder */
  113.     private TracciaBuilder xmlBuilder;

  114.     /** MsgDiagnostico per eventuali errori di tracciamento */
  115.     private MsgDiagnostico msgDiagErroreTracciamento = null;
  116.    
  117.     /** OpenSPCoopProperties */
  118.     private OpenSPCoop2Properties openspcoopProperties = null;
  119.    
  120.     /** Generatore di date casuali*/
  121.     private GeneratoreCasualeDate generatoreDateCasuali = null;
  122.    
  123.     /** Transaction */
  124.     private Transaction transactionNullable = null;
  125.    
  126.     public static String createLocationString(boolean bustaRicevuta,String location){
  127.         if(bustaRicevuta)
  128.             return ConnettoreUtils.limitLocation255Character(CostantiPdD.TRACCIAMENTO_IN+HttpConstants.SEPARATOR_SOURCE+location);
  129.         else
  130.             return ConnettoreUtils.limitLocation255Character(CostantiPdD.TRACCIAMENTO_OUT+HttpConstants.SEPARATOR_SOURCE+location);
  131.     }
  132.    
  133.    
  134.     public Tracciamento(IDSoggetto idSoggettoDominio,String idFunzione,PdDContext pddContext,TipoPdD tipoPdD,String nomePorta,
  135.             ConfigurazionePdDManager configurazionePdDManager) throws TracciamentoException {
  136.         this(idSoggettoDominio, idFunzione, pddContext, tipoPdD, nomePorta,
  137.                 configurazionePdDManager, null, null);  
  138.     }
  139.     /*
  140.     public Tracciamento(IDSoggetto idSoggettoDominio,String idFunzione,PdDContext pddContext,TipoPdD tipoPdD,String nomePorta,
  141.             IState statoRichiesta,IState statoRisposta) throws TracciamentoException {
  142.         this(idSoggettoDominio, idFunzione, pddContext, tipoPdD, nomePorta,
  143.                 null, statoRichiesta, statoRisposta);  
  144.     }
  145.     */
  146.     private Tracciamento(IDSoggetto idSoggettoDominio,String idFunzione,PdDContext pddContext,TipoPdD tipoPdD,String nomePorta,
  147.             ConfigurazionePdDManager configurazionePdDManagerParam, IState stateParam,IState responseStateParam) throws TracciamentoException {
  148.         this.idSoggettoDominio = idSoggettoDominio;
  149.         this.pddContext=pddContext;
  150.         this.tipoPdD = tipoPdD;
  151.                
  152.         this.loggerTracciamento = OpenSPCoop2Logger.loggerTracciamento;
  153.         this.loggerTracciamentoOpenSPCoopAppender = OpenSPCoop2Logger.loggerTracciamentoOpenSPCoopAppender;
  154.         this.tipoTracciamentoOpenSPCoopAppender = OpenSPCoop2Logger.tipoTracciamentoOpenSPCoopAppender;
  155.        
  156.         if(configurazionePdDManagerParam!=null) {
  157.             this._configurazionePdDReader = configurazionePdDManagerParam;
  158.             this.state = this._configurazionePdDReader.getState();
  159.             this.responseState = this._configurazionePdDReader.getResponseState();
  160.         }
  161.         else {
  162.             if(stateParam!=null && stateParam instanceof StateMessage){
  163.                 this.state = (StateMessage) stateParam;
  164.             }
  165.             if(responseStateParam!=null && responseStateParam instanceof StateMessage){
  166.                 this.responseState = (StateMessage) responseStateParam;
  167.             }
  168.             this._configurazionePdDReader = ConfigurazionePdDManager.getInstance(this.state, this.responseState);
  169.         }
  170.        
  171.         if(pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  172.             this.requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  173.         }
  174.        
  175.         this.msgDiagErroreTracciamento = MsgDiagnostico.newInstance(tipoPdD,idSoggettoDominio,idFunzione,nomePorta, this.requestInfo ,this._configurazionePdDReader);
  176.         this.msgDiagErroreTracciamento.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_TRACCIAMENTO);
  177.         try{
  178.             if(this.pddContext==null) {
  179.                 throw new Exception("PdDContext is null");
  180.             }
  181.             this.protocolFactoryManager = ProtocolFactoryManager.getInstance();
  182.             this.protocolFactory = this.protocolFactoryManager.getProtocolFactoryByName((String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  183.             this.tracciamentoSupportatoProtocollo = this.protocolFactory.createProtocolConfiguration().isAbilitataGenerazioneTracce();
  184.         } catch(Throwable e){
  185.             throw new TracciamentoException(e.getMessage(),e);
  186.         }
  187.         this.xmlBuilder = new TracciaBuilder(this.protocolFactory);
  188.         this.openspcoopProperties = OpenSPCoop2Properties.getInstance();
  189.         if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato()){
  190.             this.generatoreDateCasuali = GeneratoreCasualeDate.getGeneratoreCasualeDate();
  191.         }
  192.        
  193.         try{
  194.             if(this.pddContext!=null && this.pddContext.containsKey(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)) {
  195.                 String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  196.                 this.transactionNullable = TransactionContext.getTransaction(idTransazione);
  197.             }
  198.         }catch(Exception e){
  199.             // La transazione potrebbe essere stata eliminata nelle comunicazioni stateful
  200.         }
  201.     }
  202.    
  203.     private ConfigurazionePdDManager getConfigurazionePdDManager() {
  204.         if(this._configurazionePdDReader!=null) {
  205.             return this._configurazionePdDReader;
  206.         }
  207.         if(this.state!=null || this.responseState!=null) {
  208.             return ConfigurazionePdDManager.getInstance(this.state, this.responseState);
  209.         }
  210.         return ConfigurazionePdDManager.getInstance();
  211.     }
  212.    

  213.     public void updateState(IState requestStateParam, IState responseStateParam) {
  214.         StateMessage requestState = null;
  215.         StateMessage responseState = null;
  216.         if(requestStateParam!=null && requestStateParam instanceof StateMessage) {
  217.             requestState = (StateMessage) requestStateParam;
  218.         }
  219.         if(responseStateParam!=null && responseStateParam instanceof StateMessage) {
  220.             responseState = (StateMessage) responseStateParam;
  221.         }
  222.         updateState(requestState, responseState);
  223.     }
  224.     public void updateState(StateMessage requestState, StateMessage responseState){
  225.         this.state = requestState;
  226.         this.responseState = responseState;
  227.         if(this.state!=null || this.responseState!=null) {
  228.             if(this._configurazionePdDReader!=null) {
  229.                 this._configurazionePdDReader = this._configurazionePdDReader.refreshState(this.state, this.responseState);
  230.             }
  231.             else {
  232.                 this._configurazionePdDReader = ConfigurazionePdDManager.getInstance(this.state, this.responseState);
  233.             }
  234.         }
  235.         else {
  236.             this._configurazionePdDReader = ConfigurazionePdDManager.getInstance();
  237.         }
  238.     }
  239.     public void updateState(ConfigurazionePdDManager configurazionePdDManager){
  240.         this._configurazionePdDReader = configurazionePdDManager;
  241.         if(this._configurazionePdDReader!=null) {
  242.             this.state = this._configurazionePdDReader.getState();
  243.             this.responseState = this._configurazionePdDReader.getResponseState();
  244.         }
  245.     }
  246.    


  247.     /**
  248.      * Il Metodo si occupa di impostare il dominio del Soggetto che utilizza il logger.
  249.      *
  250.      * @param dominio Soggetto che richiede il logger
  251.      *
  252.      */
  253.     public void setDominio(IDSoggetto dominio){
  254.         this.idSoggettoDominio = dominio;
  255.     }


  256.     private Connection getConnectionFromState(boolean richiesta){
  257.         if(richiesta){
  258.             Connection c = StateMessage.getConnection(this.state);
  259.             if(c!=null) {
  260.                 return c;
  261.             }
  262.         }
  263.         else{
  264.             Connection c = StateMessage.getConnection(this.responseState);
  265.             if(c!=null) {
  266.                 return c;
  267.             }
  268.         }
  269.         return null;
  270.     }
  271.    
  272.    




  273.     /** ----------------- METODI DI LOGGING (Tracciamento buste) ---------------- */

  274.     /**
  275.      * Il Metodo si occupa di tracciare una busta di richiesta.
  276.      *
  277.      * @param busta Busta da registrare
  278.      *
  279.      */
  280.     @Deprecated
  281.     public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  282.             Busta busta,EsitoElaborazioneMessaggioTracciato esito,String location) throws TracciamentoException {
  283.         registraRichiesta(msg,securityInfo,busta,esito,location,null);
  284.     }
  285.     @Deprecated
  286.     public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  287.             Busta busta,EsitoElaborazioneMessaggioTracciato esito,String location,
  288.             String idCorrelazioneApplicativa) throws TracciamentoException {
  289.        
  290.         if(this.transactionNullable!=null) {
  291.             this.transactionNullable.getTempiElaborazione().startTracciamentoRichiesta();
  292.         }
  293.         try {
  294.             if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()){
  295.                 String xml = null;
  296.                 boolean erroreAppender = false;
  297.                
  298.                 // Data
  299.                 Date gdo = DateManager.getDate();
  300.                 if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
  301.                     gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
  302.                     busta.setOraRegistrazione(gdo);
  303.                 }
  304.                
  305.                 // Traccia
  306.                 Traccia traccia = this.getTraccia(busta, msg,securityInfo, esito, gdo, RuoloMessaggio.RICHIESTA, location, idCorrelazioneApplicativa);
  307.                
  308.                 try{
  309.                    
  310.                     // Miglioramento performance
  311.                     if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
  312.                         xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  313.                         if(xml==null)
  314.                             throw new Exception("Traccia non costruita");
  315.                         this.loggerTracciamento.info(xml);
  316.                     }
  317.    
  318.                     // TransazioneContext
  319.                     if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
  320.                         this.logTracciaInTransactionContext(traccia, true);
  321.                     }
  322.                    
  323.                     //  Tracciamento personalizzato
  324.                     for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
  325.                         try{
  326.                             this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(true), traccia);
  327.                         }catch(Exception e){
  328.                             logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  329.                             try{
  330.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
  331.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  332.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
  333.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  334.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
  335.                             }catch(Exception eMsg){
  336.                                 // ignore
  337.                             }
  338.                             if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
  339.                                 erroreAppender = true;
  340.                                 throw e; // Rilancio
  341.                             }
  342.                         }
  343.                     }
  344.                 }catch(Exception e){
  345.                     // check eventuale costruzione dell'xml non fatto per log4j disabilitato.
  346.                     if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
  347.                         try{
  348.                             xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  349.                         }catch(Exception eBuild){}
  350.                     }
  351.                     if(xml==null){
  352.                         logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
  353.                     }else{
  354.                         logError("Errore durante il tracciamento della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  355.                         if(!erroreAppender){
  356.                             try{
  357.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
  358.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  359.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  360.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
  361.                             }catch(Exception eMsg){}
  362.                         }
  363.                     }
  364.                     gestioneErroreTracciamento(e);
  365.                 }
  366.             }
  367.         }finally {
  368.             if(this.transactionNullable!=null) {
  369.                 this.transactionNullable.getTempiElaborazione().endTracciamentoRichiesta();
  370.             }
  371.         }
  372.     }
  373.     /**
  374.      * Il Metodo si occupa di tracciare una busta di richiesta.
  375.      *
  376.      * @param busta Busta da registrare in byte
  377.      * @param bustaObject Busta da registrare (per appender personalizzati)
  378.      *
  379.      */
  380.     @Deprecated
  381.     public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  382.             byte[] busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito,String location) throws TracciamentoException {
  383.         registraRichiesta(msg,securityInfo,busta,bustaObject,esito,location,null);
  384.     }
  385.     @Deprecated
  386.     public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  387.             byte[] busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito,String location,
  388.             String idCorrelazioneApplicativa) throws TracciamentoException {
  389.         if(this.transactionNullable!=null) {
  390.             this.transactionNullable.getTempiElaborazione().startTracciamentoRichiesta();
  391.         }
  392.         try {
  393.             if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()){
  394.                 String xml = null;
  395.                 boolean erroreAppender = false;
  396.                
  397.                 // Data
  398.                 Date gdo = DateManager.getDate();
  399.                 if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
  400.                     gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
  401.                     bustaObject.setOraRegistrazione(gdo);
  402.                 }
  403.                
  404.                 // Traccia
  405.                 Traccia traccia = this.getTraccia(bustaObject, msg, securityInfo, esito, gdo, RuoloMessaggio.RICHIESTA, location, idCorrelazioneApplicativa);
  406.                 traccia.setBustaAsByteArray(busta);
  407.                
  408.                 try{
  409.            
  410.                     // Miglioramento performance
  411.                     if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
  412.                         xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  413.                         if(xml==null)
  414.                             throw new Exception("Traccia non costruita");
  415.                         this.loggerTracciamento.info(xml);
  416.                     }
  417.                    
  418.                     // TransazioneContext
  419.                     if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
  420.                         this.logTracciaInTransactionContext(traccia, true);
  421.                     }
  422.                        
  423.                     // Tracciamento personalizzato
  424.                     for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
  425.                         try{
  426.                             this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(true), traccia);
  427.                         }catch(Exception e){
  428.                             logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  429.                             try{
  430.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
  431.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  432.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
  433.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  434.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
  435.                             }catch(Exception eMsg){
  436.                                 // ignore
  437.                             }
  438.                             if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
  439.                                 erroreAppender = true;
  440.                                 throw e; // Rilancio
  441.                             }
  442.                         }
  443.                     }
  444.                 }catch(Exception e){
  445.                     // check eventuale costruzione dell'xml non fatto per log4j disabilitato.
  446.                     if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
  447.                         try{
  448.                             xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  449.                         }catch(Exception eBuild){}
  450.                     }
  451.                     if(xml==null){
  452.                         logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
  453.                     }else{
  454.                         logError("Errore durante il tracciamento della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  455.                         if(!erroreAppender){
  456.                             try{
  457.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
  458.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  459.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  460.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
  461.                             }catch(Exception eMsg){}
  462.                         }
  463.                     }
  464.                     gestioneErroreTracciamento(e);
  465.                 }
  466.             }
  467.         }finally {
  468.             if(this.transactionNullable!=null) {
  469.                 this.transactionNullable.getTempiElaborazione().endTracciamentoRichiesta();
  470.             }
  471.         }
  472.     }
  473.     /**
  474.      * Il Metodo si occupa di tracciare una busta di richiesta.
  475.      *
  476.      * @param busta Busta da registrare
  477.      * @param bustaObject Busta da registrare (per appender personalizzati)
  478.      *
  479.      */
  480.     public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  481.             BustaRawContent<?> busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location) throws TracciamentoException {
  482.         registraRichiesta(msg,securityInfo,busta,bustaObject,esito,location,null);
  483.     }
  484.     public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  485.             BustaRawContent<?> busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location,
  486.             String idCorrelazioneApplicativa) throws TracciamentoException {
  487.         if(this.transactionNullable!=null) {
  488.             this.transactionNullable.getTempiElaborazione().startTracciamentoRichiesta();
  489.         }
  490.         try {
  491.             if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()) {
  492.                 String xml = null;
  493.                 boolean erroreAppender = false;
  494.                
  495.                 // Data
  496.                 Date gdo = DateManager.getDate();
  497.                 if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
  498.                     gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
  499.                     bustaObject.setOraRegistrazione(gdo);
  500.                 }
  501.                
  502.                 // Traccia
  503.                 Traccia traccia = this.getTraccia(bustaObject, msg, securityInfo, esito, gdo, RuoloMessaggio.RICHIESTA, location, idCorrelazioneApplicativa);
  504.                 boolean saveHeader = true;
  505.                 try {
  506.                     saveHeader = (this.protocolFactory==null || this.protocolFactory.createProtocolConfiguration().isAbilitatoSalvataggioHeaderProtocolloTracce());
  507.                 }catch(Throwable e) {
  508.                     this.logError("Comprensione opzione 'salvataggio header protocollo tracce' fallita: "+e.getMessage(), new Exception(e));
  509.                 }
  510.                 if(saveHeader) {
  511.                     traccia.setBustaAsRawContent(busta);
  512.                 }
  513.                
  514.                 try{
  515.                    
  516.                     // Miglioramento performance
  517.                     if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
  518.                         xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  519.                         if(xml==null)
  520.                             throw new Exception("Traccia non costruita");
  521.                         this.loggerTracciamento.info(xml);
  522.                     }
  523.                        
  524.                     // TransazioneContext
  525.                     if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
  526.                         this.logTracciaInTransactionContext(traccia, true);
  527.                     }
  528.                    
  529.                     // Tracciamento personalizzato
  530.                     for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
  531.                         try{
  532.                             this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(true), traccia);
  533.                         } catch(Exception e){
  534.                             logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  535.                             try{
  536.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
  537.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  538.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
  539.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  540.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
  541.                             }catch(Exception eMsg){
  542.                                 // ignore
  543.                             }
  544.                             if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
  545.                                 erroreAppender = true;
  546.                                 throw e; // Rilancio
  547.                             }
  548.                         }
  549.                     }
  550.                 }catch(Exception e){
  551.                     // check eventuale costruzione dell'xml non fatto per log4j disabilitato.
  552.                     if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
  553.                         try{
  554.                             xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  555.                         }catch(Exception eBuild){}
  556.                     }
  557.                     if(xml==null){
  558.                         logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
  559.                     }else{
  560.                         logError("Errore durante il tracciamento della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  561.                         if(!erroreAppender){
  562.                             try{
  563.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
  564.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  565.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  566.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
  567.                             }catch(Exception eMsg){}
  568.                         }
  569.                     }
  570.                     gestioneErroreTracciamento(e);
  571.                 }
  572.             }
  573.         }finally {
  574.             if(this.transactionNullable!=null) {
  575.                 this.transactionNullable.getTempiElaborazione().endTracciamentoRichiesta();
  576.             }
  577.         }
  578.     }
  579.    



  580.     /**
  581.      * Il Metodo si occupa di tracciare una busta di risposta.
  582.      *
  583.      * @param busta Busta da registrare
  584.      *
  585.      */
  586.     @Deprecated
  587.     public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  588.             Busta busta,EsitoElaborazioneMessaggioTracciato esito, String location) throws TracciamentoException {
  589.         registraRisposta(msg,securityInfo,busta,esito,location,null,null);
  590.     }
  591.     @Deprecated
  592.     public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  593.             Busta busta,EsitoElaborazioneMessaggioTracciato esito, String location,
  594.             String idCorrelazioneApplicativa, String idCorrelazioneApplicativaRisposta) throws TracciamentoException {
  595.         if(this.transactionNullable!=null) {
  596.             this.transactionNullable.getTempiElaborazione().startTracciamentoRisposta();
  597.         }
  598.         try {
  599.             if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()){
  600.                 String xml = null;
  601.                 boolean erroreAppender = false;
  602.                
  603.                 // Data
  604.                 Date gdo = DateManager.getDate();
  605.                 if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
  606.                     gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
  607.                     busta.setOraRegistrazione(gdo);
  608.                 }
  609.                
  610.                 // Traccia
  611.                 Traccia traccia = this.getTraccia(busta, msg, securityInfo, esito, gdo, RuoloMessaggio.RISPOSTA, location, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta);
  612.                
  613.                 try{
  614.                                
  615.                     // Miglioramento performance
  616.                     if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
  617.                         xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  618.                         if(xml==null)
  619.                             throw new Exception("Traccia non costruita");
  620.                         this.loggerTracciamento.info(xml);
  621.                     }
  622.                        
  623.                     // TransazioneContext
  624.                     if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
  625.                         this.logTracciaInTransactionContext(traccia, false);
  626.                     }
  627.                    
  628.                     // Tracciamento personalizzato
  629.                     for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
  630.                         try{
  631.                             this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(false), traccia);
  632.                         }catch(Exception e){
  633.                             logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  634.                             try{
  635.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
  636.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  637.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
  638.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  639.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
  640.                             }catch(Exception eMsg){
  641.                                 // ignore
  642.                             }
  643.                             if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
  644.                                 erroreAppender = true;
  645.                                 throw e; // Rilancio
  646.                             }
  647.                         }
  648.                     }
  649.                 }catch(Exception e){
  650.                     // check eventuale costruzione dell'xml non fatto per log4j disabilitato.
  651.                     if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
  652.                         try{
  653.                             xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  654.                         }catch(Exception eBuild){}
  655.                     }
  656.                     if(xml==null){
  657.                         logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
  658.                     }else{
  659.                         logError("Errore durante il tracciamento della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  660.                         if(!erroreAppender){
  661.                             try{
  662.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
  663.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  664.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  665.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
  666.                             }catch(Exception eMsg){}
  667.                         }
  668.                     }
  669.                     gestioneErroreTracciamento(e);
  670.                 }
  671.             }
  672.         }finally {
  673.             if(this.transactionNullable!=null) {
  674.                 this.transactionNullable.getTempiElaborazione().endTracciamentoRisposta();
  675.             }
  676.         }
  677.     }
  678.     /**
  679.      * Il Metodo si occupa di tracciare una busta di risposta.
  680.      *
  681.      * @param busta Busta da registrare
  682.      * @param bustaObject Busta da registrare (per appender personalizzati)
  683.      *
  684.      */
  685.     @Deprecated
  686.     public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  687.             byte[] busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location) throws TracciamentoException {
  688.         registraRisposta(msg,securityInfo,busta,bustaObject,esito, location,null,null);
  689.     }
  690.     @Deprecated
  691.     public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  692.             byte[] busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location,
  693.             String idCorrelazioneApplicativa, String idCorrelazioneApplicativaRisposta) throws TracciamentoException{
  694.         if(this.transactionNullable!=null) {
  695.             this.transactionNullable.getTempiElaborazione().startTracciamentoRisposta();
  696.         }
  697.         try {
  698.             if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()){
  699.                 String xml = null;
  700.                 boolean erroreAppender = false;
  701.                
  702.                 // Data
  703.                 Date gdo = DateManager.getDate();
  704.                 if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
  705.                     gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
  706.                     bustaObject.setOraRegistrazione(gdo);
  707.                 }
  708.                
  709.                 // Traccia
  710.                 Traccia traccia = this.getTraccia(bustaObject, msg, securityInfo, esito, gdo, RuoloMessaggio.RISPOSTA, location, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta);
  711.                 traccia.setBustaAsByteArray(busta);
  712.                
  713.                 try{
  714.                                    
  715.                     // Miglioramento performance
  716.                     if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
  717.                         xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  718.                         if(xml==null)
  719.                             throw new Exception("Traccia non costruita");
  720.                         this.loggerTracciamento.info(xml);
  721.                     }
  722.                    
  723.                     // TransazioneContext
  724.                     if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
  725.                         this.logTracciaInTransactionContext(traccia, false);
  726.                     }
  727.                        
  728.                     // Tracciamento personalizzato
  729.                     for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
  730.                         try{
  731.                             this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(false), traccia);
  732.                         }catch(Exception e){
  733.                             logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  734.                             try{
  735.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
  736.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  737.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
  738.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  739.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
  740.                             }catch(Exception eMsg){
  741.                                 // ignore
  742.                             }
  743.                             if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
  744.                                 erroreAppender = true;
  745.                                 throw e; // Rilancio
  746.                             }
  747.                         }
  748.                     }
  749.                 }catch(Exception e){
  750.                     // check eventuale costruzione dell'xml non fatto per log4j disabilitato.
  751.                     if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
  752.                         try{
  753.                             xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  754.                         }catch(Exception eBuild){}
  755.                     }
  756.                     if(xml==null){
  757.                         logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
  758.                     }else{
  759.                         logError("Errore durante il tracciamento della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  760.                         if(!erroreAppender){
  761.                             try{
  762.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
  763.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  764.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  765.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
  766.                             }catch(Exception eMsg){}
  767.                         }
  768.                     }
  769.                     gestioneErroreTracciamento(e);
  770.                 }
  771.             }
  772.         }finally {
  773.             if(this.transactionNullable!=null) {
  774.                 this.transactionNullable.getTempiElaborazione().endTracciamentoRisposta();
  775.             }
  776.         }
  777.     }
  778.     /**
  779.      * Il Metodo si occupa di tracciare una busta di risposta.
  780.      *
  781.      * @param busta Busta da registrare
  782.      * @param bustaObject Busta da registrare (per appender personalizzati)
  783.      *
  784.      */
  785.     public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  786.             BustaRawContent<?> busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location) throws TracciamentoException {
  787.         registraRisposta(msg,securityInfo,busta,bustaObject,esito, location,null,null);
  788.     }
  789.     public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
  790.             BustaRawContent<?> busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location,
  791.             String idCorrelazioneApplicativa, String idCorrelazioneApplicativaRisposta) throws TracciamentoException {
  792.         if(this.transactionNullable!=null) {
  793.             this.transactionNullable.getTempiElaborazione().startTracciamentoRisposta();
  794.         }
  795.         try {
  796.             if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()){
  797.                 String xml = null;
  798.                 boolean erroreAppender = false;
  799.                
  800.                 // Data
  801.                 Date gdo = DateManager.getDate();
  802.                 if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
  803.                     gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
  804.                     bustaObject.setOraRegistrazione(gdo);
  805.                 }
  806.                
  807.                 // Traccia
  808.                 Traccia traccia = this.getTraccia(bustaObject, msg, securityInfo, esito, gdo, RuoloMessaggio.RISPOSTA, location, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta);
  809.                 boolean saveHeader = true;
  810.                 try {
  811.                     saveHeader = (this.protocolFactory==null || this.protocolFactory.createProtocolConfiguration().isAbilitatoSalvataggioHeaderProtocolloTracce());
  812.                 }catch(Throwable e) {
  813.                     this.logError("Comprensione opzione 'salvataggio header protocollo tracce' fallita: "+e.getMessage(), new Exception(e));
  814.                 }
  815.                 if(saveHeader) {
  816.                     traccia.setBustaAsRawContent(busta);
  817.                 }
  818.                
  819.                 try{
  820.                
  821.                     // Miglioramento performance
  822.                     if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
  823.                         xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  824.                         if(xml==null)
  825.                             throw new Exception("Traccia non costruita");
  826.                         this.loggerTracciamento.info(xml);
  827.                     }
  828.                    
  829.                     // TransazioneContext
  830.                     if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
  831.                         this.logTracciaInTransactionContext(traccia, false);
  832.                     }
  833.                    
  834.                     // Tracciamento personalizzato
  835.                     for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
  836.                         try{
  837.                             this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(false), traccia);
  838.                         }catch(Exception e){
  839.                             logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  840.                             try{
  841.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
  842.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  843.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
  844.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  845.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
  846.                             }catch(Exception eMsg){
  847.                                 // ignore
  848.                             }
  849.                             if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
  850.                                 erroreAppender = true;
  851.                                 throw e; // Rilancio
  852.                             }
  853.                         }
  854.                     }
  855.                 }catch(Exception e){
  856.                     // check eventuale costruzione dell'xml non fatto per log4j disabilitato.
  857.                     if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
  858.                         try{
  859.                             xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
  860.                         }catch(Exception eBuild){}
  861.                     }
  862.                     if(xml==null){
  863.                         logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
  864.                     }else{
  865.                         logError("Errore durante il tracciamento della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
  866.                         if(!erroreAppender){
  867.                             try{
  868.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
  869.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
  870.                                 this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  871.                                 this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
  872.                             }catch(Exception eMsg){}
  873.                         }
  874.                     }
  875.                     gestioneErroreTracciamento(e);
  876.                 }
  877.             }
  878.         }finally {
  879.             if(this.transactionNullable!=null) {
  880.                 this.transactionNullable.getTempiElaborazione().endTracciamentoRisposta();
  881.             }
  882.         }
  883.     }
  884.    

  885.     private void logTracciaInTransactionContext(Traccia traccia, boolean richiesta) throws TracciamentoException {
  886.         Exception exc = null;
  887.         boolean gestioneStateful = false;
  888.         try {
  889.             Transaction tr = TransactionContext.getTransaction(traccia.getIdTransazione());
  890.             if(richiesta) {
  891.                 tr.setTracciaRichiesta(traccia);
  892.             }
  893.             else {
  894.                 tr.setTracciaRisposta(traccia);
  895.             }
  896.         }catch(TransactionDeletedException e){
  897.             gestioneStateful = true;
  898.         }catch(TransactionNotExistsException e){
  899.             gestioneStateful = true;
  900.         }catch(Exception e){
  901.             exc = e;
  902.         }
  903.         if(gestioneStateful){
  904.             try{
  905.                 //System.out.println("@@@@@REPOSITORY@@@@@ LOG MSG DIAG ID TRANSAZIONE ["+idTransazione+"] ADD");
  906.                 RepositoryGestioneStateful.addTraccia(traccia.getIdTransazione(), traccia);
  907.             }catch(Exception e){
  908.                 exc = e;
  909.             }
  910.         }
  911.         if(exc!=null) {
  912.             logError("Errore durante l'emissione della traccia nel contesto della transazione: "+exc.getMessage(),exc);
  913.             gestioneErroreTracciamento(exc);
  914.         }
  915.     }
  916.    
  917.    
  918.     private Traccia getTraccia(Busta busta,OpenSPCoop2Message msg,SecurityInfo securityInfo,EsitoElaborazioneMessaggioTracciato esito,Date gdo,RuoloMessaggio tipoTraccia,
  919.             String location,String idCorrelazioneApplicativa){
  920.         return getTraccia(busta, msg, securityInfo, esito, gdo, tipoTraccia, location, idCorrelazioneApplicativa, null);
  921.     }
  922.     private Traccia getTraccia(Busta busta,OpenSPCoop2Message msg,SecurityInfo securityInfo,EsitoElaborazioneMessaggioTracciato esito,Date gdo,RuoloMessaggio tipoTraccia,
  923.             String location,String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta){
  924.        
  925.         Traccia traccia = new Traccia();
  926.        
  927.         if(this.pddContext!=null) {
  928.             traccia.setIdTransazione((String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
  929.         }
  930.        
  931.         // Esito
  932.         traccia.setEsitoElaborazioneMessaggioTracciato(esito);
  933.         try{
  934.             if(RuoloMessaggio.RISPOSTA.equals(tipoTraccia) && msg!=null){
  935.                 boolean found = false;
  936.                 if(ServiceBinding.SOAP.equals(msg.getServiceBinding())){
  937.                     if(msg.castAsSoap().hasSOAPFault()){
  938.                         SOAPBody body = msg.castAsSoap().getSOAPBody();
  939.                         found = true;
  940.                         StringBuilder bf = new StringBuilder();
  941.                         if(esito.getDettaglio()!=null){
  942.                             bf.append(esito.getDettaglio());
  943.                             bf.append("\n");
  944.                         }
  945.                         bf.append(SoapUtils.safe_toString(msg.getFactory(), body.getFault(), OpenSPCoop2Logger.loggerOpenSPCoopCore));
  946.                         traccia.getEsitoElaborazioneMessaggioTracciato().setDettaglio(bf.toString());
  947.                     }
  948.                 }
  949.                 else {
  950.                     if(msg.castAsRest().isProblemDetailsForHttpApis_RFC7807()) {
  951.                         found = true;
  952.                         ByteArrayOutputStream bout = new ByteArrayOutputStream();
  953.                         msg.writeTo(bout, false);
  954.                         bout.flush();
  955.                         bout.close();
  956.                         StringBuilder bf = new StringBuilder();
  957.                         if(esito.getDettaglio()!=null){
  958.                             bf.append(esito.getDettaglio());
  959.                             bf.append("\n");
  960.                         }
  961.                         bf.append(bout.toString());
  962.                         traccia.getEsitoElaborazioneMessaggioTracciato().setDettaglio(bf.toString());
  963.                     }
  964.                 }

  965.                 if(!found && MessageRole.FAULT.equals(msg.getMessageRole())){
  966.                     ByteArrayOutputStream bout = new ByteArrayOutputStream();
  967.                     msg.writeTo(bout, false);
  968.                     bout.flush();
  969.                     bout.close();
  970.                     StringBuilder bf = new StringBuilder();
  971.                     if(esito.getDettaglio()!=null){
  972.                         bf.append(esito.getDettaglio());
  973.                         bf.append("\n");
  974.                     }
  975.                     bf.append(bout.toString());
  976.                     traccia.getEsitoElaborazioneMessaggioTracciato().setDettaglio(bf.toString());
  977.                 }
  978.             }
  979.         }catch(Exception e){
  980.             this.logError("errore durante la registrazione del SOAPFault nelle tracce", e);
  981.         }
  982.        
  983.         traccia.setGdo(gdo);
  984.         traccia.setIdSoggetto(this.idSoggettoDominio);
  985.         traccia.setTipoMessaggio(tipoTraccia);
  986.         traccia.setTipoPdD(this.tipoPdD);
  987.                
  988.         traccia.setCorrelazioneApplicativa(idCorrelazioneApplicativa);
  989.         traccia.setCorrelazioneApplicativaRisposta(idCorrelazioneApplicativaRisposta);
  990.         if(location!=null) {
  991.             if(location.length()>230) { // sto piu' basso di 255 per evitare caratteri strani che occupano più bytes.
  992.                 traccia.setLocation(location.substring(0, 230)+" ...");
  993.             }
  994.             else {
  995.                 traccia.setLocation(location);
  996.             }
  997.         }
  998.         traccia.setProtocollo(this.protocolFactory.getProtocol());
  999.        
  1000.         if(securityInfo!=null){
  1001.             busta.setDigest(securityInfo.getDigestHeader());
  1002.             Map<String, String> properties = securityInfo.getProperties();
  1003.             if(properties!=null && !properties.isEmpty()) {
  1004.                 for (String key : properties.keySet()) {
  1005.                     busta.addProperty(key, properties.get(key)); // aggiungo le proprieta' di sicurezza riscontrate
  1006.                 }
  1007.             }
  1008.         }
  1009.         traccia.setBusta(busta);
  1010.        
  1011.         if(msg!=null){
  1012.             try{
  1013.                 if(ServiceBinding.SOAP.equals(msg.getServiceBinding())){
  1014.                     // per motivi di streaming, se non e' costruito non lo tracciamo
  1015.                     if(msg.isContentBuilded() && msg.castAsSoap().hasAttachments()) {
  1016.                         java.util.Iterator<?> it = msg.castAsSoap().getAttachments();
  1017.                         while(it.hasNext()){
  1018.                             AttachmentPart ap =
  1019.                                 (AttachmentPart) it.next();
  1020.                             Allegato allegato = new Allegato();
  1021.                             allegato.setContentId(ap.getContentId());
  1022.                             allegato.setContentLocation(ap.getContentLocation());
  1023.                             allegato.setContentType(ap.getContentType());
  1024.                            
  1025.                             if(securityInfo!=null && ap.getContentId()!=null){
  1026.                                 for (int i = 0; i < securityInfo.sizeListaAllegati(); i++) {
  1027.                                     Allegato a = securityInfo.getAllegato(i);
  1028.                                     if(a.getContentId()!=null && a.getContentId().equals(ap.getContentId())){
  1029.                                         allegato.setDigest(a.getDigest());
  1030.                                     }
  1031.                                 }
  1032.                             }
  1033.                            
  1034.                             traccia.addAllegato(allegato);
  1035.                         }
  1036.                     }
  1037.                 }
  1038.                 else if(MessageType.MIME_MULTIPART.equals(msg.getMessageType())){
  1039.                     // per motivi di streaming, se non e' costruito non lo tracciamo
  1040.                     if(msg.isContentBuilded()){
  1041.                         MultipartContent mc = msg.castAsRestMimeMultipart().getContent();
  1042.                         if(mc!=null) {
  1043.                             MimeMultipart mime = mc.getMimeMultipart();
  1044.                             if(mime!=null) {
  1045.                                 for (int i = 0; i < mime.countBodyParts(); i++) {
  1046.                                     BodyPart bodyPart = mime.getBodyPart(i);
  1047.                                     String contentId = mime.getContentID(bodyPart);
  1048.                                     if(contentId==null){
  1049.                                         // provo a vedere se c'e' un disposition
  1050.                                         contentId = mime.getContentDisposition(bodyPart);
  1051.                                     }
  1052.                                    
  1053.                                     Allegato allegato = new Allegato();
  1054.                                     allegato.setContentId(contentId);
  1055.                                     allegato.setContentLocation(mime.getContentLocation(bodyPart));
  1056.                                     allegato.setContentType(bodyPart.getContentType());
  1057.                                    
  1058.                                     if(securityInfo!=null && contentId!=null){
  1059.                                         for (int j = 0; j < securityInfo.sizeListaAllegati(); j++) {
  1060.                                             Allegato a = securityInfo.getAllegato(j);
  1061.                                             if(a.getContentId()!=null && a.getContentId().equals(contentId)){
  1062.                                                 allegato.setDigest(a.getDigest());
  1063.                                             }
  1064.                                         }
  1065.                                     }
  1066.                                    
  1067.                                     traccia.addAllegato(allegato);
  1068.                                 }
  1069.                             }
  1070.                         }
  1071.                     }
  1072.                 }
  1073.             }catch(Exception e){
  1074.                 this.logError("errore durante la registrazione degli allegati nelle tracce", e);
  1075.             }
  1076.         }
  1077.        
  1078.         if(this.pddContext!=null){
  1079.             List<MapKey<String>> keys = org.openspcoop2.core.constants.Costanti.CONTEXT_OBJECT;
  1080.             if(keys!=null){
  1081.                 for (int j = 0; j < keys.size(); j++) {
  1082.                     MapKey<String> mapKey = keys.get(j);
  1083.                     Object o = this.pddContext.getObject(mapKey);
  1084.                     if(o!=null && o instanceof String){
  1085.                         traccia.addProperty(mapKey.getValue(), (String)o);
  1086.                     }
  1087.                 }
  1088.             }
  1089.         }
  1090.        
  1091.         return traccia;
  1092.     }
  1093.    
  1094.     private void gestioneErroreTracciamento(Exception e) throws TracciamentoException{
  1095.        
  1096.         if(this.openspcoopProperties.isTracciaturaFallita_BloccoServiziPdD()){
  1097.             Tracciamento.tracciamentoDisponibile=false;
  1098.             Tracciamento.motivoMalfunzionamentoTracciamento=e;
  1099.             try{
  1100.                 this.msgDiagErroreTracciamento.logPersonalizzato("errore.bloccoServizi");
  1101.             }catch(Exception eMsg){
  1102.                 // ignore
  1103.             }
  1104.             logError("Il Sistema di tracciamento ha rilevato un errore durante la registrazione di una traccia legale,"+
  1105.                     " tutti i servizi/moduli della porta di dominio sono sospesi. Si richiede un intervento sistemistico per la risoluzione del problema "+
  1106.                     "e il riavvio di GovWay. Errore rilevato: ",e);
  1107.         }
  1108.        
  1109.         if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
  1110.             throw new TracciamentoException(e);
  1111.         }
  1112.     }
  1113.    
  1114.    
  1115.     private void logError(String msgErrore,Exception e){
  1116.         if(OpenSPCoop2Logger.loggerOpenSPCoopCore!=null){
  1117.             OpenSPCoop2Logger.loggerOpenSPCoopCore.error(msgErrore,e);
  1118.         }
  1119.        
  1120.         // Registro l'errore anche in questo logger.
  1121.         if(OpenSPCoop2Logger.loggerOpenSPCoopResources!=null){
  1122.             OpenSPCoop2Logger.loggerOpenSPCoopResources.error(msgErrore,e);
  1123.         }
  1124.        
  1125.     }
  1126.     @SuppressWarnings("unused")
  1127.     private void logError(String msgErrore){
  1128.         if(OpenSPCoop2Logger.loggerOpenSPCoopCore!=null){
  1129.             OpenSPCoop2Logger.loggerOpenSPCoopCore.error(msgErrore);
  1130.         }
  1131.        
  1132.         // Registro l'errore anche in questo logger.
  1133.         if(OpenSPCoop2Logger.loggerOpenSPCoopResources!=null){
  1134.             OpenSPCoop2Logger.loggerOpenSPCoopResources.error(msgErrore);
  1135.         }
  1136.        
  1137.     }
  1138.    
  1139. }