GestoreConsegnaMultipla.java

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

  21. import java.security.SecureRandom;
  22. import java.sql.Connection;
  23. import java.util.ArrayList;
  24. import java.util.List;

  25. import org.openspcoop2.core.commons.CoreException;
  26. import org.openspcoop2.core.commons.dao.DAOFactory;
  27. import org.openspcoop2.core.commons.dao.DAOFactoryProperties;
  28. import org.openspcoop2.core.config.OpenspcoopAppender;
  29. import org.openspcoop2.core.config.PortaApplicativa;
  30. import org.openspcoop2.core.config.Property;
  31. import org.openspcoop2.core.config.Tracciamento;
  32. import org.openspcoop2.core.config.utils.OpenSPCoopAppenderUtilities;
  33. import org.openspcoop2.core.id.IDPortaApplicativa;
  34. import org.openspcoop2.core.id.IDSoggetto;
  35. import org.openspcoop2.core.transazioni.TransazioneApplicativoServer;
  36. import org.openspcoop2.core.transazioni.dao.ITransazioneApplicativoServerService;
  37. import org.openspcoop2.core.transazioni.utils.TransactionServerUtils;
  38. import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
  39. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  40. import org.openspcoop2.pdd.config.DBConsegneMessageBoxManager;
  41. import org.openspcoop2.pdd.config.DBConsegnePreseInCaricoManager;
  42. import org.openspcoop2.pdd.config.DBTransazioniManager;
  43. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  44. import org.openspcoop2.pdd.config.Resource;
  45. import org.openspcoop2.pdd.core.handlers.transazioni.ExceptionSerialzerFileSystem;
  46. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  47. import org.openspcoop2.pdd.core.state.OpenSPCoopState;
  48. import org.openspcoop2.pdd.core.state.OpenSPCoopStateDBManager;
  49. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  50. import org.openspcoop2.protocol.sdk.Context;
  51. import org.openspcoop2.protocol.sdk.ProtocolException;
  52. import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
  53. import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticProducer;
  54. import org.openspcoop2.protocol.sdk.dump.IDumpProducer;
  55. import org.openspcoop2.protocol.sdk.dump.Messaggio;
  56. import org.openspcoop2.protocol.sdk.state.IState;
  57. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  58. import org.openspcoop2.protocol.sdk.state.StateMessage;
  59. import org.openspcoop2.protocol.utils.EsitiConfigUtils;
  60. import org.openspcoop2.protocol.utils.EsitiProperties;
  61. import org.openspcoop2.utils.Utilities;
  62. import org.openspcoop2.utils.date.DateManager;
  63. import org.openspcoop2.utils.jdbc.JDBCUtilities;
  64. import org.slf4j.Logger;

  65. /**    
  66.  * GestoreConsegnaMultipla
  67.  *
  68.  * @author Poli Andrea (poli@link.it)
  69.  * @author $Author$
  70.  * @version $Rev$, $Date$
  71.  */
  72. public class GestoreConsegnaMultipla {

  73.     private static final String ID_MODULO = "GestoreConsegnaMultipla";

  74.     private static DAOFactory daoFactory = null;
  75.     private static DAOFactory daoFactoryDevNull = null;
  76.     private static ServiceManagerProperties daoFactoryServiceManagerPropertiesTransazioni = null;
  77.     private static ServiceManagerProperties daoFactoryDevNullServiceManagerPropertiesTransazioni = null;
  78.     /**private static Logger daoFactoryLoggerTransazioni = null;*/
  79.     private static Logger daoFactoryLoggerTransazioniSql = null;
  80.     private static Logger daoFactoryLoggerTransazioniDevNull = null;

  81.     private static OpenSPCoop2Properties openspcoopProperties = null;

  82.     private static GestoreConsegnaMultipla gestoreConsegnaMultipla = null;
  83.     private static synchronized void init() throws TransactionMultiDeliverException{
  84.         if(gestoreConsegnaMultipla==null){
  85.             String tipoDatabase = null;
  86.             boolean debug = false;
  87.             Logger daoFactoryLoggerTransazioni = null;
  88.             try{
  89.                 openspcoopProperties = OpenSPCoop2Properties.getInstance();

  90.                 tipoDatabase = openspcoopProperties.getDatabaseType();
  91.                 /**System.out.println("DS["+this.datasource+"] TIPODB["+this.tipoDatabase+"]");*/

  92.                 if(tipoDatabase==null){
  93.                     throw new TransactionMultiDeliverException("Tipo Database non definito");
  94.                 }

  95.                 openspcoopProperties = OpenSPCoop2Properties.getInstance();

  96.                 debug = openspcoopProperties.isTransazioniDebug();

  97.                 daoFactoryLoggerTransazioni = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioni(debug);
  98.                 daoFactoryLoggerTransazioniSql = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSql(debug);
  99.                 daoFactoryLoggerTransazioniDevNull = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniDevNull();
  100.                
  101.                 daoFactory = DAOFactory.getInstance(daoFactoryLoggerTransazioniSql);
  102.                 DAOFactoryProperties daoFactoryProperties = DAOFactoryProperties.getInstance(daoFactoryLoggerTransazioniSql);
  103.                 daoFactoryServiceManagerPropertiesTransazioni = daoFactoryProperties.getServiceManagerProperties(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  104.                 daoFactoryServiceManagerPropertiesTransazioni.setShowSql(debug);    
  105.                 daoFactoryServiceManagerPropertiesTransazioni.setDatabaseType(DBTransazioniManager.getInstance().getTipoDatabase());
  106.                
  107.                 daoFactoryDevNull = DAOFactory.getInstance(daoFactoryLoggerTransazioniDevNull);
  108.                 DAOFactoryProperties daoFactoryPropertiesDevNull = DAOFactoryProperties.getInstance(daoFactoryLoggerTransazioniDevNull);
  109.                 daoFactoryDevNullServiceManagerPropertiesTransazioni = daoFactoryPropertiesDevNull.getServiceManagerProperties(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance());
  110.                 daoFactoryDevNullServiceManagerPropertiesTransazioni.setShowSql(debug);
  111.                 daoFactoryDevNullServiceManagerPropertiesTransazioni.setDatabaseType(DBTransazioniManager.getInstance().getTipoDatabase());
  112.                

  113.             }catch(Exception e){
  114.                 throw new TransactionMultiDeliverException("Inizializzazione risorse database non riuscita: "+e.getMessage(),e);
  115.             }
  116.             try{
  117.                 gestoreConsegnaMultipla = new GestoreConsegnaMultipla(daoFactoryLoggerTransazioni, daoFactoryLoggerTransazioniSql,
  118.                         tipoDatabase,
  119.                         debug);
  120.             }catch(Exception e){
  121.                 throw new TransactionMultiDeliverException("Inizializzazione GestoreConsegnaMultipla non riuscita: "+e.getMessage(),e);
  122.             }
  123.         }
  124.     }
  125.     public static GestoreConsegnaMultipla getInstance() throws TransactionMultiDeliverException {
  126.         if(gestoreConsegnaMultipla==null){
  127.             // spotbugs warning 'SING_SINGLETON_GETTER_NOT_SYNCHRONIZED': l'istanza viene creata allo startup
  128.             synchronized (GestoreConsegnaMultipla.class) {
  129.                 init();
  130.             }
  131.         }
  132.         return gestoreConsegnaMultipla;
  133.     }


  134.    
  135.    
  136.     private static java.util.Random rndInstance = null;
  137.     private static synchronized void initRandom() {
  138.         if(rndInstance==null) {
  139.             rndInstance = new SecureRandom();
  140.         }
  141.     }
  142.     public static java.util.Random getRandom() {
  143.         if(rndInstance==null) {
  144.             initRandom();
  145.         }
  146.         return rndInstance;
  147.     }
  148.    




  149.     private Logger log = null;
  150.     private Logger logSql = null;
  151.     private String tipoDatabase = null;
  152.     private boolean debug = false;

  153.     private IDiagnosticProducer msgDiagnosticiOpenSPCoopAppender = null;
  154.     private IDumpProducer dumpOpenSPCoopAppender = null;
  155.     private boolean transazioniRegistrazioneDumpHeadersCompactEnabled = false;

  156.     private GestoreConsegnaMultipla(Logger log,Logger logSql,
  157.             String tipoDatabase,boolean debug) throws TransactionMultiDeliverException{

  158.         this.log = log;
  159.         this.logSql = logSql;
  160.         this.tipoDatabase = tipoDatabase;
  161.         this.debug = debug;

  162.         boolean usePdDConnection = true;

  163.         try{

  164.             // Init
  165.             this.msgDiagnosticiOpenSPCoopAppender = new org.openspcoop2.pdd.logger.MsgDiagnosticoOpenSPCoopProtocolAppender();
  166.             OpenspcoopAppender diagnosticoOpenSPCoopAppender = new OpenspcoopAppender();
  167.             diagnosticoOpenSPCoopAppender.setTipo("__gestoreConsegnaMultipla");
  168.             List<Property> diagnosticoOpenSPCoopAppenderProperties = new ArrayList<>();

  169.             // Verra poi utilizzata la connessione ottenuta ogni volta che il timer viene eseguito, infatti si usa usePdDConnection
  170.             OpenSPCoopAppenderUtilities.addParameters(this.logSql, diagnosticoOpenSPCoopAppenderProperties,
  171.                     null, // nessun datasource
  172.                     null, null, null, null,  // nessuna connection
  173.                     this.tipoDatabase,
  174.                     usePdDConnection, // viene usata la connessione della PdD
  175.                     this.debug
  176.                     );
  177.             OpenSPCoopAppenderUtilities.addCheckProperties(diagnosticoOpenSPCoopAppenderProperties, false);

  178.             diagnosticoOpenSPCoopAppender.setPropertyList(diagnosticoOpenSPCoopAppenderProperties);
  179.             this.msgDiagnosticiOpenSPCoopAppender.initializeAppender(diagnosticoOpenSPCoopAppender);
  180.             this.msgDiagnosticiOpenSPCoopAppender.isAlive();

  181.         }catch(Exception e){
  182.             throw new TransactionMultiDeliverException("Errore durante l'inizializzazione del DiagnosticoAppender: "+e.getMessage(),e);
  183.         }

  184.         try{

  185.             // Init
  186.             this.dumpOpenSPCoopAppender = new org.openspcoop2.pdd.logger.DumpOpenSPCoopProtocolAppender();
  187.             OpenspcoopAppender dumpOpenSPCoopAppenderEngine = new OpenspcoopAppender();
  188.             dumpOpenSPCoopAppenderEngine.setTipo("__gestoreConsegnaMultipla");
  189.             List<Property> dumpOpenSPCoopAppenderProperties = new ArrayList<>();

  190.             // Verra poi utilizzata la connessione ottenuta ogni volta che il timer viene eseguito, infatti si usa usePdDConnection
  191.             OpenSPCoopAppenderUtilities.addParameters(this.logSql, dumpOpenSPCoopAppenderProperties,
  192.                     null, // nessun datasource
  193.                     null, null, null, null,  // nessuna connection
  194.                     this.tipoDatabase,
  195.                     usePdDConnection, // viene usata la connessione della PdD
  196.                     this.debug
  197.                     );
  198.             OpenSPCoopAppenderUtilities.addCheckProperties(dumpOpenSPCoopAppenderProperties, false);

  199.             dumpOpenSPCoopAppenderEngine.setPropertyList(dumpOpenSPCoopAppenderProperties);
  200.             this.dumpOpenSPCoopAppender.initializeAppender(dumpOpenSPCoopAppenderEngine);
  201.             this.dumpOpenSPCoopAppender.isAlive();
  202.            
  203.             // Indicazioni sulle modalita' di salvataggio degli header del dump
  204.             this.transazioniRegistrazioneDumpHeadersCompactEnabled = openspcoopProperties.isTransazioniRegistrazioneDumpHeadersCompactEnabled();

  205.         }catch(Exception e){
  206.             throw new TransactionMultiDeliverException("Errore durante l'inizializzazione del DumpAppender: "+e.getMessage(),e);
  207.         }

  208.     }


  209.     // *** SAFE ***

  210.     public void safeCreate(TransazioneApplicativoServer transazioneApplicativoServer, IDPortaApplicativa idPA, IOpenSPCoopState state, RequestInfo requestInfo, Context context) {

  211.         // cluster id
  212.         transazioneApplicativoServer.setClusterIdPresaInCarico(openspcoopProperties.getClusterId(false));
  213.        
  214.         getConnectionAndSave(transazioneApplicativoServer, transazioneApplicativoServer.getProtocollo(), false, false, idPA, state, null, requestInfo, context, "create",
  215.                 OpenSPCoopStateDBManager.runtime);

  216.     }
  217.    
  218.     public void safeUpdateConsegna(TransazioneApplicativoServer transazioneApplicativoServer, IDPortaApplicativa idPA, IOpenSPCoopState state, RequestInfo requestInfo, Context context) {

  219.         // cluster id
  220.         transazioneApplicativoServer.setClusterIdConsegna(openspcoopProperties.getClusterId(false));
  221.        
  222.         getConnectionAndSave(transazioneApplicativoServer, transazioneApplicativoServer.getProtocollo(), true, true, idPA, state, null, requestInfo, context, "updateDeliveredMessage",
  223.                 OpenSPCoopStateDBManager.consegnePreseInCarico); // l'informazione dovrebbe esistere!

  224.     }
  225.    
  226.     public void safeUpdatePrelievoIM(TransazioneApplicativoServer transazioneApplicativoServer, IDPortaApplicativa idPA, IOpenSPCoopState state, Context context) {

  227.         // cluster id
  228.         transazioneApplicativoServer.setClusterIdPrelievoIm(openspcoopProperties.getClusterId(false));
  229.        
  230.         getConnectionAndSave(transazioneApplicativoServer, transazioneApplicativoServer.getProtocollo(), true, false, idPA, state, null, null, context, "updateRetrieveMessageByMessageBox",
  231.                 OpenSPCoopStateDBManager.messageBox);

  232.     }
  233.    
  234.     public void safeUpdateEliminazioneIM(TransazioneApplicativoServer transazioneApplicativoServer, IDPortaApplicativa idPA, IOpenSPCoopState state, Context context) {

  235.         // cluster id
  236.         transazioneApplicativoServer.setClusterIdEliminazioneIm(openspcoopProperties.getClusterId(false));
  237.        
  238.         getConnectionAndSave(transazioneApplicativoServer, transazioneApplicativoServer.getProtocollo(), true, false, idPA, state, null, null, context, "updateDeletedMessageByMessageBox",
  239.                 OpenSPCoopStateDBManager.messageBox);

  240.     }
  241.    
  242.     public void safeUpdateMessaggioScaduto(TransazioneApplicativoServer transazioneApplicativoServer, IDPortaApplicativa idPA, IOpenSPCoopState state) {

  243.         getConnectionAndSave(transazioneApplicativoServer, transazioneApplicativoServer.getProtocollo(), true, false, idPA, state, null, null, null, "updateExpiredMessage",
  244.                 OpenSPCoopStateDBManager.runtime);

  245.     }

  246.    
  247.     public void safeSave(org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico diagnostico, IDPortaApplicativa idPA, IState state, RequestInfo requestInfo, Context context) {

  248.         getConnectionAndSave(diagnostico, diagnostico.getProtocollo(), false, false, idPA, null, state, requestInfo, context, "saveDiagnostic",
  249.                 OpenSPCoopStateDBManager.consegnePreseInCarico);

  250.     }

  251.     public void safeSave(Messaggio dumpMessaggio, IDPortaApplicativa idPA, IState state, RequestInfo requestInfo, Context context) {

  252.         getConnectionAndSave(dumpMessaggio, dumpMessaggio.getProtocollo(), false, false, idPA, null, state, requestInfo, context, "saveContent",
  253.                 OpenSPCoopStateDBManager.consegnePreseInCarico);

  254.     }

  255.     private void getConnectionAndSave(Object o, String protocol, boolean update, boolean throwNotFoundIfNotExists, IDPortaApplicativa idPA,
  256.             IOpenSPCoopState openspcoopState, IState state, RequestInfo requestInfo, Context context,
  257.             String tipoOperazione,
  258.             OpenSPCoopStateDBManager dbManagerSource) {
  259.         TransazioniSAProcessTimes times = null;
  260.         long timeStart = -1;
  261.         boolean buildDetailsSA = false;
  262.         boolean buildDetailsUpdateTransaction = false;
  263.         if(openspcoopProperties.isTransazioniRegistrazioneSlowLog()) {
  264.             times = new TransazioniSAProcessTimes();
  265.             timeStart = DateManager.getTimeMillis();
  266.             buildDetailsSA = openspcoopProperties.isTransazioniRegistrazioneSlowLogConnettoriMultipliProcessTransactionSADetails();
  267.             buildDetailsUpdateTransaction = openspcoopProperties.isTransazioniRegistrazioneSlowLogConnettoriMultipliUpdateTransactionDetails();
  268.         }
  269.         try {
  270.             getConnectionAndSave(o, protocol, update, throwNotFoundIfNotExists, idPA,
  271.                     openspcoopState, state, requestInfo, context,
  272.                     tipoOperazione, times, buildDetailsSA,  buildDetailsUpdateTransaction,
  273.                     dbManagerSource);
  274.         }finally {
  275.             if(times!=null) {
  276.                 long timeEnd =  DateManager.getTimeMillis();
  277.                 long timeProcess = timeEnd-timeStart;
  278.                 if(timeProcess>=openspcoopProperties.getTransazioniRegistrazioneSlowLogThresholdMs()) {
  279.                     StringBuilder sb = new StringBuilder();
  280.                     sb.append(timeProcess);
  281.                     if(times.idTransazione!=null) {
  282.                         sb.append(" <").append(times.idTransazione).append(">");
  283.                     }
  284.                     if(times.servizioApplicativoErogatore!=null) {
  285.                         sb.append(" (sa:").append(times.servizioApplicativoErogatore).append(")");
  286.                     }
  287.                     sb.append(" [GestoreConsegnaMultipla."+tipoOperazione+"]");
  288.                     sb.append(" ").append(times.toString());
  289.                     String msg = sb.toString();
  290.                     OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSlowLog().info(msg);
  291.                 }
  292.             }
  293.         }
  294.     }
  295.     @SuppressWarnings("resource")
  296.     private void getConnectionAndSave(Object o, String protocol, boolean update, boolean throwNotFoundIfNotExists, IDPortaApplicativa idPA,
  297.             IOpenSPCoopState openspcoopState, IState state, RequestInfo requestInfo, Context context,
  298.             String tipoOperazione, TransazioniSAProcessTimes times, boolean buildDetailsSA, boolean buildDetailsUpdateTransaction,
  299.             OpenSPCoopStateDBManager dbManagerSource) {

  300.         EsitiProperties esitiProperties = null;
  301.         try {
  302.             if(requestInfo!=null && requestInfo.getProtocolFactory()!=null) {
  303.                 esitiProperties = EsitiProperties.getInstance(this.log, requestInfo.getProtocolFactory());
  304.                 if(esitiProperties==null &&
  305.                     // per i casi di restart nodi in cui vengono modificati gli id delle chiavi, mentre serializzato nel messaggio e' rimasto il precedente
  306.                     requestInfo.getProtocolFactory().getProtocol()!=null) {
  307.                     esitiProperties = EsitiProperties.getInstanceFromProtocolName(this.log, requestInfo.getProtocolFactory().getProtocol());
  308.                 }
  309.             }
  310.             else {
  311.                 esitiProperties = EsitiProperties.getInstanceFromProtocolName(this.log, protocol);
  312.             }
  313.         }catch(Throwable e) {
  314.             this.log.error("Errore avvenuto durante la lettura del gestore degli esiti: "+e.getMessage() ,e);
  315.         }
  316.         if(esitiProperties==null) {
  317.             return;
  318.         }
  319.        
  320.         try{
  321.             ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance();
  322.             Tracciamento configTracciamento = configPdDManager.getOpenSPCoopAppenderTracciamento();
  323.             StringBuilder bf = new StringBuilder();
  324.             String esitiConfig = configTracciamento!=null ? configTracciamento.getEsiti() : null;
  325.             if(idPA!=null) {
  326.                 PortaApplicativa pa = configPdDManager.getPortaApplicativaSafeMethod(idPA, requestInfo);
  327.                 if(pa!=null && pa.getTracciamento()!=null && pa.getTracciamento().getEsiti()!=null) {
  328.                     esitiConfig = pa.getTracciamento().getEsiti();
  329.                 }
  330.             }
  331.             List<String> esitiDaRegistrare = EsitiConfigUtils.getRegistrazioneEsiti(esitiConfig, this.log, bf);
  332.            
  333.             int code = esitiProperties.convertoToCode(EsitoTransazioneName.CONSEGNA_MULTIPLA);
  334.             String codeAsString = code+"";
  335.             if(esitiDaRegistrare!=null && !esitiDaRegistrare.isEmpty() && !esitiDaRegistrare.contains(codeAsString)){
  336.                 String msg = "Non devo registrare l'informazione, esito '"+codeAsString+"' disabilitato nel tracciamento";
  337.                 this.log.debug(msg);
  338.                 return;
  339.             }
  340.            
  341.         }catch(Throwable e) {
  342.             this.log.debug("Errore avvenuto durante la lettura della configurazione delle transazioni da salvare: "+e.getMessage(),e);
  343.         }
  344.        
  345.         String richiedenteConnessione = null;
  346.         if(o!=null) {
  347.             if(o instanceof TransazioneApplicativoServer) {
  348.                 richiedenteConnessione = tipoOperazione+ "_" +((TransazioneApplicativoServer)o).getIdTransazione();
  349.                 richiedenteConnessione = richiedenteConnessione + "_" + ((TransazioneApplicativoServer)o).getServizioApplicativoErogatore();
  350.                 if(times!=null) {
  351.                     times.idTransazione = ((TransazioneApplicativoServer)o).getIdTransazione();
  352.                     times.servizioApplicativoErogatore = ((TransazioneApplicativoServer)o).getServizioApplicativoErogatore();
  353.                 }
  354.             }
  355.             else if(o instanceof org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico) {
  356.                 richiedenteConnessione = tipoOperazione+ "_" +((org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico)o).getIdTransazione();
  357.                 if(times!=null) {
  358.                     times.idTransazione = ((org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico)o).getIdTransazione();
  359.                 }
  360.             }
  361.             else if(o instanceof Messaggio) {
  362.                 richiedenteConnessione = tipoOperazione+ "_" +((Messaggio)o).getIdTransazione();
  363.                 if(times!=null) {
  364.                     times.idTransazione = ((Messaggio)o).getIdTransazione();
  365.                 }
  366.             }
  367.         }
  368.        
  369.         Resource dbResource = null;
  370.         DBTransazioniManager dbManagerTransazioni = null;
  371.         DBConsegnePreseInCaricoManager dbConsegnePreseInCaricoManager = null;
  372.         DBConsegneMessageBoxManager dbConsegneMessageBoxManager = null;
  373.         if(dbManagerSource!=null) {
  374.             switch (dbManagerSource) {
  375.             case runtime:
  376.                 dbManagerTransazioni = DBTransazioniManager.getInstance();
  377.                 break;
  378.             case consegnePreseInCarico:
  379.                 dbConsegnePreseInCaricoManager = DBConsegnePreseInCaricoManager.getInstanceTransazioni();
  380.                 break;
  381.             case smistatoreMessaggiPresiInCarico: // non utilizzato
  382.                 dbConsegnePreseInCaricoManager = DBConsegnePreseInCaricoManager.getInstanceTransazioni();
  383.                 break;
  384.             case messageBox:
  385.                 dbConsegneMessageBoxManager = DBConsegneMessageBoxManager.getInstanceTransazioni();
  386.                 break;
  387.             }
  388.         }
  389.         else {
  390.             dbManagerTransazioni = DBTransazioniManager.getInstance();
  391.         }
  392.         IDSoggetto idDominio = openspcoopProperties.getIdentitaPortaDefault(protocol, requestInfo);
  393.         ExceptionSerialzerFileSystem exceptionSerializerFileSystem = new ExceptionSerialzerFileSystem(this.log);
  394.         Connection con = null;
  395.         boolean isMessaggioConsegnato = false;
  396.         boolean possibileTerminazioneSingleIntegrationManagerMessage = false;
  397.         boolean consegnaInErrore = false;
  398.         TransazioneApplicativoServer transazioneApplicativoServer = null;
  399.         boolean useConnectionRuntime = false;
  400.         try{
  401.             long timeStart = -1;
  402.             try{
  403.                 if(times!=null) {
  404.                     timeStart = DateManager.getTimeMillis();
  405.                 }
  406.                 boolean checkPddRuntimeDatasource = false;
  407.                 if(dbManagerTransazioni!=null) {
  408.                     checkPddRuntimeDatasource = dbManagerTransazioni.useRuntimePdD();
  409.                 }
  410.                 else if(dbConsegnePreseInCaricoManager!=null) {
  411.                     checkPddRuntimeDatasource = dbConsegnePreseInCaricoManager.useRuntimePdD();
  412.                 }
  413.                 else if(dbConsegneMessageBoxManager!=null) {
  414.                     checkPddRuntimeDatasource = dbConsegneMessageBoxManager.useRuntimePdD();
  415.                 }
  416.                
  417.                 if(checkPddRuntimeDatasource) {
  418.                     if(openspcoopState!=null) {
  419.                         if(openspcoopState instanceof OpenSPCoopState) {
  420.                             OpenSPCoopState s = (OpenSPCoopState) openspcoopState;
  421.                             if(s.getConnectionDB()!=null && !s.getConnectionDB().isClosed()) {
  422.                                 con = s.getConnectionDB();
  423.                                 useConnectionRuntime = true;
  424.                             }
  425.                         }
  426.                     }
  427.                     else if(state instanceof StateMessage) {
  428.                         StateMessage s = (StateMessage) state;
  429.                         if(s.getConnectionDB()!=null && !s.getConnectionDB().isClosed()) {
  430.                             con = s.getConnectionDB();
  431.                             useConnectionRuntime = true;
  432.                         }
  433.                     }
  434.                 }
  435.                
  436.                 if(!useConnectionRuntime){
  437.                     if(dbManagerTransazioni!=null) {
  438.                         dbResource = dbManagerTransazioni.getResource(idDominio, ID_MODULO, richiedenteConnessione);
  439.                     }
  440.                     else if(dbConsegnePreseInCaricoManager!=null) {
  441.                         dbResource = dbConsegnePreseInCaricoManager.getResource(idDominio, ID_MODULO, richiedenteConnessione);
  442.                     }
  443.                     else if(dbConsegneMessageBoxManager!=null){
  444.                         dbResource = dbConsegneMessageBoxManager.getResource(idDominio, ID_MODULO, richiedenteConnessione);
  445.                     }
  446.                    
  447.                     if(dbResource!=null) {
  448.                         con = (Connection) dbResource.getResource();
  449.                     }
  450.                 }
  451.                
  452.             }finally {  
  453.                 if(times!=null) {
  454.                     long timeEnd =  DateManager.getTimeMillis();
  455.                     long timeProcess = timeEnd-timeStart;
  456.                     times.getConnection = timeProcess;
  457.                 }
  458.             }
  459.                
  460.             boolean autoCommit = false;
  461.             if(con!=null) {
  462.                 con.setAutoCommit(autoCommit);
  463.             }

  464.             if(o instanceof TransazioneApplicativoServer) {
  465.                 int conflict = 0;
  466.                 int iteration = 1; // inizio da 1 per i log
  467.                 boolean updateEffettuato = false;
  468.                 try{
  469.                     if(times!=null) {
  470.                         timeStart = DateManager.getTimeMillis();
  471.                         if(buildDetailsSA) {
  472.                             times.saDetails = new ArrayList<>();
  473.                         }
  474.                     }
  475.                    
  476.                     org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager jdbcServiceManager =
  477.                             (org.openspcoop2.core.transazioni.dao.jdbc.JDBCServiceManager) daoFactory.getServiceManager(org.openspcoop2.core.transazioni.utils.ProjectInfo.getInstance(),
  478.                                     con, autoCommit,
  479.                                     daoFactoryServiceManagerPropertiesTransazioni,
  480.                                     daoFactoryLoggerTransazioniDevNull);
  481.                     jdbcServiceManager.getJdbcProperties().setShowSql(this.debug);
  482.                     ITransazioneApplicativoServerService transazioneService = jdbcServiceManager.getTransazioneApplicativoServerService();
  483.    
  484.                     // ** Aggiorno campi dipendenti da questa invocazione **
  485.                     // Campi che non possono essere gestiti a livello 'core'
  486.    
  487.                     transazioneApplicativoServer = (TransazioneApplicativoServer) o;
  488.    
  489.                     // dettaglio esito
  490.                     this.setDettaglioEsito(transazioneApplicativoServer, esitiProperties, context);
  491.                    
  492.                     // consegna terminata
  493.                     if(transazioneApplicativoServer.isConsegnaTerminata()) {
  494.                         isMessaggioConsegnato = true;
  495.                     }
  496.                     else if(transazioneApplicativoServer.getDataEliminazioneIm()!=null
  497.                             ||
  498.                             transazioneApplicativoServer.getDataMessaggioScaduto()!=null) {
  499.                         isMessaggioConsegnato = true;
  500.                         possibileTerminazioneSingleIntegrationManagerMessage = true;
  501.                     }
  502.                     else if(transazioneApplicativoServer.isConsegnaTrasparente() && transazioneApplicativoServer.getDataUscitaRichiesta()!=null) {
  503.                         // !transazioneApplicativoServer.isConsegnaTerminata() altrimenti entrava nel primo if
  504.                         consegnaInErrore = true;
  505.                     }
  506.    
  507.                     boolean useSelectForUpdate = true;
  508.                     /*
  509.                      * Grazie alla select for update riesco a mettere il lock solamente sulla riga interessata
  510.                      */
  511.                    
  512.                     int oldTransactionIsolation = -1;
  513.                     if(!useSelectForUpdate) {
  514.                         try{
  515.                             oldTransactionIsolation = con.getTransactionIsolation();
  516.                             /** già effettuato fuori dal metodo connectionDB.setAutoCommit(false);*/
  517.                             JDBCUtilities.setTransactionIsolationSerializable(daoFactoryServiceManagerPropertiesTransazioni.getDatabase(), con);
  518.                         } catch(Exception er) {
  519.                             throw new CoreException("(setIsolation) "+er.getMessage(),er);
  520.                         }
  521.                     }
  522.                    
  523.                     long gestioneSerializableDBAttesaAttiva = openspcoopProperties.getGestioneSerializableDBAttesaAttiva();
  524.                     int gestioneSerializableDBCheckInterval = openspcoopProperties.getGestioneSerializableDBCheckInterval();
  525.                    
  526.                     long scadenzaWhile = DateManager.getTimeMillis() + gestioneSerializableDBAttesaAttiva;
  527.                    
  528.                     Throwable lastT = null;
  529.                     while(!updateEffettuato && DateManager.getTimeMillis() < scadenzaWhile){
  530.    
  531.                         List<String> timeDetails = null;
  532.                         try{
  533.                            
  534.                             if(times!=null && buildDetailsSA) {
  535.                                 timeDetails = new ArrayList<>();
  536.                             }
  537.                            
  538.                             boolean transazioneAggiornata = TransactionServerUtils.save(transazioneService, (TransazioneApplicativoServer)o, update, throwNotFoundIfNotExists, false,
  539.                                     useSelectForUpdate, timeDetails);
  540.                                                        
  541.                             long timeStartCommit = -1;
  542.                             if(timeDetails!=null) {
  543.                                 timeStartCommit = DateManager.getTimeMillis();
  544.                             }
  545.                             if(con!=null) {
  546.                                 con.commit();
  547.                             }
  548.                             if(timeDetails!=null) {
  549.                                 long timeEnd =  DateManager.getTimeMillis();
  550.                                 long timeProcess = timeEnd-timeStartCommit;
  551.                                 timeDetails.add("commit:"+timeProcess);
  552.                             }
  553.                            
  554.                             if(!transazioneAggiornata) {
  555.                                 isMessaggioConsegnato = false; // per gestire eventuali errori durante il  recupero da file system
  556.                             }
  557.    
  558.                             updateEffettuato = true;
  559.    
  560.                         } catch(Throwable e) {
  561.                             conflict++;
  562.                             lastT = e;
  563.                             if(timeDetails!=null) {
  564.                                 String errorMsg = e.getMessage();
  565.                                 if(errorMsg!=null) {
  566.                                     if(errorMsg.length()>100) {
  567.                                         errorMsg = errorMsg.substring(0, 97)+"...";
  568.                                     }
  569.                                     timeDetails.add("error:"+errorMsg);
  570.                                 }
  571.                             }
  572.                             /**System.out.println("Serializable error:"+e.getMessage());*/
  573.                             try{
  574.                                 if(con!=null) {
  575.                                     con.rollback();
  576.                                 }
  577.                             } catch(Exception er) {}
  578.                         }finally {
  579.                             if(timeDetails!=null && !timeDetails.isEmpty()) {
  580.                                 for (String detail : timeDetails) {
  581.                                     times.saDetails.add("i"+iteration+"-"+detail);
  582.                                 }
  583.                             }
  584.                         }
  585.    
  586.                         if(!updateEffettuato){
  587.                             // Per aiutare ad evitare conflitti
  588.                             try{
  589.                                 Utilities.sleep(getRandom().nextInt(gestioneSerializableDBCheckInterval)); // random da 0ms a checkIntervalms
  590.                             }catch(Exception eRandom){
  591.                                 // ignore
  592.                             }
  593.                             iteration++;
  594.                         }
  595.                     }
  596.                     // Ripristino Transazione
  597.                     if(!useSelectForUpdate) {
  598.                         try{
  599.                             if(con!=null) {
  600.                                 con.setTransactionIsolation(oldTransactionIsolation);
  601.                             }
  602.                             /** già effettuato fuori dal metodo connectionDB.setAutoCommit(true);*/
  603.                         } catch(Exception er) {
  604.                             throw new CoreException("(ripristinoIsolation) "+er.getMessage(),er);
  605.                         }
  606.                     }
  607.                     if(lastT!=null && !updateEffettuato) {
  608.                         // registro ultimo errore avvenuto durante il ciclo
  609.                         String msgError = "[id:"+transazioneApplicativoServer.getIdTransazione()+"][sa:"+transazioneApplicativoServer.getServizioApplicativoErogatore()+"]["+transazioneApplicativoServer.getConnettoreNome()+"] 'updateTransazioneSA' failed: "+lastT.getMessage();
  610.                         daoFactoryLoggerTransazioniSql.error(msgError,lastT);
  611.                         this.log.error(msgError,lastT);
  612.                         throw lastT;
  613.                     }
  614.                 }finally {  
  615.                     if(times!=null) {
  616.                         long timeEnd =  DateManager.getTimeMillis();
  617.                         long timeProcess = timeEnd-timeStart;
  618.                         if(update) {
  619.                             times.update = timeProcess;
  620.                         }
  621.                         else {
  622.                             times.insert = timeProcess;
  623.                         }
  624.                         if(buildDetailsSA) {
  625.                             times.saDetails.add("iteration:"+iteration);
  626.                             times.saDetails.add("conflicts:"+conflict);
  627.                             times.saDetails.add("updated:"+updateEffettuato);
  628.                         }
  629.                     }
  630.                 }
  631.             }
  632.             else if(o instanceof org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico) {
  633.                 try{
  634.                     if(times!=null) {
  635.                         timeStart = DateManager.getTimeMillis();
  636.                     }
  637.                    
  638.                     this.msgDiagnosticiOpenSPCoopAppender.log(con, (org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico)o);
  639.                    
  640.                     if(con!=null) {
  641.                         con.commit();
  642.                     }
  643.                 }finally {  
  644.                     if(times!=null) {
  645.                         long timeEnd =  DateManager.getTimeMillis();
  646.                         long timeProcess = timeEnd-timeStart;
  647.                         times.insert = timeProcess;
  648.                     }
  649.                 }
  650.             }
  651.             else if(o instanceof Messaggio) {
  652.                 try{
  653.                     if(times!=null) {
  654.                         timeStart = DateManager.getTimeMillis();
  655.                     }
  656.                    
  657.                     this.dumpOpenSPCoopAppender.dump(con, (Messaggio)o, this.transazioniRegistrazioneDumpHeadersCompactEnabled);
  658.                    
  659.                     if(con!=null) {
  660.                         con.commit();
  661.                     }
  662.                 }finally {  
  663.                     if(times!=null) {
  664.                         long timeEnd =  DateManager.getTimeMillis();
  665.                         long timeProcess = timeEnd-timeStart;
  666.                         times.insert = timeProcess;
  667.                     }
  668.                 }
  669.             }

  670.         }catch(Throwable e){
  671.             try{
  672.                 if(con!=null) {
  673.                     con.rollback();
  674.                 }
  675.             }catch(Exception eRollback){
  676.                 // ignore
  677.             }

  678.             if(o instanceof TransazioneApplicativoServer) {
  679.                
  680.                 isMessaggioConsegnato = false; // per gestire eventuali errori durante il  recupero da file system
  681.                
  682.                 TransazioneApplicativoServer serverInfo = (TransazioneApplicativoServer) o;
  683.                 try{
  684.                     if(serverInfo.getIdTransazione()!=null && serverInfo.getServizioApplicativoErogatore()!=null) {
  685.                         // NOTA: volutamente salvo serverInfo per poter reimplementare la logica di cui sopra
  686.                         serverInfo.setProtocollo(protocol);
  687.                         exceptionSerializerFileSystem.registrazioneFileSystemTransazioneApplicativoServerEmessoPdD(serverInfo, serverInfo.getIdTransazione(), serverInfo.getServizioApplicativoErogatore());
  688.                     }
  689.                 } catch (Throwable eClose) {
  690.                     // ignore
  691.                 }
  692.                 // Effettuo il log anche nel core per evitare che un eventuale filtro a OFF sul core della PdD eviti la scrittura di questi errori
  693.                 String msg = "Errore durante la scrittura dell'informazione del server '"+serverInfo.getServizioApplicativoErogatore()+"' associato alla transazione sul database: " + e.getLocalizedMessage();
  694.                 this.log.error("["+serverInfo.getIdTransazione()+"] "+msg,e);
  695.             }
  696.             else if(o instanceof org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico) {
  697.                 org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico msgDiag = (org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico) o;
  698.                 try{
  699.                     if(msgDiag.getIdTransazione()!=null && msgDiag.getApplicativo()!=null) {
  700.                         exceptionSerializerFileSystem.registrazioneFileSystemDiagnosticoEmessoPdD(msgDiag, msgDiag.getIdTransazione(), msgDiag.getApplicativo());
  701.                     }
  702.                 } catch (Throwable eClose) {
  703.                     // ignore
  704.                 }
  705.                 // Effettuo il log anche nel core per evitare che un eventuale filtro a OFF sul core della PdD eviti la scrittura di questi errori
  706.                 String msg = "Errore durante la scrittura del diagnostico relativo al server '"+msgDiag.getApplicativo()+"' associato alla transazione sul database: " + e.getLocalizedMessage();
  707.                 this.log.error("["+msgDiag.getIdTransazione()+"] "+msg,e);
  708.             }
  709.             else if(o instanceof Messaggio) {
  710.                 Messaggio messaggio = (Messaggio) o;
  711.                 try{
  712.                     if(messaggio.getIdTransazione()!=null && messaggio.getServizioApplicativoErogatore()!=null) {
  713.                         exceptionSerializerFileSystem.registrazioneFileSystemDumpEmessoPdD(messaggio, messaggio.getIdTransazione(),
  714.                                 messaggio.getServizioApplicativoErogatore(), messaggio.getDataConsegna());
  715.                     }
  716.                 } catch (Throwable eClose) {
  717.                     // ignore
  718.                 }
  719.                 // Effettuo il log anche nel core per evitare che un eventuale filtro a OFF sul core della PdD eviti la scrittura di questi errori
  720.                 String msg = "Errore durante la scrittura del messaggio relativo al server '"+messaggio.getServizioApplicativoErogatore()+"' associato alla transazione sul database: " + e.getLocalizedMessage();
  721.                 this.log.error("["+messaggio.getIdTransazione()+"] "+msg,e);
  722.             }

  723.         }finally{
  724.            
  725.             if(isMessaggioConsegnato || consegnaInErrore) {

  726.                 long timeStart = -1;
  727.                 try{
  728.                     List<String> timeDetails = null;
  729.                     if(times!=null) {
  730.                         timeStart = DateManager.getTimeMillis();
  731.                         if(buildDetailsUpdateTransaction) {
  732.                             times.transazioneDetails = new ArrayList<>();
  733.                             timeDetails = times.transazioneDetails;
  734.                         }
  735.                     }
  736.                
  737.                     // aggiorno esito transazione (non viene sollevata alcuna eccezione)
  738.                     boolean transazioneAggiornata = safeAggiornaInformazioneConsegnaTerminata(transazioneApplicativoServer, con, esitiProperties, possibileTerminazioneSingleIntegrationManagerMessage, consegnaInErrore, timeDetails);
  739.                     if(!transazioneAggiornata) {
  740.                        
  741.                         String prefix = "[id:"+transazioneApplicativoServer.getIdTransazione()+"][sa:"+transazioneApplicativoServer.getServizioApplicativoErogatore()+"]["+transazioneApplicativoServer.getConnettoreNome()+"] 'gestisciErroreAggiornamentoInformazioneConsegnaTerminata'";
  742.                        
  743.                         boolean existsTransaction = false;
  744.                         try {
  745.                             existsTransaction = TransactionServerUtils.existsTransaction(transazioneApplicativoServer.getIdTransazione(), con, this.tipoDatabase, this.log,
  746.                                     true); // la sessione viene chiusa dopo
  747.                         }catch(Throwable t) {
  748.                             String msgError = prefix+" compresione esistenza transazione fallita";
  749.                             this.log.error(msgError, t);
  750.                         }
  751.                        
  752.                         boolean serializeTransactionInfo = false;
  753.                         try {
  754.                             serializeTransactionInfo = true;
  755.                             try{
  756.                                 if(transazioneApplicativoServer.getIdTransazione()!=null && transazioneApplicativoServer.getServizioApplicativoErogatore()!=null) {
  757.                                     // NOTA: volutamente salvo serverInfo per poter reimplementare la logica di cui sopra
  758.                                     transazioneApplicativoServer.setProtocollo(protocol);
  759.                                     /**System.out.println("["+transazioneApplicativoServer.getConnettoreNome()+"] ["+transazioneApplicativoServer.getIdTransazione()+"] SAVE PER RECUPERO");*/
  760.                                     exceptionSerializerFileSystem.registrazioneFileSystemTransazioneApplicativoServerConsegnaTerminata(transazioneApplicativoServer, transazioneApplicativoServer.getIdTransazione(), transazioneApplicativoServer.getServizioApplicativoErogatore());
  761.                                 }
  762.                             } catch (Throwable eClose) {
  763.                                 // ignore
  764.                             }
  765.                            
  766.                         }catch(Throwable t) {
  767.                             String msgError = prefix+" compresione esistenza transazione fallita";
  768.                             this.log.error(msgError,t );
  769.                         }
  770.                        
  771.                         String msgError = prefix+" effettuata gestione dell'errore (existsTransaction="+existsTransaction+" serializeTransactionInfo="+serializeTransactionInfo+")";
  772.                         this.log.error(msgError);
  773.                        
  774.                     }
  775.                 }finally {  
  776.                     if(times!=null) {
  777.                         long timeEnd =  DateManager.getTimeMillis();
  778.                         long timeProcess = timeEnd-timeStart;
  779.                         times.updateTransazione = timeProcess;
  780.                     }
  781.                 }
  782.             }
  783.            
  784.             try{
  785.                 if(con!=null) {
  786.                     con.setAutoCommit(true);
  787.                 }
  788.             }catch(Exception eRollback){
  789.                 // ignore
  790.             }
  791.             try {
  792.                 if(!useConnectionRuntime) {
  793.                     if(dbManagerTransazioni!=null) {
  794.                         dbManagerTransazioni.releaseResource(idDominio, ID_MODULO, dbResource);
  795.                     }
  796.                     else if(dbConsegnePreseInCaricoManager!=null) {
  797.                         dbConsegnePreseInCaricoManager.releaseResource(idDominio, ID_MODULO, dbResource);
  798.                     }
  799.                     else if(dbConsegneMessageBoxManager!=null){
  800.                         dbConsegneMessageBoxManager.releaseResource(idDominio, ID_MODULO, dbResource);
  801.                     }
  802.                 }
  803.             } catch (Exception e) {
  804.                 // ignore
  805.             }
  806.         }


  807.     }

  808.     private void setDettaglioEsito(TransazioneApplicativoServer transazioneApplicativoServer, EsitiProperties esitiProperties, Context context) throws ProtocolException {
  809.        
  810.         if(transazioneApplicativoServer.getDataMessaggioScaduto()!=null) {
  811.             return; // non devo aggiornare l'esito
  812.         }
  813.         else if(transazioneApplicativoServer.getDataPrelievoIm()!=null) {
  814.             return; // non devo aggiornare l'esito
  815.         }
  816.         else if(transazioneApplicativoServer.getDataEliminazioneIm()!=null) {
  817.             transazioneApplicativoServer.setDettaglioEsito(esitiProperties.convertoToCode(EsitoTransazioneName.OK));
  818.         }
  819.         else {
  820.             if(transazioneApplicativoServer.getDataUscitaRichiesta()!=null) {
  821.                 if(transazioneApplicativoServer.getFault()!=null) {
  822.                     transazioneApplicativoServer.setDettaglioEsito(esitiProperties.convertoToCode(EsitoTransazioneName.ERRORE_APPLICATIVO));
  823.                 }
  824.                 else if(transazioneApplicativoServer.getCodiceRisposta()!=null) {
  825.                     int code = -1;
  826.                     try {
  827.                         code = Integer.valueOf(transazioneApplicativoServer.getCodiceRisposta());
  828.                     }catch(Exception e) {
  829.                         // ignore
  830.                     }
  831.                     if(code>0) {
  832.                         if(code<=299) {
  833.                             transazioneApplicativoServer.setDettaglioEsito(esitiProperties.convertoToCode(EsitoTransazioneName.OK));
  834.                         }
  835.                         else if(transazioneApplicativoServer.isConsegnaTerminata()) {
  836.                            
  837.                             if(code>299 && code<=399) {
  838.                                 transazioneApplicativoServer.setDettaglioEsito(esitiProperties.convertoToCode(EsitoTransazioneName.HTTP_3xx));
  839.                             }
  840.                             else if(code>399 && code<=499) {
  841.                                 transazioneApplicativoServer.setDettaglioEsito(esitiProperties.convertoToCode(EsitoTransazioneName.HTTP_4xx));
  842.                             }
  843.                             else { /**if(code>499) {*/
  844.                                 transazioneApplicativoServer.setDettaglioEsito(esitiProperties.convertoToCode(EsitoTransazioneName.HTTP_5xx));
  845.                             }
  846.                            
  847.                         }
  848.                         else {
  849.                             setErroreInvocazione(transazioneApplicativoServer, esitiProperties, context, code);
  850.                         }
  851.                     }
  852.                     else {
  853.                         // altro tipo di codice
  854.                         if(transazioneApplicativoServer.isConsegnaTerminata()) {
  855.                             transazioneApplicativoServer.setDettaglioEsito(esitiProperties.convertoToCode(EsitoTransazioneName.OK));
  856.                         }
  857.                         else {
  858.                             setErroreInvocazione(transazioneApplicativoServer, esitiProperties, context, -1);
  859.                         }
  860.                     }
  861.                 }
  862.                 else {
  863.                     // senza codice di risposta
  864.                     if(transazioneApplicativoServer.isConsegnaTerminata()) {
  865.                         transazioneApplicativoServer.setDettaglioEsito(esitiProperties.convertoToCode(EsitoTransazioneName.OK));
  866.                     }
  867.                     else {
  868.                         setErroreInvocazione(transazioneApplicativoServer, esitiProperties, context, -1);
  869.                     }
  870.                 }
  871.             }
  872.         }
  873.        
  874.         if(transazioneApplicativoServer.getDettaglioEsito()>0) {
  875.             // nop
  876.         }
  877.        
  878.     }
  879.    
  880.     private void setErroreInvocazione(TransazioneApplicativoServer transazioneApplicativoServer, EsitiProperties esitiProperties, Context context, int code) throws ProtocolException {
  881.         EsitoTransazioneName name = EsitoTransazioneName.ERRORE_INVOCAZIONE;
  882.         if(context!=null &&
  883.                 context.containsKey(org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE)
  884.             ){

  885.             String timeoutExceededMessage = null;
  886.             if(context.containsKey(org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE)) {
  887.                 timeoutExceededMessage = (String) context.get(org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE);
  888.                 if(org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_CONNECTION_TIMEOUT.equals(timeoutExceededMessage)) {
  889.                     name = EsitoTransazioneName.ERRORE_CONNECTION_TIMEOUT;
  890.                 }
  891.                 else if(org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_REQUEST_READ_TIMEOUT.equals(timeoutExceededMessage)) {
  892.                     name = EsitoTransazioneName.ERRORE_REQUEST_TIMEOUT;
  893.                 }
  894.                 else if(org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_RESPONSE_READ_TIMEOUT.equals(timeoutExceededMessage) ||
  895.                         org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_READ_TIMEOUT.equals(timeoutExceededMessage)) {
  896.                     name = EsitoTransazioneName.ERRORE_RESPONSE_TIMEOUT;
  897.                 }
  898.             }
  899.            
  900.         }
  901.         else {
  902.             if(code>299 && code<=399) {
  903.                 name = EsitoTransazioneName.HTTP_3xx;
  904.             }
  905.             else if(code>399 && code<=499) {
  906.                 name = EsitoTransazioneName.HTTP_4xx;
  907.             }
  908.             else if(code>499 && code<=599) {
  909.                 name = EsitoTransazioneName.HTTP_5xx;
  910.             }
  911.         }
  912.        
  913.         transazioneApplicativoServer.setDettaglioEsito(esitiProperties.convertoToCode(name));
  914.     }

  915.     private static boolean debugStaticValue = true;
  916.     public static boolean isDebug() {
  917.         return debugStaticValue;
  918.     }
  919.     public static void setDebug(boolean debug) {
  920.         GestoreConsegnaMultipla.debugStaticValue = debug;
  921.     }
  922.     private boolean safeAggiornaInformazioneConsegnaTerminata(TransazioneApplicativoServer transazioneApplicativoServer, Connection con, EsitiProperties esitiProperties,
  923.              boolean possibileTerminazioneSingleIntegrationManagerMessage,boolean consegnaInErrore,
  924.              List<String> timeDetails) {
  925.        
  926.         boolean debugMode = debugStaticValue; // un eventuale errore deve essere sempre registrato
  927.        
  928.         DAOFactory daoF = debugMode ? daoFactory : daoFactoryDevNull;
  929.         Logger logFactory = debugMode ? daoFactoryLoggerTransazioniSql : daoFactoryLoggerTransazioniDevNull;
  930.         ServiceManagerProperties smp = debugMode ? daoFactoryServiceManagerPropertiesTransazioni : daoFactoryDevNullServiceManagerPropertiesTransazioni;
  931.        
  932.         int esitoConsegnaMultipla = -1;
  933.         int esitoConsegnaMultiplaInCorso = -1;
  934.         int esitoConsegnaMultiplaFallita = -1;
  935.         int esitoConsegnaMultiplaCompletata = -1;
  936.         int ok = -1;
  937.         int esitoIntegrationManagerSingolo = -1;
  938.         boolean esitiLetti = false;
  939.         try {
  940.             esitoConsegnaMultipla = esitiProperties.convertoToCode(EsitoTransazioneName.CONSEGNA_MULTIPLA);
  941.             esitoConsegnaMultiplaInCorso = esitiProperties.convertoToCode(EsitoTransazioneName.CONSEGNA_MULTIPLA_IN_CORSO);
  942.             esitoConsegnaMultiplaFallita = esitiProperties.convertoToCode(EsitoTransazioneName.CONSEGNA_MULTIPLA_FALLITA);
  943.             esitoConsegnaMultiplaCompletata = esitiProperties.convertoToCode(EsitoTransazioneName.CONSEGNA_MULTIPLA_COMPLETATA);
  944.             ok = esitiProperties.convertoToCode(EsitoTransazioneName.OK);
  945.             esitoIntegrationManagerSingolo = esitiProperties.convertoToCode(EsitoTransazioneName.MESSAGE_BOX);
  946.             esitiLetti = true;          
  947.         }catch(Exception er) {
  948.             // errore che non dovrebbe succedere
  949.             String msg = "Errore durante l'aggiornamento delle transazione relativamente all'informazione del server '"+transazioneApplicativoServer.getServizioApplicativoErogatore()+"': (readEsiti) " + er.getMessage();
  950.             this.log.error("[id:"+transazioneApplicativoServer.getIdTransazione()+"][sa:"+transazioneApplicativoServer.getServizioApplicativoErogatore()+"]["+transazioneApplicativoServer.getConnettoreNome()+"] "+msg,er);
  951.         }
  952.        
  953.         if(esitiLetti) {
  954.             return TransactionServerUtils.safeAggiornaInformazioneConsegnaTerminata(transazioneApplicativoServer, con,
  955.                     this.tipoDatabase, this.log,
  956.                     daoF,logFactory,smp,
  957.                     this.debug,
  958.                     esitoConsegnaMultipla, esitoConsegnaMultiplaInCorso, esitoConsegnaMultiplaFallita, esitoConsegnaMultiplaCompletata, ok,
  959.                     esitoIntegrationManagerSingolo, possibileTerminazioneSingleIntegrationManagerMessage, consegnaInErrore,
  960.                     openspcoopProperties.getGestioneSerializableDBAttesaAttiva(),openspcoopProperties.getGestioneSerializableDBCheckInterval(),
  961.                     timeDetails);
  962.         }
  963.         return false;
  964.     }

  965. }

  966. class TransazioniSAProcessTimes{

  967.     String idTransazione;
  968.     String servizioApplicativoErogatore;
  969.     long getConnection = -1;
  970.     long insert = -1;
  971.     long update = -1;
  972.     List<String> saDetails = null;
  973.     long updateTransazione = -1;
  974.     List<String> transazioneDetails = null;
  975.    
  976.     @Override
  977.     public String toString() {
  978.         StringBuilder sb = new StringBuilder();
  979.         if(this.getConnection>=0) {
  980.             if(sb.length()>0) {
  981.                 sb.append(" ");
  982.             }
  983.             sb.append("getConnection:").append(this.getConnection);
  984.         }
  985.         if(this.insert>=0) {
  986.             if(sb.length()>0) {
  987.                 sb.append(" ");
  988.             }
  989.             sb.append("insert:").append(this.insert);
  990.         }
  991.         if(this.update>=0) {
  992.             if(sb.length()>0) {
  993.                 sb.append(" ");
  994.             }
  995.             sb.append("update:").append(this.update);
  996.         }
  997.         if(this.saDetails!=null && !this.saDetails.isEmpty()) {
  998.             if(sb.length()>0) {
  999.                 sb.append(" ");
  1000.             }
  1001.             if(this.insert>=0) {
  1002.                 sb.append("insertDetails:{");
  1003.             }
  1004.             else if(this.update>=0) {
  1005.                 sb.append("updateDetails:{");
  1006.             }
  1007.             else {
  1008.                 sb.append("details:{");
  1009.             }
  1010.             boolean first = true;
  1011.             for (String det : this.saDetails) {
  1012.                 if(!first) {
  1013.                     sb.append(" ");
  1014.                 }
  1015.                 sb.append(det);
  1016.                 first=false;
  1017.             }
  1018.             sb.append("}");
  1019.         }
  1020.         if(this.updateTransazione>=0) {
  1021.             if(sb.length()>0) {
  1022.                 sb.append(" ");
  1023.             }
  1024.             sb.append("updateTransaction:").append(this.updateTransazione);
  1025.         }
  1026.         if(this.transazioneDetails!=null && !this.transazioneDetails.isEmpty()) {
  1027.             if(sb.length()>0) {
  1028.                 sb.append(" ");
  1029.             }
  1030.             sb.append("updateTransactionDetails:{");
  1031.             boolean first = true;
  1032.             for (String det : this.transazioneDetails) {
  1033.                 if(!first) {
  1034.                     sb.append(" ");
  1035.                 }
  1036.                 sb.append(det);
  1037.                 first=false;
  1038.             }
  1039.             sb.append("}");
  1040.         }
  1041.         return sb.toString();
  1042.     }
  1043. }