TransazioneUtilities.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.ByteArrayOutputStream;
  22. import java.sql.Timestamp;
  23. import java.util.ArrayList;
  24. import java.util.Date;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;

  28. import org.apache.commons.lang.StringUtils;
  29. import org.openspcoop2.core.commons.CoreException;
  30. import org.openspcoop2.core.config.Transazioni;
  31. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  32. import org.openspcoop2.core.constants.Costanti;
  33. import org.openspcoop2.core.constants.CostantiLabel;
  34. import org.openspcoop2.core.constants.TipoPdD;
  35. import org.openspcoop2.core.controllo_traffico.beans.MisurazioniTransazione;
  36. import org.openspcoop2.core.id.IDAccordo;
  37. import org.openspcoop2.core.id.IDServizio;
  38. import org.openspcoop2.core.id.IDSoggetto;
  39. import org.openspcoop2.core.registry.AccordoServizioParteComune;
  40. import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
  41. import org.openspcoop2.core.registry.GruppoAccordo;
  42. import org.openspcoop2.core.registry.driver.IDAccordoFactory;
  43. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  44. import org.openspcoop2.core.transazioni.CredenzialeMittente;
  45. import org.openspcoop2.core.transazioni.Transazione;
  46. import org.openspcoop2.core.transazioni.TransazioneExtendedInfo;
  47. import org.openspcoop2.core.transazioni.constants.PddRuolo;
  48. import org.openspcoop2.core.transazioni.constants.RuoloTransazione;
  49. import org.openspcoop2.core.transazioni.constants.TipoAPI;
  50. import org.openspcoop2.core.transazioni.constants.TipoMessaggio;
  51. import org.openspcoop2.core.transazioni.utils.PropertiesSerializator;
  52. import org.openspcoop2.core.transazioni.utils.TempiElaborazioneUtils;
  53. import org.openspcoop2.core.transazioni.utils.credenziali.AbstractCredenzialeList;
  54. import org.openspcoop2.message.OpenSPCoop2RestMessage;
  55. import org.openspcoop2.message.OpenSPCoop2SoapMessage;
  56. import org.openspcoop2.message.constants.MessageRole;
  57. import org.openspcoop2.message.constants.ServiceBinding;
  58. import org.openspcoop2.message.xml.MessageXMLUtils;
  59. import org.openspcoop2.monitor.engine.condition.EsitoUtils;
  60. import org.openspcoop2.monitor.sdk.transaction.FaseTracciamento;
  61. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  62. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  63. import org.openspcoop2.pdd.core.CostantiPdD;
  64. import org.openspcoop2.pdd.core.EJBUtils;
  65. import org.openspcoop2.pdd.core.EJBUtilsMessaggioInConsegna;
  66. import org.openspcoop2.pdd.core.GestoreMessaggi;
  67. import org.openspcoop2.pdd.core.PdDContext;
  68. import org.openspcoop2.pdd.core.autenticazione.GestoreAutenticazione;
  69. import org.openspcoop2.pdd.core.behaviour.built_in.multi_deliver.ConfigurazioneMultiDeliver;
  70. import org.openspcoop2.pdd.core.controllo_traffico.CostantiControlloTraffico;
  71. import org.openspcoop2.pdd.core.handlers.ExtendedTransactionInfo;
  72. import org.openspcoop2.pdd.core.handlers.HandlerException;
  73. import org.openspcoop2.pdd.core.state.IOpenSPCoopState;
  74. import org.openspcoop2.pdd.core.state.OpenSPCoopStateful;
  75. import org.openspcoop2.pdd.core.token.InformazioniNegoziazioneToken;
  76. import org.openspcoop2.pdd.core.token.InformazioniToken;
  77. import org.openspcoop2.pdd.core.token.TokenUtilities;
  78. import org.openspcoop2.pdd.core.token.attribute_authority.InformazioniAttributi;
  79. import org.openspcoop2.pdd.core.transazioni.DateUtility;
  80. import org.openspcoop2.pdd.core.transazioni.Transaction;
  81. import org.openspcoop2.pdd.logger.DiagnosticInputStream;
  82. import org.openspcoop2.pdd.logger.DumpUtility;
  83. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  84. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  85. import org.openspcoop2.pdd.logger.info.InfoEsitoTransazioneFormatUtils;
  86. import org.openspcoop2.protocol.engine.driver.RepositoryBuste;
  87. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  88. import org.openspcoop2.protocol.sdk.Busta;
  89. import org.openspcoop2.protocol.sdk.Context;
  90. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  91. import org.openspcoop2.protocol.sdk.builder.EsitoTransazione;
  92. import org.openspcoop2.protocol.sdk.builder.IBustaBuilder;
  93. import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
  94. import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
  95. import org.openspcoop2.protocol.sdk.constants.TipoSerializzazione;
  96. import org.openspcoop2.protocol.sdk.dump.Messaggio;
  97. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  98. import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
  99. import org.openspcoop2.protocol.utils.EsitiProperties;
  100. import org.openspcoop2.utils.MapKey;
  101. import org.openspcoop2.utils.date.DateManager;
  102. import org.openspcoop2.utils.json.JSONUtils;
  103. import org.openspcoop2.utils.transport.TransportUtils;
  104. import org.slf4j.Logger;

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

  106. /**    
  107.  * TransazioneUtilities
  108.  *
  109.  * @author Poli Andrea (poli@link.it)
  110.  * @author $Author$
  111.  * @version $Rev$, $Date$
  112.  */
  113. public class TransazioneUtilities {

  114.     private Logger logger;
  115.     private boolean transazioniRegistrazioneTracceHeaderRawEnabled;
  116.     private boolean transazioniRegistrazioneTracceDigestEnabled;
  117.     private boolean transazioniRegistrazioneTracceProtocolPropertiesEnabled;
  118.     private boolean transazioniRegistrazioneTokenInformazioniNormalizzate;
  119.     private boolean transazioniRegistrazioneAttributiInformazioniNormalizzate;
  120.     private boolean transazioniRegistrazioneTempiElaborazione;
  121.     private boolean transazioniRegistrazioneRetrieveTokenSaveAsTokenInfo;
  122.    
  123.     public TransazioneUtilities(Logger log, OpenSPCoop2Properties openspcoopProperties,
  124.             boolean transazioniRegistrazioneTracceHeaderRawEnabled,
  125.             boolean transazioniRegistrazioneTracceDigestEnabled,
  126.             boolean transazioniRegistrazioneTracceProtocolPropertiesEnabled,
  127.             Transazioni configTransazioni){
  128.         this.logger = log;
  129.         this.transazioniRegistrazioneTracceHeaderRawEnabled = transazioniRegistrazioneTracceHeaderRawEnabled;
  130.         this.transazioniRegistrazioneTracceDigestEnabled = transazioniRegistrazioneTracceDigestEnabled;
  131.         this.transazioniRegistrazioneTracceProtocolPropertiesEnabled = transazioniRegistrazioneTracceProtocolPropertiesEnabled;
  132.        
  133.         this.transazioniRegistrazioneTempiElaborazione = configTransazioni!=null && StatoFunzionalita.ABILITATO.equals(configTransazioni.getTempiElaborazione());
  134.         this.transazioniRegistrazioneTokenInformazioniNormalizzate = configTransazioni!=null && StatoFunzionalita.ABILITATO.equals(configTransazioni.getToken());
  135.         this.transazioniRegistrazioneAttributiInformazioniNormalizzate = configTransazioni!=null && StatoFunzionalita.ABILITATO.equals(configTransazioni.getToken()) &&
  136.                 openspcoopProperties.isGestioneAttributeAuthorityTransazioniRegistrazioneAttributiInformazioniNormalizzate(); // per adesso la configurazione avviene via govway.properties
  137.         this.transazioniRegistrazioneRetrieveTokenSaveAsTokenInfo = configTransazioni!=null && StatoFunzionalita.ABILITATO.equals(configTransazioni.getToken()) &&
  138.                 openspcoopProperties.isGestioneRetrieveTokenSaveAsTokenInfo(); // per adesso la configurazione avviene via govway.properties
  139.     }
  140.    
  141.     public static boolean isConsegnaMultipla(Context context) {
  142.         int connettoriMultipli = getNumeroConnettoriMultipli(context);
  143.         return ConfigurazioneTracciamentoUtils.isConsegnaMultipla(connettoriMultipli);
  144.     }
  145.     public static boolean isConsegnaMultipla(int connettoriMultipli) {
  146.         return ConfigurazioneTracciamentoUtils.isConsegnaMultipla(connettoriMultipli);
  147.     }
  148.     public static int getNumeroConnettoriMultipli(Context context) {
  149.         return ConfigurazioneTracciamentoUtils.getNumeroConnettoriMultipli(context);
  150.     }
  151.     public static String getConnettoriMultipli(Context context) {
  152.         return ConfigurazioneTracciamentoUtils.getConnettoriMultipli(context);
  153.     }
  154.    
  155.     public static MisurazioniTransazione fillMisurazioniTransazione(InformazioniTransazione info, FaseTracciamento fase,  Transaction transaction, EsitoTransazione esito, Transazione transactionDTOparam) {
  156.         MisurazioniTransazione misurazioniTransazione = new MisurazioniTransazione();
  157.         misurazioniTransazione.setTipoPdD(info.getTipoPorta());
  158.         misurazioniTransazione.setProtocollo( info.getProtocolFactory().getProtocol());
  159.         misurazioniTransazione.setEsitoTransazione(esito.getCode());
  160.        
  161.         OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  162.        
  163.         boolean fillTransaction = transactionDTOparam==null;
  164.         Transazione transactionDTO = fillTransaction ? new Transazione() : transactionDTOparam;
  165.        
  166.         if(fillTransaction)
  167.             TransazioneUtilities.setDataIngressoRichiesta(op2Properties, transactionDTO, info, transaction);
  168.         misurazioniTransazione.setDataIngressoRichiesta(transactionDTO.getDataIngressoRichiesta());
  169.        
  170.         if(fillTransaction)
  171.             TransazioneUtilities.setDataUscitaRichiesta(transactionDTO, fase, transaction);
  172.         misurazioniTransazione.setDataUscitaRichiesta(transactionDTO.getDataUscitaRichiesta());
  173.        
  174.         if(fillTransaction)
  175.             TransazioneUtilities.setDataIngressoRisposta(op2Properties, transactionDTO, fase, transaction);
  176.         misurazioniTransazione.setDataIngressoRisposta(transactionDTO.getDataIngressoRisposta());
  177.        
  178.         if(fillTransaction)
  179.             TransazioneUtilities.setDataUscitaRisposta(op2Properties, transactionDTO, info, fase, transaction);
  180.         misurazioniTransazione.setDataUscitaRisposta(transactionDTO.getDataUscitaRisposta());
  181.        
  182.         if(fillTransaction)
  183.             TransazioneUtilities.setRichiestaIngressoBytes(transactionDTO, info, transaction, fase);
  184.         misurazioniTransazione.setRichiestaIngressoBytes(transactionDTO.getRichiestaIngressoBytes());
  185.        
  186.         if(fillTransaction)
  187.             TransazioneUtilities.setRichiestaUscitaBytes(transactionDTO, info, transaction, fase);
  188.         misurazioniTransazione.setRichiestaUscitaBytes(transactionDTO.getRichiestaUscitaBytes());
  189.        
  190.         if(fillTransaction)
  191.             TransazioneUtilities.setRispostaIngressoBytes(transactionDTO, info, transaction, fase);
  192.         misurazioniTransazione.setRispostaIngressoBytes(transactionDTO.getRispostaIngressoBytes());
  193.        
  194.         if(fillTransaction)
  195.             TransazioneUtilities.setRispostaUscitaBytes(transactionDTO, info, fase);
  196.         misurazioniTransazione.setRispostaUscitaBytes(transactionDTO.getRispostaUscitaBytes());
  197.        
  198.         return misurazioniTransazione;
  199.     }
  200.    
  201.    
  202.     public Transazione fillTransaction(InformazioniTransazione info, Transaction transaction, IDSoggetto idDominio,
  203.             TransazioniProcessTimes times, FaseTracciamento fase,
  204.             EsitoTransazione esito, String esitoContext,
  205.             Transazione transazioneDaAggiornare ) throws HandlerException{

  206.         // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  207.        
  208.         OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  209.        
  210.         if(transaction==null) {
  211.             throw new HandlerException("Transaction is null");
  212.         }
  213.         if(info==null) {
  214.             throw new HandlerException("Informazioni sulla richiesta is null");
  215.         }
  216.        
  217.         Traccia tracciaRichiesta = transaction.getTracciaRichiesta();
  218.         Traccia tracciaRisposta = transaction.getTracciaRisposta();

  219.         boolean richiestaDuplicata = false;
  220.         ProfiloDiCollaborazione profiloCollaborazioneBustaTracciaRichiesta = null;
  221.         String profiloCollaborazioneValueBustaTracciaRichiesta = null;
  222.         if(tracciaRichiesta!=null && tracciaRichiesta.getBusta()!=null){
  223.             richiestaDuplicata = transaction.containsIdProtocolloDuplicato(tracciaRichiesta.getBusta().getID());
  224.             if(tracciaRichiesta.getBusta().getProfiloDiCollaborazione()!=null){
  225.                 profiloCollaborazioneBustaTracciaRichiesta = tracciaRichiesta.getBusta().getProfiloDiCollaborazione();
  226.                 profiloCollaborazioneValueBustaTracciaRichiesta = tracciaRichiesta.getBusta().getProfiloDiCollaborazioneValue();
  227.             }
  228.         }
  229.         boolean rispostaDuplicata = false;
  230.         if(tracciaRisposta!=null && tracciaRisposta.getBusta()!=null){
  231.             rispostaDuplicata = transaction.containsIdProtocolloDuplicato(tracciaRisposta.getBusta().getID());
  232.         }

  233.         boolean schedulaNotificheDopoConsegnaSincrona = false;
  234.         boolean consegnaMultiplaProfiloSincrono = false;
  235.         MsgDiagnostico msgDiag = null;
  236.         String idTransazione = null;
  237.         String nomePorta = null;
  238.        
  239.         String identificativoSaveTransactionContext = null;
  240.        
  241.         long timeStart = -1;
  242.         try {

  243.             if(times!=null) {
  244.                 times.fillTransactionDetails = new ArrayList<>();
  245.                 timeStart = DateManager.getTimeMillis();
  246.             }
  247.            
  248.             IProtocolFactory<?> protocolFactory = info.getProtocolFactory();

  249.             IBustaBuilder<?> protocolBustaBuilder = protocolFactory.createBustaBuilder(info.getStato());

  250.             RequestInfo requestInfo = null;
  251.             if(info.getContext()!=null && info.getContext().containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  252.                 requestInfo = (RequestInfo) info.getContext().getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  253.             }

  254.             if(FaseTracciamento.POST_OUT_RESPONSE.equals(fase) &&
  255.                     info.getContext()!=null && info.getContext().containsKey(CostantiPdD.SALVA_CONTESTO_IDENTIFICATIVO_MESSAGGIO_NOTIFICA)) {
  256.                 identificativoSaveTransactionContext = (String) info.getContext().getObject(CostantiPdD.SALVA_CONTESTO_IDENTIFICATIVO_MESSAGGIO_NOTIFICA);
  257.             }
  258.            
  259.             Transazione transactionDTO = transazioneDaAggiornare!=null ? transazioneDaAggiornare : new Transazione();

  260.             EsitiProperties esitiProperties = EsitiProperties.getInstance(this.logger, protocolFactory);
  261.                        
  262.             // ** Consegna Multipla **
  263.             // NOTA: l'esito deve essere compreso solo dopo aver capito se le notifiche devono essere consegna o meno poichè le notifiche stesse si basano sullo stato di come è terminata la transazione sincrona
  264.             int connettoriMultipli = getNumeroConnettoriMultipli(info.getContext());
  265.             boolean consegnaMultipla = isConsegnaMultipla(connettoriMultipli);
  266.            
  267.             ConfigurazioneMultiDeliver configurazioneConsegnaMultiplaProfiloSincrono = null;
  268.             if(FaseTracciamento.POST_OUT_RESPONSE.equals(fase) && consegnaMultipla) {
  269.                 Object oConnettoreSync = info.getContext().getObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_SINCRONA );
  270.                 if (oConnettoreSync instanceof Boolean){
  271.                     consegnaMultiplaProfiloSincrono = (Boolean) oConnettoreSync;
  272.                 }
  273.                 else if (oConnettoreSync instanceof String){
  274.                     consegnaMultiplaProfiloSincrono = Boolean.valueOf( (String) oConnettoreSync );
  275.                 }
  276.                
  277.                 if(consegnaMultiplaProfiloSincrono) {
  278.                     Object oConnettoreSyncConfig = info.getContext().getObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_SINCRONA_CONFIGURAZIONE );
  279.                     if (oConnettoreSyncConfig instanceof ConfigurazioneMultiDeliver){
  280.                         configurazioneConsegnaMultiplaProfiloSincrono = (ConfigurazioneMultiDeliver) oConnettoreSyncConfig;
  281.                     }
  282.                 }
  283.             }

  284.             if(consegnaMultiplaProfiloSincrono) {
  285.                 if(transaction!=null && transaction.getRequestInfo()!=null && transaction.getRequestInfo().getProtocolContext()!=null){
  286.                     nomePorta = transaction.getRequestInfo().getProtocolContext().getInterfaceName();
  287.                 }
  288.                 msgDiag = MsgDiagnostico.newInstance(info.getTipoPorta(),idDominio, info.getIdModulo(), nomePorta, requestInfo, info.getStato());
  289.             }
  290.             if(consegnaMultiplaProfiloSincrono && configurazioneConsegnaMultiplaProfiloSincrono!=null &&
  291.                     esito!=null && esito.getCode()!=null) {
  292.                 if(configurazioneConsegnaMultiplaProfiloSincrono.isNotificheByEsito()) {
  293.                     int esitoSincrono = esito.getCode();
  294.                     if(isEsito(esitiProperties.getEsitiCodeOk_senzaFaultApplicativo(), esitoSincrono)) {
  295.                         schedulaNotificheDopoConsegnaSincrona = configurazioneConsegnaMultiplaProfiloSincrono.isNotificheByEsito_ok();
  296.                     }
  297.                     else if(isEsito(esitiProperties.getEsitiCodeFaultApplicativo(), esitoSincrono)) {
  298.                         schedulaNotificheDopoConsegnaSincrona = configurazioneConsegnaMultiplaProfiloSincrono.isNotificheByEsito_fault();
  299.                     }
  300.                     else if(isEsito(esitiProperties.getEsitiCodeErroriConsegna(), esitoSincrono)) {
  301.                         schedulaNotificheDopoConsegnaSincrona = configurazioneConsegnaMultiplaProfiloSincrono.isNotificheByEsito_erroriConsegna();
  302.                     }
  303.                     // le richieste scartate non arrivano alla gestione della consegna in smistatore e quindi non potranno nemmeno essere notifiate
  304.                     /**else if(isEsito(esitiProperties.getEsitiCodeRichiestaScartate(), esitoSincrono)) {
  305.                     //  schedulaNotificheDopoConsegnaSincrona = configurazione_consegnaMultipla_profiloSincrono.isNotificheByEsito_richiesteScartate();
  306.                     //}*/
  307.                     else {
  308.                         schedulaNotificheDopoConsegnaSincrona = configurazioneConsegnaMultiplaProfiloSincrono.isNotificheByEsito_erroriProcessamento();
  309.                     }
  310.                 }
  311.                 else {
  312.                     schedulaNotificheDopoConsegnaSincrona = true;
  313.                 }
  314.             }
  315.             if(schedulaNotificheDopoConsegnaSincrona && info.getContext()!=null) {
  316.                 Exception e = null;
  317.                 Object oException = info.getContext().getObject(CostantiPdD.CONNETTORE_MULTIPLO_CONSEGNA_NOTIFICA_DISABILITATA );
  318.                 if (oException instanceof Exception){
  319.                     e = (Exception) oException;
  320.                 }
  321.                 if(e!=null) {
  322.                     // log effettuato in consegna contenuti
  323.                     schedulaNotificheDopoConsegnaSincrona = false;
  324.                 }
  325.             }
  326.            

  327.             if(times!=null) {
  328.                 long timeEnd =  DateManager.getTimeMillis();
  329.                 long timeProcess = timeEnd-timeStart;
  330.                 times.fillTransactionDetails.add("connettoreMultipli:"+timeProcess);
  331.                
  332.                 timeStart = DateManager.getTimeMillis();
  333.             }
  334.            
  335.            
  336.             // ** Identificativo di transazione **
  337.             if (info.getContext().getObject(Costanti.ID_TRANSAZIONE)!=null){
  338.                 idTransazione = ((String)info.getContext().getObject(Costanti.ID_TRANSAZIONE));
  339.                 transactionDTO.setIdTransazione(idTransazione);
  340.             }else
  341.                 throw new HandlerException("ID Transazione Assente");


  342.             // ** Esito Transazione **
  343.             if (esito!=null){
  344.                 if(consegnaMultipla) {
  345.                     if(consegnaMultiplaProfiloSincrono) {
  346.                         if(schedulaNotificheDopoConsegnaSincrona) {
  347.                             transactionDTO.setEsito(esitiProperties.convertoToCode(EsitoTransazioneName.CONSEGNA_MULTIPLA));
  348.                             if(esito.getCode()!=null){
  349.                                 transactionDTO.setEsitoSincrono(esito.getCode());
  350.                             }
  351.                             transactionDTO.setConsegneMultipleInCorso(connettoriMultipli);
  352.                         }
  353.                         else {
  354.                             if(esito.getCode()!=null){
  355.                                 transactionDTO.setEsito(esito.getCode());
  356.                             }
  357.                         }
  358.                     }
  359.                     else {
  360.                         transactionDTO.setEsito(esitiProperties.convertoToCode(EsitoTransazioneName.CONSEGNA_MULTIPLA));
  361.                         transactionDTO.setConsegneMultipleInCorso(connettoriMultipli);  
  362.                     }
  363.                 }
  364.                 else {
  365.                     if(esito.getCode()!=null){
  366.                         transactionDTO.setEsito(esito.getCode());
  367.                     }
  368.                 }
  369.                 transactionDTO.setEsitoContesto(esito.getContextType());
  370.             }
  371.             else {
  372.                 transactionDTO.setEsitoContesto(esitoContext);
  373.             }
  374.             // aggiungo fase all'esito
  375.             transactionDTO.setEsitoContesto(EsitoUtils.buildEsitoContext(transactionDTO.getEsitoContesto(), fase));
  376.                        
  377.            
  378.             // ** Codice Risposta Uscita **
  379.             if(info.getReturnCode()>0)
  380.                 transactionDTO.setCodiceRispostaUscita(info.getReturnCode()+"");
  381.            
  382.             // ** eventi di gestione **
  383.             if(FaseTracciamento.POST_OUT_RESPONSE.equals(fase)){
  384.                 setEventi(transactionDTO, transaction,
  385.                         op2Properties,
  386.                         requestInfo,
  387.                         idDominio, info, idTransazione,
  388.                         times, timeStart, fase);
  389.             }
  390.             if(times!=null) {
  391.                 timeStart = DateManager.getTimeMillis();
  392.             }
  393.            
  394.             // ** data_uscita_risposta **
  395.             TransazioneUtilities.setDataUscitaRisposta(op2Properties, transactionDTO, info, fase, transaction);
  396.                
  397.             // ** data_uscita_risposta_stream **
  398.             TransazioneUtilities.setDataUscitaRispostaStream(op2Properties, transactionDTO, info, fase);
  399.            
  400.             // ** dimensione_ingresso_risposta **
  401.             TransazioneUtilities.setRispostaIngressoBytes(transactionDTO, info, transaction, fase);
  402.    
  403.             // ** dimensione_uscita_risposta **
  404.             TransazioneUtilities.setRispostaUscitaBytes(transactionDTO, info, fase);
  405.            
  406.             // ** FAULT **
  407.             if(FaseTracciamento.OUT_RESPONSE.equals(fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  408.                 transactionDTO.setFaultIntegrazione(transaction.getFaultIntegrazione());
  409.                 transactionDTO.setFormatoFaultIntegrazione(transaction.getFormatoFaultIntegrazione());
  410.                 transactionDTO.setFaultCooperazione(transaction.getFaultCooperazione());
  411.                 transactionDTO.setFormatoFaultCooperazione(transaction.getFormatoFaultCooperazione());
  412.             }
  413. /**         boolean readFault = false;
  414. //          if(TipoPdD.DELEGATA.equals(context.getTipoPorta())){
  415. //              if(transactionDTO.getFaultIntegrazione()==null){
  416. //                  readFault = true;
  417. //              }
  418. //          }
  419. //          else{
  420. //              if(transactionDTO.getFaultCooperazione()==null){
  421. //                  readFault = true;
  422. //              }
  423. //          }*/
  424.             // Il fault potrebbe essere cambiato durante la fase di gestione dalla consegna della risposta
  425.             boolean readFault = true;
  426.             if(readFault && FaseTracciamento.POST_OUT_RESPONSE.equals(fase)){
  427.                 setFaultInfo(transactionDTO,
  428.                         op2Properties,
  429.                         info);
  430.             }
  431.            
  432.             // ** diagnostici **
  433.             if(esito!=null) {
  434.                 String errore = InfoEsitoTransazioneFormatUtils.getMessaggioDiagnosticoErroreRilevante(this.logger, transactionDTO.getEsito(), protocolFactory, transaction.getMsgDiagnostici(), true);        
  435.                 String warning = InfoEsitoTransazioneFormatUtils.getMessaggioDiagnosticoWarning(this.logger, transactionDTO.getEsito(), protocolFactory, transaction.getMsgDiagnostici());          
  436.                 transactionDTO.setErrorLog(errore);
  437.                 transactionDTO.setWarningLog(warning);
  438.             }

  439.            
  440.             // ***** NOTA: tutte le informazioni sopra devono essere "gestite in UPDATE" nel metodo TracciamentoManager.registraTransazione
  441.            
  442.             /*** ESCO SE SONO IN FASE POST OUT DI AGGIORNAMENTO DEI DATI */
  443.            
  444.             if(transazioneDaAggiornare!=null) {
  445.                 return transactionDTO; // nell'oggetto ci sono già tutti i dati eccetto l'esito corretto
  446.             }
  447.            
  448.            
  449.            
  450.            
  451.            

  452.             // ** stato **
  453.             // Stato di una transazione (marca la transazione con uno stato tramite la configurazione plugin)
  454.             if(transaction.getStato()!=null) {
  455.                 transactionDTO.setStato(transaction.getStato());    
  456.             }

  457.             // ** Ruolo transazione **
  458.             // invocazioneOneway (1)
  459.             // invocazioneSincrona (2)
  460.             // invocazioneAsincronaSimmetrica (3)
  461.             // rispostaAsincronaSimmetrica (4)
  462.             // invocazioneAsincronaAsimmetrica (5)
  463.             // richiestaStatoAsincronaAsimmetrica (6)
  464.             // integrationManager (7)
  465.             /**System.out.println("SCENARIO DI COOPERAZIONE ["+transaction.getScenarioCooperazione()+"]");*/
  466.             RuoloTransazione ruolo = RuoloTransazione.getEnumConstantFromOpenSPCoopValue(transaction.getScenarioCooperazione());
  467.             if(ruolo!=null)
  468.                 transactionDTO.setRuoloTransazione(ruolo.getValoreAsInt());
  469.             else
  470.                 transactionDTO.setRuoloTransazione(-1);


  471.             // ** protocollo **
  472.             transactionDTO.setProtocollo(info.getProtocolFactory().getProtocol());

  473.            
  474.             // ** header HTTP **
  475.             if(transaction.getRequestInfo()!=null &&
  476.                     transaction.getRequestInfo().getProtocolContext()!=null &&
  477.                     transaction.getRequestInfo().getProtocolContext().getRequestType()!=null) {
  478.                 transactionDTO.setTipoRichiesta(transaction.getRequestInfo().getProtocolContext().getRequestType());
  479.             }
  480.             // ** Codice Risposta Ingresso **
  481.             transactionDTO.setCodiceRispostaIngresso(transaction.getCodiceTrasportoRichiesta());
  482.             // ** Codice Risposta Uscita **
  483.             // Gestite prima per la doppia fase, come per l'esito

  484.             // ** Tempi di latenza **

  485.             // Se data_accettazione_richiesta è null viene impostata a CURRENT_TIMESTAMP
  486.             TransazioneUtilities.setDataAccettazioneRichiesta(transactionDTO, info, transaction);
  487.            
  488.             // Se data_ingresso_richiesta è null viene impostata a CURRENT_TIMESTAMP
  489.             TransazioneUtilities.setDataIngressoRichiesta(op2Properties, transactionDTO, info, transaction);
  490.            
  491.             // data_ingresso_richiesta_stream
  492.             TransazioneUtilities.setDataIngressoRichiestaStream(transactionDTO, info);
  493.            
  494.             // data_uscita_richiesta si imposta se e' diversa da null
  495.             TransazioneUtilities.setDataUscitaRichiesta(transactionDTO, fase, transaction);

  496.             // data_accettazione_risposta
  497.             TransazioneUtilities.setDataAccettazioneRisposta(transactionDTO, fase, transaction);
  498.                
  499.             // data_ingresso_risposta
  500.             TransazioneUtilities.setDataIngressoRisposta(op2Properties, transactionDTO, fase, transaction);
  501.                
  502.             // data_ingresso_risposta_stream
  503.             TransazioneUtilities.setDataIngressoRispostaStream(transactionDTO, info, fase);
  504.            
  505.             // data_uscita_risposta
  506.             // data_uscita_risposta_stream
  507.             // Gestite prima per la doppia fase, come per l'esito


  508.             // ** Dimensione messaggi gestiti **
  509.             // Se le dimensioni (BIGINT) sono null occorre impostarle a zero

  510.             // dimensione_ingresso_richiesta
  511.             TransazioneUtilities.setRichiestaIngressoBytes(transactionDTO, info, transaction, fase);

  512.             // dimensione_uscita_richiesta
  513.             TransazioneUtilities.setRichiestaUscitaBytes(transactionDTO, info, transaction, fase);

  514.             // dimensione_ingresso_risposta
  515.             // dimensione_uscita_risposta
  516.             // Gestite prima per la doppia fase, come per l'esito: faccio una ulteriore verifica se siamo nell'ultima fase e sono null
  517.             if(transactionDTO.getRispostaIngressoBytes()==null &&
  518.                     FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  519.                 transactionDTO.setRispostaIngressoBytes(readDimensioneFromDumpBinario(TipoMessaggio.RISPOSTA_INGRESSO_DUMP_BINARIO, transaction));
  520.             }
  521.             if(transactionDTO.getRispostaUscitaBytes()==null &&
  522.                     FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  523.                 transactionDTO.setRispostaUscitaBytes(readDimensioneFromDumpBinario(TipoMessaggio.RISPOSTA_USCITA_DUMP_BINARIO, transaction));
  524.             }


  525.             // ** Dati Pdd **
  526.             transactionDTO.setPddCodice(idDominio.getCodicePorta());
  527.             transactionDTO.setPddTipoSoggetto(idDominio.getTipo());
  528.             transactionDTO.setPddNomeSoggetto(idDominio.getNome());
  529.             if(info.getTipoPorta()!=null){
  530.                 transactionDTO.setPddRuolo(PddRuolo.toEnumConstant(info.getTipoPorta().getTipo()));
  531.             }

  532.            
  533.             if(times!=null) {
  534.                 long timeEnd =  DateManager.getTimeMillis();
  535.                 long timeProcess = timeEnd-timeStart;
  536.                 times.fillTransactionDetails.add("baseContext:"+timeProcess);
  537.                
  538.                 timeStart = DateManager.getTimeMillis();
  539.             }
  540.            

  541.             // ** FAULT **
  542.             // Gestite prima per la doppia fase, come per l'esito
  543.            
  544.            
  545.             if(times!=null) {
  546.                 long timeEnd =  DateManager.getTimeMillis();
  547.                 long timeProcess = timeEnd-timeStart;
  548.                 times.fillTransactionDetails.add("fault:"+timeProcess);
  549.                
  550.                 timeStart = DateManager.getTimeMillis();
  551.             }


  552.             // ** Soggetto Fruitore **
  553.             if (info.getProtocollo()!=null && info.getProtocollo().getFruitore()!=null) {
  554.                 transactionDTO.setTipoSoggettoFruitore(info.getProtocollo().getFruitore().getTipo());
  555.                 transactionDTO.setNomeSoggettoFruitore(info.getProtocollo().getFruitore().getNome());
  556.                 transactionDTO.setIdportaSoggettoFruitore(info.getProtocollo().getFruitore().getCodicePorta());
  557.                 transactionDTO.setIndirizzoSoggettoFruitore(info.getProtocollo().getIndirizzoFruitore());
  558.             }
  559.             else if(transaction!=null && transaction.getRequestInfo()!=null && transaction.getRequestInfo().getFruitore()!=null) {
  560.                 transactionDTO.setTipoSoggettoFruitore(transaction.getRequestInfo().getFruitore().getTipo());
  561.                 transactionDTO.setNomeSoggettoFruitore(transaction.getRequestInfo().getFruitore().getNome());
  562.                 transactionDTO.setIdportaSoggettoFruitore(transaction.getRequestInfo().getFruitore().getCodicePorta());
  563.             }


  564.             // ** Soggetto Erogatore **
  565.             if (info.getProtocollo()!=null && info.getProtocollo().getErogatore()!=null) {
  566.                 transactionDTO.setTipoSoggettoErogatore(info.getProtocollo().getErogatore().getTipo());
  567.                 transactionDTO.setNomeSoggettoErogatore(info.getProtocollo().getErogatore().getNome());
  568.                 transactionDTO.setIdportaSoggettoErogatore(info.getProtocollo().getErogatore().getCodicePorta());
  569.                 transactionDTO.setIndirizzoSoggettoErogatore(info.getProtocollo().getIndirizzoErogatore());
  570.             }
  571.             else if(transaction!=null && transaction.getRequestInfo()!=null && transaction.getRequestInfo().getIdServizio()!=null &&
  572.                     transaction.getRequestInfo().getIdServizio().getSoggettoErogatore()!=null) {
  573.                 transactionDTO.setTipoSoggettoErogatore(transaction.getRequestInfo().getIdServizio().getSoggettoErogatore().getTipo());
  574.                 transactionDTO.setNomeSoggettoErogatore(transaction.getRequestInfo().getIdServizio().getSoggettoErogatore().getNome());
  575.                 transactionDTO.setIdportaSoggettoErogatore(transaction.getRequestInfo().getIdServizio().getSoggettoErogatore().getCodicePorta());
  576.             }


  577.             // ** Identificativi Messaggi **
  578.             if (info.getProtocollo()!=null) {

  579.                 // Richiesta
  580.                 String idMessaggioRichiesta = info.getProtocollo().getIdRichiesta();
  581.                 if(
  582.                         //TipoPdD.APPLICATIVA.equals(context.getTipoPorta()) &&
  583.                         CostantiLabel.MODIPA_PROTOCOL_NAME.equals(protocolFactory.getProtocol()) &&
  584.                         tracciaRichiesta!=null && tracciaRichiesta.getBusta()!=null && tracciaRichiesta.getBusta().getID()!=null &&
  585.                         !tracciaRichiesta.getBusta().getID().equals(idMessaggioRichiesta)) {
  586.                     // modificato durante la gestione della validazione semantica
  587.                     idMessaggioRichiesta = tracciaRichiesta.getBusta().getID();
  588.                 }
  589.                 Timestamp dateInternaIdProtocolloRichiesta = null;
  590.                 if(op2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory) &&
  591.                     idMessaggioRichiesta!=null){
  592.                     dateInternaIdProtocolloRichiesta = DateUtility.getTimestampIntoIdProtocollo(this.logger,protocolBustaBuilder,idMessaggioRichiesta);
  593.                 }

  594.                 // Risposta
  595.                 String idMessaggioRisposta = null;
  596.                 Timestamp dateInternaIdProtocolloRisposta = null;
  597.                 // Nel contesto l'id di riposta puo' essere null o un valore generato per la confermaPresa in carico.
  598.                 // Se e' presenta una busta di risposta nella transazione deve pero' finire l'id di protocollo della busta.
  599.                 if(tracciaRisposta!=null && tracciaRisposta.getBusta()!=null && tracciaRisposta.getBusta().getID()!=null){
  600.                     idMessaggioRisposta = tracciaRisposta.getBusta().getID();
  601.                     if(op2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
  602.                         dateInternaIdProtocolloRisposta = DateUtility.getTimestampIntoIdProtocollo(this.logger,protocolBustaBuilder,idMessaggioRisposta);
  603.                     }
  604.                 }
  605.                 else if(info.getProtocollo().getIdRisposta()!=null){
  606.                     idMessaggioRisposta = info.getProtocollo().getIdRisposta();
  607.                     if(op2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
  608.                         dateInternaIdProtocolloRisposta =  DateUtility.getTimestampIntoIdProtocollo(this.logger,protocolBustaBuilder,idMessaggioRisposta);
  609.                     }
  610.                 }

  611.                 // Set
  612.                 transactionDTO.setIdMessaggioRichiesta(idMessaggioRichiesta);
  613.                 transactionDTO.setIdMessaggioRisposta(idMessaggioRisposta);
  614.                 if(op2Properties.isTransazioniFiltroDuplicatiSaveDateEnabled(protocolFactory)){
  615.                     transactionDTO.setDataIdMsgRichiesta(dateInternaIdProtocolloRichiesta);
  616.                     transactionDTO.setDataIdMsgRisposta(dateInternaIdProtocolloRisposta);
  617.                 }

  618.             }


  619.             // ** altre informazioni **
  620.             if (info.getProtocollo()!=null && info.getProtocollo().getProfiloCollaborazione()!=null) {
  621.                 transactionDTO.setProfiloCollaborazioneOp2(info.getProtocollo().getProfiloCollaborazione().getEngineValue());      
  622.             }
  623.             else if(profiloCollaborazioneBustaTracciaRichiesta!=null){
  624.                 transactionDTO.setProfiloCollaborazioneOp2(profiloCollaborazioneBustaTracciaRichiesta.getEngineValue());
  625.             }
  626.             if (info.getProtocollo()!=null && info.getProtocollo().getProfiloCollaborazioneValue()!=null) {
  627.                 transactionDTO.setProfiloCollaborazioneProt(info.getProtocollo().getProfiloCollaborazioneValue());
  628.             }
  629.             else if(profiloCollaborazioneValueBustaTracciaRichiesta!=null){
  630.                 transactionDTO.setProfiloCollaborazioneProt(profiloCollaborazioneValueBustaTracciaRichiesta);
  631.             }
  632.             IDAccordo idAccordo = null;
  633.             if (info.getProtocollo()!=null){

  634.                 transactionDTO.setIdCollaborazione(info.getProtocollo().getCollaborazione());

  635.                 idAccordo = info.getProtocollo().getIdAccordo();
  636.                 if(idAccordo!=null){
  637.                     transactionDTO.setUriAccordoServizio(IDAccordoFactory.getInstance().getUriFromIDAccordo(idAccordo));
  638.                 }

  639.                 transactionDTO.setTipoServizio(info.getProtocollo().getTipoServizio());
  640.                 transactionDTO.setNomeServizio(info.getProtocollo().getServizio());
  641.                 if(info.getProtocollo().getVersioneServizio()!=null && info.getProtocollo().getVersioneServizio().intValue()>0) {
  642.                     transactionDTO.setVersioneServizio(info.getProtocollo().getVersioneServizio());
  643.                 }
  644.                 transactionDTO.setAzione(info.getProtocollo().getAzione());
  645.             }
  646.             if(transactionDTO.getTipoServizio()==null &&
  647.                 (transaction!=null && transaction.getRequestInfo()!=null && transaction.getRequestInfo().getIdServizio()!=null)
  648.                 ){
  649.                 transactionDTO.setTipoServizio(transaction.getRequestInfo().getIdServizio().getTipo());
  650.             }
  651.             if(transactionDTO.getNomeServizio()==null &&
  652.                 (transaction!=null && transaction.getRequestInfo()!=null && transaction.getRequestInfo().getIdServizio()!=null)
  653.                 ){
  654.                 transactionDTO.setNomeServizio(transaction.getRequestInfo().getIdServizio().getNome());
  655.             }
  656.             if(
  657.                 (info.getProtocollo()==null || info.getProtocollo().getVersioneServizio()==null || info.getProtocollo().getVersioneServizio().intValue()<=0)
  658.                 &&
  659.                 (transaction!=null && transaction.getRequestInfo()!=null && transaction.getRequestInfo().getIdServizio()!=null)
  660.                 ){
  661.                 transactionDTO.setVersioneServizio(transaction.getRequestInfo().getIdServizio().getVersione());
  662.             }
  663.             if(transactionDTO.getAzione()==null &&
  664.                 (transaction!=null && transaction.getRequestInfo()!=null && transaction.getRequestInfo().getIdServizio()!=null)
  665.                 ){
  666.                 transactionDTO.setAzione(transaction.getRequestInfo().getIdServizio().getAzione());
  667.             }
  668.            
  669.             if(times!=null) {
  670.                 long timeEnd =  DateManager.getTimeMillis();
  671.                 long timeProcess = timeEnd-timeStart;
  672.                 times.fillTransactionDetails.add("identificativi:"+timeProcess);
  673.                
  674.                 timeStart = DateManager.getTimeMillis();
  675.             }
  676.            
  677.             RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(info.getStato());
  678.             if(idAccordo==null &&
  679.                 (transactionDTO.getNomeServizio()!=null && transactionDTO.getTipoServizio()!=null &&
  680.                 transactionDTO.getNomeSoggettoErogatore()!=null && transactionDTO.getTipoSoggettoErogatore()!=null)
  681.                 ) {
  682.                 idAccordo = getIdAccordo(transactionDTO, registroServiziManager, requestInfo);
  683.             }
  684.            
  685.             if(times!=null) {
  686.                 long timeEnd =  DateManager.getTimeMillis();
  687.                 long timeProcess = timeEnd-timeStart;
  688.                 times.fillTransactionDetails.add("id-api:"+timeProcess);
  689.                
  690.                 timeStart = DateManager.getTimeMillis();
  691.             }
  692.            
  693.             if(idAccordo!=null) {
  694.                 setAccordoInfo(idAccordo, transactionDTO,
  695.                         op2Properties, registroServiziManager, requestInfo,
  696.                         idDominio, info, idTransazione,
  697.                         times, timeStart, fase);
  698.                 if(times!=null) {
  699.                     timeStart = DateManager.getTimeMillis();
  700.                 }
  701.             }


  702.             // ** Identificativo asincrono se utilizzato come riferimento messaggio nella richiesta (2 fase asincrona) **
  703.                
  704.             if(tracciaRichiesta!=null && tracciaRichiesta.getBusta()!=null &&
  705.                     (ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(tracciaRichiesta.getBusta().getProfiloDiCollaborazione()) || ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(tracciaRichiesta.getBusta().getProfiloDiCollaborazione()) ) ){
  706.                 Busta busta = tracciaRichiesta.getBusta();
  707.                 if(busta.getRiferimentoMessaggio()!=null){
  708.                     // Seconda fase dei profili asincroni
  709.                     transactionDTO.setIdAsincrono(busta.getRiferimentoMessaggio());
  710.                 }
  711.                 else{
  712.                     transactionDTO.setIdAsincrono(busta.getCollaborazione());
  713.                 }
  714.             }
  715.             if(tracciaRichiesta!=null && tracciaRichiesta.getBusta()!=null &&
  716.                     ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(tracciaRichiesta.getBusta().getProfiloDiCollaborazione()) ){
  717.                 Busta busta = tracciaRichiesta.getBusta();
  718.                 if(busta!=null){
  719.                     transactionDTO.setTipoServizioCorrelato(busta.getTipoServizioCorrelato());
  720.                     transactionDTO.setNomeServizioCorrelato(busta.getServizioCorrelato());
  721.                 }
  722.             }
  723.             else if(tracciaRisposta!=null && tracciaRisposta.getBusta()!=null &&
  724.                     ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(tracciaRisposta.getBusta().getProfiloDiCollaborazione()) ){
  725.                 Busta busta = tracciaRisposta.getBusta();
  726.                 if(busta!=null){
  727.                     transactionDTO.setTipoServizioCorrelato(busta.getTipoServizioCorrelato());
  728.                     transactionDTO.setNomeServizioCorrelato(busta.getServizioCorrelato());
  729.                 }
  730.             }
  731.            
  732.             if(transactionDTO.getIdCollaborazione()==null) {
  733.                 if(tracciaRichiesta!=null && tracciaRichiesta.getBusta()!=null && tracciaRichiesta.getBusta().getCollaborazione()!=null) {
  734.                     transactionDTO.setIdCollaborazione(tracciaRichiesta.getBusta().getCollaborazione());
  735.                 }
  736.                 else if(tracciaRisposta!=null && tracciaRisposta.getBusta()!=null && tracciaRisposta.getBusta().getCollaborazione()!=null) {
  737.                     transactionDTO.setIdCollaborazione(tracciaRisposta.getBusta().getCollaborazione());
  738.                 }
  739.             }
  740.            
  741.             boolean asincrono = tracciaRichiesta!=null && tracciaRichiesta.getBusta()!=null &&
  742.                     (ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO.equals(tracciaRichiesta.getBusta().getProfiloDiCollaborazione()) || ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO.equals(tracciaRichiesta.getBusta().getProfiloDiCollaborazione()) );
  743.             if(!asincrono) {
  744.                 if(transactionDTO.getIdAsincrono()==null &&
  745.                     (tracciaRichiesta!=null && tracciaRichiesta.getBusta()!=null && tracciaRichiesta.getBusta().getRiferimentoMessaggio()!=null)
  746.                     ){
  747.                     transactionDTO.setIdAsincrono(tracciaRichiesta.getBusta().getRiferimentoMessaggio());
  748.                 }
  749.                 if(transactionDTO.getIdAsincrono()==null &&
  750.                     (info.getProtocollo()!=null)
  751.                     ){
  752.                     transactionDTO.setIdAsincrono(info.getProtocollo().getRiferimentoAsincrono());
  753.                 }
  754.             }
  755.            
  756.             if(times!=null) {
  757.                 long timeEnd =  DateManager.getTimeMillis();
  758.                 long timeProcess = timeEnd-timeStart;
  759.                 times.fillTransactionDetails.add("async:"+timeProcess);
  760.                
  761.                 timeStart = DateManager.getTimeMillis();
  762.             }

  763.             // ** info protocollo **
  764.             if(tracciaRichiesta!=null){
  765.                 if(this.transazioniRegistrazioneTracceHeaderRawEnabled){
  766.                     if(tracciaRichiesta.getBustaAsString()!=null){
  767.                         transactionDTO.setHeaderProtocolloRichiesta(tracciaRichiesta.getBustaAsString());
  768.                     }
  769.                     else if(tracciaRichiesta.getBustaAsByteArray()!=null){
  770.                         transactionDTO.setHeaderProtocolloRichiesta(new String(tracciaRichiesta.getBustaAsByteArray()));
  771.                     }
  772.                     else if(tracciaRichiesta.getBustaAsRawContent()!=null){
  773.                         setHeaderProtocolloRichiesta(transactionDTO, tracciaRichiesta);
  774.                     }
  775.                 }
  776.                 if(tracciaRichiesta.getBusta()!=null){
  777.                     if(this.transazioniRegistrazioneTracceDigestEnabled){
  778.                         transactionDTO.setDigestRichiesta(tracciaRichiesta.getBusta().getDigest());
  779.                     }
  780.                     if(this.transazioniRegistrazioneTracceProtocolPropertiesEnabled &&
  781.                         tracciaRichiesta.getBusta().sizeProperties()>0){
  782.                         Map<String, List<String>> propertiesBusta = new HashMap<>();
  783.                         String [] pNames = tracciaRichiesta.getBusta().getPropertiesNames();
  784.                         if(pNames!=null){
  785.                             for (int i = 0; i < pNames.length; i++) {
  786.                                 String key = pNames[i];
  787.                                 String value = tracciaRichiesta.getBusta().getProperty(key);
  788.                                 if(key!=null && value!=null){
  789.                                     TransportUtils.put(propertiesBusta, key, value, false);
  790.                                 }
  791.                             }
  792.                         }
  793.                         PropertiesSerializator ps = new PropertiesSerializator(propertiesBusta);
  794.                         setProtocolloExtInfoRichiesta(transactionDTO, ps);
  795.                     }
  796.                 }
  797.                 if(times!=null) {
  798.                     long timeEnd =  DateManager.getTimeMillis();
  799.                     long timeProcess = timeEnd-timeStart;
  800.                     times.fillTransactionDetails.add("traccia-richiesta:"+timeProcess);
  801.                    
  802.                     timeStart = DateManager.getTimeMillis();
  803.                 }
  804.             }
  805.             if(tracciaRisposta!=null){              
  806.                 if(this.transazioniRegistrazioneTracceHeaderRawEnabled){
  807.                     if(tracciaRisposta.getBustaAsString()!=null){
  808.                         transactionDTO.setHeaderProtocolloRisposta(tracciaRisposta.getBustaAsString());
  809.                     }
  810.                     else if(tracciaRisposta.getBustaAsByteArray()!=null){
  811.                         transactionDTO.setHeaderProtocolloRisposta(new String(tracciaRisposta.getBustaAsByteArray()));
  812.                     }
  813.                     else if(tracciaRisposta.getBustaAsRawContent()!=null){
  814.                         setHeaderProtocolloRisposta(transactionDTO, tracciaRisposta);
  815.                     }
  816.                 }
  817.                 if(tracciaRisposta.getBusta()!=null){
  818.                     if(this.transazioniRegistrazioneTracceDigestEnabled){
  819.                         transactionDTO.setDigestRisposta(tracciaRisposta.getBusta().getDigest());
  820.                     }
  821.                     if(this.transazioniRegistrazioneTracceProtocolPropertiesEnabled &&
  822.                         tracciaRisposta.getBusta().sizeProperties()>0){
  823.                         Map<String, List<String>> propertiesBusta = new HashMap<>();
  824.                         String [] pNames = tracciaRisposta.getBusta().getPropertiesNames();
  825.                         if(pNames!=null){
  826.                             for (int i = 0; i < pNames.length; i++) {
  827.                                 String key = pNames[i];
  828.                                 String value = tracciaRisposta.getBusta().getProperty(key);
  829.                                 if(key!=null && value!=null){
  830.                                     TransportUtils.put(propertiesBusta, key, value, false);
  831.                                 }
  832.                             }
  833.                         }
  834.                         PropertiesSerializator ps = new PropertiesSerializator(propertiesBusta);
  835.                         setProtocolloExtInfoRisposta(transactionDTO, ps);
  836.                     }
  837.                 }
  838.                 if(times!=null) {
  839.                     long timeEnd =  DateManager.getTimeMillis();
  840.                     long timeProcess = timeEnd-timeStart;
  841.                     times.fillTransactionDetails.add("traccia-risposta:"+timeProcess);
  842.                    
  843.                     timeStart = DateManager.getTimeMillis();
  844.                 }
  845.             }
  846.            
  847.             // ** diagnostici **
  848.             // Gestite prima per la doppia fase, come per l'esito
  849.            
  850.             // ** informazioni di integrazione **
  851.             if(info.getIntegrazione()!=null){
  852.                 transactionDTO.setIdCorrelazioneApplicativa(info.getIntegrazione().getIdCorrelazioneApplicativa());
  853.                 transactionDTO.setIdCorrelazioneApplicativaRisposta(transaction.getCorrelazioneApplicativaRisposta());
  854.                 transactionDTO.setServizioApplicativoFruitore(info.getIntegrazione().getServizioApplicativoFruitore());
  855.                 if(info!=null && info.getContext()!=null &&
  856.                         info.getContext().containsKey(CostantiPdD.CONNETTORE_MULTIPLO_SELEZIONATO)) {
  857.                     Object o = info.getContext().getObject(CostantiPdD.CONNETTORE_MULTIPLO_SELEZIONATO);
  858.                     if(o instanceof String) {
  859.                         String sa = (String) o;
  860.                         if(sa!=null && !"".equals(sa)) {
  861.                             transactionDTO.setServizioApplicativoErogatore(sa);
  862.                         }
  863.                     }
  864.                 }
  865.                 if(transactionDTO.getServizioApplicativoErogatore()==null) {
  866.                     // in caso di porta applicativa si salva l'elenco dei servizi applicativi erogatori
  867.                     if(info.getIntegrazione().sizeServiziApplicativiErogatori()>0){
  868.                         StringBuilder saErogatori = new StringBuilder();
  869.                         for (int i=0; i<info.getIntegrazione().sizeServiziApplicativiErogatori(); i++) {
  870.                             if (i>0){
  871.                                 saErogatori.append(",");
  872.                             }
  873.                             saErogatori.append( info.getIntegrazione().getServizioApplicativoErogatore(i) );
  874.                         }
  875.                         transactionDTO.setServizioApplicativoErogatore(saErogatori.toString().length()>2000 ? saErogatori.toString().substring(0, 1999) : saErogatori.toString());
  876.                     }
  877.                     else if(transaction.getServiziApplicativiErogatore()!=null && !transaction.getServiziApplicativiErogatore().isEmpty()){
  878.                         StringBuilder saErogatori = new StringBuilder();
  879.                         for (int i=0; i<transaction.getServiziApplicativiErogatore().size(); i++) {
  880.                             if (i>0){
  881.                                 saErogatori.append(",");
  882.                             }
  883.                             saErogatori.append( transaction.getServiziApplicativiErogatore().get(i) );
  884.                         }
  885.                         transactionDTO.setServizioApplicativoErogatore(saErogatori.toString().length()>2000 ? saErogatori.toString().substring(0, 1999) : saErogatori.toString());
  886.                     }
  887.                 }
  888.             }
  889.            
  890.             if(info.getContext()!=null){
  891.                 Object operazioneIM = info.getContext().getObject(CostantiPdD.TIPO_OPERAZIONE_IM);
  892.                 if(operazioneIM instanceof String){
  893.                     String op = (String) operazioneIM;
  894.                     transactionDTO.setOperazioneIm(op);
  895.                 }
  896.             }
  897.            
  898.             if(transactionDTO.getServizioApplicativoFruitore()==null &&
  899.                 // provo a vedere se fosse nella traccia di richiesta
  900.                 (tracciaRichiesta!=null && tracciaRichiesta.getBusta()!=null && tracciaRichiesta.getBusta().getServizioApplicativoFruitore()!=null)
  901.                 ){
  902.                 transactionDTO.setServizioApplicativoFruitore(tracciaRichiesta.getBusta().getServizioApplicativoFruitore());
  903.             }
  904.             if(transactionDTO.getServizioApplicativoFruitore()==null &&
  905.                 // provo a vedere se fosse nella traccia di risposta
  906.                 (tracciaRisposta!=null && tracciaRisposta.getBusta()!=null && tracciaRisposta.getBusta().getServizioApplicativoFruitore()!=null)
  907.                 ){
  908.                 transactionDTO.setServizioApplicativoFruitore(tracciaRisposta.getBusta().getServizioApplicativoFruitore());
  909.             }
  910.             // correggo anonimo
  911.             if(transactionDTO.getServizioApplicativoFruitore()!=null && CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO.equals(transactionDTO.getServizioApplicativoFruitore())){
  912.                 transactionDTO.setServizioApplicativoFruitore(null);
  913.             }
  914.            
  915.             if(transactionDTO.getServizioApplicativoErogatore()==null &&
  916.                 // provo a vedere se fosse nella traccia di richiesta
  917.                 (tracciaRichiesta!=null && tracciaRichiesta.getBusta()!=null && tracciaRichiesta.getBusta().getServizioApplicativoErogatore()!=null)
  918.                 ){
  919.                 transactionDTO.setServizioApplicativoErogatore(tracciaRichiesta.getBusta().getServizioApplicativoErogatore());
  920.             }
  921.             if(transactionDTO.getServizioApplicativoErogatore()==null &&
  922.                 // provo a vedere se fosse nella traccia di risposta
  923.                 (tracciaRisposta!=null && tracciaRisposta.getBusta()!=null && tracciaRisposta.getBusta().getServizioApplicativoErogatore()!=null)
  924.                 ){
  925.                 transactionDTO.setServizioApplicativoErogatore(tracciaRisposta.getBusta().getServizioApplicativoErogatore());
  926.             }
  927.            
  928.             transactionDTO.setLocationRichiesta(tracciaRichiesta!=null ? tracciaRichiesta.getLocation() : null);
  929.             transactionDTO.setLocationRisposta(tracciaRisposta!=null ? tracciaRisposta.getLocation() : null);
  930.            
  931.             if(transaction!=null && transaction.getRequestInfo()!=null && transaction.getRequestInfo().getProtocolContext()!=null){
  932.                 transactionDTO.setNomePorta(transaction.getRequestInfo().getProtocolContext().getInterfaceName());
  933.             }
  934.            
  935.             if(transaction.getCredenziali()!=null){
  936.                 transactionDTO.setCredenziali(transaction.getCredenziali());
  937.             }else{
  938.                 Object o = info.getContext().getObject(CostantiControlloTraffico.PDD_CONTEXT_MAX_REQUEST_VIOLATED_CREDENZIALI);
  939.                 if(o instanceof String){
  940.                     transactionDTO.setCredenziali((String)o);
  941.                 }
  942.                 else{
  943.                     o = info.getContext().getObject(org.openspcoop2.core.constants.Costanti.CREDENZIALI_INVOCAZIONE);
  944.                     if(o instanceof String){
  945.                         transactionDTO.setCredenziali((String)o);
  946.                     }
  947.                 }
  948.             }
  949.            
  950.             transactionDTO.setLocationConnettore(transaction.getLocation());
  951.            
  952.             if(transaction.getUrlInvocazione()!=null){
  953.                 transactionDTO.setUrlInvocazione(transaction.getUrlInvocazione());
  954.             }else{
  955.                 Object o = info.getContext().getObject(CostantiControlloTraffico.PDD_CONTEXT_MAX_REQUEST_VIOLATED_URL_INVOCAZIONE);
  956.                 if(o instanceof String){
  957.                     transactionDTO.setUrlInvocazione((String)o);
  958.                 }
  959.                 else{
  960.                     o = info.getContext().getObject(org.openspcoop2.core.constants.Costanti.URL_INVOCAZIONE);
  961.                     if(o instanceof String){
  962.                         transactionDTO.setUrlInvocazione((String)o);
  963.                     }
  964.                 }
  965.             }
  966.            
  967.             // ** cluster-id **
  968.             transactionDTO.setClusterId(op2Properties.getClusterId(false));
  969.            
  970.             if(times!=null) {
  971.                 long timeEnd =  DateManager.getTimeMillis();
  972.                 long timeProcess = timeEnd-timeStart;
  973.                 times.fillTransactionDetails.add("integration:"+timeProcess);
  974.                
  975.                 timeStart = DateManager.getTimeMillis();
  976.             }
  977.            
  978.             // credenziali
  979.             if(transaction.getCredenzialiMittente()!=null) {
  980.                
  981.                 // trasporto
  982.                 if(transaction.getCredenzialiMittente().getTrasporto()!=null) {
  983.                     transactionDTO.setTrasportoMittente(transaction.getCredenzialiMittente().getTrasporto().getId()+"");
  984.                 }
  985.                
  986.                 // token
  987.                 if(transaction.getCredenzialiMittente().getTokenIssuer()!=null) {
  988.                     transactionDTO.setTokenIssuer(transaction.getCredenzialiMittente().getTokenIssuer().getId()+"");
  989.                 }
  990.                 if(transaction.getCredenzialiMittente().getTokenClientId()!=null) {
  991.                     transactionDTO.setTokenClientId(transaction.getCredenzialiMittente().getTokenClientId().getId()+"");
  992.                 }
  993.                 if(transaction.getCredenzialiMittente().getTokenSubject()!=null) {
  994.                     transactionDTO.setTokenSubject(transaction.getCredenzialiMittente().getTokenSubject().getId()+"");
  995.                 }
  996.                 if(transaction.getCredenzialiMittente().getTokenUsername()!=null) {
  997.                     transactionDTO.setTokenUsername(transaction.getCredenzialiMittente().getTokenUsername().getId()+"");
  998.                 }
  999.                 if(transaction.getCredenzialiMittente().getTokenEMail()!=null) {
  1000.                     transactionDTO.setTokenMail(transaction.getCredenzialiMittente().getTokenEMail().getId()+"");
  1001.                 }
  1002.             }
  1003.            
  1004.             // token negoziazione
  1005.             InformazioniNegoziazioneToken informazioniNegoziazioneToken = null;
  1006.             if(this.transazioniRegistrazioneRetrieveTokenSaveAsTokenInfo) {
  1007.                 if(transaction.getInformazioniNegoziazioneToken()!=null) {
  1008.                     informazioniNegoziazioneToken = transaction.getInformazioniNegoziazioneToken();
  1009.                     if(
  1010.                             (
  1011.                                     op2Properties.isGestioneRetrieveTokenSaveAsTokenInfoExcludeJwtSignature() &&
  1012.                                     (informazioniNegoziazioneToken.getAccessToken()!=null || informazioniNegoziazioneToken.getRefreshToken()!=null)
  1013.                             )
  1014.                             ||
  1015.                             (
  1016.                                     op2Properties.isGestioneRetrieveTokenGrantTypeRfc7523SaveClientAssertionJWTInfoExcludeJwtSignature() &&
  1017.                                     informazioniNegoziazioneToken.getRequest()!=null
  1018.                             )
  1019.                     ) {
  1020.                         // clone for fix 'Caused by: java.util.ConcurrentModificationException' e non modificare informazione in cache dovuto alla deleteSignature e alla sostituzione del token
  1021.                         informazioniNegoziazioneToken = (InformazioniNegoziazioneToken) informazioniNegoziazioneToken.clone();
  1022.                     }
  1023.                 }
  1024.                
  1025.                 if(informazioniNegoziazioneToken!=null) {
  1026.                     if(op2Properties.isGestioneRetrieveTokenSaveAsTokenInfoExcludeJwtSignature()) {
  1027.                         if(informazioniNegoziazioneToken.getAccessToken()!=null) {
  1028.                             String originale = informazioniNegoziazioneToken.getAccessToken();
  1029.                             String senzaSignature = TokenUtilities.deleteSignature(informazioniNegoziazioneToken.getAccessToken());
  1030.                             informazioniNegoziazioneToken.setAccessToken(senzaSignature);
  1031.                             informazioniNegoziazioneToken.setClaims(TokenUtilities.replaceTokenInMapByValue(informazioniNegoziazioneToken.getClaims(), originale, senzaSignature));
  1032.                             informazioniNegoziazioneToken.replaceInRawResponse(originale, senzaSignature);
  1033.                         }
  1034.                         if(informazioniNegoziazioneToken.getRefreshToken()!=null) {
  1035.                             String originale = informazioniNegoziazioneToken.getRefreshToken();
  1036.                             String senzaSignature = TokenUtilities.deleteSignature(informazioniNegoziazioneToken.getRefreshToken());
  1037.                             informazioniNegoziazioneToken.setRefreshToken(senzaSignature);
  1038.                             informazioniNegoziazioneToken.setClaims(TokenUtilities.replaceTokenInMapByValue(informazioniNegoziazioneToken.getClaims(), originale, senzaSignature));
  1039.                             informazioniNegoziazioneToken.replaceInRawResponse(originale, senzaSignature);
  1040.                         }
  1041.                     }
  1042.                    
  1043.                     if(informazioniNegoziazioneToken.getRequest()!=null &&
  1044.                         informazioniNegoziazioneToken.getRequest().getJwtClientAssertion()!=null &&
  1045.                         informazioniNegoziazioneToken.getRequest().getJwtClientAssertion().getToken()!=null &&
  1046.                         op2Properties.isGestioneRetrieveTokenGrantTypeRfc7523SaveClientAssertionJWTInfoExcludeJwtSignature()) {
  1047.                         informazioniNegoziazioneToken.getRequest().getJwtClientAssertion().setToken(TokenUtilities.deleteSignature(informazioniNegoziazioneToken.getRequest().getJwtClientAssertion().getToken()));
  1048.                     }
  1049.                 }
  1050.             }
  1051.                                    
  1052.             // token info
  1053.             if(this.transazioniRegistrazioneTokenInformazioniNormalizzate && transaction.getInformazioniToken()!=null) {
  1054.                
  1055.                 InformazioniToken informazioniToken = transaction.getInformazioniToken();
  1056.                 if(informazioniToken.getToken()!=null && op2Properties.isGestioneTokenSaveTokenInfoValidationFailedExcludeJwtSignature()) {
  1057.                     // clone for fix 'Caused by: java.util.ConcurrentModificationException' e non modificare informazione in cache dovuto alla deleteSignature e alla sostituzione del token
  1058.                     informazioniToken = (InformazioniToken) informazioniToken.clone();
  1059.                 }
  1060.                
  1061.                 // token validazione
  1062.                 if(informazioniToken.getToken()!=null && op2Properties.isGestioneTokenSaveTokenInfoValidationFailedExcludeJwtSignature()) {
  1063.                     informazioniToken.setToken(TokenUtilities.deleteSignature(informazioniToken.getToken()));
  1064.                 }
  1065.                
  1066.                 // token negoziazione
  1067.                 if(informazioniNegoziazioneToken!=null) {
  1068.                     informazioniToken.setRetrievedToken(informazioniNegoziazioneToken);
  1069.                 }
  1070.                
  1071.                 // attributi
  1072.                 InformazioniAttributi informazioniAttributi = null;
  1073.                 if(!this.transazioniRegistrazioneAttributiInformazioniNormalizzate) {
  1074.                     informazioniAttributi = informazioniToken.getAa();
  1075.                     informazioniToken.setAa(null);
  1076.                 }
  1077.                 setTokenInfo(transactionDTO, informazioniToken);
  1078.                 if(informazioniAttributi!=null) {
  1079.                     informazioniToken.setAa(informazioniAttributi);
  1080.                 }
  1081.                                
  1082.             }
  1083.             if(transactionDTO.getTokenInfo()==null && this.transazioniRegistrazioneAttributiInformazioniNormalizzate &&
  1084.                     transaction.getInformazioniAttributi()!=null) {
  1085.                 if(informazioniNegoziazioneToken!=null) {
  1086.                     setTokenInfo(transactionDTO, informazioniNegoziazioneToken, transaction);
  1087.                 }
  1088.                 else {
  1089.                     setTokenInfo(transactionDTO, transaction);
  1090.                 }
  1091.             }
  1092.             if(transactionDTO.getTokenInfo()==null && informazioniNegoziazioneToken!=null) {
  1093.                 setTokenInfo(transactionDTO, informazioniNegoziazioneToken);
  1094.             }
  1095.            
  1096.             if(times!=null) {
  1097.                 long timeEnd =  DateManager.getTimeMillis();
  1098.                 long timeProcess = timeEnd-timeStart;
  1099.                 times.fillTransactionDetails.add("token:"+timeProcess);
  1100.                
  1101.                 timeStart = DateManager.getTimeMillis();
  1102.             }
  1103.            
  1104.             // tempi elaborazione
  1105.             if(this.transazioniRegistrazioneTempiElaborazione && transaction.getTempiElaborazione()!=null) {
  1106.                 setTempiElaborazione(transactionDTO, transaction);
  1107.             }
  1108.            
  1109.             if(times!=null) {
  1110.                 long timeEnd =  DateManager.getTimeMillis();
  1111.                 long timeProcess = timeEnd-timeStart;
  1112.                 times.fillTransactionDetails.add("times:"+timeProcess);
  1113.                
  1114.                 timeStart = DateManager.getTimeMillis();
  1115.             }
  1116.            
  1117.             // ** Indirizzo IP **
  1118.             setAccordoInfoClientAddress(transactionDTO,
  1119.                     requestInfo,
  1120.                     idDominio, info, idTransazione,
  1121.                     times, timeStart, fase);
  1122.             if(times!=null) {
  1123.                 timeStart = DateManager.getTimeMillis();
  1124.             }
  1125.            
  1126.             // ** eventi di gestione **
  1127.             if(!FaseTracciamento.POST_OUT_RESPONSE.equals(fase)){ // altrimenti gestito prima come per l'esito
  1128.                 setEventi(transactionDTO, transaction,
  1129.                         op2Properties,
  1130.                         requestInfo,
  1131.                         idDominio, info, idTransazione,
  1132.                         times, timeStart, fase);
  1133.             }
  1134.             if(times!=null) {
  1135.                 timeStart = DateManager.getTimeMillis();
  1136.             }
  1137.            
  1138.             // ** filtro duplicati **
  1139.             if(richiestaDuplicata){
  1140.                 transactionDTO.setDuplicatiRichiesta(-1);
  1141.             }
  1142.             else{
  1143.                 transactionDTO.setDuplicatiRichiesta(0);
  1144.             }
  1145.             if(rispostaDuplicata){
  1146.                 transactionDTO.setDuplicatiRisposta(-1);
  1147.             }
  1148.             else{
  1149.                 transactionDTO.setDuplicatiRisposta(0);
  1150.             }
  1151.            
  1152.            
  1153.             // ** Extended Info **
  1154.             ExtendedTransactionInfo transactionExtendedInfo = null;
  1155.             if (info.getContext().getObject(Costanti.EXTENDED_INFO_TRANSAZIONE)!=null){
  1156.                 transactionExtendedInfo = ((ExtendedTransactionInfo)info.getContext().getObject(Costanti.EXTENDED_INFO_TRANSAZIONE));
  1157.                 List<String> keys = transactionExtendedInfo.keys();
  1158.                 if(keys!=null && !keys.isEmpty()){
  1159.                     for (String key : keys) {
  1160.                         String value = transactionExtendedInfo.getValue(key);
  1161.                         TransazioneExtendedInfo transazioneExtendedInfo = new TransazioneExtendedInfo();
  1162.                         transazioneExtendedInfo.setNome(key);
  1163.                         transazioneExtendedInfo.setValore(value);
  1164.                         transactionDTO.addTransazioneExtendedInfo(transazioneExtendedInfo);
  1165.                     }
  1166.                 }
  1167.             }
  1168.            
  1169.             if(times!=null) {
  1170.                 long timeEnd =  DateManager.getTimeMillis();
  1171.                 long timeProcess = timeEnd-timeStart;
  1172.                 times.fillTransactionDetails.add("ext-info:"+timeProcess);
  1173.                
  1174.                 timeStart = DateManager.getTimeMillis();
  1175.             }
  1176.            
  1177.            
  1178.             return transactionDTO;


  1179.         } catch (Exception e) {
  1180.             throw new HandlerException("Errore durante il popolamento della transazione da salvare su database: " + e.getLocalizedMessage(), e);
  1181.         }
  1182.         finally{
  1183.        
  1184.             if(consegnaMultiplaProfiloSincrono) {
  1185.                 timeStart = consegnaMultiplaProfiloSincrono(info, idDominio, idTransazione,
  1186.                         times, timeStart,
  1187.                         schedulaNotificheDopoConsegnaSincrona, msgDiag, nomePorta);
  1188.             }
  1189.            
  1190.             if(identificativoSaveTransactionContext!=null) {
  1191.                 timeStart = saveTransactionContext(identificativoSaveTransactionContext, info, idDominio, idTransazione,
  1192.                         times, timeStart,
  1193.                         msgDiag);
  1194.             }
  1195.         }
  1196.     }
  1197.    
  1198.     private static void setDataAccettazioneRichiesta(Transazione transactionDTO, InformazioniTransazione info, Transaction transaction) {
  1199.         // Se data_accettazione_richiesta è null viene impostata a CURRENT_TIMESTAMP
  1200.         if (transaction.getDataAccettazioneRichiesta()!=null){
  1201.             transactionDTO.setDataAccettazioneRichiesta(transaction.getDataAccettazioneRichiesta());
  1202.         }else{
  1203.             Object o = info.getContext().getObject(CostantiPdD.DATA_ACCETTAZIONE_RICHIESTA);
  1204.             if(o instanceof Date){
  1205.                 transactionDTO.setDataAccettazioneRichiesta((Date) o);
  1206.             }
  1207.             else{
  1208.                 transactionDTO.setDataAccettazioneRichiesta(DateManager.getDate());
  1209.             }
  1210.         }
  1211.     }
  1212.     private static void setDataIngressoRichiesta(OpenSPCoop2Properties op2Properties, Transazione transactionDTO, InformazioniTransazione info, Transaction transaction) {
  1213.         // Se data_ingresso_richiesta è null viene impostata a CURRENT_TIMESTAMP
  1214.         boolean valorizzataDataIngressoConDataAccettazione = op2Properties.isTransazioniValorizzaDataIngressoConDataAccettazione();
  1215.         if(valorizzataDataIngressoConDataAccettazione) {
  1216.             transactionDTO.setDataIngressoRichiesta(transactionDTO.getDataAccettazioneRichiesta());
  1217.         }
  1218.         else {
  1219.             if (transaction.getDataIngressoRichiesta()!=null){
  1220.                 transactionDTO.setDataIngressoRichiesta(transaction.getDataIngressoRichiesta());
  1221.             }else{
  1222.                 Object o = info.getContext().getObject(CostantiPdD.DATA_INGRESSO_RICHIESTA);
  1223.                 if(o instanceof Date){
  1224.                     transactionDTO.setDataIngressoRichiesta((Date) o);
  1225.                 }
  1226.                 else{
  1227.                     transactionDTO.setDataIngressoRichiesta(DateManager.getDate());
  1228.                 }
  1229.             }
  1230.         }
  1231.     }
  1232.     private static void setDataIngressoRichiestaStream(Transazione transactionDTO, InformazioniTransazione info) {
  1233.         if(info.getContext()!=null) {
  1234.             Object o = info.getContext().get(DiagnosticInputStream.DIAGNOSTIC_INPUT_STREAM_REQUEST_COMPLETE_DATE);
  1235.             if(o==null) {
  1236.                 o = info.getContext().get(DiagnosticInputStream.DIAGNOSTIC_INPUT_STREAM_REQUEST_ERROR_DATE);
  1237.             }
  1238.             if(o instanceof Date) {
  1239.                 Date d = (Date) o;
  1240.                 transactionDTO.setDataIngressoRichiestaStream(d);
  1241.             }
  1242.         }
  1243.     }
  1244.    
  1245.     private static void setDataUscitaRichiesta(Transazione transactionDTO, FaseTracciamento fase, Transaction transaction) {
  1246.         // data_uscita_richiesta si imposta se e' diversa da null
  1247.         if(FaseTracciamento.OUT_REQUEST.equals(fase) || FaseTracciamento.OUT_RESPONSE.equals(fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  1248.             if (transaction.getDataUscitaRichiesta()!=null) {
  1249.                 transactionDTO.setDataUscitaRichiesta(transaction.getDataUscitaRichiesta());
  1250.             }
  1251.            
  1252.             // data_uscita_richiesta_stream
  1253.             if(transaction.getDataRichiestaInoltrata()!=null) {
  1254.                 transactionDTO.setDataUscitaRichiestaStream(transaction.getDataRichiestaInoltrata());
  1255.             }
  1256.         }
  1257.     }
  1258.    
  1259.     private static void setDataAccettazioneRisposta(Transazione transactionDTO, FaseTracciamento fase, Transaction transaction) {
  1260.         if(
  1261.                 (FaseTracciamento.OUT_RESPONSE.equals(fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(fase))
  1262.                 &&
  1263.             // data_accettazione_risposta
  1264.             // La porta di dominio mi passa sempre questa informazione.
  1265.             // Nel PddMonitor, invece, la data deve essere visualizzata solo se la dimensione e' diverso da 0 e cioe' se c'e' un messaggio di risposta.
  1266.             /**if (transaction.getDimensioneIngressoRispostaBytes()!=null && transaction.getDimensioneIngressoRispostaBytes()>0){*/
  1267.             // L'INFORMAZIONE DEVE INVECE ESSERE SALVATA PER LA SIMULAZIONE DEI MESSAGGI DIAGNOSTICI
  1268.             transaction.getDataAccettazioneRisposta()!=null){
  1269.             transactionDTO.setDataAccettazioneRisposta(transaction.getDataAccettazioneRisposta());
  1270.         }
  1271.     }
  1272.     private static void setDataIngressoRisposta(OpenSPCoop2Properties op2Properties, Transazione transactionDTO, FaseTracciamento fase, Transaction transaction) {
  1273.         if(FaseTracciamento.OUT_RESPONSE.equals(fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  1274.             // data_ingresso_risposta
  1275.            
  1276.             boolean valorizzataDataIngressoConDataAccettazione = op2Properties.isTransazioniValorizzaDataIngressoConDataAccettazione();
  1277.            
  1278.             // La porta di dominio mi passa sempre questa informazione.
  1279.             // Nel PddMonitor, invece, la data deve essere visualizzata solo se la dimensione e' diverso da 0 e cioe' se c'e' un messaggio di risposta.
  1280.             /**if (transaction.getDimensioneIngressoRispostaBytes()!=null && transaction.getDimensioneIngressoRispostaBytes()>0){*/
  1281.             // L'INFORMAZIONE DEVE INVECE ESSERE SALVATA PER LA SIMULAZIONE DEI MESSAGGI DIAGNOSTICI
  1282.             if(valorizzataDataIngressoConDataAccettazione && transactionDTO.getDataAccettazioneRisposta()!=null) {
  1283.                 transactionDTO.setDataIngressoRisposta(transactionDTO.getDataAccettazioneRisposta());
  1284.             }
  1285.             else {
  1286.                 if (transaction.getDataIngressoRisposta()!=null){
  1287.                     transactionDTO.setDataIngressoRisposta(transaction.getDataIngressoRisposta());
  1288.                 }
  1289.             }
  1290.         }
  1291.     }
  1292.     private static void setDataIngressoRispostaStream(Transazione transactionDTO, InformazioniTransazione info, FaseTracciamento fase) {
  1293.         if(
  1294.             (FaseTracciamento.OUT_RESPONSE.equals(fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(fase))
  1295.                 &&
  1296.             // data_ingresso_risposta_stream
  1297.             info.getContext()!=null) {
  1298.             Object o = info.getContext().get(DiagnosticInputStream.DIAGNOSTIC_INPUT_STREAM_RESPONSE_COMPLETE_DATE);
  1299.             if(o==null) {
  1300.                 o = info.getContext().get(DiagnosticInputStream.DIAGNOSTIC_INPUT_STREAM_RESPONSE_ERROR_DATE);
  1301.             }
  1302.             if(o instanceof Date) {
  1303.                 Date d = (Date) o;
  1304.                 transactionDTO.setDataIngressoRispostaStream(d);
  1305.             }
  1306.         }
  1307.     }
  1308.    
  1309.     private static void setDataUscitaRisposta(OpenSPCoop2Properties op2Properties, Transazione transactionDTO, InformazioniTransazione info, FaseTracciamento fase, Transaction transaction) {
  1310.         // ** data_uscita_risposta **
  1311.         if(FaseTracciamento.OUT_RESPONSE.equals(fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  1312.             boolean calcolaDataUscitaRispostaConDateAfterResponseSent = op2Properties.isTransazioniValorizzaDataUscitaRispostaUseDateAfterResponseSent();
  1313.             if(calcolaDataUscitaRispostaConDateAfterResponseSent && info.getDataRispostaSpedita()!=null) {
  1314.                 if(FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  1315.                     transactionDTO.setDataUscitaRisposta(info.getDataRispostaSpedita());
  1316.                 }
  1317.             }
  1318.             else if(!calcolaDataUscitaRispostaConDateAfterResponseSent && info.getDataPrimaSpedizioneRisposta()!=null) {
  1319.                 transactionDTO.setDataUscitaRisposta(info.getDataPrimaSpedizioneRisposta());
  1320.             }
  1321.             else if (transaction.getDataUscitaRisposta()!=null){
  1322.                 transactionDTO.setDataUscitaRisposta(transaction.getDataUscitaRisposta());
  1323.             }
  1324.             else{
  1325.                 // creo sempre una data di risposta.
  1326.                 transactionDTO.setDataUscitaRisposta(DateManager.getDate());
  1327.             }
  1328.         }
  1329.     }
  1330.     private static void setDataUscitaRispostaStream(OpenSPCoop2Properties op2Properties, Transazione transactionDTO, InformazioniTransazione info, FaseTracciamento fase) {
  1331.         // ** data_uscita_risposta_stream **
  1332.         if(FaseTracciamento.OUT_RESPONSE.equals(fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  1333.             boolean calcolaDataUscitaRispostaConDateAfterResponseSent = op2Properties.isTransazioniValorizzaDataUscitaRispostaUseDateAfterResponseSent();
  1334.             if(calcolaDataUscitaRispostaConDateAfterResponseSent && info.getDataPrimaSpedizioneRisposta()!=null) {
  1335.                 transactionDTO.setDataUscitaRispostaStream(info.getDataPrimaSpedizioneRisposta());
  1336.             }
  1337.             else if(!calcolaDataUscitaRispostaConDateAfterResponseSent && info.getDataRispostaSpedita()!=null &&
  1338.                 FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  1339.                 transactionDTO.setDataUscitaRispostaStream(info.getDataRispostaSpedita());
  1340.             }
  1341.            
  1342.             if(calcolaDataUscitaRispostaConDateAfterResponseSent && transactionDTO.getDataUscitaRispostaStream()==null) {
  1343.                 transactionDTO.setDataUscitaRispostaStream(transactionDTO.getDataUscitaRisposta()); // uso la stessa
  1344.             }
  1345.         }
  1346.     }
  1347.    
  1348.     private static void setRichiestaIngressoBytes(Transazione transactionDTO, InformazioniTransazione info, Transaction transaction, FaseTracciamento fase) {
  1349.         // dimensione_ingresso_richiesta
  1350.         if (info.getInputRequestMessageSize()!=null && info.getInputRequestMessageSize()>0){
  1351.             transactionDTO.setRichiestaIngressoBytes(info.getInputRequestMessageSize());
  1352.         }
  1353.         if(transactionDTO.getRichiestaIngressoBytes()==null &&
  1354.                 FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  1355.             transactionDTO.setRichiestaIngressoBytes(readDimensioneFromDumpBinario(TipoMessaggio.RICHIESTA_INGRESSO_DUMP_BINARIO, transaction));
  1356.         }
  1357.     }
  1358.    
  1359.     private static void setRichiestaUscitaBytes(Transazione transactionDTO, InformazioniTransazione info, Transaction transaction, FaseTracciamento fase) {
  1360.         if(
  1361.                 (FaseTracciamento.OUT_REQUEST.equals(fase) || FaseTracciamento.OUT_RESPONSE.equals(fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(fase))
  1362.                 &&
  1363.                 (info.getOutputRequestMessageSize()!=null && info.getOutputRequestMessageSize()>0 &&
  1364.                     transactionDTO.getDataUscitaRichiesta()!=null) // altrimenti non ha senso, poichè non c'è stato un vero inoltro verso il backend
  1365.             ) {
  1366.             transactionDTO.setRichiestaUscitaBytes(info.getOutputRequestMessageSize());
  1367.         }
  1368.         if(transactionDTO.getRichiestaUscitaBytes()==null &&
  1369.                 FaseTracciamento.POST_OUT_RESPONSE.equals(fase)) {
  1370.             transactionDTO.setRichiestaUscitaBytes(readDimensioneFromDumpBinario(TipoMessaggio.RICHIESTA_USCITA_DUMP_BINARIO, transaction));
  1371.         }
  1372.     }
  1373.    
  1374.     private static void setRispostaIngressoBytes(Transazione transactionDTO, InformazioniTransazione info, Transaction transaction, FaseTracciamento fase) {
  1375.         // ** dimensione_ingresso_risposta **
  1376.         if(
  1377.                 (FaseTracciamento.OUT_RESPONSE.equals(fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(fase))
  1378.                 &&
  1379.                 (info.getInputResponseMessageSize()!=null && info.getInputResponseMessageSize()>0 &&
  1380.                     transaction!=null && transaction.getDataIngressoRisposta()!=null)
  1381.             ) { // altrimenti non ha senso, poichè non c'è stato un vero inoltro verso il backend
  1382.                
  1383.             boolean add = false;
  1384.             if(info.getContext()!=null) {
  1385.                 Object o = info.getContext().get(DiagnosticInputStream.DIAGNOSTIC_INPUT_STREAM_RESPONSE_START_DATE);
  1386.                 if(o instanceof Date) {
  1387.                     add = true;
  1388.                 }
  1389.             }
  1390.            
  1391.             if(add) {
  1392.                 transactionDTO.setRispostaIngressoBytes(info.getInputResponseMessageSize());
  1393.             }
  1394.            
  1395.         }
  1396.     }
  1397.    
  1398.     private static void setRispostaUscitaBytes(Transazione transactionDTO, InformazioniTransazione info, FaseTracciamento fase) {
  1399.         if(
  1400.                 (FaseTracciamento.OUT_RESPONSE.equals(fase) || FaseTracciamento.POST_OUT_RESPONSE.equals(fase))
  1401.                 &&
  1402.                 (info.getOutputResponseMessageSize()!=null && info.getOutputResponseMessageSize()>0)
  1403.             ){
  1404.             transactionDTO.setRispostaUscitaBytes(info.getOutputResponseMessageSize());
  1405.         }
  1406.     }
  1407.    
  1408.     private static Long readDimensioneFromDumpBinario(TipoMessaggio tipoMessaggio, Transaction transaction) {
  1409.         if(transaction!=null && !transaction.getMessaggi().isEmpty()) {
  1410.             for (Messaggio msg : transaction.getMessaggi()) {
  1411.                 if(tipoMessaggio.equals(msg.getTipoMessaggio()) && msg.getBody()!=null){
  1412.                     return Long.valueOf(msg.getBody().size());
  1413.                 }
  1414.             }
  1415.         }
  1416.         return null;
  1417.     }
  1418.    
  1419.     private void setFaultInfo(Transazione transactionDTO,
  1420.             OpenSPCoop2Properties op2Properties,
  1421.             InformazioniTransazione info) {
  1422.         String fault = null;
  1423.         String formatoFault = null;
  1424.         try{
  1425.             if(info.getResponse()!=null){
  1426.                 if(ServiceBinding.SOAP.equals(info.getResponse().getServiceBinding())) {
  1427.                     OpenSPCoop2SoapMessage soapMsg = info.getResponse().castAsSoap();
  1428.                     if(soapMsg.hasSOAPFault()){
  1429.                        
  1430.                         ByteArrayOutputStream bout = new ByteArrayOutputStream();
  1431.                         bout.write(info.getResponse().getAsByte(soapMsg.getSOAPPart().getEnvelope(), false));
  1432.                         bout.flush();
  1433.                         bout.close();
  1434.                        
  1435.                         Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioni(op2Properties.isTransazioniDebug());
  1436.                         if(op2Properties.isTransazioniFaultPrettyPrint()){
  1437.                             // Faccio una pretty-print: potevo fare anche direttamente passando il fault a metodo prettyPrint,
  1438.                             // Pero' non veniva stampato correttamente il SOAPFault. Mi appoggio allora a SoapUtils.
  1439.                             /**byte [] content = org.openspcoop2.message.soap.TunnelSoapUtils.sbustamentoMessaggio(context.getMessaggio());*/
  1440.                             byte [] content = bout.toByteArray();
  1441.                             fault = DumpUtility.toString(MessageXMLUtils.getInstance(soapMsg.getFactory()).newDocument(content), log, info.getResponse());
  1442.                             /**System.out.println("IMPOSTATO FAULT IN TRANSACTION ["+fault+"]");*/
  1443.                         }
  1444.                         else{
  1445.                            
  1446.                             fault = bout.toString();
  1447.                         }
  1448.                        
  1449.                         formatoFault = soapMsg.getMessageType().name();
  1450.                     }

  1451.                 }
  1452.                 else {
  1453.                     OpenSPCoop2RestMessage<?> restMsg = info.getResponse().castAsRest();
  1454.                     if(restMsg.isProblemDetailsForHttpApis_RFC7807() || MessageRole.FAULT.equals(restMsg.getMessageRole())) {
  1455.                         switch (restMsg.getMessageType()) {
  1456.                         case XML:
  1457.                            
  1458.                             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  1459.                             restMsg.writeTo(bout, false);
  1460.                             bout.flush();
  1461.                             bout.close();
  1462.                            
  1463.                             Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioni(op2Properties.isTransazioniDebug());
  1464.                             if(op2Properties.isTransazioniFaultPrettyPrint()){
  1465.                                 // Faccio una pretty-print: potevo fare anche direttamente passando il fault a metodo prettyPrint,
  1466.                                 // Pero' non veniva stampato correttamente il SOAPFault. Mi appoggio allora a SoapUtils.
  1467.                                 /**byte [] content = org.openspcoop2.message.soap.TunnelSoapUtils.sbustamentoMessaggio(context.getMessaggio());*/
  1468.                                 byte [] content = bout.toByteArray();
  1469.                                 fault = DumpUtility.toString(MessageXMLUtils.getInstance(restMsg.getFactory()).newDocument(content), log, info.getResponse());
  1470.                                 /**System.out.println("IMPOSTATO FAULT IN TRANSACTION ["+fault+"]");*/
  1471.                             }
  1472.                             else{
  1473.                                
  1474.                                 fault = bout.toString();
  1475.                             }
  1476.                            
  1477.                             formatoFault = restMsg.getMessageType().name();
  1478.                            
  1479.                             break;
  1480.                            
  1481.                         case JSON:
  1482.                            
  1483.                             bout = new ByteArrayOutputStream();
  1484.                             restMsg.writeTo(bout, false);
  1485.                             bout.flush();
  1486.                             bout.close();
  1487.                            
  1488.                             if(op2Properties.isTransazioniFaultPrettyPrint()){
  1489.                                
  1490.                                 JSONUtils jsonUtils = JSONUtils.getInstance(true);
  1491.                                 byte [] content = bout.toByteArray();
  1492.                                 JsonNode jsonNode = jsonUtils.getAsNode(content);
  1493.                                 fault = jsonUtils.toString(jsonNode);
  1494.                                
  1495.                             }
  1496.                             else{
  1497.                                
  1498.                                 fault = bout.toString();
  1499.                             }
  1500.                            
  1501.                             formatoFault = restMsg.getMessageType().name();
  1502.                            
  1503.                             break;

  1504.                         default:
  1505.                             break;
  1506.                         }
  1507.                     }
  1508.                 }
  1509.             }
  1510.         }catch(Exception e){
  1511.             this.logger.error("Errore durante il dump del soap fault",e);
  1512.         }
  1513.         if(TipoPdD.DELEGATA.equals(info.getTipoPorta())){
  1514.             transactionDTO.setFaultIntegrazione(fault);
  1515.             transactionDTO.setFormatoFaultIntegrazione(formatoFault);
  1516.         }
  1517.         else{
  1518.             transactionDTO.setFaultCooperazione(fault);
  1519.             transactionDTO.setFormatoFaultCooperazione(formatoFault);
  1520.         }
  1521.     }
  1522.    
  1523.     private IDAccordo getIdAccordo(Transazione transactionDTO, RegistroServiziManager registroServiziManager, RequestInfo requestInfo) {
  1524.         try {
  1525.             IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(transactionDTO.getTipoServizio(), transactionDTO.getNomeServizio(),
  1526.                 transactionDTO.getTipoSoggettoErogatore(), transactionDTO.getNomeSoggettoErogatore(), transactionDTO.getVersioneServizio());
  1527.             AccordoServizioParteSpecifica asps = registroServiziManager.getAccordoServizioParteSpecifica(idServizio, null, false, requestInfo);
  1528.             return  IDAccordoFactory.getInstance().getIDAccordoFromUri(asps.getAccordoServizioParteComune());
  1529.         }catch(Exception e) {
  1530.             // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  1531.             this.logger.error("Errore durante l'identificazione delle caratteristiche dell'API (Accesso servizio): "+e.getMessage(),e);
  1532.             return null;
  1533.         }
  1534.     }
  1535.        
  1536.     private void setAccordoInfo(IDAccordo idAccordo, Transazione transactionDTO,
  1537.             OpenSPCoop2Properties op2Properties, RegistroServiziManager registroServiziManager, RequestInfo requestInfo,
  1538.             IDSoggetto idDominio, InformazioniTransazione info, String idTransazione,
  1539.             TransazioniProcessTimes times, long timeStart, FaseTracciamento fase) {
  1540.         try {
  1541.             AccordoServizioParteComune aspc = registroServiziManager.getAccordoServizioParteComune(idAccordo, null, false, false, requestInfo);
  1542.             if(org.openspcoop2.core.registry.constants.ServiceBinding.REST.equals(aspc.getServiceBinding())) {
  1543.                 transactionDTO.setTipoApi(TipoAPI.REST.getValoreAsInt());
  1544.             }
  1545.             else {
  1546.                 transactionDTO.setTipoApi(TipoAPI.SOAP.getValoreAsInt());
  1547.             }
  1548.                
  1549.             if(times!=null) {
  1550.                 long timeEnd =  DateManager.getTimeMillis();
  1551.                 long timeProcess = timeEnd-timeStart;
  1552.                 times.fillTransactionDetails.add("api:"+timeProcess);
  1553.                
  1554.                 timeStart = DateManager.getTimeMillis();
  1555.             }
  1556.            
  1557.             String conflict = setAccordoInfoGruppi(aspc, transactionDTO,
  1558.                     op2Properties,
  1559.                     requestInfo,
  1560.                     idDominio, info, idTransazione,
  1561.                     times, fase);
  1562.            
  1563.             if(times!=null) {
  1564.                 long timeEnd =  DateManager.getTimeMillis();
  1565.                 long timeProcess = timeEnd-timeStart;
  1566.                 times.fillTransactionDetails.add("tags:"+timeProcess+"/c"+conflict);
  1567.                
  1568.                 timeStart = DateManager.getTimeMillis();
  1569.             }
  1570.            
  1571.         }catch(Exception e) {
  1572.             // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  1573.             this.logger.error("Errore durante l'identificazione delle caratteristiche dell'API (Accesso servizio): "+e.getMessage(),e);
  1574.         }
  1575.        
  1576.         String conflict = setAccordoInfoUriAPC(idAccordo, transactionDTO,
  1577.                 requestInfo,
  1578.                 idDominio, info, idTransazione,
  1579.                 times, fase);
  1580.        
  1581.         if(times!=null) {
  1582.             long timeEnd =  DateManager.getTimeMillis();
  1583.             long timeProcess = timeEnd-timeStart;
  1584.             times.fillTransactionDetails.add("uri-api:"+timeProcess+"/c"+conflict);
  1585.         }
  1586.     }
  1587.    
  1588.     private static final MapKey<String> CREDENZIALI_MITTENTE_GRUPPI_RESOLVED = org.openspcoop2.utils.Map.newMapKey("CREDENZIALI_MITTENTE_GRUPPI_RESOLVED");
  1589.     private String getCredenzialiMittenteGruppi(InformazioniTransazione info) {
  1590.         return (info!=null && info.getContext()!=null) ? (String) info.getContext().get(CREDENZIALI_MITTENTE_GRUPPI_RESOLVED) : null;
  1591.     }
  1592.     private void addCredenzialiMittenteGruppi(InformazioniTransazione info, String cred) {
  1593.         if(info!=null && info.getContext()!=null) {
  1594.             info.getContext().put(CREDENZIALI_MITTENTE_GRUPPI_RESOLVED, cred);
  1595.         }
  1596.     }
  1597.     private String setAccordoInfoGruppi(AccordoServizioParteComune aspc, Transazione transactionDTO,
  1598.             OpenSPCoop2Properties op2Properties,
  1599.             RequestInfo requestInfo,
  1600.             IDSoggetto idDominio, InformazioniTransazione info, String idTransazione,
  1601.             TransazioniProcessTimes times, FaseTracciamento fase) throws CoreException {
  1602.         String conflict = "0";
  1603.         if(aspc.getGruppi()!=null && aspc.getGruppi().sizeGruppoList()>0) {
  1604.            
  1605.             String cred = getCredenzialiMittenteGruppi(info);
  1606.             if(cred!=null && StringUtils.isNotEmpty(cred)) {
  1607.                 transactionDTO.setGruppi(cred);
  1608.             }
  1609.             else {
  1610.                 List<String> gruppi = new ArrayList<>();
  1611.                 int count = 0;
  1612.                 int maxLengthCredenziali = op2Properties.getTransazioniCredenzialiMittenteMaxLength()-AbstractCredenzialeList.PREFIX.length();
  1613.                 for (int i=0; i<aspc.getGruppi().sizeGruppoList(); i++) {
  1614.                     GruppoAccordo gruppoAccordo = aspc.getGruppi().getGruppo(i);
  1615.                     String dbValue = AbstractCredenzialeList.getDBValue(gruppoAccordo.getNome());
  1616.                     if(count+dbValue.length()<maxLengthCredenziali) {
  1617.                         gruppi.add( gruppoAccordo.getNome() );
  1618.                         count = count+dbValue.length();
  1619.                     }
  1620.                     else {
  1621.                         // tronco i gruppi ai primi trovati. Sono troppi eventi gruppi associati alla api
  1622.                     }
  1623.                 }
  1624.                 if(!gruppi.isEmpty()){
  1625.                     StringBuilder sbConflict = null;
  1626.                     if(times!=null) {
  1627.                         sbConflict = new StringBuilder();
  1628.                     }
  1629.                     CredenzialeMittente credGruppi = null;
  1630.                     try {
  1631.                         credGruppi = GestoreAutenticazione.convertGruppiToCredenzialiMittenti(idDominio, info.getIdModulo(), idTransazione, gruppi,
  1632.                             null, fase.name()+".gruppi",
  1633.                             sbConflict, requestInfo);
  1634.                     }catch(Exception e) {
  1635.                         throw new CoreException(e.getMessage(),e);
  1636.                     }
  1637.                     if(sbConflict!=null && sbConflict.length()>0) {
  1638.                         conflict = sbConflict.toString();
  1639.                     }
  1640.                     if(credGruppi!=null) {
  1641.                         cred = credGruppi.getId()+"";
  1642.                         transactionDTO.setGruppi(cred);
  1643.                         addCredenzialiMittenteGruppi(info, cred);
  1644.                     }
  1645.                 }
  1646.             }
  1647.         }
  1648.         return conflict;
  1649.     }
  1650.    
  1651.    
  1652.     private static final MapKey<String> CREDENZIALI_MITTENTE_URI_APC_RESOLVED = org.openspcoop2.utils.Map.newMapKey("CREDENZIALI_MITTENTE_URI_APC_RESOLVED");
  1653.     private String getCredenzialiMittenteUriAPC(InformazioniTransazione info) {
  1654.         return (info!=null && info.getContext()!=null) ? (String) info.getContext().get(CREDENZIALI_MITTENTE_URI_APC_RESOLVED) : null;
  1655.     }
  1656.     private void addCredenzialiMittenteUriAPC(InformazioniTransazione info, String cred) {
  1657.         if(info!=null && info.getContext()!=null) {
  1658.             info.getContext().put(CREDENZIALI_MITTENTE_URI_APC_RESOLVED, cred);
  1659.         }
  1660.     }
  1661.     private String setAccordoInfoUriAPC(IDAccordo idAccordo, Transazione transactionDTO,
  1662.             RequestInfo requestInfo,
  1663.             IDSoggetto idDominio, InformazioniTransazione info, String idTransazione,
  1664.             TransazioniProcessTimes times, FaseTracciamento fase) {
  1665.         String conflict = "0";
  1666.         try {
  1667.             String cred = getCredenzialiMittenteUriAPC(info);
  1668.             if(cred!=null && StringUtils.isNotEmpty(cred)) {
  1669.                 transactionDTO.setUriApi(cred);
  1670.             }
  1671.             else {
  1672.                 if(transactionDTO.getUriAccordoServizio()==null){
  1673.                     transactionDTO.setUriAccordoServizio(IDAccordoFactory.getInstance().getUriFromIDAccordo(idAccordo));
  1674.                 }
  1675.                 StringBuilder sbConflict = null;
  1676.                 if(times!=null) {
  1677.                     sbConflict = new StringBuilder();
  1678.                 }
  1679.                 CredenzialeMittente credAPI = GestoreAutenticazione.convertAPIToCredenzialiMittenti(idDominio, info.getIdModulo(), idTransazione, transactionDTO.getUriAccordoServizio(),
  1680.                         null, fase.name()+".api",
  1681.                         sbConflict, requestInfo);
  1682.                 if(sbConflict!=null && sbConflict.length()>0) {
  1683.                     conflict = sbConflict.toString();
  1684.                 }
  1685.                 if(credAPI!=null) {
  1686.                     cred = credAPI.getId()+"";
  1687.                     transactionDTO.setUriApi(cred);
  1688.                     addCredenzialiMittenteUriAPC(info, cred);
  1689.                 }
  1690.             }
  1691.         }catch(Exception e) {
  1692.             // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  1693.             this.logger.error("Errore durante l'identificazione dell'identificativo dell'API (Accesso servizio parte comune): "+e.getMessage(),e);
  1694.         }
  1695.         return conflict;
  1696.     }
  1697.    
  1698.     private void setHeaderProtocolloRichiesta(Transazione transactionDTO, Traccia tracciaRichiesta) {
  1699.         try{
  1700.             transactionDTO.setHeaderProtocolloRichiesta(tracciaRichiesta.getBustaAsRawContent().toString(TipoSerializzazione.DEFAULT));
  1701.         }catch(Exception e){
  1702.             /// NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  1703.             String msg = "Errore durante la conversione dell'oggetto Busta di richiesta ["+tracciaRichiesta.getBustaAsRawContent().getClass().getName()+"] in stringa";
  1704.             this.logger.error(msg);
  1705.         }
  1706.     }
  1707.    
  1708.     private void setProtocolloExtInfoRichiesta(Transazione transactionDTO, PropertiesSerializator ps) {
  1709.         try{
  1710.             transactionDTO.setProtocolloExtInfoRichiesta(ps.convertToDBColumnValue());
  1711.         }catch(Exception e){
  1712.             // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  1713.             this.logger.error("Errore durante la conversione delle proprieta della Busta di richiesta: "+e.getMessage(),e);
  1714.         }
  1715.     }
  1716.    
  1717.     private void setHeaderProtocolloRisposta(Transazione transactionDTO, Traccia tracciaRisposta) {
  1718.         try{
  1719.             transactionDTO.setHeaderProtocolloRisposta(tracciaRisposta.getBustaAsRawContent().toString(TipoSerializzazione.DEFAULT));
  1720.         }catch(Exception e){
  1721.             // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  1722.             String msg = "Errore durante la conversione dell'oggetto Busta di risposta ["+tracciaRisposta.getBustaAsRawContent().getClass().getName()+"] in stringa";
  1723.             this.logger.error(msg);
  1724.         }
  1725.     }
  1726.    
  1727.     private void setProtocolloExtInfoRisposta(Transazione transactionDTO, PropertiesSerializator ps) {
  1728.         try{
  1729.             transactionDTO.setProtocolloExtInfoRisposta(ps.convertToDBColumnValue());
  1730.         }catch(Exception e){
  1731.             // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  1732.             this.logger.error("Errore durante la conversione delle proprieta della Busta di risposta: "+e.getMessage(),e);
  1733.         }
  1734.     }
  1735.    
  1736.     private void setTokenInfo(Transazione transactionDTO, InformazioniToken informazioniToken) {
  1737.         try {
  1738.             transactionDTO.setTokenInfo(informazioniToken.toJson());
  1739.         }catch(Exception t) {
  1740.             this.logger.error("Serializzazione informazioni token non riuscita: "+t.getMessage(),t);
  1741.         }
  1742.     }
  1743.     private void setTokenInfo(Transazione transactionDTO, InformazioniNegoziazioneToken informazioniNegoziazioneToken, Transaction transaction) {
  1744.         try {
  1745.             InformazioniToken infoToken = new InformazioniToken(); // uso come aggregatore
  1746.             infoToken.setRetrievedToken(informazioniNegoziazioneToken);
  1747.             infoToken.setAa(transaction.getInformazioniAttributi());
  1748.             transactionDTO.setTokenInfo(infoToken.toJson());
  1749.         }catch(Exception t) {
  1750.             this.logger.error("Serializzazione informazioni attributi (aggregato insieme a client assertion) non riuscita: "+t.getMessage(),t);
  1751.         }
  1752.     }
  1753.     private void setTokenInfo(Transazione transactionDTO, Transaction transaction) {
  1754.         try {
  1755.             transactionDTO.setTokenInfo(transaction.getInformazioniAttributi().toJson());
  1756.         }catch(Exception t) {
  1757.             this.logger.error("Serializzazione informazioni attributi non riuscita: "+t.getMessage(),t);
  1758.         }
  1759.     }
  1760.     private void setTokenInfo(Transazione transactionDTO, InformazioniNegoziazioneToken informazioniNegoziazioneToken) {
  1761.         try {
  1762.             transactionDTO.setTokenInfo(informazioniNegoziazioneToken.toJson());
  1763.         }catch(Exception t) {
  1764.             this.logger.error("Serializzazione informazioni client assertion non riuscita: "+t.getMessage(),t);
  1765.         }
  1766.     }
  1767.    
  1768.     private void setTempiElaborazione(Transazione transactionDTO, Transaction transaction) {
  1769.         try {
  1770.             transactionDTO.setTempiElaborazione(TempiElaborazioneUtils.convertToDBValue(transaction.getTempiElaborazione()));
  1771.         }catch(Exception e) {
  1772.             // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  1773.             this.logger.error("TempiElaborazioneUtils.convertToDBValue failed: "+e.getMessage(),e);
  1774.         }
  1775.     }
  1776.    
  1777.     private static final MapKey<String> CREDENZIALI_MITTENTE_CLIENT_ADDRESS_RESOLVED = org.openspcoop2.utils.Map.newMapKey("CREDENZIALI_MITTENTE_CLIENT_ADDRESS_RESOLVED");
  1778.     private String getCredenzialiMittenteClientAddress(InformazioniTransazione info) {
  1779.         return (info!=null && info.getContext()!=null) ? (String) info.getContext().get(CREDENZIALI_MITTENTE_CLIENT_ADDRESS_RESOLVED) : null;
  1780.     }
  1781.     private void addCredenzialiMittenteClientAddress(InformazioniTransazione info, String cred) {
  1782.         if(info!=null && info.getContext()!=null) {
  1783.             info.getContext().put(CREDENZIALI_MITTENTE_CLIENT_ADDRESS_RESOLVED, cred);
  1784.         }
  1785.     }
  1786.     private void setAccordoInfoClientAddress(Transazione transactionDTO,
  1787.             RequestInfo requestInfo,
  1788.             IDSoggetto idDominio, InformazioniTransazione info, String idTransazione,
  1789.             TransazioniProcessTimes times, long timeStart, FaseTracciamento fase) {
  1790.         Object oIpAddressRemote = info.getContext().getObject(org.openspcoop2.core.constants.Costanti.CLIENT_IP_REMOTE_ADDRESS);
  1791.         if(oIpAddressRemote instanceof String){
  1792.             String ipAddress = (String)oIpAddressRemote;
  1793.             if(ipAddress.length()<=255){
  1794.                 transactionDTO.setSocketClientAddress(ipAddress);
  1795.             }
  1796.             else{
  1797.                 transactionDTO.setSocketClientAddress(ipAddress.substring(0, 250)+"...");
  1798.             }
  1799.         }
  1800.         Object oIpAddressTransport = info.getContext().getObject(org.openspcoop2.core.constants.Costanti.CLIENT_IP_TRANSPORT_ADDRESS);
  1801.         if(oIpAddressTransport instanceof String){
  1802.             String ipAddress = (String)oIpAddressTransport;
  1803.             if(ipAddress.length()<=255){
  1804.                 transactionDTO.setTransportClientAddress(ipAddress);
  1805.             }
  1806.             else{
  1807.                 transactionDTO.setTransportClientAddress(ipAddress.substring(0, 250)+"...");
  1808.             }
  1809.         }
  1810.         setAccordoInfoClientAddressCredenzialiMittente(transactionDTO,
  1811.                 requestInfo,
  1812.                 idDominio, info, idTransazione,
  1813.                 times, timeStart, fase);
  1814.     }
  1815.     private void setAccordoInfoClientAddressCredenzialiMittente(Transazione transactionDTO,
  1816.             RequestInfo requestInfo,
  1817.             IDSoggetto idDominio, InformazioniTransazione info, String idTransazione,
  1818.             TransazioniProcessTimes times, long timeStart, FaseTracciamento fase) {
  1819.         String conflict = "0";
  1820.         if(transactionDTO.getSocketClientAddress()!=null || transactionDTO.getTransportClientAddress()!=null) {
  1821.             String cred = getCredenzialiMittenteClientAddress(info);
  1822.             if(cred!=null && StringUtils.isNotEmpty(cred)) {
  1823.                 transactionDTO.setClientAddress(cred);
  1824.             }
  1825.             else {
  1826.                 try {
  1827.                     StringBuilder sbConflict = null;
  1828.                     if(times!=null) {
  1829.                         sbConflict = new StringBuilder();
  1830.                     }
  1831.                     CredenzialeMittente credClientAddress =GestoreAutenticazione.convertClientCredentialToCredenzialiMittenti(idDominio, info.getIdModulo(), idTransazione,
  1832.                             transactionDTO.getSocketClientAddress(), transactionDTO.getTransportClientAddress(),
  1833.                             null, fase.name()+".clientAddress",
  1834.                             sbConflict, requestInfo);
  1835.                     if(sbConflict!=null && sbConflict.length()>0) {
  1836.                         conflict = sbConflict.toString();
  1837.                     }
  1838.                     if(credClientAddress!=null) {
  1839.                         cred = credClientAddress.getId()+"";
  1840.                         transactionDTO.setClientAddress(cred);
  1841.                         addCredenzialiMittenteClientAddress(info, cred);
  1842.                     }
  1843.                 }catch(Exception e) {
  1844.                     // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  1845.                     this.logger.error("Errore durante la scrittura dell'indice per la ricerca del client address: "+e.getMessage(),e);
  1846.                 }
  1847.             }
  1848.         }
  1849.        
  1850.         if(times!=null) {
  1851.             long timeEnd =  DateManager.getTimeMillis();
  1852.             long timeProcess = timeEnd-timeStart;
  1853.             times.fillTransactionDetails.add("ip-address:"+timeProcess+"/c"+conflict);
  1854.         }
  1855.        
  1856.     }
  1857.    
  1858.     private void setEventi(Transazione transactionDTO, Transaction transaction,
  1859.             OpenSPCoop2Properties op2Properties,
  1860.             RequestInfo requestInfo,
  1861.             IDSoggetto idDominio, InformazioniTransazione info, String idTransazione,
  1862.             TransazioniProcessTimes times, long timeStart, FaseTracciamento fase) throws CoreException {
  1863.         List<String> eventiGestione = new ArrayList<>();
  1864.         int count = 0;
  1865.         int maxLengthCredenziali = op2Properties.getTransazioniCredenzialiMittenteMaxLength()-AbstractCredenzialeList.PREFIX.length();
  1866.        
  1867.         if(op2Properties.isTransazioniHttpStatusAsEvent_outResponseCode() && transactionDTO.getCodiceRispostaUscita()!=null &&
  1868.                 !"".equals(transactionDTO.getCodiceRispostaUscita())) {
  1869.             String evento = CostantiPdD.PREFIX_HTTP_STATUS_CODE_OUT+transactionDTO.getCodiceRispostaUscita();
  1870.             String dbValue = AbstractCredenzialeList.getDBValue(evento);
  1871.             if(count+dbValue.length()<maxLengthCredenziali) {
  1872.                 eventiGestione.add( evento );
  1873.                 count = count+dbValue.length();
  1874.             }
  1875.             else {
  1876.                 // tronco gli eventi ai primi trovati. Sono troppi eventi successi sulla transazione.
  1877.             }
  1878.         }
  1879.         if(op2Properties.isTransazioniHttpStatusAsEvent_inResponseCode() && transactionDTO.getCodiceRispostaIngresso()!=null &&
  1880.                 !"".equals(transactionDTO.getCodiceRispostaIngresso())) {
  1881.             String evento = CostantiPdD.PREFIX_HTTP_STATUS_CODE_IN+transactionDTO.getCodiceRispostaIngresso();
  1882.             String dbValue = AbstractCredenzialeList.getDBValue(evento);
  1883.             if(count+dbValue.length()<maxLengthCredenziali) {
  1884.                 eventiGestione.add( evento );
  1885.                 count = count+dbValue.length();
  1886.             }
  1887.             else {
  1888.                 // tronco gli eventi ai primi trovati. Sono troppi eventi successi sulla transazione.
  1889.             }
  1890.         }
  1891.         if(op2Properties.isTransazioniTipoApiAsEvent() && transactionDTO.getTipoApi()>0) {
  1892.             String evento = CostantiPdD.PREFIX_API+transactionDTO.getTipoApi();
  1893.             String dbValue = AbstractCredenzialeList.getDBValue(evento);
  1894.             if(count+dbValue.length()<maxLengthCredenziali) {
  1895.                 eventiGestione.add( evento );
  1896.                 count = count+dbValue.length();
  1897.             }
  1898.             else {
  1899.                 // tronco gli eventi ai primi trovati. Sono troppi eventi successi sulla transazione.
  1900.             }
  1901.         }
  1902.         String consegneMultipleById = getConnettoriMultipli(info.getContext());
  1903.         if(op2Properties.isTransazioniConnettoriMultipliAsEvent() && consegneMultipleById!=null) {
  1904.             String evento = CostantiPdD.PREFIX_CONNETTORI_MULTIPLI+consegneMultipleById;
  1905.             String dbValue = AbstractCredenzialeList.getDBValue(evento);
  1906.             if(count+dbValue.length()<maxLengthCredenziali) {
  1907.                 eventiGestione.add( evento );
  1908.                 count = count+dbValue.length();
  1909.             }
  1910.             else {
  1911.                 // tronco gli eventi ai primi trovati. Sono troppi eventi successi sulla transazione.
  1912.             }
  1913.         }
  1914.        
  1915.         if(transaction.getEventiGestione()!=null && !transaction.getEventiGestione().isEmpty()){
  1916.             for (int i=0; i<transaction.getEventiGestione().size(); i++) {
  1917.                 String dbValue = AbstractCredenzialeList.getDBValue(transaction.getEventiGestione().get(i));
  1918.                 if(count+dbValue.length()<maxLengthCredenziali) {
  1919.                     eventiGestione.add( transaction.getEventiGestione().get(i) );
  1920.                     count = count+dbValue.length();
  1921.                 }
  1922.                 else {
  1923.                     // tronco gli eventi ai primi trovati. Sono troppi eventi successi sulla transazione.
  1924.                 }
  1925.             }
  1926.         }
  1927.         Object oEventoMax = info.getContext().getObject(CostantiControlloTraffico.PDD_CONTEXT_MAX_REQUEST_VIOLATED_EVENTO);
  1928.         if(oEventoMax instanceof String){
  1929.             String max = (String)oEventoMax;
  1930.             String dbValue = AbstractCredenzialeList.getDBValue(max);
  1931.             if(count+dbValue.length()<maxLengthCredenziali) {
  1932.                 eventiGestione.add( max );
  1933.                 /**count = count+dbValue.length();*/
  1934.             }
  1935.             else {
  1936.                 // tronco gli eventi ai primi trovati. Sono troppi eventi successi sulla transazione.
  1937.             }
  1938.         }
  1939.         String conflict = "0";
  1940.         if(!eventiGestione.isEmpty()){
  1941.             try {
  1942.                 StringBuilder sbConflict = null;
  1943.                 if(times!=null) {
  1944.                     sbConflict = new StringBuilder();
  1945.                 }
  1946.                 CredenzialeMittente credEventi = GestoreAutenticazione.convertEventiToCredenzialiMittenti(idDominio, info.getIdModulo(), idTransazione, eventiGestione,
  1947.                         null, fase.name()+".eventi",
  1948.                         sbConflict, requestInfo);
  1949.                 if(sbConflict!=null && sbConflict.length()>0) {
  1950.                     conflict = sbConflict.toString();
  1951.                 }
  1952.                 if(credEventi!=null) {
  1953.                     transactionDTO.setEventiGestione(credEventi.getId()+"");
  1954.                 }
  1955.             }catch(Exception e) {
  1956.                 // NOTA: questo metodo dovrebbe non lanciare praticamente mai eccezione
  1957.                 this.logger.error("Errore durante la definizione dell'indice per la ricerca degli eventi: "+e.getMessage(),e);
  1958.             }
  1959.         }
  1960.         if(times!=null) {
  1961.             long timeEnd =  DateManager.getTimeMillis();
  1962.             long timeProcess = timeEnd-timeStart;
  1963.             times.fillTransactionDetails.add("eventi:"+timeProcess+"/c"+conflict);
  1964.         }
  1965.     }
  1966.    
  1967.    
  1968.     private boolean isEsito(List<Integer> esiti, int esitoCheck) {
  1969.         for (int esito : esiti) {
  1970.             if(esitoCheck == esito){
  1971.                 return true;
  1972.             }
  1973.         }
  1974.         return false;
  1975.     }
  1976.    
  1977.     private long consegnaMultiplaProfiloSincrono(InformazioniTransazione info, IDSoggetto idDominio, String idTransazione,
  1978.             TransazioniProcessTimes times, long timeStart,
  1979.             boolean schedulaNotificheDopoConsegnaSincrona, MsgDiagnostico msgDiag, String nomePorta) {
  1980.         IOpenSPCoopState openspcoopState = null;
  1981.         try {
  1982.             OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  1983.            
  1984.             EJBUtilsMessaggioInConsegna messaggiInConsegna = null;
  1985.             Object oConnettoreConfig = info.getContext().getObject(CostantiPdD.TIMER_RICONSEGNA_CONTENUTI_APPLICATIVI_MESSAGGI_SPEDIRE );
  1986.             if (oConnettoreConfig instanceof EJBUtilsMessaggioInConsegna){
  1987.                 messaggiInConsegna = (EJBUtilsMessaggioInConsegna) oConnettoreConfig;
  1988.             }
  1989.             if(messaggiInConsegna==null) {
  1990.                 this.logger.error("Non è stato possibile gestire lo scheduling delle notifiche (connettori multipli): configurazione non disponibile");
  1991.             }
  1992.             else {
  1993.                 openspcoopState = new OpenSPCoopStateful();
  1994.                 openspcoopState.initResource(idDominio, info.getIdModulo(), idTransazione);
  1995.                
  1996.                 if(times!=null) {
  1997.                     long timeEnd =  DateManager.getTimeMillis();
  1998.                     long timeProcess = timeEnd-timeStart;
  1999.                     times.fillTransactionDetails.add("async-send-getConnection:"+timeProcess);
  2000.                    
  2001.                     timeStart = DateManager.getTimeMillis();
  2002.                 }
  2003.                
  2004.                 GestoreMessaggi msgRequest = new GestoreMessaggi(openspcoopState,true, messaggiInConsegna.getBusta().getID(),
  2005.                         org.openspcoop2.protocol.engine.constants.Costanti.INBOX,msgDiag,(PdDContext) info.getContext());
  2006.                
  2007.                 if(schedulaNotificheDopoConsegnaSincrona) {
  2008.                    
  2009.                     RepositoryBuste repositoryBuste = null;
  2010.                     boolean spedizioneConsegnaContenuti = false; // sarà il timer a far partire effettivamente la spedizione
  2011.                     /**
  2012.                         RepositoryBuste repositoryBuste = new RepositoryBuste(openspcoopState.getStatoRichiesta(), true, context.getProtocolFactory());
  2013.                      */
  2014.                        
  2015.                     // Devo rilasciare l'attendi esito
  2016.                     Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioniSql(op2Properties.isTransazioniDebug());
  2017.                     msgRequest.releaseAttesaEsiti(op2Properties.isTransazioniDebug(), log);
  2018.                    
  2019.                     EJBUtils.sendMessages(this.logger, msgDiag, openspcoopState, idTransazione,
  2020.                             repositoryBuste, msgRequest, null,
  2021.                             info.getProtocolFactory(), idDominio, nomePorta, messaggiInConsegna,
  2022.                             spedizioneConsegnaContenuti,
  2023.                             (PdDContext) info.getContext(),
  2024.                             ConfigurazionePdDManager.getInstance());
  2025.                    
  2026.                     if(times!=null) {
  2027.                         long timeEnd =  DateManager.getTimeMillis();
  2028.                         long timeProcess = timeEnd-timeStart;
  2029.                         times.fillTransactionDetails.add("async-send:"+timeProcess);
  2030.                        
  2031.                         timeStart = DateManager.getTimeMillis();
  2032.                     }
  2033.                    
  2034.                 }
  2035.                 else {
  2036.                    
  2037.                     for (String servizioApplicativo : messaggiInConsegna.getServiziApplicativi()) {
  2038.                         msgRequest.eliminaDestinatarioMessaggio(servizioApplicativo, null, messaggiInConsegna.getOraRegistrazioneMessaggio());
  2039.                     }
  2040.                
  2041.                     if(times!=null) {
  2042.                         long timeEnd =  DateManager.getTimeMillis();
  2043.                         long timeProcess = timeEnd-timeStart;
  2044.                         times.fillTransactionDetails.add("async-send-del:"+timeProcess);
  2045.                        
  2046.                         timeStart = DateManager.getTimeMillis();
  2047.                     }
  2048.                 }
  2049.             }
  2050.            
  2051.         }catch(Exception e) {
  2052.             this.logger.error("Non è stato possibile gestire lo scheduling delle notifiche (connettori multipli): "+e.getMessage(), e);
  2053.         }
  2054.         finally {
  2055.             try{
  2056.                 if(openspcoopState!=null && !openspcoopState.resourceReleased()){
  2057.                     openspcoopState.commit();
  2058.                    
  2059.                     if(times!=null) {
  2060.                         long timeEnd =  DateManager.getTimeMillis();
  2061.                         long timeProcess = timeEnd-timeStart;
  2062.                         times.fillTransactionDetails.add("async-send-commit:"+timeProcess);
  2063.                        
  2064.                         timeStart = DateManager.getTimeMillis();
  2065.                     }
  2066.                    
  2067.                     openspcoopState.releaseResource();
  2068.                    
  2069.                     if(times!=null) {
  2070.                         long timeEnd =  DateManager.getTimeMillis();
  2071.                         long timeProcess = timeEnd-timeStart;
  2072.                         times.fillTransactionDetails.add("async-send-finish:"+timeProcess);
  2073.                        
  2074.                         timeStart = DateManager.getTimeMillis();
  2075.                     }
  2076.                 }
  2077.             }catch(Exception e){
  2078.                 // ignore
  2079.             }
  2080.         }
  2081.        
  2082.         return timeStart;
  2083.     }
  2084.    
  2085.     private long saveTransactionContext(String identificativoSaveTransactionContext, InformazioniTransazione info, IDSoggetto idDominio, String idTransazione,
  2086.             TransazioniProcessTimes times, long timeStart,
  2087.             MsgDiagnostico msgDiag) {
  2088.         IOpenSPCoopState openspcoopState = null;
  2089.         try {
  2090.             openspcoopState = new OpenSPCoopStateful();
  2091.             openspcoopState.initResource(idDominio, info.getIdModulo(), idTransazione);
  2092.                
  2093.             if(times!=null) {
  2094.                 long timeEnd =  DateManager.getTimeMillis();
  2095.                 long timeProcess = timeEnd-timeStart;
  2096.                 times.fillTransactionDetails.add("async-send-saveTransactionContext:"+timeProcess);
  2097.                    
  2098.                 timeStart = DateManager.getTimeMillis();
  2099.             }
  2100.                
  2101.             GestoreMessaggi msgRequest = new GestoreMessaggi(openspcoopState,true, identificativoSaveTransactionContext,
  2102.                     org.openspcoop2.protocol.engine.constants.Costanti.INBOX,msgDiag,(PdDContext) info.getContext());
  2103.                
  2104.             msgRequest.registraTransactionContext_statelessEngine(identificativoSaveTransactionContext, info.getContext());
  2105.                                
  2106.             if(times!=null) {
  2107.                 long timeEnd =  DateManager.getTimeMillis();
  2108.                 long timeProcess = timeEnd-timeStart;
  2109.                 times.fillTransactionDetails.add("async-send-saveTransactionContext-saved:"+timeProcess);
  2110.                
  2111.                 timeStart = DateManager.getTimeMillis();
  2112.             }
  2113.            
  2114.         }catch(Exception e) {
  2115.             this.logger.error("Non è stato possibile salvare il contesto della transazione per le notifiche (connettori multipli): "+e.getMessage(), e);
  2116.         }
  2117.         finally {
  2118.             try{
  2119.                 if(openspcoopState!=null && !openspcoopState.resourceReleased()){
  2120.                     openspcoopState.commit();
  2121.                    
  2122.                     if(times!=null) {
  2123.                         long timeEnd =  DateManager.getTimeMillis();
  2124.                         long timeProcess = timeEnd-timeStart;
  2125.                         times.fillTransactionDetails.add("async-send-saveTransactionContext-commit:"+timeProcess);
  2126.                        
  2127.                         timeStart = DateManager.getTimeMillis();
  2128.                     }
  2129.                    
  2130.                     openspcoopState.releaseResource();
  2131.                    
  2132.                     if(times!=null) {
  2133.                         long timeEnd =  DateManager.getTimeMillis();
  2134.                         long timeProcess = timeEnd-timeStart;
  2135.                         times.fillTransactionDetails.add("async-send-saveTransactionContext-finish:"+timeProcess);
  2136.                        
  2137.                         timeStart = DateManager.getTimeMillis();
  2138.                     }
  2139.                 }
  2140.             }catch(Exception e){
  2141.                 // ignore
  2142.             }
  2143.         }
  2144.        
  2145.         return timeStart;
  2146.     }
  2147.    
  2148.    
  2149.    
  2150.     public static Busta convertToBusta(Transazione transazioneDTO) {
  2151.         Busta busta = new Busta(transazioneDTO.getProtocollo());
  2152.        
  2153.         busta.setTipoMittente(transazioneDTO.getTipoSoggettoFruitore());
  2154.         busta.setMittente(transazioneDTO.getNomeSoggettoFruitore());
  2155.         busta.setIdentificativoPortaMittente(transazioneDTO.getIdportaSoggettoFruitore());
  2156.         busta.setIndirizzoMittente(transazioneDTO.getIndirizzoSoggettoFruitore());
  2157.        
  2158.         busta.setTipoDestinatario(transazioneDTO.getTipoSoggettoErogatore());
  2159.         busta.setDestinatario(transazioneDTO.getNomeSoggettoErogatore());
  2160.         busta.setIdentificativoPortaDestinatario(transazioneDTO.getIdportaSoggettoErogatore());
  2161.         busta.setIndirizzoDestinatario(transazioneDTO.getIndirizzoSoggettoErogatore());
  2162.        
  2163.         busta.setTipoServizio(transazioneDTO.getTipoServizio());
  2164.         busta.setServizio(transazioneDTO.getNomeServizio());
  2165.         busta.setVersioneServizio(transazioneDTO.getVersioneServizio());
  2166.         busta.setAzione(transazioneDTO.getAzione());
  2167.        
  2168.         busta.setID(transazioneDTO.getIdMessaggioRichiesta());
  2169.         busta.setRiferimentoMessaggio(transazioneDTO.getIdMessaggioRisposta());
  2170.        
  2171.         busta.setCollaborazione(transazioneDTO.getIdCollaborazione());
  2172.        
  2173.         busta.setServizioApplicativoFruitore(transazioneDTO.getServizioApplicativoFruitore());
  2174.         busta.setServizioApplicativoErogatore(transazioneDTO.getServizioApplicativoErogatore());
  2175.        
  2176.         return busta;
  2177.     }
  2178. }