TracciamentoManager.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.transazioni;

  21. import java.io.File;
  22. import java.sql.Connection;
  23. import java.sql.SQLException;
  24. import java.util.ArrayList;
  25. import java.util.Date;
  26. import java.util.HashMap;
  27. import java.util.List;

  28. import org.openspcoop2.core.commons.CoreException;
  29. import org.openspcoop2.core.commons.dao.DAOFactory;
  30. import org.openspcoop2.core.commons.dao.DAOFactoryProperties;
  31. import org.openspcoop2.core.config.OpenspcoopAppender;
  32. import org.openspcoop2.core.config.PortaApplicativa;
  33. import org.openspcoop2.core.config.PortaDelegata;
  34. import org.openspcoop2.core.config.Property;
  35. import org.openspcoop2.core.config.utils.OpenSPCoopAppenderUtilities;
  36. import org.openspcoop2.core.constants.Costanti;
  37. import org.openspcoop2.core.constants.CostantiLabel;
  38. import org.openspcoop2.core.constants.TipoPdD;
  39. import org.openspcoop2.core.controllo_traffico.beans.MisurazioniTransazione;
  40. import org.openspcoop2.core.id.IDPortaApplicativa;
  41. import org.openspcoop2.core.id.IDPortaDelegata;
  42. import org.openspcoop2.core.id.IDServizio;
  43. import org.openspcoop2.core.id.IDSoggetto;
  44. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  45. import org.openspcoop2.core.transazioni.Transazione;
  46. import org.openspcoop2.core.transazioni.constants.DiagnosticColumnType;
  47. import org.openspcoop2.core.transazioni.dao.IDumpMessaggioService;
  48. import org.openspcoop2.core.transazioni.dao.ITransazioneService;
  49. import org.openspcoop2.core.transazioni.utils.TransazioneDaoExt;
  50. import org.openspcoop2.generic_project.beans.UpdateField;
  51. import org.openspcoop2.generic_project.exception.ExpressionException;
  52. import org.openspcoop2.generic_project.exception.ExpressionNotImplementedException;
  53. import org.openspcoop2.generic_project.exception.NotFoundException;
  54. import org.openspcoop2.generic_project.exception.NotImplementedException;
  55. import org.openspcoop2.generic_project.exception.ServiceException;
  56. import org.openspcoop2.generic_project.expression.IExpression;
  57. import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
  58. import org.openspcoop2.monitor.sdk.transaction.FaseTracciamento;
  59. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  60. import org.openspcoop2.pdd.config.DBTransazioniManager;
  61. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  62. import org.openspcoop2.pdd.config.Resource;
  63. import org.openspcoop2.pdd.core.CostantiPdD;
  64. import org.openspcoop2.pdd.core.controllo_traffico.CostantiControlloTraffico;
  65. import org.openspcoop2.pdd.core.controllo_traffico.handler.PostOutResponseHandlerGestioneControlloTraffico;
  66. import org.openspcoop2.pdd.core.handlers.HandlerException;
  67. import org.openspcoop2.pdd.core.handlers.transazioni.ExceptionSerialzerFileSystem;
  68. import org.openspcoop2.pdd.core.handlers.transazioni.ISalvataggioDiagnosticiManager;
  69. import org.openspcoop2.pdd.core.handlers.transazioni.ISalvataggioTracceManager;
  70. import org.openspcoop2.pdd.core.handlers.transazioni.StatoSalvataggioDiagnostici;
  71. import org.openspcoop2.pdd.core.handlers.transazioni.StatoSalvataggioTracce;
  72. import org.openspcoop2.pdd.core.token.InformazioniNegoziazioneToken;
  73. import org.openspcoop2.pdd.core.token.InformazioniToken;
  74. import org.openspcoop2.pdd.core.token.attribute_authority.InformazioniAttributi;
  75. import org.openspcoop2.pdd.core.transazioni.Transaction;
  76. import org.openspcoop2.pdd.core.transazioni.TransactionContext;
  77. import org.openspcoop2.pdd.core.transazioni.TransactionNotExistsException;
  78. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  79. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  80. import org.openspcoop2.pdd.logger.filetrace.FileTraceConfig;
  81. import org.openspcoop2.pdd.logger.filetrace.FileTraceManager;
  82. import org.openspcoop2.pdd.services.ServicesUtils;
  83. import org.openspcoop2.protocol.engine.SecurityTokenUtilities;
  84. import org.openspcoop2.protocol.sdk.Context;
  85. import org.openspcoop2.protocol.sdk.SecurityToken;
  86. import org.openspcoop2.protocol.sdk.builder.EsitoTransazione;
  87. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  88. import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticProducer;
  89. import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
  90. import org.openspcoop2.protocol.sdk.dump.IDumpProducer;
  91. import org.openspcoop2.protocol.sdk.dump.Messaggio;
  92. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  93. import org.openspcoop2.protocol.sdk.tracciamento.ITracciaProducer;
  94. import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
  95. import org.openspcoop2.utils.BooleanNullable;
  96. import org.openspcoop2.utils.Map;
  97. import org.openspcoop2.utils.MapKey;
  98. import org.openspcoop2.utils.date.DateManager;
  99. import org.openspcoop2.utils.date.DateUtils;
  100. import org.openspcoop2.utils.date.UnitaTemporale;
  101. import org.slf4j.Logger;

  102. /**
  103.  * TracciamentoManager
  104.  *
  105.  * @author Andrea Poli (apoli@link.it)
  106.  * @author $Author$
  107.  * @version $Rev$, $Date$
  108.  *
  109.  */
  110. public class TracciamentoManager {

  111.     private boolean transazioniEnabled = true;
  112.     public boolean isTransazioniEnabled() {
  113.         return this.transazioniEnabled;
  114.     }
  115.    
  116.     /**
  117.      * Database resources
  118.      */
  119.     private DAOFactory daoFactory = null;
  120.     private ServiceManagerProperties daoFactoryServiceManagerPropertiesTransazioni = null;
  121.     private Logger daoFactoryLoggerTransazioni = null;

  122.     /**
  123.      * OpenSPCoop2Properties/ConfigurazionePdDManager resources
  124.      */
  125.     private OpenSPCoop2Properties openspcoopProperties = null;
  126.     public OpenSPCoop2Properties getOpenspcoopProperties() {
  127.         return this.openspcoopProperties;
  128.     }
  129.     private ConfigurazionePdDManager configPdDManager = null;
  130.    
  131.     /**
  132.      * Indicazione se funzionare in modalita' debug
  133.      */
  134.     private boolean debug = false;

  135.     /**
  136.      * Tracciamento e MsgDiagnostici appender
  137.      */
  138.     private ITracciaProducer tracciamentoOpenSPCoopAppender = null;
  139.     private IDiagnosticProducer msgDiagnosticiOpenSPCoopAppender = null;
  140.     private IDumpProducer dumpOpenSPCoopAppender = null;

  141.     /**
  142.      * Informazioni tracce e diagnostici
  143.      */
  144.     private boolean transazioniRegistrazioneTracceProtocolPropertiesEnabled = false;
  145.     private boolean transazioniRegistrazioneTracceHeaderRawEnabled = false;
  146.     private boolean transazioniRegistrazioneTracceDigestEnabled = false;
  147.     private ISalvataggioTracceManager salvataggioTracceManager = null;
  148.     private ISalvataggioDiagnosticiManager salvataggioDiagnosticiManager = null;
  149.     private boolean transazioniRegistrazioneDumpHeadersCompactEnabled = false;
  150.    
  151.     private FaseTracciamento fase;
  152.     private boolean usePdDConnection = true;
  153.     private String tipoDatabaseRuntime = null;
  154.    
  155.     /**
  156.      * Logger
  157.      */
  158.     private Logger log = null;
  159.     public void logDebug(String msg) {
  160.         if(this.log!=null) {
  161.             this.log.debug(msg);
  162.         }
  163.     }
  164.     public void logDebug(String msg, Exception e) {
  165.         if(this.log!=null) {
  166.             this.log.debug(msg,e);
  167.         }
  168.     }
  169.     public void logWarn(String msg) {
  170.         if(this.log!=null) {
  171.             this.log.warn(msg);
  172.         }
  173.     }
  174.     public void logError(String msg) {
  175.         if(this.log!=null) {
  176.             this.log.error(msg);
  177.         }
  178.     }
  179.     public void logError(String msg, Throwable e) {
  180.         if(this.log!=null) {
  181.             this.log.error(msg,e);
  182.         }
  183.     }
  184.     private Logger logSql = null;
  185.     public void logSqlDebug(String msg) {
  186.         if(this.logSql!=null) {
  187.             this.logSql.debug(msg);
  188.         }
  189.     }
  190.    
  191.     private static final String TIPO_RECOVERY_FS = "__timerFileSystemRecovery";
  192.    
  193.     public TracciamentoManager(FaseTracciamento fase) throws CoreException{
  194.         this.fase = fase;
  195.        
  196.         this.openspcoopProperties = OpenSPCoop2Properties.getInstance();
  197.         this.transazioniEnabled = this.openspcoopProperties.isTransazioniEnabled();
  198.         if(!this.transazioniEnabled) {
  199.             return;
  200.         }
  201.        
  202.         // Debug
  203.         this.debug = this.openspcoopProperties.isTransazioniDebug();
  204.        
  205.         // Log
  206.         this.log = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioni(this.debug);
  207.         this.logSql = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSql(this.debug);
  208.        
  209.         this.tipoDatabaseRuntime = this.openspcoopProperties.getDatabaseType();
  210.         if(this.tipoDatabaseRuntime==null){
  211.             throw new CoreException("Tipo Database non definito");
  212.         }
  213.        
  214.         this.configPdDManager = ConfigurazionePdDManager.getInstance();
  215.        
  216.         this.initTransactionResources();
  217.        
  218.         this.usePdDConnection = true;
  219.        
  220.         if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
  221.             initTracciamento(this.tipoDatabaseRuntime, this.usePdDConnection);
  222.         }
  223.        
  224.         if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
  225.             initDiagnostica(this.tipoDatabaseRuntime, this.usePdDConnection);
  226.             initDump(this.tipoDatabaseRuntime, this.usePdDConnection);
  227.         }
  228.        
  229.         initConfigurazioneTracciamento();
  230.     }
  231.    
  232.     private void initTransactionResources() throws CoreException {
  233.         // DB
  234.         try{
  235.             DAOFactoryProperties daoFactoryProperties = null;
  236.             this.daoFactoryLoggerTransazioni = this.logSql;
  237.             this.daoFactory = DAOFactory.getInstance(this.daoFactoryLoggerTransazioni);
  238.             daoFactoryProperties = DAOFactoryProperties.getInstance(this.daoFactoryLoggerTransazioni);
  239.             this.daoFactoryServiceManagerPropertiesTransazioni = daoFactoryProperties.getServiceManagerProperties(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  240.             this.daoFactoryServiceManagerPropertiesTransazioni.setShowSql(this.debug);  
  241.             this.daoFactoryServiceManagerPropertiesTransazioni.setDatabaseType(DBTransazioniManager.getInstance().getTipoDatabase());

  242.         }catch(Exception e){
  243.             throw new CoreException("Errore durante l'inizializzazione delle risorse per l'accesso al database: "+e.getMessage(),e);
  244.         }
  245.     }
  246.    
  247.     private void initTracciamento(String tipoDatabaseRuntime, boolean usePdDConnection) throws CoreException {
  248.         try{
  249.            
  250.             // Init
  251.             this.tracciamentoOpenSPCoopAppender = new org.openspcoop2.pdd.logger.TracciamentoOpenSPCoopProtocolAppender();
  252.             OpenspcoopAppender tracciamentoOpenSPCoopAppenderEngine = new OpenspcoopAppender();
  253.             tracciamentoOpenSPCoopAppenderEngine.setTipo(TIPO_RECOVERY_FS);
  254.             List<Property> tracciamentoOpenSPCoopAppenderProperties = new ArrayList<>();

  255.             // Verra poi utilizzata la connessione ottenuta ogni volta che il timer viene eseguito, infatti si usa usePdDConnection
  256.             OpenSPCoopAppenderUtilities.addParameters(this.daoFactoryLoggerTransazioni, tracciamentoOpenSPCoopAppenderProperties,
  257.                     null, // nessun datasource
  258.                     null, null, null, null,  // nessuna connection
  259.                     tipoDatabaseRuntime,
  260.                     usePdDConnection, // viene usata la connessione della PdD
  261.                     this.debug
  262.                     );
  263.             OpenSPCoopAppenderUtilities.addCheckProperties(tracciamentoOpenSPCoopAppenderProperties, false);

  264.             tracciamentoOpenSPCoopAppenderEngine.setPropertyList(tracciamentoOpenSPCoopAppenderProperties);
  265.             this.tracciamentoOpenSPCoopAppender.initializeAppender(tracciamentoOpenSPCoopAppenderEngine);
  266.             this.tracciamentoOpenSPCoopAppender.isAlive();
  267.            
  268.         }catch(Exception e){
  269.             throw new CoreException("Errore durante l'inizializzazione del TracciamentoAppender: "+e.getMessage(),e);
  270.         }
  271.     }
  272.    
  273.     private void initDiagnostica(String tipoDatabaseRuntime, boolean usePdDConnection) throws CoreException {
  274.         try{
  275.            
  276.             // Init
  277.             this.msgDiagnosticiOpenSPCoopAppender = new org.openspcoop2.pdd.logger.MsgDiagnosticoOpenSPCoopProtocolAppender();
  278.             OpenspcoopAppender diagnosticoOpenSPCoopAppenderEngine = new OpenspcoopAppender();
  279.             diagnosticoOpenSPCoopAppenderEngine.setTipo(TIPO_RECOVERY_FS);
  280.             List<Property> diagnosticoOpenSPCoopAppenderProperties = new ArrayList<>();

  281.             // Verra poi utilizzata la connessione ottenuta ogni volta che il timer viene eseguito, infatti si usa usePdDConnection
  282.             OpenSPCoopAppenderUtilities.addParameters(this.daoFactoryLoggerTransazioni, diagnosticoOpenSPCoopAppenderProperties,
  283.                     null, // nessun datasource
  284.                     null, null, null, null,  // nessuna connection
  285.                     tipoDatabaseRuntime,
  286.                     usePdDConnection, // viene usata la connessione della PdD
  287.                     this.debug
  288.                     );
  289.             OpenSPCoopAppenderUtilities.addCheckProperties(diagnosticoOpenSPCoopAppenderProperties, false);

  290.             diagnosticoOpenSPCoopAppenderEngine.setPropertyList(diagnosticoOpenSPCoopAppenderProperties);
  291.             this.msgDiagnosticiOpenSPCoopAppender.initializeAppender(diagnosticoOpenSPCoopAppenderEngine);
  292.             this.msgDiagnosticiOpenSPCoopAppender.isAlive();
  293.            
  294.         }catch(Exception e){
  295.             throw new CoreException("Errore durante l'inizializzazione del DiagnosticoAppender: "+e.getMessage(),e);
  296.         }
  297.     }
  298.    
  299.     private void initDump(String tipoDatabaseRuntime, boolean usePdDConnection) throws CoreException {
  300.         try{
  301.            
  302.             // Init
  303.             this.dumpOpenSPCoopAppender = new org.openspcoop2.pdd.logger.DumpOpenSPCoopProtocolAppender();
  304.             OpenspcoopAppender dumpOpenSPCoopAppenderEngine = new OpenspcoopAppender();
  305.             dumpOpenSPCoopAppenderEngine.setTipo(TIPO_RECOVERY_FS);
  306.             List<Property> dumpOpenSPCoopAppenderProperties = new ArrayList<>();

  307.             // Verra poi utilizzata la connessione ottenuta ogni volta che il timer viene eseguito, infatti si usa usePdDConnection
  308.             OpenSPCoopAppenderUtilities.addParameters(this.daoFactoryLoggerTransazioni, dumpOpenSPCoopAppenderProperties,
  309.                     null, // nessun datasource
  310.                     null, null, null, null,  // nessuna connection
  311.                     tipoDatabaseRuntime,
  312.                     usePdDConnection, // viene usata la connessione della PdD
  313.                     this.debug
  314.                     );
  315.             OpenSPCoopAppenderUtilities.addCheckProperties(dumpOpenSPCoopAppenderProperties, false);

  316.             dumpOpenSPCoopAppenderEngine.setPropertyList(dumpOpenSPCoopAppenderProperties);
  317.             this.dumpOpenSPCoopAppender.initializeAppender(dumpOpenSPCoopAppenderEngine);
  318.             this.dumpOpenSPCoopAppender.isAlive();
  319.            
  320.         }catch(Exception e){
  321.             throw new CoreException("Errore durante l'inizializzazione del DumpAppender: "+e.getMessage(),e);
  322.         }
  323.     }
  324.    
  325.     private void initConfigurazioneTracciamento() throws CoreException {
  326.         // Configurazione tracce e diagnostici
  327.         try{

  328.             // Indicazione se devo registrare tutte le tracce o solo quelle non ricostruibili
  329.             this.transazioniRegistrazioneTracceProtocolPropertiesEnabled =  this.openspcoopProperties.isTransazioniRegistrazioneTracceProtocolPropertiesEnabled();
  330.             this.transazioniRegistrazioneTracceHeaderRawEnabled = this.openspcoopProperties.isTransazioniRegistrazioneTracceHeaderRawEnabled();
  331.             this.transazioniRegistrazioneTracceDigestEnabled = this.openspcoopProperties.isTransazioniRegistrazioneTracceDigestEnabled();
  332.            
  333.             // Indicazioni sulle modalita' di salvataggio degli header del dump
  334.             this.transazioniRegistrazioneDumpHeadersCompactEnabled = this.openspcoopProperties.isTransazioniRegistrazioneDumpHeadersCompactEnabled();
  335.            
  336.             // salvataggio
  337.             this.salvataggioTracceManager = this.openspcoopProperties.getTransazioniRegistrazioneTracceManager();
  338.             this.salvataggioDiagnosticiManager = this.openspcoopProperties.getTransazioniRegistrazioneDiagnosticiManager();

  339.         } catch (Exception e) {
  340.             throw new CoreException("Errore durante la lettura della configurazione della registrazione di tracce/diagnostici: " + e.getLocalizedMessage(), e);
  341.         }
  342.     }
  343.    
  344.    
  345.     private static final MapKey<String> DISABLE_TRANSACTION_FILTER = Map.newMapKey("DISABLE_TRANSACTION_FILTER");
  346.     private boolean existsTransactionFilter(InformazioniTransazione info) {
  347.         return info!=null && info.getContext()!=null && info.getContext().containsKey(DISABLE_TRANSACTION_FILTER);
  348.     }
  349.     private String getTransactionFilter(InformazioniTransazione info) {
  350.         return (info!=null && info.getContext()!=null) ? (String) info.getContext().get(DISABLE_TRANSACTION_FILTER) : null;
  351.     }
  352.     private void disableTransactionFilter(InformazioniTransazione info) {
  353.         if(!existsTransactionFilter(info) && info!=null && info.getContext()!=null) {
  354.             info.getContext().put(DISABLE_TRANSACTION_FILTER, this.fase.name());
  355.         }
  356.     }
  357.    
  358.     private static final MapKey<String> DISABLE_TRANSACTION_FILTER_DB = Map.newMapKey("DISABLE_TRANSACTION_FILTER_DB");
  359.     private boolean existsTransactionFilterDB(InformazioniTransazione info) {
  360.         return info!=null && info.getContext()!=null && info.getContext().containsKey(DISABLE_TRANSACTION_FILTER_DB);
  361.     }
  362.     private void disableTransactionFilterDB(InformazioniTransazione info) {
  363.         if(!existsTransactionFilter(info) && info!=null && info.getContext()!=null) {
  364.             info.getContext().put(DISABLE_TRANSACTION_FILTER_DB, this.fase.name());
  365.         }
  366.     }
  367.    
  368.     private static final MapKey<String> DISABLE_TRANSACTION_FILTER_FILETRACE = Map.newMapKey("DISABLE_TRANSACTION_FILTER_FILETRACE");
  369.     private boolean existsTransactionFilterFileTrace(InformazioniTransazione info) {
  370.         return info!=null && info.getContext()!=null && info.getContext().containsKey(DISABLE_TRANSACTION_FILTER_FILETRACE);
  371.     }
  372.     private void disableTransactionFilterFileTrace(InformazioniTransazione info) {
  373.         if(!existsTransactionFilter(info) && info!=null && info.getContext()!=null) {
  374.             info.getContext().put(DISABLE_TRANSACTION_FILTER_FILETRACE, this.fase.name());
  375.         }
  376.     }
  377.    
  378.    
  379.     public void invoke(InformazioniTransazione info, String esitoContext, java.util.Map<String, List<String>> headerInUscita,
  380.             org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore) throws HandlerException {
  381.         invokeEngine(info, null, esitoContext, headerInUscita,
  382.                 msgdiagErrore);
  383.     }
  384.     public void invoke(InformazioniTransazione info, String esitoContext,
  385.             org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore) throws HandlerException {
  386.         invokeEngine(info, null, esitoContext, null,
  387.                 msgdiagErrore);
  388.     }
  389.     public void invoke(InformazioniTransazione info, EsitoTransazione esito, java.util.Map<String, List<String>> headerInUscita,
  390.             org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore) throws HandlerException {
  391.         invokeEngine(info, esito, null, headerInUscita,
  392.                 msgdiagErrore);
  393.     }
  394.     public void invoke(InformazioniTransazione info, EsitoTransazione esito) throws HandlerException {
  395.         invokeEngine(info, esito, null, null, null);
  396.     }
  397.     private void invokeEngine(InformazioniTransazione info, EsitoTransazione esito, String esitoContext,
  398.             java.util.Map<String, List<String>> headerInUscita,
  399.             org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore) throws HandlerException {
  400.        
  401.         if(!this.transazioniEnabled) {
  402.             return;
  403.         }
  404.        
  405.         TransazioniProcessTimes times = null;
  406.         long timeStart = -1;
  407.         if(this.openspcoopProperties.isTransazioniRegistrazioneSlowLog()) {
  408.             times = new TransazioniProcessTimes();
  409.             timeStart = DateManager.getTimeMillis();
  410.         }
  411.         try {
  412.             invoke(info, esito, esitoContext, headerInUscita,
  413.                     msgdiagErrore,
  414.                     times);
  415.         }
  416.         catch(HandlerException he) {
  417.             he.setIntegrationFunctionError(IntegrationFunctionError.GOVWAY_RESOURCES_NOT_AVAILABLE);
  418.             throw he;
  419.         }
  420.         finally {
  421.             if(times!=null) {
  422.                 long timeEnd =  DateManager.getTimeMillis();
  423.                 long timeProcess = timeEnd-timeStart;
  424.                 if(timeProcess>=this.openspcoopProperties.getTransazioniRegistrazioneSlowLogThresholdMs()) {
  425.                     StringBuilder sb = new StringBuilder();
  426.                     sb.append(timeProcess);
  427.                     if(times.idTransazione!=null) {
  428.                         sb.append(" <").append(times.idTransazione).append(">");
  429.                     }
  430.                     sb.append(" ["+this.fase+"]");
  431.                     sb.append(" ").append(times.toString());
  432.                     String msg = sb.toString();
  433.                     OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSlowLog().info(msg);
  434.                 }
  435.             }
  436.         }
  437.        
  438.     }
  439.     private void invoke(InformazioniTransazione info,
  440.             EsitoTransazione esito, String esitoContext,
  441.             java.util.Map<String, List<String>> headerInUscita,
  442.             org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore,
  443.             TransazioniProcessTimes times) throws HandlerException {

  444.         if (info==null)
  445.             throw new HandlerException("Informazioni transazione is null");
  446.        
  447.         Context context = info.getContext();
  448.         TipoPdD tipoPorta = info.getTipoPorta();
  449.        

  450.         /* ---- Recupero contesto ----- */

  451.         if (context==null)
  452.             throw new HandlerException("Contesto is null");

  453.         if (context.getObject(Costanti.ID_TRANSAZIONE)==null)
  454.             throw new HandlerException("Identificativo della transazione assente");
  455.         String idTransazione = (String) context.getObject(Costanti.ID_TRANSAZIONE);
  456.         if (idTransazione==null)
  457.             throw new HandlerException("Identificativo della transazione assente");
  458.         /**System.out.println("------------- "+this.fase+" ("+idTransazione+")("+context.getTipoPorta().getTipo()+") -------------------");*/
  459.         String prefixIdTransazione = "Transazione ID["+idTransazione+"] ";

  460.         Transaction transaction = null;
  461.         try {
  462.             transaction = FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) ? TransactionContext.removeTransaction(idTransazione) : TransactionContext.getTransaction(idTransazione);
  463.         }catch(TransactionNotExistsException n) {
  464.             // ignore
  465.         }
  466.         if(times!=null) {
  467.             times.idTransazione = idTransazione;
  468.         }
  469.        
  470.         /* ---- Verifica Configurazione della Transazione per registrazione nello storico ----- */
  471.        
  472.         ConfigurazioneTracciamento configurazioneTracciamento = null;
  473.         boolean dbEnabledBloccante = true;
  474.         boolean dbEnabledNonBloccante = false;
  475.         boolean fileTraceEnabledBloccante = false;
  476.         boolean fileTraceEnabledNonBloccante = false;
  477.         File fileTraceConfig = null;
  478.         boolean fileTraceConfigGlobal = true;
  479.         boolean existsAnotherFiletraceTrackingPhase = false;
  480.         try{
  481.             if(msgdiagErrore==null) {
  482.                 String nomePorta = null;
  483.                 if(transaction!=null && transaction.getRequestInfo()!=null &&
  484.                         transaction.getRequestInfo().getProtocolContext()!=null &&
  485.                         transaction.getRequestInfo().getProtocolContext().getInterfaceName()!=null) {
  486.                     nomePorta = transaction.getRequestInfo().getProtocolContext().getInterfaceName();
  487.                 }
  488.                 RequestInfo requestInfo = transaction!=null ? transaction.getRequestInfo() : null;
  489.                 msgdiagErrore = org.openspcoop2.pdd.logger.MsgDiagnostico.newInstance(info.getTipoPorta(),info.getIdModulo(), nomePorta, requestInfo, this.configPdDManager);
  490.                 msgdiagErrore.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_BUSTE);
  491.                 msgdiagErrore.setPddContext(info.getContext(), info.getProtocolFactory());
  492.             }
  493.            
  494.             configurazioneTracciamento = getConfigurazioneTracciamento(idTransazione, context, tipoPorta, transaction);
  495.            
  496.             if(configurazioneTracciamento!=null) {
  497.                 dbEnabledBloccante = configurazioneTracciamento.isDbEnabled();
  498.                 if(dbEnabledBloccante) {
  499.                     switch (this.fase) {
  500.                     case IN_REQUEST:
  501.                         dbEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBRequestInEnabledBloccante();
  502.                         dbEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBRequestInEnabledNonBloccante();                      
  503.                         break;
  504.                     case OUT_REQUEST:
  505.                         dbEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBRequestOutEnabledBloccante();
  506.                         dbEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBRequestOutEnabledNonBloccante();
  507.                         break;
  508.                     case OUT_RESPONSE:
  509.                         dbEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBResponseOutEnabledBloccante();
  510.                         dbEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoDBResponseOutEnabledNonBloccante();
  511.                         break;
  512.                     case POST_OUT_RESPONSE:
  513.                         dbEnabledBloccante = configurazioneTracciamento.getRegole()==null || configurazioneTracciamento.getRegole().isTracciamentoDBResponseOutCompleteEnabled();
  514.                         break;
  515.                     }
  516.                 }
  517.                
  518.                 fileTraceEnabledBloccante = configurazioneTracciamento.isFileTraceEnabled();
  519.                 if(fileTraceEnabledBloccante) {
  520.                     fileTraceConfig = configurazioneTracciamento.getFileTraceConfig();
  521.                     fileTraceConfigGlobal = configurazioneTracciamento.isFileTraceConfigGlobal();
  522.                 }
  523.                 if(fileTraceEnabledBloccante) {
  524.                     switch (this.fase) {
  525.                     case IN_REQUEST:
  526.                         fileTraceEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestInEnabledBloccante();
  527.                         fileTraceEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestInEnabledNonBloccante();
  528.                        
  529.                         // per ripulire le risorse
  530.                         if(this.openspcoopProperties.isTransazioniFileTraceDumpBinarioReleaseInLastTrackingPhase() && configurazioneTracciamento.isFileTraceEnabled()) {
  531.                             existsAnotherFiletraceTrackingPhase =
  532.                                     // postOutResponse
  533.                                     (configurazioneTracciamento.getRegole()==null ||
  534.                                             configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutCompleteEnabled() ||
  535.                                             configurazioneTracciamento.isInitFileTraceByExternalPropertyPort())
  536.                                     ||
  537.                                     // outRequest
  538.                                     (configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestOutEnabledBloccante() || configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestOutEnabledNonBloccante())
  539.                                     ||
  540.                                     // outResponse
  541.                                     (configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledBloccante() || configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledNonBloccante())
  542.                                     ;
  543.                         }
  544.                         break;
  545.                     case OUT_REQUEST:
  546.                         fileTraceEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestOutEnabledBloccante();
  547.                         fileTraceEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceRequestOutEnabledNonBloccante();
  548.                        
  549.                         // per ripulire le risorse
  550.                         if(this.openspcoopProperties.isTransazioniFileTraceDumpBinarioReleaseInLastTrackingPhase() && configurazioneTracciamento.isFileTraceEnabled()) {
  551.                             existsAnotherFiletraceTrackingPhase =
  552.                                     // postOutResponse
  553.                                     (configurazioneTracciamento.getRegole()==null ||
  554.                                             configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutCompleteEnabled() ||
  555.                                             configurazioneTracciamento.isInitFileTraceByExternalPropertyPort())
  556.                                     ||
  557.                                     // outResponse
  558.                                     (configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledBloccante() || configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledNonBloccante())
  559.                                     ;
  560.                         }
  561.                         break;
  562.                     case OUT_RESPONSE:
  563.                         fileTraceEnabledBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledBloccante();
  564.                         fileTraceEnabledNonBloccante = configurazioneTracciamento.getRegole()!=null && configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutEnabledNonBloccante();
  565.                        
  566.                         // per ripulire le risorse
  567.                         if(this.openspcoopProperties.isTransazioniFileTraceDumpBinarioReleaseInLastTrackingPhase() && configurazioneTracciamento.isFileTraceEnabled()) {
  568.                             existsAnotherFiletraceTrackingPhase =
  569.                                     // postOutResponse
  570.                                     (configurazioneTracciamento.getRegole()==null ||
  571.                                             configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutCompleteEnabled() ||
  572.                                             configurazioneTracciamento.isInitFileTraceByExternalPropertyPort())
  573.                                     ;
  574.                         }
  575.                         break;
  576.                     case POST_OUT_RESPONSE:
  577.                         fileTraceEnabledBloccante = configurazioneTracciamento.getRegole()==null ||
  578.                             configurazioneTracciamento.getRegole().isTracciamentoFileTraceResponseOutCompleteEnabled() ||
  579.                             configurazioneTracciamento.isInitFileTraceByExternalPropertyPort();
  580.                         break;
  581.                     }
  582.                 }
  583.             }
  584.            
  585.         }catch (Exception e) {
  586.             this.logError(prefixIdTransazione+"errore durante la lettura della configurazione del tracciamento da effettuare: "+e.getMessage(),e);
  587.         }
  588.        
  589.         /* ---- Verifica Esito della Transazione per registrazione nello storico ----- */
  590.        
  591.         boolean exitTransactionAfterRateLimitingRemoveThreadNoTraceDB = false;
  592.         boolean noFileTrace = false;
  593.         if(!dbEnabledBloccante && !dbEnabledNonBloccante
  594.                 &&
  595.                 !fileTraceEnabledBloccante && !fileTraceEnabledNonBloccante
  596.             ) {
  597.             noFileTrace = true;
  598.             exitTransactionAfterRateLimitingRemoveThreadNoTraceDB = true;
  599.         }
  600.         else {
  601.             try{
  602.                 boolean forceDisableTransactionFilter = false;
  603.                 if(FaseTracciamento.OUT_RESPONSE.equals(this.fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
  604.                     forceDisableTransactionFilter = this.existsTransactionFilter(info);
  605.                 }
  606.                 else if(FaseTracciamento.IN_REQUEST.equals(this.fase) || FaseTracciamento.OUT_REQUEST.equals(this.fase)){
  607.                     this.disableTransactionFilter(info);
  608.                 }
  609.                
  610.                 if(forceDisableTransactionFilter) {
  611.                     if(this.debug){
  612.                         this.logDebug("["+idTransazione+"] Vengono registrati tutte le Transazioni indipendentemente dagli esiti poichè è stata precedentente effettuato un tracciamento nella fase "+getTransactionFilter(info));
  613.                     }
  614.                 }
  615.                 else {
  616.                     StringBuilder bf = new StringBuilder();
  617.                     String tipoFiltroEsiti = null;
  618.                     boolean filtroEsitiDB = false;
  619.                     boolean filtroEsitiFileTrace = false;
  620.                     List<String> esitiDaRegistrare = null;
  621.                     if(configurazioneTracciamento!=null) {
  622.                         esitiDaRegistrare = configurazioneTracciamento.getEsitiDaRegistrare(bf);
  623.                         tipoFiltroEsiti = configurazioneTracciamento.getTipoFiltroEsiti();
  624.                         filtroEsitiDB = configurazioneTracciamento.isFiltroEsitiDB();
  625.                         filtroEsitiFileTrace = configurazioneTracciamento.isFiltroEsitiFileTrace();
  626.                     }
  627.                    
  628.                     if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
  629.                         if(filtroEsitiDB && this.existsTransactionFilterDB(info)) {
  630.                             filtroEsitiDB=false;
  631.                         }
  632.                         if(filtroEsitiFileTrace && this.existsTransactionFilterFileTrace(info)) {
  633.                             filtroEsitiFileTrace=false;
  634.                         }
  635.                     }
  636.                    
  637.                     if(esitiDaRegistrare==null || esitiDaRegistrare.isEmpty() || (!filtroEsitiDB && !filtroEsitiFileTrace)){
  638.                         esitiDaRegistrare = null;
  639.                         if(this.debug){
  640.                             this.logDebug("["+idTransazione+"] Vengono registrati tutte le Transazioni indipendentemente dagli esiti");
  641.                         }
  642.                     }
  643.                     else{
  644.                         if(this.debug){
  645.                             this.logDebug("["+idTransazione+"] ("+tipoFiltroEsiti+") Esiti delle Transazioni da registare: "+bf.toString());
  646.                         }
  647.                         if(esito!=null){
  648.                            
  649.                             boolean esitoDaRegistrare = ConfigurazioneTracciamentoUtils.isEsitoDaRegistrare(this.log, info.getProtocolFactory(), context,
  650.                                     esitiDaRegistrare, esito);
  651.                            
  652.                             if(!esitoDaRegistrare){
  653.                                 String msg = prefixIdTransazione+"non salvata nello storico "+tipoFiltroEsiti+" come richiesto dalla configurazione del tracciamento: "+
  654.                                         ConfigurazioneTracciamentoUtils.getEsitoTransazionDetail(this.log, info.getProtocolFactory(),esito);
  655.                                 if(ConfigurazioneTracciamentoUtils.isEsitoOk(this.log, info.getProtocolFactory(),esito)) {
  656.                                     this.logWarn(msg);
  657.                                 }
  658.                                 else{
  659.                                     this.logError(msg);
  660.                                 }
  661.                                
  662.                                 // BUG OP-825
  663.                                 // la gestione RateLimiting deve essere sempre fatta senno se si configurara di non registrare una transazione, poi si ha l'effetto che i contatori del Controllo del Traffico non vengono diminuiti.
  664.                                 if(filtroEsitiDB) {
  665.                                     exitTransactionAfterRateLimitingRemoveThreadNoTraceDB = true;
  666.                                 }
  667.                                 else if(FaseTracciamento.OUT_RESPONSE.equals(this.fase) &&
  668.                                     (dbEnabledBloccante || dbEnabledNonBloccante)) {
  669.                                     this.disableTransactionFilterDB(info);
  670.                                 }
  671.                                
  672.                                 if(filtroEsitiFileTrace) {
  673.                                     noFileTrace = true;
  674.                                 }
  675.                                 else if(FaseTracciamento.OUT_RESPONSE.equals(this.fase) &&
  676.                                         (fileTraceEnabledBloccante || fileTraceEnabledNonBloccante)) {
  677.                                     this.disableTransactionFilterFileTrace(info);
  678.                                 }
  679.                             }
  680.                             else{
  681.                                 this.disableTransactionFilter(info);
  682.                             }
  683.                         }
  684.                         else{
  685.                             this.logError(prefixIdTransazione+"senza un esito");
  686.                         }
  687.                     }
  688.                 }
  689.             }catch (Exception e) {
  690.                 this.logError(prefixIdTransazione+"errore durante la lettura della configurazione del tracciamento da effettuare rispetto agli esiti: "+e.getMessage(),e);
  691.             }
  692.            
  693.             if(!exitTransactionAfterRateLimitingRemoveThreadNoTraceDB && !dbEnabledBloccante && !dbEnabledNonBloccante) {
  694.                 exitTransactionAfterRateLimitingRemoveThreadNoTraceDB = true;
  695.             }
  696.             if(!noFileTrace && !fileTraceEnabledBloccante && !fileTraceEnabledNonBloccante) {
  697.                 noFileTrace = true;
  698.             }
  699.            
  700.         }
  701.        
  702.        
  703.        
  704.        
  705.        

  706.            
  707.         /* ---- Recupero dati della transazione dal contesto ----- */
  708.        
  709.         Boolean controlloCongestioneMaxRequestThreadRegistrato = null;
  710.         if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && this.openspcoopProperties.isControlloTrafficoEnabled()){
  711.             Object objControlloCongestioneMaxRequestThreadRegistrato = context.getObject(CostantiControlloTraffico.PDD_CONTEXT_MAX_REQUEST_THREAD_REGISTRATO);
  712.             if(objControlloCongestioneMaxRequestThreadRegistrato!=null){
  713.                 controlloCongestioneMaxRequestThreadRegistrato = (Boolean) objControlloCongestioneMaxRequestThreadRegistrato;
  714.                 /**System.out.println("CHECK POST OUT ["+context.getTipoPorta().name()+"] controlloCongestioneMaxRequestViolated["+controlloCongestioneMaxRequestViolated+"] controllo["+PddInterceptorConfig.isControlloCongestioneTraceTransazioneMaxThreadsViolated()+"]");*/
  715.             }      
  716.         }
  717.        
  718.         // Check Transaction
  719.         if (transaction==null)
  720.             throw new HandlerException("Dati della transazione assenti");
  721.         if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
  722.             transaction.setDeleted();
  723.         }


  724.         MisurazioniTransazione misurazioniTransazione = null;
  725.         Transazione transazioneDTO = null;
  726.         HandlerException fileTraceException = null;
  727.         try{
  728.            
  729.             RequestInfo requestInfo = null;
  730.             if(context!=null && context.containsKey(Costanti.REQUEST_INFO)){
  731.                 requestInfo = (RequestInfo) context.getObject(Costanti.REQUEST_INFO);
  732.             }
  733.            
  734.             IDSoggetto idDominio = this.openspcoopProperties.getIdentitaPortaDefault(info.getProtocolFactory().getProtocol(), requestInfo);
  735.             if(info.getProtocollo()!=null && info.getProtocollo().getDominio()!=null && !info.getProtocollo().getDominio().equals(idDominio)){
  736.                 idDominio = info.getProtocollo().getDominio();
  737.             }
  738.             else if(requestInfo!=null &&
  739.                 requestInfo.getIdentitaPdD()!=null && !requestInfo.getIdentitaPdD().equals(idDominio)){
  740.                 idDominio = requestInfo.getIdentitaPdD();
  741.             }
  742.    
  743.             String modulo = "Tracciamento-"+this.fase;
  744.    
  745.             ExceptionSerialzerFileSystem exceptionSerializerFileSystem = new ExceptionSerialzerFileSystem(this.log);
  746.    
  747.            
  748.             // ### Lettura dati Transazione ###
  749.            
  750.             boolean pddStateless = true;
  751.             TransazioneUtilities transazioneUtilities = null;
  752.             HandlerException he = null;
  753.             long timeStart = -1;
  754.             try{
  755.                 if(exitTransactionAfterRateLimitingRemoveThreadNoTraceDB && noFileTrace) {
  756.                     if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && this.openspcoopProperties.isControlloTrafficoEnabled()){
  757.                         misurazioniTransazione = TransazioneUtilities.fillMisurazioniTransazione(info, this.fase, transaction, esito, transazioneDTO);
  758.                     }
  759.                     return; // entro nel finally e se sono post out rimuovo il thread per il controllo del traffico
  760.                 }
  761.                
  762.                 if(times!=null) {
  763.                     timeStart = DateManager.getTimeMillis();
  764.                 }
  765.                
  766.                 // Stateless
  767. /**             if ( (context.getIntegrazione()==null) ||
  768. //                      (context.getIntegrazione().isGestioneStateless()==null) ||
  769. //                      (context.getIntegrazione().isGestioneStateless()==false)
  770. //                      ){
  771. //                  pddStateless = false;
  772. //              }*/
  773.                 // Cambio l'approccio per poter simulare anche gli errori nei diagnostici dove possibile
  774.                 // Tanto tutte le comunicazioni sono stateless a meno che non vengano tramutate in stateful
  775.                 if ( info.getIntegrazione()!=null &&
  776.                         info.getIntegrazione().isGestioneStateless()!=null &&
  777.                                 !info.getIntegrazione().isGestioneStateless().booleanValue()){
  778.                     pddStateless = false;
  779.                 }
  780.                
  781.                 /* ---- Salvo informazioni sulla transazioni nell'oggetto transazioniDTO ----- */
  782.                 transazioneUtilities = new TransazioneUtilities(this.log, this.openspcoopProperties,
  783.                         this.transazioniRegistrazioneTracceHeaderRawEnabled,
  784.                         this.transazioniRegistrazioneTracceDigestEnabled,
  785.                         this.transazioniRegistrazioneTracceProtocolPropertiesEnabled,
  786.                         configurazioneTracciamento!=null ? configurazioneTracciamento.getInformazioniSalvareTransazioni() : null);
  787.                 transazioneDTO = transazioneUtilities.fillTransaction(info, transaction, idDominio,
  788.                         ( (times!=null && this.openspcoopProperties.isTransazioniRegistrazioneSlowLogBuildTransactionDetails()) ? times : null),
  789.                         this.fase,
  790.                         esito, esitoContext,
  791.                         info.getTransazioneDaAggiornare()); // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  792.                 if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && this.openspcoopProperties.isControlloTrafficoEnabled()){
  793.                     misurazioniTransazione = TransazioneUtilities.fillMisurazioniTransazione(info, this.fase, transaction, esito, transazioneDTO);
  794.                 }
  795.                 if(FaseTracciamento.OUT_RESPONSE.equals(this.fase)) {
  796.                     info.setTransazioneDaAggiornare(transazioneDTO);
  797.                 }
  798.    
  799.             }catch (Throwable e) {
  800.                 try{
  801.                     if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
  802.                         exceptionSerializerFileSystem.registrazioneFileSystemDiagnosticiTracceDumpEmessiPdD(transaction, idTransazione, null,
  803.                                 true, true, true, true);
  804.                     }
  805.                 } catch (Exception eClose) {
  806.                     // ignore
  807.                 }
  808.                 // Effettuo il log anche nel core per evitare che un eventuale filtro a OFF sul core della PdD eviti la scrittura di questi errori
  809.                 String msg = "Errore durante la scrittura della transazione sul database (Lettura dati Transazione): " + e.getLocalizedMessage();
  810.                 this.logError("["+idTransazione+"] "+msg,e);
  811.                 he = new HandlerException(msg,e);
  812.             }
  813.             finally {  

  814.                 if(times!=null) {
  815.                     long timeEnd =  DateManager.getTimeMillis();
  816.                     long timeProcess = timeEnd-timeStart;
  817.                     times.fillTransaction = timeProcess;
  818.                 }
  819.                
  820.                 // ### Gestione Controllo Congestione ###
  821.                 // Nota: il motivo del perchè viene effettuato qua la "remove"
  822.                 //       risiede nel fatto che la risposta al client è già stata data
  823.                 //       però il "thread occupato" dal client non è ancora stato liberato per una nuova richiesta
  824.                 //       Se la remove viene messa nel finally del try-catch sottostante prima della remove si "paga"
  825.                 //       i tempi di attesa dell'inserimento della transazione sul database
  826.                 if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && this.openspcoopProperties.isControlloTrafficoEnabled()){
  827.                    
  828.                     try {
  829.                         if(times!=null) {
  830.                             timeStart = DateManager.getTimeMillis();
  831.                         }
  832.                         PostOutResponseHandlerGestioneControlloTraffico outHandler = new PostOutResponseHandlerGestioneControlloTraffico();
  833.                         outHandler.process(controlloCongestioneMaxRequestThreadRegistrato, this.log, idTransazione, misurazioniTransazione, info,
  834.                                 ( (times!=null && this.openspcoopProperties.isTransazioniRegistrazioneSlowLogRateLimitingDetails()) ? times : null));
  835.                     }catch (Throwable e) {
  836.                         this.logError("["+idTransazione+"] Errore durante la registrazione di terminazione del thread: "+e.getMessage(),e);
  837.                     }finally {
  838.                         if(times!=null) {
  839.                             long timeEnd =  DateManager.getTimeMillis();
  840.                             long timeProcess = timeEnd-timeStart;
  841.                             times.controlloTraffico = timeProcess;
  842.                         }
  843.                     }
  844.                 }
  845.                
  846.                 // ### FileTrace ###
  847.                 if((fileTraceEnabledBloccante || fileTraceEnabledNonBloccante) && !noFileTrace) {
  848.                    
  849.                     InformazioniToken informazioniToken = null;
  850.                     InformazioniAttributi informazioniAttributi = null;
  851.                     InformazioniNegoziazioneToken informazioniNegoziazioneToken = null;
  852.                     SecurityToken securityToken = null;
  853.                     if(transaction!=null) {
  854.                         informazioniToken = transaction.getInformazioniToken();
  855.                         informazioniNegoziazioneToken = transaction.getInformazioniNegoziazioneToken();
  856.                     }
  857.                     if(context!=null) {
  858.                         Object oInformazioniAttributiNormalizzati = context.getObject(org.openspcoop2.pdd.core.token.Costanti.PDD_CONTEXT_ATTRIBUTI_INFORMAZIONI_NORMALIZZATE);
  859.                         if(oInformazioniAttributiNormalizzati instanceof InformazioniAttributi) {
  860.                             informazioniAttributi = (InformazioniAttributi) oInformazioniAttributiNormalizzati;
  861.                         }
  862.                         securityToken = SecurityTokenUtilities.readSecurityToken(context);
  863.                     }
  864.                    
  865.                     fileTraceException = logWithFileTrace(fileTraceConfig, fileTraceConfigGlobal,
  866.                             times,
  867.                             transazioneDTO, transaction, esito,
  868.                             informazioniToken,
  869.                             informazioniAttributi,
  870.                             informazioniNegoziazioneToken,
  871.                             securityToken,
  872.                             info,
  873.                             headerInUscita,
  874.                             requestInfo,
  875.                             idTransazione,
  876.                             fileTraceEnabledBloccante,
  877.                             msgdiagErrore,
  878.                             existsAnotherFiletraceTrackingPhase); // anche qua vi e' un try catch con Throwable
  879.                 }
  880.                
  881.             }
  882.            
  883.             if(he!=null) {
  884.                 throw he;
  885.             }
  886.             else if(exitTransactionAfterRateLimitingRemoveThreadNoTraceDB){
  887.                 // La risorsa viene rilasciata nel finally
  888.                 /**this.releaseResources(transaction, idTransazione, context);*/
  889.                
  890.                 // se non devo tracciare su db ma ho avuto un errore su file trace devo registrarlo
  891.                 if(fileTraceException!=null) {
  892.                     throw fileTraceException;
  893.                 }
  894.                
  895.                 return;
  896.             }
  897.            
  898.            
  899.            
  900.             // Il controllo stateful è stato spostato sotto il blocco soprastante, per assicurare la gestione del traffico (decremento dei contatori)
  901.            
  902.             // NOTA: se l'integrazione e' null o l'indicazione se la gestione stateless e' null, significa che la PdD non e' ancora riuscita
  903.             // a capire che tipo di gestione deve adottare. Queste transazioni devono essere sempre registrate perche' riguardano cooperazioni andate in errore all'inizio,
  904.             // es. Porta Delegata non esistente, busta malformata....
  905.             if(info.getIntegrazione()!=null &&
  906.                     info.getIntegrazione().isGestioneStateless()!=null &&
  907.                     !info.getIntegrazione().isGestioneStateless().booleanValue() &&
  908.                 !this.openspcoopProperties.isTransazioniStatefulEnabled()){
  909.                 /**if(this.debug)*/
  910.                 this.logError("["+idTransazione+"] Transazione non registrata, gestione stateful non abilitata");
  911.                 // NOTA: Da fare thread che ripulisce header di trasporto o dump messaggi non associati a transazioni.
  912.                 // La risorsa viene rilasciata nel finally
  913.                 /**this._releaseResources(transaction, idTransazione, context);*/
  914.                
  915.                 // se non devo tracciare su db ma ho avuto un errore su file trace devo registrarlo
  916.                 if(fileTraceException!=null) {
  917.                     throw fileTraceException;
  918.                 }
  919.                
  920.                 return;
  921.             }
  922.            
  923.            
  924.            
  925.            
  926.            
  927.    
  928.            
  929.            
  930.             // ### Gestione Transazione ###
  931.    
  932.             boolean autoCommit = true;
  933.             DBTransazioniManager dbManager = null;
  934.             Resource resource = null;
  935.             Connection connection = null;
  936.             boolean errore = false;
  937.             boolean registraTracciaRichiesta = (FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && info.getTransazioneDaAggiornare()==null)
  938.                     ||
  939.                     (FaseTracciamento.OUT_RESPONSE.equals(this.fase));
  940.             boolean registraTracciaRichiestaInfoTransazione = false;
  941.             boolean registraTracciaRisposta = (FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && info.getTransazioneDaAggiornare()==null)
  942.                     ||
  943.                     (FaseTracciamento.OUT_RESPONSE.equals(this.fase));
  944.             boolean registraTracciaRispostaInfoTransazione = false;
  945.             boolean registrazioneMessaggiDiagnostici = true;
  946.             boolean registrazioneDumpMessaggi = true;
  947.             boolean insertTransazione = false;
  948.             try {
  949.                

  950.                    
  951.                 /* ---- Recupero informazioni sulla modalita' di salvataggio delle tracce ----- */
  952.    
  953.                 String informazioneTracciaRichiestaDaSalvare = null;
  954.                 String informazioneTracciaRispostaDaSalvare = null;
  955.                 HashMap<DiagnosticColumnType, String> informazioniDiagnosticiDaSalvare = null;
  956.                 try {
  957.                     if(times!=null) {
  958.                         timeStart = DateManager.getTimeMillis();
  959.                     }
  960.                    
  961.                     // TRACCIA RICHIESTA
  962.                     if(
  963.                             registraTracciaRichiesta
  964.                             &&
  965.                             this.salvataggioTracceManager!=null) {
  966.                        
  967.                         registraTracciaRichiestaInfoTransazione = true;
  968.                        
  969.                         StatoSalvataggioTracce statoTracciaRichiesta =  
  970.                                 this.salvataggioTracceManager.getInformazioniSalvataggioTracciaRichiesta(this.log, info, transaction, transazioneDTO, pddStateless);
  971.                         if(statoTracciaRichiesta!=null) {
  972.                             registraTracciaRichiesta = (!statoTracciaRichiesta.isCompresso());
  973.                             informazioneTracciaRichiestaDaSalvare = statoTracciaRichiesta.getInformazioneCompressa();
  974.                         }
  975.                         if(this.debug){
  976.                             this.logDebug("["+idTransazione+"] Emissione traccia richiesta: "+registraTracciaRichiesta);
  977.                             if(statoTracciaRichiesta!=null) {
  978.                                 this.logDebug("["+idTransazione+"] Informazioni Salvataggio traccia richiesta (compresso:"+statoTracciaRichiesta.isCompresso()+
  979.                                         " errore:"+statoTracciaRichiesta.isErrore()+"): "+statoTracciaRichiesta.getInformazione());
  980.                             }
  981.                         }
  982.                         else{
  983.                             if(statoTracciaRichiesta!=null && statoTracciaRichiesta.isErrore()){
  984.                                     this.logWarn("["+idTransazione+"] Informazioni Salvataggio traccia richiesta in errore: "+statoTracciaRichiesta.getInformazione());
  985.                             }
  986.                         }
  987.                     }
  988.                    
  989.                     // TRACCIA RISPOSTA
  990.                     if(
  991.                             registraTracciaRisposta
  992.                             &&
  993.                             this.salvataggioTracceManager!=null) {
  994.                        
  995.                         registraTracciaRispostaInfoTransazione = true;
  996.                        
  997.                         StatoSalvataggioTracce statoTracciaRisposta =  
  998.                                 this.salvataggioTracceManager.getInformazioniSalvataggioTracciaRisposta(this.log, info, transaction, transazioneDTO, pddStateless);
  999.                         if(statoTracciaRisposta!=null) {
  1000.                             registraTracciaRisposta = (!statoTracciaRisposta.isCompresso());
  1001.                             informazioneTracciaRispostaDaSalvare = statoTracciaRisposta.getInformazioneCompressa();
  1002.                         }
  1003.                         if(this.debug){
  1004.                             this.logDebug("["+idTransazione+"] Emissione traccia risposta: "+registraTracciaRisposta);
  1005.                             if(statoTracciaRisposta!=null) {
  1006.                                 this.logDebug("["+idTransazione+"] Informazioni Salvataggio traccia risposta (compresso:"+statoTracciaRisposta.isCompresso()+
  1007.                                         " errore:"+statoTracciaRisposta.isErrore()+"): "+statoTracciaRisposta.getInformazione());
  1008.                             }
  1009.                         }
  1010.                         else{
  1011.                             if(statoTracciaRisposta!=null && statoTracciaRisposta.isErrore()){
  1012.                                     this.logWarn("["+idTransazione+"] Informazioni Salvataggio traccia risposta in errore: "+statoTracciaRisposta.getInformazione());
  1013.                             }
  1014.                         }
  1015.                     }
  1016.        
  1017.                     // MESSAGGI DIAGNOSTICI
  1018.                     if(this.salvataggioDiagnosticiManager!=null) {
  1019.                         StatoSalvataggioDiagnostici statoDiagnostici =  
  1020.                                 this.salvataggioDiagnosticiManager.getInformazioniSalvataggioDiagnostici(this.log, info, transaction, transazioneDTO, pddStateless);
  1021.                         if(statoDiagnostici!=null) {
  1022.                             registrazioneMessaggiDiagnostici = (!statoDiagnostici.isCompresso());
  1023.                             informazioniDiagnosticiDaSalvare = statoDiagnostici.getInformazioneCompressa();
  1024.                         }
  1025.                         if(this.debug){
  1026.                             this.logDebug("["+idTransazione+"] Emissione diagnostici: "+registrazioneMessaggiDiagnostici);
  1027.                             if(statoDiagnostici!=null) {
  1028.                                 this.logDebug("["+idTransazione+"] Informazioni Salvataggio diagnostici (compresso:"+statoDiagnostici.isCompresso()+
  1029.                                         " errore :"+statoDiagnostici.isErrore()+"): "+statoDiagnostici.getInformazione());
  1030.                             }
  1031.                         }
  1032.                         else{
  1033.                             if(statoDiagnostici!=null && statoDiagnostici.isErrore()){
  1034.                                     this.logWarn("["+idTransazione+"] Informazioni Salvataggio diagnostici in errore: "+statoDiagnostici.getInformazione());
  1035.                             }
  1036.                         }
  1037.                         if(registrazioneMessaggiDiagnostici && !FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
  1038.                             registrazioneMessaggiDiagnostici = false; // con salvataggioDiagnosticiManager si scrivono nella tabella msgdiagnostici solo in fondo
  1039.                         }
  1040.                     }
  1041.                 }finally {
  1042.                     if(times!=null) {
  1043.                         long timeEnd =  DateManager.getTimeMillis();
  1044.                         long timeProcess = timeEnd-timeStart;
  1045.                         times.processTransactionInfo = timeProcess;
  1046.                     }
  1047.                 }
  1048.                
  1049.                 // IMPOSTO INFORMAZIONI IN TRANSAZIONE DTO
  1050.                
  1051.                 // ** dati tracce **
  1052.                 transazioneDTO.setTracciaRichiesta(informazioneTracciaRichiestaDaSalvare);
  1053.                 transazioneDTO.setTracciaRisposta(informazioneTracciaRispostaDaSalvare);
  1054.                
  1055.                 // ** dati diagnostica **
  1056.                 if(informazioniDiagnosticiDaSalvare!=null){
  1057.                     transazioneDTO.setDiagnostici(informazioniDiagnosticiDaSalvare.get(DiagnosticColumnType.META_INF));
  1058.                     transazioneDTO.setDiagnosticiList1(informazioniDiagnosticiDaSalvare.get(DiagnosticColumnType.LIST1));
  1059.                     transazioneDTO.setDiagnosticiList2(informazioniDiagnosticiDaSalvare.get(DiagnosticColumnType.LIST2));
  1060.                     transazioneDTO.setDiagnosticiListExt(informazioniDiagnosticiDaSalvare.get(DiagnosticColumnType.LIST_EXT));
  1061.                     transazioneDTO.setDiagnosticiExt(informazioniDiagnosticiDaSalvare.get(DiagnosticColumnType.EXT));
  1062.                 }
  1063.    
  1064.                
  1065.                 // DUMP
  1066.                
  1067.                 boolean registrazioneContenuti = false;
  1068.                 for(int i=0; i<transaction.sizeMessaggi(); i++){
  1069.                     Messaggio messaggio = transaction.getMessaggio(i);
  1070.                     if(!messaggio.isStored()) {
  1071.                         registrazioneContenuti=true;
  1072.                         break;
  1073.                     }
  1074.                 }
  1075.                
  1076.                 // CONTENUTI
  1077.                 boolean registrazioneRisorse = transaction.getTransactionServiceLibrary()!=null || (transaction.getRisorse()!=null && !transaction.getRisorse().isEmpty()); /**transaction.sizeMessaggi()>0;*/
  1078.                
  1079.    
  1080.                 // AUTO-COMMIT
  1081.                 if(registraTracciaRichiesta || registraTracciaRisposta || registrazioneMessaggiDiagnostici ||  registrazioneContenuti || registrazioneRisorse){
  1082.                     autoCommit = false; // devo registrare piu' informazioni oltre alla transazione
  1083.                 }
  1084.                 if(this.debug)
  1085.                     this.logSqlDebug("["+idTransazione+"] AutoCommit: "+this.debug);
  1086.    
  1087.    
  1088.                
  1089.                
  1090.                
  1091.                
  1092.                
  1093.                 // Dopo aver assegnato tutti i valori all'oggetto transazione, in modo da poterlo salvare su filesystem
  1094.                 if(
  1095.                         (FaseTracciamento.OUT_REQUEST.equals(this.fase) && this.openspcoopProperties.isTransazioniTracciamentoDBOutRequestThrowRequestException() )
  1096.                         ||
  1097.                         (FaseTracciamento.OUT_RESPONSE.equals(this.fase) && this.openspcoopProperties.isTransazioniTracciamentoDBOutResponseThrowRequestException() )
  1098.                         ||
  1099.                         (FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) &&
  1100.                                 (
  1101.                                         this.openspcoopProperties.isTransazioniTracciamentoDBPostOutResponseThrowRequestException()
  1102.                                         ||
  1103.                                         this.openspcoopProperties.isTransazioniTracciamentoDBPostOutResponseThrowResponseException()
  1104.                                 )
  1105.                         )
  1106.                     ) {
  1107.                     throwTrackingExceptionIfExists(info);
  1108.                 }
  1109.                
  1110.                
  1111.                
  1112.                
  1113.    
  1114.    
  1115.    
  1116.                 /* ---- Connection/Service Manager ----- */
  1117.    
  1118.                 if(this.debug)
  1119.                     this.logSqlDebug("["+idTransazione+"] recupero jdbcServiceManager in corso ...");

  1120.                
  1121.                 // Ottiene la connessione al db
  1122.                 try {
  1123.                     if(times!=null) {
  1124.                         timeStart = DateManager.getTimeMillis();
  1125.                     }
  1126.                     dbManager = DBTransazioniManager.getInstance();
  1127.                     resource = dbManager.getResource(idDominio, modulo, idTransazione);
  1128.                 }finally {
  1129.                     if(times!=null) {
  1130.                         long timeEnd =  DateManager.getTimeMillis();
  1131.                         long timeProcess = timeEnd-timeStart;
  1132.                         times.getConnection = timeProcess;
  1133.                     }
  1134.                 }
  1135.                 if(resource==null){
  1136.                     throw new CoreException("Risorsa al database non disponibile");
  1137.                 }
  1138.                 connection = (Connection) resource.getResource();
  1139.                 if(connection == null)
  1140.                     throw new CoreException("Connessione non disponibile");

  1141.                 if(!autoCommit){
  1142.                     connection.setAutoCommit(false);
  1143.                 }
  1144.                 org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager jdbcServiceManager =
  1145.                         (org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager)
  1146.                         this.daoFactory.getServiceManager(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance(),
  1147.                                 connection, autoCommit,
  1148.                                 this.daoFactoryServiceManagerPropertiesTransazioni, this.daoFactoryLoggerTransazioni);
  1149.                 jdbcServiceManager.getJdbcProperties().setShowSql(this.debug);
  1150.                 ITransazioneService transazioneService = jdbcServiceManager.getTransazioneService();
  1151.                 if(this.debug)
  1152.                     this.logSqlDebug("["+idTransazione+"] recupero jdbcServiceManager effettuato");
  1153.    
  1154.                 /**System.out.println("\n\n\n****** ["+this.fase+"]["+transazioneDTO.getIdTransazione()+"] (autoCommit:"+autoCommit+") ["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] *******");*/
  1155.                
  1156.    

  1157.    
  1158.                 /* ---- Inserimento dati transazione ----- */
  1159.    
  1160.                 // Inserisco transazione
  1161.                 if(this.debug)
  1162.                     this.logDebug("["+idTransazione+"] inserimento transazione in corso ...");
  1163.                
  1164.                 try {
  1165.                     if(times!=null) {
  1166.                         timeStart = DateManager.getTimeMillis();
  1167.                     }
  1168.                     insertTransazione = registraTransazione(transazioneDTO,
  1169.                             transazioneService, info,
  1170.                             autoCommit, registraTracciaRichiestaInfoTransazione, registraTracciaRispostaInfoTransazione);
  1171.                 }finally {
  1172.                     if(times!=null) {
  1173.                         long timeEnd =  DateManager.getTimeMillis();
  1174.                         long timeProcess = timeEnd-timeStart;
  1175.                         times.insertTransaction = timeProcess;
  1176.                     }
  1177.                 }
  1178.                 if(this.debug)
  1179.                     this.logDebug("["+idTransazione+"] inserita transazione");
  1180.    

  1181.    
  1182.    
  1183.    
  1184.                 /* ---- Inserimento dati tracce ----- */
  1185.                
  1186.                 List<Traccia> tracceSalvate = new ArrayList<>();
  1187.                 try {
  1188.                     timeStart = -1;
  1189.                    
  1190.                     if(
  1191.                             !FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)
  1192.                             &&
  1193.                             (
  1194.                                     (registraTracciaRichiesta && transaction.getTracciaRichiesta()!=null)
  1195.                                     ||
  1196.                                     (registraTracciaRisposta && transaction.getTracciaRisposta()!=null)
  1197.                             )
  1198.                         ){
  1199.                         initTracciamento(this.tipoDatabaseRuntime, this.usePdDConnection);
  1200.                     }
  1201.                    
  1202.                     if( registraTracciaRichiesta && transaction.getTracciaRichiesta()!=null){
  1203.                         if(times!=null) {
  1204.                             timeStart = DateManager.getTimeMillis();
  1205.                         }
  1206.                         if(transaction.getTracciaRichiesta().isStored()) {
  1207.                             if(this.debug)
  1208.                                 this.logDebug("["+idTransazione+"] registrazione traccia richiesta skipped");
  1209.                         }
  1210.                         else {
  1211.                             if(this.debug)
  1212.                                 this.logDebug("["+idTransazione+"] registrazione traccia richiesta...");
  1213.                             /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] INSERT TRACCIA RICHIESTA");*/
  1214.                             this.tracciamentoOpenSPCoopAppender.log(connection, transaction.getTracciaRichiesta());
  1215.                             if(this.debug)
  1216.                                 this.logDebug("["+idTransazione+"] registrazione traccia richiesta completata");
  1217.                             if(autoCommit) {
  1218.                                 transaction.getTracciaRichiesta().setStored(true);
  1219.                             }
  1220.                             else {
  1221.                                 tracceSalvate.add(transaction.getTracciaRichiesta());
  1222.                             }
  1223.                         }
  1224.                     }  
  1225.                     if( registraTracciaRisposta && transaction.getTracciaRisposta()!=null){
  1226.                         if(times!=null && timeStart==-1) {
  1227.                             timeStart = DateManager.getTimeMillis();
  1228.                         }
  1229.                         if(transaction.getTracciaRisposta().isStored()) {
  1230.                             if(this.debug)
  1231.                                 this.logDebug("["+idTransazione+"] registrazione traccia richiesta skipped");
  1232.                         }
  1233.                         else {
  1234.                             if(this.debug)
  1235.                                 this.logDebug("["+idTransazione+"] registrazione traccia risposta...");
  1236.                             /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] INSERT TRACCIA RISPOSTA");*/
  1237.                             this.tracciamentoOpenSPCoopAppender.log(connection, transaction.getTracciaRisposta());
  1238.                             if(this.debug)
  1239.                                 this.logDebug("["+idTransazione+"] registrazione traccia risposta completata");
  1240.                             if(autoCommit) {
  1241.                                 transaction.getTracciaRisposta().setStored(true);
  1242.                             }
  1243.                             else {
  1244.                                 tracceSalvate.add(transaction.getTracciaRisposta());
  1245.                             }
  1246.                         }
  1247.                     }  
  1248.                 }finally {
  1249.                     if(times!=null && timeStart>0) {
  1250.                         long timeEnd =  DateManager.getTimeMillis();
  1251.                         long timeProcess = timeEnd-timeStart;
  1252.                         times.insertTrace = timeProcess;
  1253.                     }
  1254.                 }
  1255.    
  1256.    

  1257.    
  1258.    
  1259.                 /* ---- Inserimento messaggi diagnostici ----- */
  1260.                
  1261.                 List<MsgDiagnostico> diagnosticiSalvati = new ArrayList<>();
  1262.                 try {
  1263.                     timeStart = -1;
  1264.                     if(registrazioneMessaggiDiagnostici){
  1265.                        
  1266.                         if(!FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
  1267.                             initDiagnostica(this.tipoDatabaseRuntime, this.usePdDConnection);
  1268.                         }
  1269.                        
  1270.                         if(times!=null && transaction!=null && transaction.sizeMsgDiagnostici()>0) {
  1271.                             timeStart = DateManager.getTimeMillis();
  1272.                         }
  1273.                         for(int i=0; i<transaction.sizeMsgDiagnostici(); i++){
  1274.                             MsgDiagnostico msgDiagnostico = transaction.getMsgDiagnostico(i);
  1275.                             if(msgDiagnostico.isStored()) {
  1276.                                 if(this.debug)
  1277.                                     this.logDebug("["+idTransazione+"] registrazione diagnostico con codice ["+msgDiagnostico.getCodice()+"] skipped");
  1278.                                 continue;
  1279.                             }
  1280.                             if(msgDiagnostico.getIdSoggetto()==null){
  1281.                                 msgDiagnostico.setIdSoggetto(idDominio);
  1282.                             }
  1283.                             if(this.debug)
  1284.                                 this.logDebug("["+idTransazione+"] registrazione diagnostico con codice ["+msgDiagnostico.getCodice()+"] ...");
  1285.                             /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] INSERT DIAG ["+msgDiagnostico.getCodice()+"]");*/
  1286.                             this.msgDiagnosticiOpenSPCoopAppender.log(connection,msgDiagnostico);
  1287.                             if(this.debug)
  1288.                                 this.logDebug("["+idTransazione+"] registrazione diagnostico con codice ["+msgDiagnostico.getCodice()+"] completata");
  1289.                             if(autoCommit) {
  1290.                                 msgDiagnostico.setStored(true);
  1291.                             }
  1292.                             else {
  1293.                                 diagnosticiSalvati.add(msgDiagnostico);
  1294.                             }
  1295.                         }
  1296.                     }
  1297.                 }finally {
  1298.                     if(times!=null && timeStart>0) {
  1299.                         long timeEnd =  DateManager.getTimeMillis();
  1300.                         long timeProcess = timeEnd-timeStart;
  1301.                         times.insertDiagnostics = timeProcess;
  1302.                     }
  1303.                 }
  1304.    
  1305.                
  1306.                

  1307.                
  1308.                
  1309.                
  1310.                 /* ---- Inserimento dump ----- */
  1311.                
  1312.                 List<Messaggio> messaggiSalvati = new ArrayList<>();
  1313.                 try {
  1314.                     timeStart = -1;
  1315.                     if(times!=null && transaction!=null && transaction.sizeMessaggi()>0) {
  1316.                         timeStart = DateManager.getTimeMillis();
  1317.                     }
  1318.                     for(int i=0; i<transaction.sizeMessaggi(); i++){
  1319.                         Messaggio messaggio = transaction.getMessaggio(i);
  1320.                         if(messaggio.isStored()) {
  1321.                             if(this.debug)
  1322.                                 this.logDebug("["+idTransazione+"] registrazione messaggio di tipo ["+messaggio.getTipoMessaggio()+"] skipped");
  1323.                             continue;
  1324.                         }
  1325.                         try {
  1326.                             if(!FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
  1327.                                 initDump(this.tipoDatabaseRuntime, this.usePdDConnection);
  1328.                             }                          
  1329.                            
  1330.                             if(messaggio.getProtocollo()==null) {
  1331.                                 messaggio.setProtocollo(transazioneDTO.getProtocollo());
  1332.                             }
  1333.                             if(messaggio.getDominio()==null) {
  1334.                                 messaggio.setDominio(idDominio);
  1335.                             }
  1336.                             if(messaggio.getTipoPdD()==null) {
  1337.                                 messaggio.setTipoPdD(info.getTipoPorta());
  1338.                             }
  1339.                             if(messaggio.getIdFunzione()==null) {
  1340.                                 messaggio.setIdFunzione(modulo);
  1341.                             }
  1342.                             if(messaggio.getIdBusta()==null &&
  1343.                                 info.getProtocollo()!=null) {
  1344.                                 messaggio.setIdBusta(info.getProtocollo().getIdRichiesta());
  1345.                             }
  1346.                             if(messaggio.getFruitore()==null &&
  1347.                                 info.getProtocollo()!=null) {
  1348.                                 messaggio.setFruitore(info.getProtocollo().getFruitore());
  1349.                             }
  1350.                             if(messaggio.getServizio()==null &&
  1351.                                 info.getProtocollo()!=null) {
  1352.                                 IDServizio idServizio = IDServizioFactory.getInstance().
  1353.                                         getIDServizioFromValuesWithoutCheck(info.getProtocollo().getTipoServizio(),
  1354.                                                 info.getProtocollo().getServizio(),
  1355.                                                 info.getProtocollo().getErogatore()!=null ? info.getProtocollo().getErogatore().getTipo() : null,
  1356.                                                 info.getProtocollo().getErogatore()!=null ? info.getProtocollo().getErogatore().getNome() : null,
  1357.                                                 info.getProtocollo().getVersioneServizio()!=null ? info.getProtocollo().getVersioneServizio() : -1);
  1358.                                 messaggio.setServizio(idServizio);
  1359.                             }
  1360.                             if(this.debug)
  1361.                                 this.logDebug("["+idTransazione+"] registrazione messaggio di tipo ["+messaggio.getTipoMessaggio()+"] ...");
  1362.                             /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] INSERT MESSAGGIO ["+messaggio.getTipoMessaggio()+"]");*/
  1363.                             this.dumpOpenSPCoopAppender.dump(connection,messaggio,this.transazioniRegistrazioneDumpHeadersCompactEnabled);
  1364.                             if(this.debug)
  1365.                                 this.logDebug("["+idTransazione+"] registrazione messaggio di tipo ["+messaggio.getTipoMessaggio()+"] completata");
  1366.                             if(autoCommit) {
  1367.                                 messaggio.setStored(true);
  1368.                             }
  1369.                             else {
  1370.                                 messaggiSalvati.add(messaggio);
  1371.                             }
  1372.                         }finally {
  1373.                             try {
  1374.                                 if(messaggio.getBody()!=null) {
  1375.                                     messaggio.getBody().unlock();
  1376.                                     messaggio.getBody().clearResources();
  1377.                                 }
  1378.                             }catch(Exception t){
  1379.                                 this.logError("["+idTransazione+"] errore durante il rilascio delle risorse del messaggio: "+t.getMessage(),t);
  1380.                             }
  1381.                         }
  1382.                     }
  1383.                 }finally {
  1384.                     if(times!=null && timeStart>0) {
  1385.                         long timeEnd =  DateManager.getTimeMillis();
  1386.                         long timeProcess = timeEnd-timeStart;
  1387.                         times.insertContents = timeProcess;
  1388.                     }
  1389.                 }

  1390.                
  1391.                
  1392.                
  1393.                 /* ---- Inserimento risorse contenuti (library personalizzata) ----- */
  1394.                
  1395.                 if(registrazioneRisorse){
  1396.                     /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] RISORSE");*/
  1397.                     try {
  1398.                         if(times!=null) {
  1399.                             timeStart = DateManager.getTimeMillis();
  1400.                         }
  1401.                         IDumpMessaggioService dumpMessageService = jdbcServiceManager.getDumpMessaggioService();
  1402.                         ContenutiUtilities contenutiUtilities = new ContenutiUtilities(this.log);
  1403.                         contenutiUtilities.insertContenuti(transazioneDTO,
  1404.                                 transaction.getTracciaRichiesta(), transaction.getTracciaRisposta(),
  1405.                                 transaction.getMsgDiagnostici(),
  1406.                                 dumpMessageService, transaction.getRisorse(), transaction.getTransactionServiceLibrary(), this.daoFactory);
  1407.                     }finally {
  1408.                         if(times!=null) {
  1409.                             long timeEnd =  DateManager.getTimeMillis();
  1410.                             long timeProcess = timeEnd-timeStart;
  1411.                             times.insertResources = timeProcess;
  1412.                         }
  1413.                     }
  1414.                 }
  1415.    
  1416.                
  1417.                 String hdrTest = this.openspcoopProperties.getTransazioniTestsuiteManuallyFaultHeaderDBBeforeCommit();
  1418.                 if(hdrTest!=null && requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getHeaderFirstValue(hdrTest)!=null &&
  1419.                         this.fase.name().equals(requestInfo.getProtocolContext().getHeaderFirstValue(hdrTest))) {
  1420.                     throw new CoreException("Test Manually Exception generated in phase '"+this.fase+"'");
  1421.                 }
  1422.                
  1423.    
  1424.                 // COMMIT
  1425.                 if(!autoCommit) {
  1426.                     try {
  1427.                         if(times!=null) {
  1428.                             timeStart = DateManager.getTimeMillis();
  1429.                         }
  1430.                         connection.commit();
  1431.                        
  1432.                         if(!tracceSalvate.isEmpty()) {
  1433.                             for (Traccia traccia : tracceSalvate) {
  1434.                                 traccia.setStored(true);
  1435.                             }
  1436.                         }
  1437.                         if(!diagnosticiSalvati.isEmpty()) {
  1438.                             for (MsgDiagnostico msgDiagnostico : diagnosticiSalvati) {
  1439.                                 msgDiagnostico.setStored(true);
  1440.                             }
  1441.                         }
  1442.                         if(!messaggiSalvati.isEmpty()) {
  1443.                             for (Messaggio messaggio : messaggiSalvati) {
  1444.                                 messaggio.setStored(true);
  1445.                             }
  1446.                         }
  1447.                        
  1448.                     }finally {
  1449.                         if(times!=null) {
  1450.                             long timeEnd =  DateManager.getTimeMillis();
  1451.                             long timeProcess = timeEnd-timeStart;
  1452.                             times.commit = timeProcess;
  1453.                         }
  1454.                     }
  1455.                 }
  1456.                
  1457.                
  1458.                 // DOPO COMMIT RIUSCITO
  1459.                 if(!autoCommit && insertTransazione &&
  1460.                     !FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
  1461.                     addTransactionAlreadyRegistered(info);
  1462.                 }
  1463.    
  1464.    
  1465.             } catch (SQLException sqlEx) {
  1466.                 errore = true;
  1467.                 try{
  1468.                     if(!autoCommit &&
  1469.                         connection!=null) {
  1470.                         connection.rollback();
  1471.                     }
  1472.                 }catch(Exception eRollback){
  1473.                     // ignore
  1474.                 }
  1475.                 // Effettuo il log anche nel core per evitare che un eventuale filtro a OFF sul core della PdD eviti la scrittura di questi errori
  1476.                 String msg = "Errore durante la scrittura della transazione sul database (sql): " + sqlEx.getLocalizedMessage();
  1477.                 this.logError("["+idTransazione+"] "+msg,sqlEx);
  1478.                 if(!FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
  1479.                     logRegistrazioneNonRiuscita(msgdiagErrore, false, sqlEx, idTransazione,
  1480.                             null, null, null);
  1481.                 }
  1482.                 HandlerException errorDB = new HandlerException(msg,sqlEx);
  1483.                 addTrackingException(info, errorDB);
  1484.                 if(dbEnabledBloccante) {
  1485.                     throw errorDB;
  1486.                 }
  1487.             }  catch (Exception e) {
  1488.                 errore = true;
  1489.                 try{
  1490.                     if(!autoCommit &&
  1491.                         connection!=null) {
  1492.                         connection.rollback();
  1493.                     }
  1494.                 }catch(Exception eRollback){
  1495.                     // ignore
  1496.                 }
  1497.                 // Effettuo il log anche nel core per evitare che un eventuale filtro a OFF sul core della PdD eviti la scrittura di questi errori
  1498.                 String msg = "Errore durante la scrittura della transazione sul database: " + e.getLocalizedMessage();
  1499.                 this.logError("["+idTransazione+"] "+msg,e);
  1500.                 if(!FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
  1501.                     logRegistrazioneNonRiuscita(msgdiagErrore, false, e, idTransazione,
  1502.                             null, null, null);
  1503.                 }
  1504.                 HandlerException errorDB = new HandlerException(msg,e);
  1505.                 addTrackingException(info, errorDB);
  1506.                 if(dbEnabledBloccante) {
  1507.                     throw errorDB;
  1508.                 }
  1509.             } finally {
  1510.                
  1511.                 // Ripristino Autocomit
  1512.                 try {
  1513.                     if(!autoCommit &&
  1514.                         connection!=null) {
  1515.                         connection.setAutoCommit(true);
  1516.                     }
  1517.                 } catch (Exception e) {
  1518.                     // ignore
  1519.                 }
  1520.                                    
  1521.                 // Chiusura della connessione al database
  1522.                 try {
  1523.                     if(resource!=null)
  1524.                         dbManager.releaseResource(idDominio, modulo, resource);
  1525.                 } catch (Exception e) {
  1526.                     // ignore
  1527.                 }
  1528.                
  1529.                 // Registrazione su FileSystem informazioni se la gestione e' andata in errore
  1530.                 if(errore && FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
  1531.                    
  1532.                     try {
  1533.                         exceptionSerializerFileSystem.registrazioneFileSystemDiagnosticiTracceDumpEmessiPdD(transaction, idTransazione, transazioneDTO,
  1534.                                 registraTracciaRichiesta, registraTracciaRisposta, registrazioneMessaggiDiagnostici, registrazioneDumpMessaggi);
  1535.                     } catch (Exception e) {
  1536.                         // ignore
  1537.                     }
  1538.                     try {
  1539.                         exceptionSerializerFileSystem.registrazioneFileSystem(transazioneDTO, idTransazione);
  1540.                     } catch (Exception e) {
  1541.                         // ignore
  1542.                     }
  1543.                 }
  1544.                                
  1545.             }
  1546.                        
  1547.         }finally{

  1548.             this.releaseResourcesEngine(transaction, idTransazione, info);
  1549.                        
  1550.         }
  1551.        
  1552.        
  1553.         if(fileTraceException!=null) {
  1554.             throw fileTraceException;
  1555.         }
  1556.     }

  1557.     private ConfigurazioneTracciamento getConfigurazioneTracciamento(String idTransazione, Context context, TipoPdD tipoPorta, Transaction transaction){
  1558.        
  1559.         if(context!=null) {
  1560.             // nop
  1561.         }
  1562.        
  1563.         ConfigurazioneTracciamento configurazioneTracciamento = null;
  1564.         try {
  1565.             if(transaction!=null && transaction.getRequestInfo()!=null &&
  1566.                     transaction.getRequestInfo().getProtocolContext()!=null &&
  1567.                     transaction.getRequestInfo().getProtocolContext().getInterfaceName()!=null) {
  1568.                 switch (tipoPorta) {
  1569.                 case DELEGATA:
  1570.                     IDPortaDelegata idPD = new IDPortaDelegata();
  1571.                     idPD.setNome(transaction.getRequestInfo().getProtocolContext().getInterfaceName());
  1572.                     PortaDelegata pd = this.configPdDManager.getPortaDelegataSafeMethod(idPD, transaction.getRequestInfo());
  1573.                     configurazioneTracciamento = new ConfigurazioneTracciamento(this.log, this.configPdDManager, pd);
  1574.                     break;
  1575.                 case APPLICATIVA:
  1576.                     IDPortaApplicativa idPA = new IDPortaApplicativa();
  1577.                     idPA.setNome(transaction.getRequestInfo().getProtocolContext().getInterfaceName());
  1578.                     PortaApplicativa pa = this.configPdDManager.getPortaApplicativaSafeMethod(idPA, transaction.getRequestInfo());
  1579.                     configurazioneTracciamento = new ConfigurazioneTracciamento(this.log, this.configPdDManager, pa);
  1580.                     break;
  1581.                 default:
  1582.                     break;
  1583.                 }
  1584.             }
  1585.             if(configurazioneTracciamento==null) {
  1586.                 configurazioneTracciamento = new ConfigurazioneTracciamento(this.log, this.configPdDManager,tipoPorta);
  1587.             }
  1588.         }catch(Exception e) {
  1589.             this.logDebug("["+idTransazione+"] Errore avvenuto durante la lettura della configurazione del tracciamento: "+e.getMessage(),e);
  1590.         }
  1591.         return configurazioneTracciamento;
  1592.     }
  1593.    
  1594.     private void releaseResourcesEngine(Transaction transactionParam, String idTransazione, InformazioniTransazione info) {
  1595.        
  1596.         if(!FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)) {
  1597.             return;
  1598.         }
  1599.        
  1600.         if(transactionParam!=null) {
  1601.             // nop
  1602.         }
  1603.        
  1604.         Transaction transaction = null;
  1605.         try {
  1606.             transaction = TransactionContext.removeTransaction(idTransazione);
  1607.             if(transaction!=null) {
  1608.                 transaction.setDeleted();
  1609.             }
  1610.             // altrimenti e' gia' stata eliminata
  1611.         } catch (Exception e) {
  1612.             this.logError("["+idTransazione+"] Errore durante la rimozione della registrazione delle transazione",e);
  1613.         }
  1614.            
  1615.         /* ---- Elimino informazione per filtro duplicati ----- */
  1616.         if(info!=null && info.getProtocollo()!=null){
  1617.             // Aggiunto check Applicativa e Delegata per evitare che comunicazioni dove i due domini sono entrambi gestiti sul solito GovWay si eliminano a vicenda gli id.
  1618.             if(TipoPdD.APPLICATIVA.equals(info.getTipoPorta()) && info.getProtocollo().getIdRichiesta()!=null){
  1619.                 try {
  1620.                     TransactionContext.removeIdentificativoProtocollo(info.getProtocollo().getIdRichiesta());
  1621.                 } catch (Exception e) {
  1622.                     this.logError("["+idTransazione+"] Errore durante la rimozione della registrazione dell'identificativo di protocollo della richiesta ["+info.getProtocollo().getIdRichiesta()+"]",e);
  1623.                 }
  1624.             }
  1625.             if(TipoPdD.DELEGATA.equals(info.getTipoPorta()) && info.getProtocollo().getIdRisposta()!=null){
  1626.                 try {
  1627.                     TransactionContext.removeIdentificativoProtocollo(info.getProtocollo().getIdRisposta());
  1628.                 } catch (Exception e) {
  1629.                     this.logError("["+idTransazione+"] Errore durante la rimozione della registrazione dell'identificativo di protocollo della risposta ["+info.getProtocollo().getIdRisposta()+"]",e);
  1630.                 }
  1631.             }
  1632.         }
  1633.        
  1634.     }
  1635.    
  1636.     private HandlerException logWithFileTrace(File fileTraceConfig, boolean fileTraceConfigGlobal,
  1637.             TransazioniProcessTimes times,
  1638.             Transazione transazioneDTO, Transaction transaction, EsitoTransazione esito,
  1639.             InformazioniToken informazioniToken,
  1640.             InformazioniAttributi informazioniAttributi,
  1641.             InformazioniNegoziazioneToken informazioniNegoziazioneToken,
  1642.             SecurityToken securityToken,
  1643.             InformazioniTransazione info,
  1644.             java.util.Map<String, List<String>> headerInUscita,
  1645.             RequestInfo requestInfo,
  1646.             String idTransazione,
  1647.             boolean fileTraceEnabledBloccante,
  1648.             org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore,
  1649.             boolean existsAnotherFiletraceTrackingPhase) {
  1650.         FileTraceManager fileTraceManager = null;
  1651.         long timeStart = -1;
  1652.         try {
  1653.             if(times!=null) {
  1654.                 timeStart = DateManager.getTimeMillis();
  1655.             }
  1656.             FileTraceConfig config = FileTraceConfig.getConfig(fileTraceConfig, fileTraceConfigGlobal);
  1657.             fileTraceManager = new FileTraceManager(this.log, config);
  1658.             fileTraceManager.buildTransazioneInfo(info.getProtocolFactory(), transazioneDTO, transaction,
  1659.                     informazioniToken,
  1660.                     informazioniAttributi,
  1661.                     informazioniNegoziazioneToken,
  1662.                     securityToken,
  1663.                     info.getContext(),
  1664.                     headerInUscita,
  1665.                     this.fase);
  1666.            
  1667.             String hdrTest = this.openspcoopProperties.getTransazioniTestsuiteManuallyFaultHeaderFileTraceBeforeLog();
  1668.             if(hdrTest!=null && requestInfo!=null && requestInfo.getProtocolContext()!=null && requestInfo.getProtocolContext().getHeaderFirstValue(hdrTest)!=null &&
  1669.                     this.fase.name().equals(requestInfo.getProtocolContext().getHeaderFirstValue(hdrTest))) {
  1670.                 throw new CoreException("Test Manually Exception generated (fileTrace) in phase '"+this.fase+"'");
  1671.             }
  1672.            
  1673.             fileTraceManager.invoke(info.getTipoPorta(),
  1674.                     info.getContext(), requestInfo, TransazioneUtilities.convertToBusta(transazioneDTO),
  1675.                     this.fase);
  1676.                        
  1677.         }catch (Throwable e) {
  1678.             String error = "["+idTransazione+"] File trace fallito: "+e.getMessage();
  1679.             this.logError(error,e);
  1680.             BooleanNullable changeEsito = BooleanNullable.NULL();
  1681.             StringBuilder errorLog = new StringBuilder();
  1682.             logRegistrazioneNonRiuscita(msgdiagErrore, true, e, idTransazione,
  1683.                     transaction, changeEsito, errorLog);
  1684.             if(changeEsito.getValue()!=null && changeEsito.getValue().booleanValue()) {
  1685.                 esito = ServicesUtils.updateEsitoConAnomalie(esito, this.log, info.getProtocolFactory());
  1686.                 transazioneDTO.setEsito(esito.getCode());
  1687.                 if(transazioneDTO.getErrorLog()==null) {
  1688.                     transazioneDTO.setErrorLog(errorLog.toString());
  1689.                 }
  1690.             }
  1691.             if(fileTraceEnabledBloccante) {
  1692.                 return new HandlerException(error,e);
  1693.             }
  1694.         }finally {
  1695.             try {
  1696.                 if(!existsAnotherFiletraceTrackingPhase && fileTraceManager!=null) {
  1697.                     fileTraceManager.cleanResourcesForOnlyFileTrace(transaction);
  1698.                 }
  1699.             }catch(Exception eClean) {
  1700.                 this.logError("["+idTransazione+"] File trace 'clean' fallito: "+eClean.getMessage(),eClean);
  1701.             }
  1702.             if(times!=null) {
  1703.                 long timeEnd =  DateManager.getTimeMillis();
  1704.                 long timeProcess = timeEnd-timeStart;
  1705.                 times.fileTrace = timeProcess;
  1706.             }
  1707.         }
  1708.        
  1709.         return null;
  1710.     }
  1711.    
  1712.    
  1713.     private static final MapKey<String> TRACKING_EXCEPTION = org.openspcoop2.utils.Map.newMapKey("TRACKING_EXCEPTION");
  1714.     private static final MapKey<String> TRACKING_EXCEPTION_PHASE = org.openspcoop2.utils.Map.newMapKey("TRACKING_EXCEPTION_PHASE");
  1715.     private void throwTrackingExceptionIfExists(InformazioniTransazione info) throws HandlerException {
  1716.         if(info!=null && info.getContext()!=null && info.getContext().containsKey(TRACKING_EXCEPTION)) {
  1717.             HandlerException e = (HandlerException) info.getContext().get(TRACKING_EXCEPTION);
  1718.             FaseTracciamento faseExc = (FaseTracciamento) info.getContext().get(TRACKING_EXCEPTION_PHASE);
  1719.             String label = null;
  1720.             if(FaseTracciamento.IN_REQUEST.equals(faseExc)) {
  1721.                 label = CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_REQ_IN;
  1722.             }
  1723.             else if(FaseTracciamento.OUT_REQUEST.equals(faseExc)) {
  1724.                 label = CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_REQ_OUT;
  1725.             }
  1726.             else {
  1727.                 label = CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_RES_OUT;
  1728.             }
  1729.             throw new HandlerException("database rilevato non disponibile nella fase '"+label+"': "+e.getMessage(),e);
  1730.         }
  1731.     }
  1732.     private void addTrackingException(InformazioniTransazione info, HandlerException e) {
  1733.         if(info!=null && info.getContext()!=null && !info.getContext().containsKey(TRACKING_EXCEPTION)) {
  1734.             boolean add = false;
  1735.             if (
  1736.                     (
  1737.                         (
  1738.                                 FaseTracciamento.OUT_REQUEST.equals(this.fase)
  1739.                         )
  1740.                         &&
  1741.                         (
  1742.                                 this.openspcoopProperties.isTransazioniTracciamentoDBOutRequestThrowRequestException()
  1743.                         )
  1744.                     )
  1745.                     ||
  1746.                     (
  1747.                         (
  1748.                                 FaseTracciamento.IN_REQUEST.equals(this.fase) ||
  1749.                                 FaseTracciamento.OUT_REQUEST.equals(this.fase)
  1750.                         )
  1751.                         &&
  1752.                         (
  1753.                                 this.openspcoopProperties.isTransazioniTracciamentoDBOutResponseThrowRequestException()
  1754.                                 ||
  1755.                                 this.openspcoopProperties.isTransazioniTracciamentoDBPostOutResponseThrowRequestException()
  1756.                         )
  1757.                     )
  1758.                     ||
  1759.                     (
  1760.                         (
  1761.                                 FaseTracciamento.OUT_RESPONSE.equals(this.fase)
  1762.                         )
  1763.                         &&
  1764.                         (
  1765.                                 this.openspcoopProperties.isTransazioniTracciamentoDBPostOutResponseThrowResponseException()
  1766.                         )
  1767.                     )
  1768.             ){
  1769.                 add = true;
  1770.             }
  1771.             if(add) {
  1772.                 info.getContext().put(TRACKING_EXCEPTION, e);
  1773.                 info.getContext().put(TRACKING_EXCEPTION_PHASE, this.fase);
  1774.             }
  1775.         }
  1776.     }
  1777.    
  1778.    
  1779.     private static final MapKey<String> TRANSACTION_REGISTERED = org.openspcoop2.utils.Map.newMapKey("TRANSACTION_REGISTERED");
  1780.     private boolean isTransactionAlreadyRegistered(InformazioniTransazione info) {
  1781.         return info!=null && info.getContext()!=null && info.getContext().containsKey(TRANSACTION_REGISTERED);
  1782.     }
  1783.     private void addTransactionAlreadyRegistered(InformazioniTransazione info) {
  1784.         if(info!=null && info.getContext()!=null) {
  1785.             info.getContext().put(TRANSACTION_REGISTERED, "true");
  1786.         }
  1787.     }
  1788.     private boolean registraTransazione(Transazione transazioneDTO,
  1789.             ITransazioneService transazioneService, InformazioniTransazione info,
  1790.             boolean autoCommit, boolean registraTracciaRichiestaInfoTransazione, boolean registraTracciaRispostaInfoTransazione) throws ServiceException, NotImplementedException, NotFoundException, ExpressionNotImplementedException, ExpressionException {
  1791.         if(FaseTracciamento.IN_REQUEST.equals(this.fase)
  1792.                 ||
  1793.                 !isTransactionAlreadyRegistered(info)) {
  1794.             /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] INSERT con contesto["+transazioneDTO.getEsitoContesto()+"]");*/
  1795.             transazioneService.create(transazioneDTO);
  1796.             /**
  1797.              * DEVO AGGIUNGERLO DOPO IL COMMIT */
  1798.             if(autoCommit && !FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
  1799.                 addTransactionAlreadyRegistered(info);
  1800.             }
  1801.             return true;
  1802.         }
  1803.         else if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && info.getTransazioneDaAggiornare()!=null){
  1804.             /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] UPDATE PUNTUALE con contesto["+transazioneDTO.getEsitoContesto()+"]");*/
  1805.             List<UpdateField> list = new ArrayList<>();
  1806.             list.add(new UpdateField(Transazione.model().ESITO, transazioneDTO.getEsito()));
  1807.             list.add(new UpdateField(Transazione.model().ESITO_SINCRONO, transazioneDTO.getEsitoSincrono()));
  1808.             list.add(new UpdateField(Transazione.model().ESITO_CONTESTO, transazioneDTO.getEsitoContesto()));
  1809.             list.add(new UpdateField(Transazione.model().CONSEGNE_MULTIPLE_IN_CORSO, transazioneDTO.getConsegneMultipleInCorso()));
  1810.             list.add(new UpdateField(Transazione.model().CODICE_RISPOSTA_USCITA, transazioneDTO.getCodiceRispostaUscita()));
  1811.             list.add(new UpdateField(Transazione.model().EVENTI_GESTIONE, transazioneDTO.getEventiGestione()));
  1812.             list.add(new UpdateField(Transazione.model().DATA_USCITA_RISPOSTA, transazioneDTO.getDataUscitaRisposta()));
  1813.             list.add(new UpdateField(Transazione.model().DATA_USCITA_RISPOSTA_STREAM, transazioneDTO.getDataUscitaRispostaStream()));
  1814.             list.add(new UpdateField(Transazione.model().RISPOSTA_INGRESSO_BYTES, transazioneDTO.getRispostaIngressoBytes()));
  1815.             list.add(new UpdateField(Transazione.model().RISPOSTA_USCITA_BYTES, transazioneDTO.getRispostaUscitaBytes()));
  1816.             list.add(new UpdateField(Transazione.model().FAULT_INTEGRAZIONE, transazioneDTO.getFaultIntegrazione()));
  1817.             list.add(new UpdateField(Transazione.model().FORMATO_FAULT_INTEGRAZIONE, transazioneDTO.getFormatoFaultIntegrazione()));
  1818.             list.add(new UpdateField(Transazione.model().FAULT_COOPERAZIONE, transazioneDTO.getFaultCooperazione()));
  1819.             list.add(new UpdateField(Transazione.model().FORMATO_FAULT_COOPERAZIONE, transazioneDTO.getFormatoFaultCooperazione()));
  1820.             list.add(new UpdateField(Transazione.model().ERROR_LOG, transazioneDTO.getErrorLog()));
  1821.             list.add(new UpdateField(Transazione.model().WARNING_LOG, transazioneDTO.getWarningLog()));
  1822.            
  1823.             // ** dati tracce **
  1824.             if(this.salvataggioTracceManager!=null) {
  1825.                 if(registraTracciaRichiestaInfoTransazione) {
  1826.                     list.add(new UpdateField(Transazione.model().TRACCIA_RICHIESTA, transazioneDTO.getTracciaRichiesta()));
  1827.                 }
  1828.                 if(registraTracciaRispostaInfoTransazione) {
  1829.                     list.add(new UpdateField(Transazione.model().TRACCIA_RISPOSTA, transazioneDTO.getTracciaRisposta()));
  1830.                 }
  1831.             }
  1832.             // ** dati diagnostica **
  1833.             if(this.salvataggioDiagnosticiManager!=null){
  1834.                 list.add(new UpdateField(Transazione.model().DIAGNOSTICI, transazioneDTO.getDiagnostici()));
  1835.                 list.add(new UpdateField(Transazione.model().DIAGNOSTICI_LIST_1, transazioneDTO.getDiagnosticiList1()));
  1836.                 list.add(new UpdateField(Transazione.model().DIAGNOSTICI_LIST_2, transazioneDTO.getDiagnosticiList2()));
  1837.                 list.add(new UpdateField(Transazione.model().DIAGNOSTICI_LIST_EXT, transazioneDTO.getDiagnosticiListExt()));
  1838.                 list.add(new UpdateField(Transazione.model().DIAGNOSTICI_EXT, transazioneDTO.getDiagnosticiExt()));
  1839.             }
  1840.            
  1841.             boolean isTransazioniUpdateUseDayInterval = this.openspcoopProperties.isTransazioniUpdateUseDayInterval();
  1842.             if(isTransazioniUpdateUseDayInterval) {
  1843.                 IExpression condition = transazioneService.newExpression();
  1844.                 Date left = DateUtils.convertToLeftInterval(transazioneDTO.getDataIngressoRichiesta(), UnitaTemporale.GIORNALIERO);
  1845.                 condition.greaterEquals(Transazione.model().DATA_INGRESSO_RICHIESTA, left);
  1846.                 Date right = DateUtils.convertToRightInterval(transazioneDTO.getDataIngressoRichiesta(), UnitaTemporale.GIORNALIERO);
  1847.                 condition.lessEquals(Transazione.model().DATA_INGRESSO_RICHIESTA, right);
  1848.                 transazioneService.updateFields(transazioneDTO.getIdTransazione(), condition, list.toArray(new UpdateField[1]));
  1849.             }
  1850.             else {
  1851.                 transazioneService.updateFields(transazioneDTO.getIdTransazione(), list.toArray(new UpdateField[1]));
  1852.             }
  1853.             return false;
  1854.         }
  1855.         else {
  1856.             /**System.out.println("["+this.fase+"]["+transazioneDTO.getIdTransazione()+"]["+transazioneDTO.getPddRuolo()+"]["+transazioneDTO.getPddCodice()+"]["+transazioneDTO.getNomeServizio()+"] UPDATE con contesto["+transazioneDTO.getEsitoContesto()+"]");*/
  1857.            
  1858.             boolean isTransazioniUpdateUseDayInterval = this.openspcoopProperties.isTransazioniUpdateUseDayInterval();
  1859.             if(isTransazioniUpdateUseDayInterval) {
  1860.                 TransazioneDaoExt ext = new TransazioneDaoExt(transazioneDTO);
  1861.                 ext.setUseDayIntervalForUpdate(true);
  1862.                 transazioneService.update(transazioneDTO.getIdTransazione(), ext);
  1863.             }
  1864.             else {
  1865.                 transazioneService.update(transazioneDTO.getIdTransazione(), transazioneDTO);
  1866.             }
  1867.             return false;
  1868.         }
  1869.     }
  1870.    
  1871.     private void logRegistrazioneNonRiuscita(org.openspcoop2.pdd.logger.MsgDiagnostico msgdiagErrore, boolean fileTrace, Throwable e, String idTransazione,
  1872.             Transaction transaction, BooleanNullable changeEsito, StringBuilder sbErrorLog) {
  1873.         if(fileTrace || !FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase)){
  1874.             try {
  1875.                 msgdiagErrore.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE, e.getMessage());
  1876.                 msgdiagErrore.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, fileTrace ? "fileTrace" : "database");
  1877.                 switch (this.fase) {
  1878.                 case IN_REQUEST:
  1879.                     msgdiagErrore.addKeyword(CostantiPdD.KEY_FASE_TRACCIAMENTO, CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_REQ_IN);
  1880.                     break;
  1881.                 case OUT_REQUEST:
  1882.                     msgdiagErrore.addKeyword(CostantiPdD.KEY_FASE_TRACCIAMENTO, CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_REQ_OUT);
  1883.                     break;
  1884.                 case OUT_RESPONSE:
  1885.                     msgdiagErrore.addKeyword(CostantiPdD.KEY_FASE_TRACCIAMENTO, CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_RES_OUT);
  1886.                     break;
  1887.                 case POST_OUT_RESPONSE:
  1888.                     msgdiagErrore.addKeyword(CostantiPdD.KEY_FASE_TRACCIAMENTO, CostantiLabel.LABEL_CONFIGURAZIONE_AVANZATA_RES_OUT_COMPLETE);
  1889.                     break;
  1890.                 }
  1891.                 if(FaseTracciamento.POST_OUT_RESPONSE.equals(this.fase) && transaction!=null) {
  1892.                     // siamo per forza in fileTrace
  1893.                     msgdiagErrore.addLogPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_TRACCIAMENTO, "registrazioneTransazioneNonRiuscita", transaction, sbErrorLog);
  1894.                     if(changeEsito!=null) {
  1895.                         changeEsito.setValue(true);
  1896.                     }
  1897.                 }
  1898.                 else {
  1899.                     msgdiagErrore.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_TRACCIAMENTO, "registrazioneTransazioneNonRiuscita");
  1900.                 }
  1901.             }catch(Throwable t) {
  1902.                 String error = "["+idTransazione+"] Registrazione dell'anomalia avvenuta durante il tracciamento non riuscita: "+t.getMessage();
  1903.                 this.log.error(error,t);
  1904.             }
  1905.         }
  1906.     }
  1907. }