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.UtilsException;
  102. import org.openspcoop2.utils.date.DateManager;
  103. import org.openspcoop2.utils.json.JSONUtils;
  104. import org.openspcoop2.utils.transport.TransportUtils;
  105. import org.slf4j.Logger;

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

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

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

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

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

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

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

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

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

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

  261.             EsitiProperties esitiProperties = EsitiProperties.getInstance(this.logger, protocolFactory);
  262.                        
  263.             // ** Consegna Multipla **
  264.             // 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
  265.             int connettoriMultipli = getNumeroConnettoriMultipli(info.getContext());
  266.             boolean consegnaMultipla = isConsegnaMultipla(connettoriMultipli);
  267.            
  268.             ConfigurazioneMultiDeliver configurazioneConsegnaMultiplaProfiloSincrono = null;
  269.             if(FaseTracciamento.POST_OUT_RESPONSE.equals(fase) && consegnaMultipla) {
  270.                 Object oConnettoreSync = info.getContext().getObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_SINCRONA );
  271.                 if (oConnettoreSync instanceof Boolean){
  272.                     consegnaMultiplaProfiloSincrono = (Boolean) oConnettoreSync;
  273.                 }
  274.                 else if (oConnettoreSync instanceof String){
  275.                     consegnaMultiplaProfiloSincrono = Boolean.valueOf( (String) oConnettoreSync );
  276.                 }
  277.                
  278.                 if(consegnaMultiplaProfiloSincrono) {
  279.                     Object oConnettoreSyncConfig = info.getContext().getObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_SINCRONA_CONFIGURAZIONE );
  280.                     if (oConnettoreSyncConfig instanceof ConfigurazioneMultiDeliver){
  281.                         configurazioneConsegnaMultiplaProfiloSincrono = (ConfigurazioneMultiDeliver) oConnettoreSyncConfig;
  282.                     }
  283.                 }
  284.             }

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

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


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

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

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

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


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

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

  485.             // ** Tempi di latenza **

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

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


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

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

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

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


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

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

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


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


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


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

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

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

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

  619.             }


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

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

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

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


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

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


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

  1487.                 }
  1488.                 else {
  1489.                     OpenSPCoop2RestMessage<?> restMsg = info.getResponse().castAsRest();
  1490.                     if(restMsg.isProblemDetailsForHttpApis_RFC7807() || MessageRole.FAULT.equals(restMsg.getMessageRole())) {
  1491.                         switch (restMsg.getMessageType()) {
  1492.                         case XML:
  1493.                            
  1494.                             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  1495.                             restMsg.writeTo(bout, false);
  1496.                             bout.flush();
  1497.                             bout.close();
  1498.                            
  1499.                             Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopTransazioni(op2Properties.isTransazioniDebug());
  1500.                             if(op2Properties.isTransazioniFaultPrettyPrint()){
  1501.                                 // Faccio una pretty-print: potevo fare anche direttamente passando il fault a metodo prettyPrint,
  1502.                                 // Pero' non veniva stampato correttamente il SOAPFault. Mi appoggio allora a SoapUtils.
  1503.                                 /**byte [] content = org.openspcoop2.message.soap.TunnelSoapUtils.sbustamentoMessaggio(context.getMessaggio());*/
  1504.                                 byte [] content = bout.toByteArray();
  1505.                                 fault = DumpUtility.toString(MessageXMLUtils.getInstance(restMsg.getFactory()).newDocument(content), log, info.getResponse());
  1506.                                 /**System.out.println("IMPOSTATO FAULT IN TRANSACTION ["+fault+"]");*/
  1507.                             }
  1508.                             else{
  1509.                                
  1510.                                 fault = bout.toString();
  1511.                             }
  1512.                            
  1513.                             formatoFault = restMsg.getMessageType().name();
  1514.                            
  1515.                             break;
  1516.                            
  1517.                         case JSON:
  1518.                            
  1519.                             bout = new ByteArrayOutputStream();
  1520.                             restMsg.writeTo(bout, false);
  1521.                             bout.flush();
  1522.                             bout.close();
  1523.                            
  1524.                             if(op2Properties.isTransazioniFaultPrettyPrint()){
  1525.                                
  1526.                                 JSONUtils jsonUtils = JSONUtils.getInstance(true);
  1527.                                 byte [] content = bout.toByteArray();
  1528.                                 JsonNode jsonNode = jsonUtils.getAsNode(content);
  1529.                                 fault = jsonUtils.toString(jsonNode);
  1530.                                
  1531.                             }
  1532.                             else{
  1533.                                
  1534.                                 fault = bout.toString();
  1535.                             }
  1536.                            
  1537.                             formatoFault = restMsg.getMessageType().name();
  1538.                            
  1539.                             break;

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