ConvertitoreCodiceDiagnostici.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it). 
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package org.openspcoop2.pdd.logger.diagnostica;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.soap.SOAPFault;

import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.config.GestioneTokenAutenticazione;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.config.constants.MTOMProcessorType;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.constants.TipiConnettore;
import org.openspcoop2.core.eccezione.details.DettaglioEccezione;
import org.openspcoop2.core.eccezione.details.utils.XMLUtils;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.core.transazioni.CredenzialeMittente;
import org.openspcoop2.core.transazioni.Transazione;
import org.openspcoop2.core.transazioni.constants.PddRuolo;
import org.openspcoop2.core.transazioni.constants.TipoAPI;
import org.openspcoop2.core.transazioni.utils.credenziali.CredenzialeTokenClient;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.message.OpenSPCoop2MessageParseResult;
import org.openspcoop2.message.OpenSPCoop2RestMessage;
import org.openspcoop2.message.OpenSPCoop2SoapMessage;
import org.openspcoop2.message.constants.MessageRole;
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.message.exception.MessageException;
import org.openspcoop2.message.exception.MessageNotSupportedException;
import org.openspcoop2.message.soap.SoapUtils;
import org.openspcoop2.message.utils.MessageUtilities;
import org.openspcoop2.pdd.core.CostantiPdD;
import org.openspcoop2.pdd.core.PdDContext;
import org.openspcoop2.pdd.core.autenticazione.GestoreAutenticazione;
import org.openspcoop2.pdd.core.connettori.ConnettoreBase;
import org.openspcoop2.pdd.core.connettori.ConnettoreUtils;
import org.openspcoop2.pdd.core.controllo_traffico.GeneratoreMessaggiErrore;
import org.openspcoop2.pdd.core.credenziali.engine.GestoreCredenzialiEngine;
import org.openspcoop2.pdd.core.token.PolicyGestioneToken;
import org.openspcoop2.pdd.core.trasformazioni.GestoreTrasformazioniUtilities;
import org.openspcoop2.pdd.logger.LogLevels;
import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
import org.openspcoop2.pdd.logger.record.AbstractDatoRicostruzione;
import org.openspcoop2.pdd.logger.record.RuoloTransazione;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.engine.constants.Costanti;
import org.openspcoop2.protocol.engine.utils.NamingUtils;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.constants.CostantiProtocollo;
import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
import org.openspcoop2.protocol.sdk.constants.MessaggiFaultErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
import org.openspcoop2.protocol.utils.EsitiProperties;
import org.openspcoop2.security.message.constants.SecurityConstants;
import org.openspcoop2.utils.LoggerWrapperFactory;
import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.properties.PropertiesReader;
import org.openspcoop2.utils.transport.http.HttpRequestMethod;
import org.slf4j.Logger;

/**     
 * ConvertitoreCodiceDiagnostici
 *
 * @author Poli Andrea (poli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class ConvertitoreCodiceDiagnostici {

	protected org.openspcoop2.pdd.logger.MsgDiagnostico msgDiag;
	protected Transazione transazioneDTO = null;
	protected InformazioniRecordDiagnostici info;
	protected IProtocolFactory<?> protocolFactory;
	
	protected List<String> codiciModuliSimulabili = new ArrayList<>();
	protected	List<String> codiciModuliSimulabiliIntegrazione = new ArrayList<>();
	protected List<String> codiciModuliSimulabiliCooperazione = new ArrayList<>();

	protected OpenSPCoop2Message mFaultRicostruitoCooperazione = null;
	protected String mFaultRicostruitoCooperazioneDescrizioneWithDetails = null;
	protected String mFaultRicostruitoCooperazioneDescrizioneWithoutDetails = null;
	
	protected OpenSPCoop2Message mFaultRicostruitoIntegrazione = null;
	protected String mFaultRicostruitoIntegrazioneDescrizioneWithDetails = null;
	protected String mFaultRicostruitoIntegrazioneDescrizioneWithoutDetails = null;
	
	protected List<String> codiciModuliSimulabiliTracciamento = new ArrayList<>();
	
	protected boolean esitoAutenticazioneInCache = false;
	protected boolean esitoAutorizzazioneInCache = false;
	protected boolean esitoAutorizzazioneContenutiInCache = false;
	protected boolean esitoAutenticazioneTokenInCache = false;
	protected boolean esitoModiTokenAuthorizationInCache = false;
	protected boolean esitoModiTokenIntegrityInCache = false;
	protected boolean esitoModiTokenAuditInCache = false;
	
	protected boolean rispostaLettaDallaCache = false;
	
	protected String dettaglioAutenticazioneFallita = null;
	
	public static final String RICEZIONE_CONTENUTI_APPLICATIVI_CODICE_MODULO = "001"; // codice modulo
	public static final String RICEZIONE_CONTENUTI_APPLICATIVI_LOCAL_FORWARD_LOGINFO_CODICE = "001034"; // ricezioneContenutiApplicativi.localForward.logInfo
	public static final String RICEZIONE_CONTENUTI_APPLICATIVI_CONSEGNA_RISPOSTA_APPLICATIVA_OK_CODICE = "001005"; // ricezioneContenutiApplicativi.consegnaRispostaApplicativaOkEffettuata
	public static final String RICEZIONE_CONTENUTI_APPLICATIVI_CONSEGNA_RISPOSTA_APPLICATIVA_KO_CODICE = "001006"; // ricezioneContenutiApplicativi.consegnaRispostaApplicativaKoEffettuata
	public static final String RICEZIONE_CONTENUTI_APPLICATIVI_AUTENTICAZIONE_IN_CORSO_CODICE = "001050"; // ricezioneContenutiApplicativi.autenticazioneInCorso
		
	public static final String IMBUSTAMENTO_CODICE_MODULO = "002"; // codice modulo
	
	public static final String INOLTRO_BUSTE_CODICE_MODULO = "003"; // codice modulo
	public static final String INOLTRO_BUSTE_INOLTRO_CON_ERRORE_CODICE = "003008"; // inoltroBuste.inoltroConErrore
	public static final String INOLTRO_BUSTE_RICEZIONE_SOAP_FAULT_CODICE = "003013"; // inoltroBuste.ricezioneSoapFault
	
	public static final String RICEZIONE_BUSTE_CODICE_MODULO = "004"; // codice modulo
	public static final String RICEZIONE_BUSTE_AUTORIZZAZIONE_BUSTE_EFFETTUATA_CODICE = "004004"; // ricezioneBuste.autorizzazioneBusteEffettuata
	public static final String RICEZIONE_BUSTE_AUTENTICAZIONE_IN_CORSO_CODICE = "004074"; //ricezioneBuste.autenticazioneInCorso
	public static final String RICEZIONE_BUSTE_AUTENTICAZIONE_EFFETTUATA_CODICE = "004075"; //ricezioneBuste.autenticazioneEffettuata
	public static final String RICEZIONE_BUSTE_AUTENTICAZIONE_FALLITA_CODICE = "004076"; //ricezioneBuste.autenticazioneFallita
	public static final String RICEZIONE_BUSTE_AUTENTICAZIONE_FALLITA_OPZIONALE_CODICE = "004077"; //ricezioneBuste.autenticazioneFallita.opzionale
			
	public static final String SBUSTAMENTO_CODICE_MODULO = "005"; // codice modulo
	
	public static final String SBUSTAMENTO_RISPOSTE_CODICE_MODULO = "006"; // codice modulo
	
	public static final String CONSEGNA_CONTENUTI_APPLICATIVI_CODICE_MODULO = "007"; // codice modulo
	public static final String CONSEGNA_CONTENUTI_APPLICATIVI_RICEZIONE_SOAP_FAULT_CODICE = "007014"; // consegnaContenutiApplicativi.ricezioneSoapFault
	
	
	public ConvertitoreCodiceDiagnostici(Transazione transazioneDTO,
			Traccia tracciaRichiesta, Traccia tracciaRisposta,
			InformazioniRecordDiagnostici info,
			CredenzialeMittente credenzialeClientId) throws ProtocolException{
		this.init(null, tracciaRichiesta, tracciaRisposta, transazioneDTO, info, credenzialeClientId);
	}
	protected ConvertitoreCodiceDiagnostici() {
		// va chiamato init
	}
	protected void init(IProtocolFactory<?> protocolFactory, Traccia tracciaRichiesta, Traccia tracciaRisposta,
			Transazione transazioneDTO, InformazioniRecordDiagnostici info,
			CredenzialeMittente credenzialeClientId) throws ProtocolException{

		if(protocolFactory==null){
			protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(transazioneDTO.getProtocollo());
		}
		
		/**Logger log = protocolFactory.getLogger() != null ? protocolFactory.getLogger() : LoggerWrapperFactory.getLogger(ConvertitoreCodiceDiagnostici.class);*/
		
		String confDir = null;
		if(!MsgDiagnosticiProperties.initialize(null,confDir)){
			throw new ProtocolException("Inizializzazione MsgDiagnosticiProperties non riuscita");
		}
		MsgDiagnosticiProperties msgDiagProperties = MsgDiagnosticiProperties.getInstance();
		if(!msgDiagProperties.initializeMsgDiagnosticiPersonalizzati()){
			throw new ProtocolException("Inizializzazione MsgDiagnosticiProperties (msg personalizzati) non riuscita");
		}
		
		this.msgDiag = org.openspcoop2.pdd.logger.MsgDiagnostico.newInstance();
		this.msgDiag.setPrefixMsgPersonalizzati("");

		this.transazioneDTO = transazioneDTO;
		this.info = info;
		
		
		/* ---- Codici Simulabili ----- */
		
		//this.codiciModuliSimulabili.add("000"); all
		this.codiciModuliSimulabili.add(RICEZIONE_CONTENUTI_APPLICATIVI_CODICE_MODULO); // ricezioneContenutiApplicativi
		this.codiciModuliSimulabili.add(IMBUSTAMENTO_CODICE_MODULO); // imbustamentoBusta
		this.codiciModuliSimulabili.add(INOLTRO_BUSTE_CODICE_MODULO); // inoltroBuste
		this.codiciModuliSimulabili.add(RICEZIONE_BUSTE_CODICE_MODULO); // ricezioneBuste
		this.codiciModuliSimulabili.add(SBUSTAMENTO_CODICE_MODULO); // sbustamentoBusta
		this.codiciModuliSimulabili.add(SBUSTAMENTO_RISPOSTE_CODICE_MODULO); // sbustamentoRispostaBusta
		this.codiciModuliSimulabili.add(CONSEGNA_CONTENUTI_APPLICATIVI_CODICE_MODULO); // consegnaContenutiApplicativi
		this.codiciModuliSimulabili.add("008"); // integrationManager
		//this.codiciModuliSimulabili.add("009"); // tracciamento
		//this.codiciModuliSimulabili.add("010"); // timerGestoreRiscontriRicevute
		//this.codiciModuliSimulabili.add("011"); // timerGestoreMessaggi
		//this.codiciModuliSimulabili.add("012"); // timerGestoreMessaggiInconsistenti
		//this.codiciModuliSimulabili.add("013"); // timerGestoreRepositoryBuste
		//this.codiciModuliSimulabili.add("014"); // timerMonitoraggioRisorse
		//this.codiciModuliSimulabili.add("015"); // timerThreshold
		//this.codiciModuliSimulabili.add("100"); // openspcoopStartup
		
		this.codiciModuliSimulabiliIntegrazione.add(RICEZIONE_CONTENUTI_APPLICATIVI_CODICE_MODULO); // ricezioneContenutiApplicativi
		this.codiciModuliSimulabiliIntegrazione.add(IMBUSTAMENTO_CODICE_MODULO); // imbustamentoBusta
		this.codiciModuliSimulabiliIntegrazione.add(CONSEGNA_CONTENUTI_APPLICATIVI_CODICE_MODULO); // consegnaContenutiApplicativi
		
		this.codiciModuliSimulabiliCooperazione.add(INOLTRO_BUSTE_CODICE_MODULO); // inoltroBuste
		this.codiciModuliSimulabiliCooperazione.add(RICEZIONE_BUSTE_CODICE_MODULO); // ricezioneBuste
		this.codiciModuliSimulabiliCooperazione.add(SBUSTAMENTO_CODICE_MODULO); // sbustamentoBusta
		this.codiciModuliSimulabiliCooperazione.add(SBUSTAMENTO_RISPOSTE_CODICE_MODULO); // sbustamentoRispostaBusta
		
		this.codiciModuliSimulabiliTracciamento.add("009007"); // richiestaIngresso.inCorso
		this.codiciModuliSimulabiliTracciamento.add("009008"); // richiestaIngresso.completato
		this.codiciModuliSimulabiliTracciamento.add("009009"); // richiestaUscita.inCorso
		this.codiciModuliSimulabiliTracciamento.add("009010"); // richiestaUscita.completato
		this.codiciModuliSimulabiliTracciamento.add("009011"); // rispostaIngresso.inCorso
		this.codiciModuliSimulabiliTracciamento.add("009012"); // rispostaIngresso.completato
		this.codiciModuliSimulabiliTracciamento.add("009013"); // rispostaUscita.inCorso
		this.codiciModuliSimulabiliTracciamento.add("009014"); // rispostaUscita.completato
		this.codiciModuliSimulabiliTracciamento.add("009015"); // richiestaIngresso.inCorso (fileTrace)
		this.codiciModuliSimulabiliTracciamento.add("009016"); // richiestaIngresso.completato (fileTrace)
		this.codiciModuliSimulabiliTracciamento.add("009017"); // richiestaUscita.inCorso (fileTrace)
		this.codiciModuliSimulabiliTracciamento.add("009018"); // richiestaUscita.completato (fileTrace)
		this.codiciModuliSimulabiliTracciamento.add("009019"); // rispostaIngresso.inCorso (fileTrace)
		this.codiciModuliSimulabiliTracciamento.add("009020"); // rispostaIngresso.completato (fileTrace)
		this.codiciModuliSimulabiliTracciamento.add("009021"); // rispostaUscita.inCorso (fileTrace)
		this.codiciModuliSimulabiliTracciamento.add("009022"); // rispostaUscita.completato (fileTrace)
		
		
		/* ---- Dati identificativi ----- */
		
		IDSoggetto soggettoMittente = null;
		if(transazioneDTO.getTipoSoggettoFruitore()!=null && transazioneDTO.getNomeSoggettoFruitore()!=null){
			soggettoMittente = new IDSoggetto(transazioneDTO.getTipoSoggettoFruitore(),transazioneDTO.getNomeSoggettoFruitore());
		}
		IDServizio idServizio = null;
		try {
			if(transazioneDTO.getTipoServizio()!=null && transazioneDTO.getNomeServizio()!=null &&
					transazioneDTO.getTipoSoggettoErogatore()!=null && transazioneDTO.getNomeSoggettoErogatore()!=null) {
				idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(transazioneDTO.getTipoServizio(),transazioneDTO.getNomeServizio(), 
						transazioneDTO.getTipoSoggettoErogatore(),transazioneDTO.getNomeSoggettoErogatore(), 
						transazioneDTO.getVersioneServizio()); 
			}
		}catch(Exception e) {
			throw new ProtocolException(e.getMessage(),e);
		}
		if(idServizio!=null) {
			idServizio.setAzione(transazioneDTO.getAzione());
		}
		

		/* ---- Protocollo ---- */
		this.protocolFactory = protocolFactory;
		String protocollo = protocolFactory.getProtocol();
		this.msgDiag.addKeywords(protocolFactory);


		/* ---- Buste ---- */

		// NOTA: se esiste una traccia di richiesta, si fornisce quella.
		// Altrimenti la si costruisce dalla transazione.
		Busta bustaRichiesta = null;
		if(tracciaRichiesta!=null && tracciaRichiesta.getBusta()!=null){
			bustaRichiesta = tracciaRichiesta.getBusta();
			this.msgDiag.addKeywords(tracciaRichiesta.getBusta(), true);
		}
		else{
			bustaRichiesta = new Busta(protocollo);
			bustaRichiesta.setID(transazioneDTO.getIdMessaggioRichiesta());
			ProfiloDiCollaborazione profilo = null;
			if(transazioneDTO.getProfiloCollaborazioneOp2()!=null){
				profilo = ProfiloDiCollaborazione.toProfiloDiCollaborazione(transazioneDTO.getProfiloCollaborazioneOp2());
				bustaRichiesta.setProfiloDiCollaborazione(profilo);
			}
			bustaRichiesta.setProfiloDiCollaborazioneValue(transazioneDTO.getProfiloCollaborazioneProt());
			bustaRichiesta.setTipoMittente(transazioneDTO.getTipoSoggettoFruitore());
			bustaRichiesta.setMittente(transazioneDTO.getNomeSoggettoFruitore());
			bustaRichiesta.setIdentificativoPortaMittente(transazioneDTO.getIdportaSoggettoFruitore());
			bustaRichiesta.setIndirizzoMittente(transazioneDTO.getIndirizzoSoggettoFruitore());
			bustaRichiesta.setTipoDestinatario(transazioneDTO.getTipoSoggettoErogatore());
			bustaRichiesta.setDestinatario(transazioneDTO.getNomeSoggettoErogatore());
			bustaRichiesta.setIdentificativoPortaDestinatario(transazioneDTO.getIdportaSoggettoErogatore());
			bustaRichiesta.setIndirizzoDestinatario(transazioneDTO.getIndirizzoSoggettoErogatore());
			bustaRichiesta.setTipoServizio(transazioneDTO.getTipoServizio());
			bustaRichiesta.setServizio(transazioneDTO.getNomeServizio());
			bustaRichiesta.setVersioneServizio(transazioneDTO.getVersioneServizio());
			bustaRichiesta.setAzione(transazioneDTO.getAzione());
			//bustaRichiesta.setRiferimentoMessaggio(null); // non posso saperlo se c'era l'id di richiesta o altro
			//bustaRichiesta.setSequenza(-1); // non posso saperlo se c'era nella richiesta o nella risposta 
			//bustaRichiesta.setScadenza(new Date()); //non posso saperlo se c'era nella richiesta o nella risposta 
			this.msgDiag.addKeywords(bustaRichiesta, true);
		}

		// NOTA: se esiste una traccia di richiesta, si fornisce quella.
		// Altrimenti la si costruisce dalla transazione.
		if(tracciaRisposta!=null && tracciaRisposta.getBusta()!=null){
			this.msgDiag.addKeywords(tracciaRisposta.getBusta(), false);
		}
		else{
			Busta bustaRisposta = new Busta(protocollo);
			bustaRisposta.setID(transazioneDTO.getIdMessaggioRisposta());
			ProfiloDiCollaborazione profilo = null;
			if(transazioneDTO.getProfiloCollaborazioneOp2()!=null){
				profilo = ProfiloDiCollaborazione.toProfiloDiCollaborazione(transazioneDTO.getProfiloCollaborazioneOp2());
				bustaRisposta.setProfiloDiCollaborazione(profilo);
			}
			bustaRisposta.setProfiloDiCollaborazioneValue(transazioneDTO.getProfiloCollaborazioneProt());
			bustaRisposta.setTipoMittente(transazioneDTO.getTipoSoggettoErogatore());
			bustaRisposta.setMittente(transazioneDTO.getNomeSoggettoErogatore());
			bustaRisposta.setIdentificativoPortaMittente(transazioneDTO.getIdportaSoggettoErogatore());
			bustaRisposta.setIndirizzoMittente(transazioneDTO.getIndirizzoSoggettoErogatore());
			bustaRisposta.setTipoDestinatario(transazioneDTO.getTipoSoggettoFruitore());
			bustaRisposta.setDestinatario(transazioneDTO.getNomeSoggettoFruitore());
			bustaRisposta.setIdentificativoPortaDestinatario(transazioneDTO.getIdportaSoggettoFruitore());
			bustaRisposta.setIndirizzoDestinatario(transazioneDTO.getIndirizzoSoggettoFruitore());
			bustaRisposta.setTipoServizio(transazioneDTO.getTipoServizio());
			bustaRisposta.setServizio(transazioneDTO.getNomeServizio());
			bustaRisposta.setVersioneServizio(transazioneDTO.getVersioneServizio());
			bustaRisposta.setAzione(transazioneDTO.getAzione());
			//bustaRichiesta.setRiferimentoMessaggio(null); // non posso saperlo se c'era l'id di richiesta o altro
			//bustaRichiesta.setSequenza(-1); // non posso saperlo se c'era nella richiesta o nella risposta 
			//bustaRichiesta.setScadenza(new Date()); //non posso saperlo se c'era nella richiesta o nella risposta 
			this.msgDiag.addKeywords(bustaRisposta, false);
		}

		
		/* ---- Servizi Applicativi ---- */
		String servizioApplicativoFruitore = transazioneDTO.getServizioApplicativoFruitore();
		if(servizioApplicativoFruitore!=null && !"".equals(servizioApplicativoFruitore)){
			this.msgDiag.addKeyword(CostantiPdD.KEY_SA_FRUITORE, transazioneDTO.getServizioApplicativoFruitore());
		}
		else{
			this.msgDiag.addKeyword(CostantiPdD.KEY_SA_FRUITORE, CostantiPdD.SERVIZIO_APPLICATIVO_ANONIMO);
		}
		String servizioApplicativoErogatore = transazioneDTO.getServizioApplicativoErogatore();
		this.msgDiag.addKeyword(CostantiPdD.KEY_SA_EROGATORE, servizioApplicativoErogatore);

		
		/* ---- Servizi Applicativi via Token ---- */
		if(credenzialeClientId!=null && credenzialeClientId.getCredenziale()!=null) {
			String clientId = CredenzialeTokenClient.convertClientIdDBValueToOriginal(credenzialeClientId.getCredenziale());
			if(clientId!=null) {
				this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_CLIENT_ID, clientId);
			}
			try {
				IDServizioApplicativo idApplicativoToken = CredenzialeTokenClient.convertApplicationDBValueToOriginal(credenzialeClientId.getCredenziale());
				if(idApplicativoToken!=null) {
					this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_SERVIZIO_APPLICATIVO, idApplicativoToken.getNome()+NamingUtils.LABEL_DOMINIO+idApplicativoToken.getIdSoggettoProprietario().toString());
				}
			}catch(Exception e) {
				protocolFactory.getLogger().error(e.getMessage(),e);
			}
		}

		/* ---- Correlazione Applicativa ---- */
		this.msgDiag.addKeyword(CostantiPdD.KEY_ID_CORRELAZIONE_APPLICATIVA, transazioneDTO.getIdCorrelazioneApplicativa());


		/* ---- Ruolo (scenario, tipologia, tipoRicevuta, profiloAsincrono) ---- */
		RuoloTransazione ruoloTransazione = RuoloTransazione.toEnumConstant(transazioneDTO.getRuoloTransazione());
		String idAsincrono = transazioneDTO.getIdAsincrono();
		if(ruoloTransazione!=null){
			if(RuoloTransazione.INVOCAZIONE_ONEWAY.equals(ruoloTransazione)){				
				this.msgDiag.addKeyword(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO, Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO);
			}
			else if(RuoloTransazione.INVOCAZIONE_SINCRONA.equals(ruoloTransazione)){				
				this.msgDiag.addKeyword(CostantiPdD.KEY_TIPOLOGIA_RISPOSTA_APPLICATIVA, "risposta sincrona");
				this.msgDiag.addKeyword(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO, Costanti.SCENARIO_SINCRONO_INVOCAZIONE_SERVIZIO);
			}
			else if(RuoloTransazione.INVOCAZIONE_ASINCRONA_SIMMETRICA.equals(ruoloTransazione)){				
				this.msgDiag.addKeyword(CostantiPdD.KEY_TIPOLOGIA_RISPOSTA_APPLICATIVA, "ricevuta di una richiesta asincrona simmetrica");
				this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_RICEVUTA_ASINCRONA, "ricevuta di una richiesta asincrona simmetrica");
				this.msgDiag.addKeyword(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO, Costanti.SCENARIO_ASINCRONO_SIMMETRICO_INVOCAZIONE_SERVIZIO);
			}
			else if(RuoloTransazione.RISPOSTA_ASINCRONA_SIMMETRICA.equals(ruoloTransazione)){				
				this.msgDiag.addKeyword(CostantiPdD.KEY_TIPOLOGIA_RISPOSTA_APPLICATIVA, "ricevuta di una risposta asincrona simmetrica");
				this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_RICEVUTA_ASINCRONA, "ricevuta di una risposta asincrona simmetrica");
				if(idAsincrono!=null){
					this.msgDiag.addKeyword(CostantiPdD.KEY_ID_CORRELAZIONE_ASINCRONA, idAsincrono);
				}
				this.msgDiag.addKeyword(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO, Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA);
			}
			else if(RuoloTransazione.INVOCAZIONE_ASINCRONA_ASIMMETRICA.equals(ruoloTransazione)){				
				this.msgDiag.addKeyword(CostantiPdD.KEY_TIPOLOGIA_RISPOSTA_APPLICATIVA, "ricevuta di una richiesta asincrona asimmetrica");
				this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_RICEVUTA_ASINCRONA, "ricevuta di una richiesta asincrona asimmetrica");
				this.msgDiag.addKeyword(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO, Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_INVOCAZIONE_SERVIZIO);
			}
			else if(RuoloTransazione.RICHIESTA_STATO_ASINCRONA_ASIMMETRICA.equals(ruoloTransazione)){				
				this.msgDiag.addKeyword(CostantiPdD.KEY_TIPOLOGIA_RISPOSTA_APPLICATIVA, "ricevuta di una risposta asincrona asimmetrica");
				this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_RICEVUTA_ASINCRONA, "ricevuta di una risposta asincrona asimmetrica contenente l'esito della richiesta stato");
				if(idAsincrono!=null){
					this.msgDiag.addKeyword(CostantiPdD.KEY_ID_CORRELAZIONE_ASINCRONA, idAsincrono);
				}
				this.msgDiag.addKeyword(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO, Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING);
			}
		}

		String tipoMessaggio = "messaggio";
		//tipoMessaggio = "ricevuta asincrona"; non simulabile
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_MESSAGGIO_BUSTA, tipoMessaggio);

		
		/* ---- Behaviour ---- */
		// L'informazione non la si puo' salvare essendo i behaviour piu' di 1.
		// Inoltre contengono il carattere separatore e andrebbe gestita anche questa criticita
		this.msgDiag.addKeyword(CostantiPdD.KEY_DESCRIZIONE_BEHAVIOUR, "");

		
		/* ---- Router ---- */
		// router non verra' simulato
		this.msgDiag.addKeyword(CostantiPdD.KEY_DESTINATARIO_TRASMISSIONE, "");

		
		/* ---- Credenziali ---- */
		
		String credenziali = transazioneDTO.getCredenziali();
		
		// credenziali da gateway
		if(credenziali!=null && !"".equals(credenziali)){
			if(GestoreCredenzialiEngine.containsPrefixGatewayCredenziali(credenziali)) {
				String identitaGateway = GestoreCredenzialiEngine.readIdentitaGatewayCredenziali(credenziali);
				credenziali = GestoreCredenzialiEngine.erasePrefixGatewayCredenziali(credenziali);			
				this.msgDiag.addKeyword(CostantiPdD.KEY_IDENTITA_GESTORE_CREDENZIALI, identitaGateway);
				this.msgDiag.addKeyword(CostantiPdD.KEY_NUOVE_CREDENZIALI, normalizeCredenziali(credenziali,true,false));
			}
			else{
				this.msgDiag.addKeyword(CostantiPdD.KEY_NUOVE_CREDENZIALI, normalizeCredenziali(credenziali,true,false));
			}
			
			this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI, normalizeCredenziali(credenziali,true,true));
			this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_SA_FRUITORE, normalizeCredenziali(credenziali,true,true));
		}
		else{
			this.msgDiag.addKeyword(CostantiPdD.KEY_NUOVE_CREDENZIALI, "");
			this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI, "");
			this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_SA_FRUITORE, "");
		}
		
		
		/* ---- Operazione IM ---- */
		
		if(transazioneDTO.getOperazioneIm()!=null){
			this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_OPERAZIONE_IM, transazioneDTO.getOperazioneIm());
		}
		
		
		/* ---- Parametri IM ---- */
		
		if(transazioneDTO.getNomePorta()!=null){
			
			String messaggioPerIdAsincrono = "";
			if(idAsincrono!=null){
				messaggioPerIdAsincrono = " riferimentoMessaggio["+idAsincrono+"]";
			}
			
			String c = "";
			if(credenziali!=null){
				c = credenziali;
			}
	
			String param = "PD["+transazioneDTO.getNomePorta()+"]"+c+messaggioPerIdAsincrono;
			this.msgDiag.addKeyword(CostantiPdD.KEY_PARAMETRI_OPERAZIONE_IM, param);
		}
		
		

		/* ---- Autorizzazione Buste ---- */

		if(idServizio!=null) {
			if(soggettoMittente!=null){
				this.msgDiag.addKeyword(CostantiPdD.KEY_MITTENTE_E_SERVIZIO_DA_AUTORIZZARE, "fruitore ["+soggettoMittente.toString()+"] -> servizio ["+idServizio.toString()+"]");
			}
			else{
				this.msgDiag.addKeyword(CostantiPdD.KEY_MITTENTE_E_SERVIZIO_DA_AUTORIZZARE, "servizio ["+idServizio.toString()+"]");
			}
		}

		// KEY_CREDENZIALI_MITTENTE_MSG Gestite all'interno del metodo buildContextForSingleMsgDiagnostico 
		/**if(credenziali!=null && !"".equals(credenziali)) {
			this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_MITTENTE_MSG, " credenzialiMittente "+credenziali);
		}
		else{
			this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_MITTENTE_MSG, "");
		}*/
		if(servizioApplicativoFruitore!=null)
			this.msgDiag.addKeyword(CostantiPdD.KEY_SA_FRUITORE_MSG, " identitaServizioApplicativoFruitore ["+servizioApplicativoFruitore+"]");
		else
			this.msgDiag.addKeyword(CostantiPdD.KEY_SA_FRUITORE_MSG, "");
		this.msgDiag.addKeyword(CostantiPdD.KEY_SUBJECT_MESSAGE_SECURITY_MSG, ""); // non simulato

		this.msgDiag.addKeyword(CostantiPdD.KEY_DETAILS, ""); // non simulabile

		if(tracciaRisposta!=null && tracciaRisposta.getBusta()!=null && tracciaRisposta.getBusta().sizeListaRiscontri()==1){
			this.msgDiag.addKeyword(CostantiPdD.KEY_DATA_RISCONTRO, tracciaRisposta.getBusta().getRiscontro(0).getOraRegistrazione().toString());
			this.msgDiag.addKeyword(CostantiPdD.KEY_ID_BUSTA_RISCONTRATA, tracciaRisposta.getBusta().getRiscontro(0).getID());
		}

		
		
		/* ---- Integrazione ---- */

		Object o = info.getDato(MappingRicostruzioneDiagnostici.RESPONSE_FROM_CACHE).getDato();
		String infoResponseFromCache = (o!=null ? (String) o : null );
		if(CostantiMappingDiagnostici.IN_CACHE_TRUE.equals(infoResponseFromCache)) {
			this.rispostaLettaDallaCache = true;
		}
		else {
			this.rispostaLettaDallaCache = false;
		}
		
		
		if(PddRuolo.DELEGATA.equals(transazioneDTO.getPddRuolo())){
			this.msgDiag.addKeyword(CostantiPdD.KEY_PORTA_DELEGATA, transazioneDTO.getNomePorta());
		}
		else{
			this.msgDiag.addKeyword(CostantiPdD.KEY_PORTA_APPLICATIVA, transazioneDTO.getNomePorta());
		}

		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_CONNETTORE).getDato();
		String tipoConnettore = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_CONNETTORE, tipoConnettore);
		
		if(transazioneDTO.getLocationConnettore()!=null) {
			
			String locationConnettore = transazioneDTO.getLocationConnettore();
			
			if(this.rispostaLettaDallaCache &&
				locationConnettore.contains(ConnettoreBase.LOCATION_CACHED_SEPARATOR_REQUEST_URL)) {
				int indexOf = locationConnettore.indexOf(ConnettoreBase.LOCATION_CACHED_SEPARATOR_REQUEST_URL);
				if(indexOf>0 && locationConnettore.length()>(indexOf+ConnettoreBase.LOCATION_CACHED_SEPARATOR_REQUEST_URL.length())) {
					locationConnettore = locationConnettore.substring(indexOf+ConnettoreBase.LOCATION_CACHED_SEPARATOR_REQUEST_URL.length());
				}
			}
			
			String url = null;
			String method = null;
			try {
				url = CostantiPdD.readUrlFromConnettoreRequest(locationConnettore);
				method = CostantiPdD.readMethodFromConnettoreRequest(locationConnettore);
			}catch(Exception e) {
				protocolFactory.getLogger().error(e.getMessage(),e);
			}
			if(url==null || StringUtils.isEmpty(url) || method==null || StringUtils.isEmpty(method)) {
				url = locationConnettore;
				method = transazioneDTO.getTipoRichiesta();
			}
						
			boolean tipoConnettoreHttp = false;
			if(tipoConnettore!=null && 
					(TipiConnettore.HTTP.getNome().equals(tipoConnettore) || TipiConnettore.HTTPS.getNome().equals(tipoConnettore)  || tipoConnettore.toLowerCase().startsWith("http"))
				) {
				tipoConnettoreHttp = true;	
			}
			
			HttpRequestMethod httpRequestMethod = null;
			if(method!=null && !StringUtils.isEmpty(method)) {
				httpRequestMethod = HttpRequestMethod.valueOf(method);
			}
			
			if( (TipoAPI.SOAP.getValoreAsInt() == transazioneDTO.getTipoApi()) || !tipoConnettoreHttp) {
				httpRequestMethod = null; // il diagnostico in soap o in un connettore non http non contiene l'http method
			}
			this.msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, ConnettoreUtils.formatLocation(httpRequestMethod, url));
		}
		
		
		/* ---- ControlloCongestione ---- */
		
		o = info.getDato(MappingRicostruzioneDiagnostici.MAX_THREADS_THRESHOLD).getDato();
		String maxThreadThreshold = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_MAX_THREADS_THRESHOLD, maxThreadThreshold);
		
		o = info.getDato(MappingRicostruzioneDiagnostici.CONTROLLO_TRAFFICO_THRESHOLD).getDato();
		String controlloTrafficoThreshold = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_CONTROLLO_TRAFFICO_THRESHOLD, controlloTrafficoThreshold);
		
		o = info.getDato(MappingRicostruzioneDiagnostici.ACTIVE_THREADS).getDato();
		String activeThreads = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_ACTIVE_THREADS, activeThreads);
		
		o = info.getDato(MappingRicostruzioneDiagnostici.NUMERO_POLICY_CONFIGURATE).getDato();
		String numeroPolicy = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY, numeroPolicy);
		
		o = info.getDato(MappingRicostruzioneDiagnostici.NUMERO_POLICY_DISABILITATE).getDato();
		String numeroPolicyDisabilitate = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_DISABILITATE, numeroPolicyDisabilitate);
		
		o = info.getDato(MappingRicostruzioneDiagnostici.NUMERO_POLICY_FILTRATE).getDato();
		String numeroPolicyFiltrate = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_FILTRATE, numeroPolicyFiltrate);

		o = info.getDato(MappingRicostruzioneDiagnostici.NUMERO_POLICY_NON_APPLICATE).getDato();
		String numeroPolicyNonApplicabili = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_NON_APPLICATE, numeroPolicyNonApplicabili);
		
		o = info.getDato(MappingRicostruzioneDiagnostici.NUMERO_POLICY_RISPETTATE).getDato();
		String numeroPolicyRispettate = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_RISPETTATE, numeroPolicyRispettate);
		
		o = info.getDato(MappingRicostruzioneDiagnostici.NUMERO_POLICY_VIOLATE).getDato();
		String numeroPolicyViolate = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_VIOLATE, numeroPolicyViolate);
		
		o = info.getDato(MappingRicostruzioneDiagnostici.NUMERO_POLICY_VIOLATE_WARNING_ONLY).getDato();
		String numeroPolicyViolateWarningOnly = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_VIOLATE_WARNING_ONLY, numeroPolicyViolateWarningOnly);

		o = info.getDato(MappingRicostruzioneDiagnostici.NUMERO_POLICY_IN_ERRORE).getDato();
		String numeroPolicyInErrore = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_IN_ERRORE, numeroPolicyInErrore);
			
		
		
	
		
		
		/* ---- Altro ---- */

		this.msgDiag.addKeyword(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO, ""); // non simulabile

		String infoSearch = "";
		if(bustaRichiesta!=null &&
			bustaRichiesta.getTipoServizio()!=null && bustaRichiesta.getServizio()!=null &&
			bustaRichiesta.getTipoDestinatario()!=null && bustaRichiesta.getDestinatario()!=null){
			infoSearch = bustaRichiesta.getTipoServizio() + "/"
					+ bustaRichiesta.getServizio() + " erogato dal Soggetto "
					+ bustaRichiesta.getTipoDestinatario() + "/"
					+ bustaRichiesta.getDestinatario();
			if (bustaRichiesta.getAzione() != null)
				infoSearch = infoSearch + " azione " + bustaRichiesta.getAzione();
			if (idAsincrono != null) {
				infoSearch = "Servizio correlato " + infoSearch;
			} else {
				infoSearch = "Servizio " + infoSearch;
			}
			infoSearch = "Ricerca nel registro dei servizi di: " + infoSearch;
			if (idAsincrono != null)
				infoSearch = infoSearch + " (idServizioCorrelato: "+ idAsincrono + ")";
		}
		this.msgDiag.addKeyword(CostantiPdD.KEY_INFO_SERVIZIO_BUSTA, infoSearch);

			
		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_AUTENTICAZIONE).getDato();
		String tipoAutenticazione = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_AUTENTICAZIONE, tipoAutenticazione);
				
		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_AUTORIZZAZIONE).getDato();
		String tipoAutorizzazione = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_AUTORIZZAZIONE_BUSTE, tipoAutorizzazione);
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_AUTORIZZAZIONE, tipoAutorizzazione);
		
		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_AUTORIZZAZIONE_CONTENUTI).getDato();
		String tipoAutorizzazioneContenuti = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_AUTORIZZAZIONE_CONTENUTO, tipoAutorizzazioneContenuti);
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_VALIDAZIONE_CONTENUTI).getDato();
		String tipoTradottoOpenSPCoop = null;
		String tipoValidazioneContenuti = (o!=null ? (String) o : null );
		if(tipoValidazioneContenuti!=null && tipoValidazioneContenuti.length()>0){
			char tipoValidazione = tipoValidazioneContenuti.charAt(0);
			if(CostantiMappingDiagnostici.TIPO_VALIDAZIONE_CONTENUTI_OPENSPCOOP == tipoValidazione){
				tipoTradottoOpenSPCoop = CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_OPENSPCOOP.getValue();
			}
			else if(CostantiMappingDiagnostici.TIPO_VALIDAZIONE_CONTENUTI_INTERFACE == tipoValidazione){
				tipoTradottoOpenSPCoop = CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_INTERFACE.getValue();
			}
			else if(CostantiMappingDiagnostici.TIPO_VALIDAZIONE_CONTENUTI_XSD == tipoValidazione){
				tipoTradottoOpenSPCoop = CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_XSD.getValue();
			}
			if(tipoValidazioneContenuti.length()>1){
				char mtom = tipoValidazioneContenuti.charAt(1);
				if(CostantiMappingDiagnostici.TIPO_VALIDAZIONE_CONTENUTI_MTOM == mtom){
					tipoTradottoOpenSPCoop =  tipoTradottoOpenSPCoop + CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_PRINT_SEPARATOR +  
							CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_VALIDAZIONE_CON_MTOM;
				}
				if(tipoValidazioneContenuti.length()>2){
					char warn = tipoValidazioneContenuti.charAt(2);
					if(CostantiMappingDiagnostici.TIPO_VALIDAZIONE_CONTENUTI_WARN == warn){
						tipoTradottoOpenSPCoop =  tipoTradottoOpenSPCoop + CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_PRINT_SEPARATOR +  
								CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_VALIDAZIONE_IN_WARNING_MODE;
					}
				}
			}
		}
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_VALIDAZIONE_CONTENUTI, tipoTradottoOpenSPCoop);
		this.msgDiag.addKeyword(CostantiPdD.KEY_DETAILS_VALIDAZIONE_CONTENUTI,"");
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_PROCESSAMENTO_MTOM_RICHIESTA).getDato();
		tipoTradottoOpenSPCoop = null;
		String tipoProcessamentoMTOMRichiesta = (o!=null ? (String) o : null );
		if(tipoProcessamentoMTOMRichiesta!=null && tipoProcessamentoMTOMRichiesta.length()==1){
			char tipoProcessamento = tipoProcessamentoMTOMRichiesta.charAt(0);
			if(CostantiMappingDiagnostici.TIPO_MTOM_PROCESSAMENTO_DISABLE == tipoProcessamento){
				tipoTradottoOpenSPCoop = MTOMProcessorType.DISABLE.getValue();
			}
			else if(CostantiMappingDiagnostici.TIPO_MTOM_PROCESSAMENTO_PACKAGING == tipoProcessamento){
				tipoTradottoOpenSPCoop = MTOMProcessorType.PACKAGING.getValue();
			}
			else if(CostantiMappingDiagnostici.TIPO_MTOM_PROCESSAMENTO_UNPACKAGING == tipoProcessamento){
				tipoTradottoOpenSPCoop = MTOMProcessorType.UNPACKAGING.getValue();
			}
			else if(CostantiMappingDiagnostici.TIPO_MTOM_PROCESSAMENTO_VERIFY == tipoProcessamento){
				tipoTradottoOpenSPCoop = MTOMProcessorType.VERIFY.getValue();
			}
		}
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_PROCESSAMENTO_MTOM_RICHIESTA, tipoTradottoOpenSPCoop);
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_PROCESSAMENTO_MTOM_RISPOSTA).getDato();
		tipoTradottoOpenSPCoop = null;
		String tipoProcessamentoMTOMRisposta = (o!=null ? (String) o : null );
		if(tipoProcessamentoMTOMRisposta!=null && tipoProcessamentoMTOMRisposta.length()==1){
			char tipoProcessamento = tipoProcessamentoMTOMRisposta.charAt(0);
			if(CostantiMappingDiagnostici.TIPO_MTOM_PROCESSAMENTO_DISABLE == tipoProcessamento){
				tipoTradottoOpenSPCoop = MTOMProcessorType.DISABLE.getValue();
			}
			else if(CostantiMappingDiagnostici.TIPO_MTOM_PROCESSAMENTO_PACKAGING == tipoProcessamento){
				tipoTradottoOpenSPCoop = MTOMProcessorType.PACKAGING.getValue();
			}
			else if(CostantiMappingDiagnostici.TIPO_MTOM_PROCESSAMENTO_UNPACKAGING == tipoProcessamento){
				tipoTradottoOpenSPCoop = MTOMProcessorType.UNPACKAGING.getValue();
			}
			else if(CostantiMappingDiagnostici.TIPO_MTOM_PROCESSAMENTO_VERIFY == tipoProcessamento){
				tipoTradottoOpenSPCoop = MTOMProcessorType.VERIFY.getValue();
			}
		}
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_PROCESSAMENTO_MTOM_RISPOSTA, tipoTradottoOpenSPCoop);
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_PROCESSAMENTO_MESSAGE_SECURITY_RICHIESTA).getDato();
		tipoTradottoOpenSPCoop = null;
		String tipoProcessamentoMessageSecurityRichiesta = (o!=null ? (String) o : null );
		if(tipoProcessamentoMessageSecurityRichiesta!=null && tipoProcessamentoMessageSecurityRichiesta.length()>0){
			tipoTradottoOpenSPCoop = buildSicurezzaMessaggio(tipoProcessamentoMessageSecurityRichiesta);
		}
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_SICUREZZA_MESSAGGIO_RICHIESTA, tipoTradottoOpenSPCoop);
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_PROCESSAMENTO_MESSAGE_SECURITY_RISPOSTA).getDato();
		tipoTradottoOpenSPCoop = null;
		String tipoProcessamentoMessageSecurityRisposta = (o!=null ? (String) o : null );
		if(tipoProcessamentoMessageSecurityRisposta!=null && tipoProcessamentoMessageSecurityRisposta.length()>0){
			tipoTradottoOpenSPCoop = buildSicurezzaMessaggio(tipoProcessamentoMessageSecurityRisposta);
		}
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_SICUREZZA_MESSAGGIO_RISPOSTA, tipoTradottoOpenSPCoop);
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.AUTENTICAZIONE_IN_CACHE).getDato();
		String infoAutenticazioneInCache = (o!=null ? (String) o : null );
		if(CostantiMappingDiagnostici.IN_CACHE_TRUE.equals(infoAutenticazioneInCache)) {
			this.esitoAutenticazioneInCache = true;
		}
		else {
			this.esitoAutenticazioneInCache = false;
		}
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.AUTORIZZAZIONE_IN_CACHE).getDato();
		String infoAutorizzazioneInCache = (o!=null ? (String) o : null );
		if(CostantiMappingDiagnostici.IN_CACHE_TRUE.equals(infoAutorizzazioneInCache)) {
			this.esitoAutorizzazioneInCache = true;
		}
		else {
			this.esitoAutorizzazioneInCache = false;
		}
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.AUTORIZZAZIONE_CONTENUTI_IN_CACHE).getDato();
		String infoAutorizzazioneContenutiInCache = (o!=null ? (String) o : null );
		if(CostantiMappingDiagnostici.IN_CACHE_TRUE.equals(infoAutorizzazioneContenutiInCache)) {
			this.esitoAutorizzazioneContenutiInCache = true;
		}
		else {
			this.esitoAutorizzazioneContenutiInCache = false;
		}
		

		o = info.getDato(MappingRicostruzioneDiagnostici.TOKEN_POLICY).getDato();
		String tokenPolicy = (o!=null ? (String) o : null );
		this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_POLICY_GESTIONE, tokenPolicy);
		
		o = info.getDato(MappingRicostruzioneDiagnostici.TOKEN_POLICY_ACTIONS).getDato();
		tipoTradottoOpenSPCoop = null;
		String tokenPolicyActions = (o!=null ? (String) o : null );
		if(tokenPolicyActions!=null && tokenPolicyActions.length()>0){
			tipoTradottoOpenSPCoop = buildTokenPolicyValidationActions(tokenPolicyActions);
		}
		this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_POLICY_AZIONI, tipoTradottoOpenSPCoop);
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.TOKEN_POLICY_AUTENTCAZIONE).getDato();
		tipoTradottoOpenSPCoop = null;
		String tokenPolicyAuthn = (o!=null ? (String) o : null );
		if(tokenPolicyAuthn!=null && tokenPolicyAuthn.length()>0){
			tipoTradottoOpenSPCoop = buildTokenPolicyAuthnActions(tokenPolicyAuthn);
		}
		this.msgDiag.addKeyword(CostantiPdD.KEY_TOKEN_AUTHN_CHECK, tipoTradottoOpenSPCoop);
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_TRASFORMAZIONE_RICHIESTA).getDato();
		tipoTradottoOpenSPCoop = null;
		String tipoTrasformazioneRichiesta = (o!=null ? (String) o : null );
		if(tipoTrasformazioneRichiesta!=null && tipoTrasformazioneRichiesta.length()>0){
			tipoTradottoOpenSPCoop = buildTipoTrasformazione(tipoTrasformazioneRichiesta);
		}
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_TRASFORMAZIONE_RICHIESTA, tipoTradottoOpenSPCoop);
		
		
		o = info.getDato(MappingRicostruzioneDiagnostici.TIPO_TRASFORMAZIONE_RISPOSTA).getDato();
		tipoTradottoOpenSPCoop = null;
		String tipoTrasformazioneRisposta = (o!=null ? (String) o : null );
		if(tipoTrasformazioneRisposta!=null && tipoTrasformazioneRisposta.length()>0){
			tipoTradottoOpenSPCoop = buildTipoTrasformazione(tipoTrasformazioneRisposta);
		}
		this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_TRASFORMAZIONE_RISPOSTA, tipoTradottoOpenSPCoop);
		
		
		AbstractDatoRicostruzione<?> oDatoAutenticazioneTokenInCache = info.getDato(MappingRicostruzioneDiagnostici.AUTENTICAZIONE_TOKEN_IN_CACHE);
		if(oDatoAutenticazioneTokenInCache!=null) {
			o = oDatoAutenticazioneTokenInCache.getDato();
			String infoAutenticazioneTokenInCache = (o!=null ? (String) o : null );
			if(CostantiMappingDiagnostici.IN_CACHE_TRUE.equals(infoAutenticazioneTokenInCache)) {
				this.esitoAutenticazioneTokenInCache = true;
			}
			else {
				this.esitoAutenticazioneTokenInCache = false;
			}
		}else {
			this.esitoAutenticazioneTokenInCache = false;
		}
		
		AbstractDatoRicostruzione<?> oDatoAutenticazioneFallitaMotivazione = info.getDato(MappingRicostruzioneDiagnostici.AUTENTICAZIONE_FALLITA_MOTIVAZIONE);
		if(oDatoAutenticazioneFallitaMotivazione!=null) {
			o = oDatoAutenticazioneFallitaMotivazione.getDato();
			tipoTradottoOpenSPCoop = null;
			String tipoAutenticazioneFallitaMotivazione = (o!=null ? (String) o : null );
			if(tipoAutenticazioneFallitaMotivazione!=null && tipoAutenticazioneFallitaMotivazione.length()>0){
				tipoTradottoOpenSPCoop = buildTipoAutenticazioneFallitaMotivazione(tipoAutenticazioneFallitaMotivazione);
			}
			if(tipoTradottoOpenSPCoop!=null) {
				this.dettaglioAutenticazioneFallita = tipoTradottoOpenSPCoop;
			}		
		}
			
		if(!PddRuolo.DELEGATA.equals(transazioneDTO.getPddRuolo()) &&
				Costanti.MODIPA_PROTOCOL_NAME.equals(protocollo) &&
				CostantiConfigurazione.AUTENTICAZIONE_TOKEN.equals(tipoAutorizzazione)) {
			// casoSpecialeAutorizzazioneTokenModi
			this.msgDiag.addKeyword(CostantiPdD.KEY_SA_FRUITORE_MSG, "");
		}

		
		
		AbstractDatoRicostruzione<?> oDatoModiTokenAuthorizationInCache = info.getDato(MappingRicostruzioneDiagnostici.MODI_TOKEN_AUTHORIZATION_IN_CACHE);
		if(oDatoModiTokenAuthorizationInCache!=null) {
			o = oDatoModiTokenAuthorizationInCache.getDato();
			String infoInCache = (o!=null ? (String) o : null );
			if(CostantiMappingDiagnostici.IN_CACHE_TRUE.equals(infoInCache)) {
				this.esitoModiTokenAuthorizationInCache = true;
			}
			else {
				this.esitoModiTokenAuthorizationInCache = false;
			}
		}else {
			this.esitoModiTokenAuthorizationInCache = false;
		}
		
		
		AbstractDatoRicostruzione<?> oDatoModiTokenIntegrityInCache = info.getDato(MappingRicostruzioneDiagnostici.MODI_TOKEN_INTEGRITY_IN_CACHE);
		if(oDatoModiTokenIntegrityInCache!=null) {
			o = oDatoModiTokenIntegrityInCache.getDato();
			String infoInCache = (o!=null ? (String) o : null );
			if(CostantiMappingDiagnostici.IN_CACHE_TRUE.equals(infoInCache)) {
				this.esitoModiTokenIntegrityInCache = true;
			}
			else {
				this.esitoModiTokenIntegrityInCache = false;
			}
		}else {
			this.esitoModiTokenIntegrityInCache = false;
		}
		
		AbstractDatoRicostruzione<?> oDatoModiTokenAuditInCache = info.getDato(MappingRicostruzioneDiagnostici.MODI_TOKEN_AUDIT_IN_CACHE);
		if(oDatoModiTokenAuditInCache!=null) {
			o = oDatoModiTokenAuditInCache.getDato();
			String infoInCache = (o!=null ? (String) o : null );
			if(CostantiMappingDiagnostici.IN_CACHE_TRUE.equals(infoInCache)) {
				this.esitoModiTokenAuditInCache = true;
			}
			else {
				this.esitoModiTokenAuditInCache = false;
			}
		}else {
			this.esitoModiTokenAuditInCache = false;
		}
		
		
		
		if(info.sizeMetaDati()>=CostantiMappingDiagnostici.LENGHT_DATI_SIMULATI_VERSIONE_ATTUALE){
			
			// altri...
			
		}
		
	}

	private String normalizeCredenziali(String credenziali, boolean addParentesi, boolean addFinalSpace) {
		String newC = credenziali + "";
		try {
			if(newC.endsWith(" ")){
				newC = newC.substring(0,newC.length()-1);
			}
			if(newC.contains("SSL-Issuer ")) {
				newC = newC.substring(0,newC.indexOf("SSL-Issuer "));
				while(newC.endsWith(" ") || newC.endsWith("\n")) {
					newC = newC.substring(0,newC.length()-1);
				}
			}
			String c = null;
			if(addParentesi) {
				c = "( "+newC+" )";
			}
			else {
				c= newC;
			}
			if(addFinalSpace) {
				c = c + " ";
			}
			return c;
		}catch(Exception e) {
			String msgError = "Interpretazione credenziali '"+credenziali+"' non riuscita: ("+newC+") "+e.getMessage();
			LoggerWrapperFactory.getLogger(ConvertitoreCodiceDiagnostici.class).error(msgError, e);
			return credenziali;
		}
	}
	
	private String buildSicurezzaMessaggio(String tmp){
		
		StringBuilder tipoTradottoOpenSPCoop = new StringBuilder();
		
		char engine = tmp.charAt(0);
		addSicurezzaMessaggioEngine(engine,  tipoTradottoOpenSPCoop);
		
		tipoTradottoOpenSPCoop.append(SecurityConstants.TIPO_SECURITY_ENGINE_SEPARATOR);
		
		for (int i = 1; i < tmp.length(); i++) {
		
			String actionCode = tmp.charAt(i)+"";
			for (String keySecurity : CostantiMappingDiagnostici.getMapSecurityAction().keySet()) {
				String actionSecurityCode = CostantiMappingDiagnostici.getMapSecurityAction().get(keySecurity);
				if(actionSecurityCode.equals(actionCode)){
					if(i>1){
						tipoTradottoOpenSPCoop.append(SecurityConstants.TIPO_SECURITY_ACTION_SEPARATOR);
					}
					tipoTradottoOpenSPCoop.append(keySecurity);
					break;
				}
			}
			
		}
		
		if(tipoTradottoOpenSPCoop.length()>0) {
			return tipoTradottoOpenSPCoop.toString();
		}
		return null;
	}
	private void addSicurezzaMessaggioEngine(char engine, StringBuilder tipoTradottoOpenSPCoop) {
		if(CostantiMappingDiagnostici.TIPO_SECURITY_ENGINE_WSS4J == engine){
			tipoTradottoOpenSPCoop.append(SecurityConstants.SECURITY_ENGINE_WSS4J);
		}
		else if(CostantiMappingDiagnostici.TIPO_SECURITY_ENGINE_SOAPBOX == engine){
			tipoTradottoOpenSPCoop.append(SecurityConstants.SECURITY_ENGINE_SOAPBOX);
		}
		else if(CostantiMappingDiagnostici.TIPO_SECURITY_ENGINE_DSS == engine){
			tipoTradottoOpenSPCoop.append(SecurityConstants.SECURITY_ENGINE_DSS);
		}
		else if(CostantiMappingDiagnostici.TIPO_SECURITY_ENGINE_JOSE == engine){
			tipoTradottoOpenSPCoop.append(SecurityConstants.SECURITY_ENGINE_JOSE);
		}
		else if(CostantiMappingDiagnostici.TIPO_SECURITY_ENGINE_XML == engine){
			tipoTradottoOpenSPCoop.append(SecurityConstants.SECURITY_ENGINE_XML);
		}
	}
	
	private String buildTokenPolicyValidationActions(String tmp) {
		
		PolicyGestioneToken pgt = new PolicyGestioneToken();
		
		if(tmp.length()==1 && (CostantiMappingDiagnostici.GESTIONE_TOKEN_VALIDATION_ACTION_NONE+"").equals(tmp)) {
			return pgt.getLabelAzioniGestioneToken();
		}
		
		for (int i = 0; i < tmp.length(); i++) {
			
			String actionCode = tmp.charAt(i)+"";
			if((CostantiMappingDiagnostici.GESTIONE_TOKEN_VALIDATION_ACTION_JWT+"").equals(actionCode)) {
				pgt.setValidazioneJWT(true);
			}
			else if((CostantiMappingDiagnostici.GESTIONE_TOKEN_VALIDATION_ACTION_INTROSPECTION+"").equals(actionCode)) {
				pgt.setIntrospection(true);
			}
			else if((CostantiMappingDiagnostici.GESTIONE_TOKEN_VALIDATION_ACTION_USER_INFO+"").equals(actionCode)) {
				pgt.setUserInfo(true);
			}
			
		}
		
		return pgt.getLabelAzioniGestioneToken();
		
	}
	
	private String buildTokenPolicyAuthnActions(String tmp) {
		
		GestioneTokenAutenticazione gestore = new GestioneTokenAutenticazione();
		
		for (int i = 0; i < tmp.length(); i++) {
			
			String actionCode = tmp.charAt(i)+"";
			if((CostantiMappingDiagnostici.AUTENTICAZIONE_TOKEN_ISSUER+"").equals(actionCode)) {
				gestore.setIssuer(StatoFunzionalita.ABILITATO);
			}
			else if((CostantiMappingDiagnostici.AUTENTICAZIONE_TOKEN_SUBJECT+"").equals(actionCode)) {
				gestore.setSubject(StatoFunzionalita.ABILITATO);
			}
			else if((CostantiMappingDiagnostici.AUTENTICAZIONE_TOKEN_CLIENTID+"").equals(actionCode)) {
				gestore.setClientId(StatoFunzionalita.ABILITATO);
			}
			else if((CostantiMappingDiagnostici.AUTENTICAZIONE_TOKEN_USERNAME+"").equals(actionCode)) {
				gestore.setUsername(StatoFunzionalita.ABILITATO);
			}
			else if((CostantiMappingDiagnostici.AUTENTICAZIONE_TOKEN_EMAIL+"").equals(actionCode)) {
				gestore.setEmail(StatoFunzionalita.ABILITATO);
			}
			
		}
		
		return GestoreAutenticazione.getLabel(gestore);
		
	}
	
	private String buildTipoTrasformazione(String tmp) {
		
		if(CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_NESSUNA.equals(tmp)){
			return GestoreTrasformazioniUtilities.TIPO_TRASFORMAZIONE_NESSUNA;
		}
		
		StringBuilder bf = new StringBuilder();
		
		for (int i = 0; i < tmp.length(); i++) {
			
			if(i>0) {
				bf.append(GestoreTrasformazioniUtilities.TIPO_TRASFORMAZIONE_SEPARATOR);
			}
			
			String actionCode = tmp.charAt(i)+"";
			addTipoTrasformazioneAction(actionCode, bf);
			
		}
		
		if(bf.length()>0) {
			return bf.toString();
		}
		
		return null;
		
	}
	private void addTipoTrasformazioneAction(String actionCode, StringBuilder bf) {
		if((CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_CONVERSIONE_SOAP+"").equals(actionCode)) {
			bf.append(GestoreTrasformazioniUtilities.TIPO_TRASFORMAZIONE_CONVERSIONE_SOAP);
		}
		else if((CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_CONVERSIONE_REST+"").equals(actionCode)) {
			bf.append(GestoreTrasformazioniUtilities.TIPO_TRASFORMAZIONE_CONVERSIONE_REST);
		}
		else if((CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_CONVERSIONE_METHOD+"").equals(actionCode)) {
			bf.append(GestoreTrasformazioniUtilities.TIPO_TRASFORMAZIONE_CONVERSIONE_METHOD);
		}
		else if((CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_CONVERSIONE_PATH+"").equals(actionCode)) {
			bf.append(GestoreTrasformazioniUtilities.TIPO_TRASFORMAZIONE_CONVERSIONE_PATH);
		}
		else if((CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_CONVERSIONE_HEADERS+"").equals(actionCode)) {
			bf.append(GestoreTrasformazioniUtilities.TIPO_TRASFORMAZIONE_CONVERSIONE_HEADERS);
		}
		else if((CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_CONVERSIONE_QUERY_PARAMETERS+"").equals(actionCode)) {
			bf.append(GestoreTrasformazioniUtilities.TIPO_TRASFORMAZIONE_CONVERSIONE_QUERY_PARAMETERS);
		}
		else if((CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_CONVERSIONE_RETURN_CODE+"").equals(actionCode)) {
			bf.append(GestoreTrasformazioniUtilities.TIPO_TRASFORMAZIONE_CONVERSIONE_RETURN_CODE);
		}
		else if((CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_NESSUNA+"").equals(actionCode)) {
			bf.append(GestoreTrasformazioniUtilities.TIPO_TRASFORMAZIONE_NESSUNA);
		}
		else {
			for (String keySecurity : CostantiMappingDiagnostici.getMapTipiConversione().keySet()) {
				String actionSecurityCode = CostantiMappingDiagnostici.getMapTipiConversione().get(keySecurity);
				if(actionSecurityCode.equals(actionCode)){
					bf.append(keySecurity);
					break;
				}
			}
		}
	}
	
	private String buildTipoAutenticazioneFallitaMotivazione(String tmp) {
		
		if(CostantiMappingDiagnostici.TIPO_AUTENTICAZIONE_FALLITA_MOTIVAZIONE_CREDENZIALI_NON_FORNITE.equals(tmp)){
			return CostantiProtocollo.CREDENZIALI_NON_FORNITE;
		}
		else if(CostantiMappingDiagnostici.TIPO_AUTENTICAZIONE_FALLITA_MOTIVAZIONE_CREDENZIALI_FORNITE_NON_CORRETE.equals(tmp)){
			return CostantiProtocollo.CREDENZIALI_FORNITE_NON_CORRETTE;
		}
				
		return null;
		
	}
	
	private void buildFaultInfo(Logger log) throws Exception {
		
		buildFaultInfoIntegrazione(log);
		
		buildFaultInfoCooperazione(log);
		
	}
	private void buildFaultInfoIntegrazione(Logger log) throws Exception {
		if(this.mFaultRicostruitoIntegrazione==null &&
				this.transazioneDTO.getFaultIntegrazione()!=null && 
				!"".equals(this.transazioneDTO.getFaultIntegrazione())){
			if(StringUtils.isNotEmpty(this.transazioneDTO.getFormatoFaultIntegrazione())){
				MessageType msgType = MessageType.valueOf(this.transazioneDTO.getFormatoFaultIntegrazione());
				OpenSPCoop2MessageParseResult parseResult = OpenSPCoop2MessageFactory.getDefaultMessageFactory().createMessage(msgType, MessageRole.FAULT, 
						MessageUtilities.getDefaultContentType(msgType),this.transazioneDTO.getFaultIntegrazione().getBytes()); 
				this.mFaultRicostruitoIntegrazione = parseResult.getMessage_throwParseException();
			}
			buildFaultInfoIntegrazioneDetails(log);
		}
	}
	private void buildFaultInfoIntegrazioneDetails(Logger log) throws MessageException, MessageNotSupportedException {
		if(this.mFaultRicostruitoIntegrazione!=null) {
			if(ServiceBinding.SOAP.equals(this.mFaultRicostruitoIntegrazione.getServiceBinding())) {
				OpenSPCoop2SoapMessage soapMsg = this.mFaultRicostruitoIntegrazione.castAsSoap();
				if(soapMsg.getSOAPBody()!=null && soapMsg.getSOAPBody().hasFault()){
					this.mFaultRicostruitoIntegrazioneDescrizioneWithDetails = SoapUtils.safe_toString(soapMsg.getFactory(), soapMsg.getSOAPBody().getFault(), log);
					this.mFaultRicostruitoIntegrazioneDescrizioneWithoutDetails = SoapUtils.safe_toString(soapMsg.getFactory(), soapMsg.getSOAPBody().getFault(), false, log);
				}
			}
			else {
				OpenSPCoop2RestMessage<?> restMsg = this.mFaultRicostruitoIntegrazione.castAsRest();
				if(restMsg.isFault()){
					this.mFaultRicostruitoIntegrazioneDescrizioneWithDetails = restMsg.getContentAsString();
					this.mFaultRicostruitoIntegrazioneDescrizioneWithoutDetails = restMsg.getContentAsString();
				}
			}
		}
	}
	private void buildFaultInfoCooperazione(Logger log) throws Exception {
		if(this.mFaultRicostruitoCooperazione==null &&
				this.transazioneDTO.getFaultCooperazione()!=null && 
				!"".equals(this.transazioneDTO.getFaultCooperazione())){
			if(StringUtils.isNotEmpty(this.transazioneDTO.getFormatoFaultCooperazione())){
				MessageType msgType = MessageType.valueOf(this.transazioneDTO.getFormatoFaultCooperazione());
				OpenSPCoop2MessageParseResult parseResult = OpenSPCoop2MessageFactory.getDefaultMessageFactory().createMessage(msgType, MessageRole.FAULT, 
						MessageUtilities.getDefaultContentType(msgType),this.transazioneDTO.getFaultCooperazione().getBytes()); 
				this.mFaultRicostruitoCooperazione = parseResult.getMessage_throwParseException();
			}
			buildFaultInfoCooperazioneDetails(log);
		}
	}
	private void buildFaultInfoCooperazioneDetails(Logger log) throws MessageException, MessageNotSupportedException {
		if(this.mFaultRicostruitoCooperazione!=null) {
			if(ServiceBinding.SOAP.equals(this.mFaultRicostruitoCooperazione.getServiceBinding())) {
				OpenSPCoop2SoapMessage soapMsg = this.mFaultRicostruitoCooperazione.castAsSoap();
				if(soapMsg.getSOAPBody()!=null && soapMsg.getSOAPBody().hasFault()){
					this.mFaultRicostruitoCooperazioneDescrizioneWithDetails = SoapUtils.safe_toString(soapMsg.getFactory(), soapMsg.getSOAPBody().getFault(), log);
					this.mFaultRicostruitoCooperazioneDescrizioneWithoutDetails = SoapUtils.safe_toString(soapMsg.getFactory(), soapMsg.getSOAPBody().getFault(), false, log);
				}
			}
			else {
				OpenSPCoop2RestMessage<?> restMsg = this.mFaultRicostruitoCooperazione.castAsRest();
				if(restMsg.isFault()){
					this.mFaultRicostruitoCooperazioneDescrizioneWithDetails = restMsg.getContentAsString();
					this.mFaultRicostruitoCooperazioneDescrizioneWithoutDetails = restMsg.getContentAsString();
				}
			}
		}
	}
	
	protected void buildFault(Logger log, String codice, String codiceModulo) throws Exception{
		
		if(codice!=null) {
			// nop
		}
		
		this.msgDiag.getKeywordLogPersonalizzati().remove(CostantiPdD.KEY_SOAP_FAULT);
		this.msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, "");
		
		if(this.codiciModuliSimulabiliIntegrazione.contains(codiceModulo)){
			buildFaultInfo(log);
			// aggiorno key soap fault per il diagnostico in questione
			if(this.mFaultRicostruitoIntegrazioneDescrizioneWithDetails!=null){
				this.msgDiag.getKeywordLogPersonalizzati().remove(CostantiPdD.KEY_SOAP_FAULT);
				this.msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, this.mFaultRicostruitoIntegrazioneDescrizioneWithDetails);
			}
		}
		else if(this.codiciModuliSimulabiliCooperazione.contains(codiceModulo)){
			buildFaultInfo(log);
			// aggiorno key soap fault per il diagnostico in questione
			if(this.mFaultRicostruitoCooperazioneDescrizioneWithDetails!=null){
				this.msgDiag.getKeywordLogPersonalizzati().remove(CostantiPdD.KEY_SOAP_FAULT);
				this.msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, this.mFaultRicostruitoCooperazioneDescrizioneWithDetails);
			}
		}
	}
	
	protected void buildContextForSingleMsgDiagnostico(String codice, String codiceModulo, 
			boolean dynamic, String dynamicType, String dynamicValue, Logger log) throws Exception{
				
		
		if(codice.equals("001013") || codice.equals("001056") || codice.equals("001058") || 
				codice.equals(RICEZIONE_BUSTE_AUTENTICAZIONE_EFFETTUATA_CODICE) || codice.equals(RICEZIONE_BUSTE_AUTENTICAZIONE_FALLITA_CODICE) || codice.equals(RICEZIONE_BUSTE_AUTENTICAZIONE_FALLITA_OPZIONALE_CODICE)) { 
			PdDContext pddContextDevNull = new PdDContext();
			CostantiPdD.addKeywordInCache(this.msgDiag, this.esitoAutenticazioneInCache, pddContextDevNull, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_AUTENTICAZIONE);
		}
		else if(codice.equals("001015") || codice.equals("001045") ||
				codice.equals(RICEZIONE_BUSTE_AUTORIZZAZIONE_BUSTE_EFFETTUATA_CODICE) || codice.equals("004005")) { 
			PdDContext pddContextDevNull = new PdDContext();
			CostantiPdD.addKeywordInCache(this.msgDiag, this.esitoAutorizzazioneInCache, pddContextDevNull, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_AUTORIZZAZIONE);
		}
		else if(codice.equals("001016") || codice.equals("001048") ||
				codice.equals("004045") || codice.equals("004046")) {
			PdDContext pddContextDevNull = new PdDContext();
			CostantiPdD.addKeywordInCache(this.msgDiag, this.esitoAutorizzazioneContenutiInCache, pddContextDevNull, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_AUTORIZZAZIONE_CONTENUTI);
		}
		else if(codice.equals("001126") || codice.equals("001127") || codice.equals("001128") || 
				codice.equals("004149") || codice.equals("004150") || codice.equals("004151")) { 
			PdDContext pddContextDevNull = new PdDContext();
			CostantiPdD.addKeywordInCache(this.msgDiag, this.esitoAutenticazioneTokenInCache, pddContextDevNull, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_AUTENTICAZIONE_TOKEN);
		}
		else if(codice.equals("001133") || codice.equals("004159") ) { 
			PdDContext pddContextDevNull = new PdDContext();
			CostantiPdD.addKeywordInCache(this.msgDiag, this.esitoModiTokenAuthorizationInCache, pddContextDevNull, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_MODI_TOKEN_AUTHORIZATION);
		}
		else if(codice.equals("001139") || codice.equals("004165") ) { 
			PdDContext pddContextDevNull = new PdDContext();
			CostantiPdD.addKeywordInCache(this.msgDiag, this.esitoModiTokenIntegrityInCache, pddContextDevNull, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_MODI_TOKEN_INTEGRITY);
		}
		else if(codice.equals("001145") ) { 
			PdDContext pddContextDevNull = new PdDContext();
			CostantiPdD.addKeywordInCache(this.msgDiag, this.esitoModiTokenAuditInCache, pddContextDevNull, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_MODI_TOKEN_AUDIT);
		}
		
		if(
			(codice.equals("001058") || codice.equals(RICEZIONE_BUSTE_AUTENTICAZIONE_FALLITA_OPZIONALE_CODICE) )
			&& 
			(this.dettaglioAutenticazioneFallita!=null) 
			){
			PdDContext pddContextDevNull = new PdDContext();
			CostantiPdD.addKeywordAutenticazioneFallita(this.msgDiag, this.dettaglioAutenticazioneFallita, pddContextDevNull, CostantiPdD.KEY_INFO_IN_CACHE_FUNZIONE_AUTENTICAZIONE_FALLITA);
		}
		
		if(
			(codice.equals("003007") || codice.equals("007012") || codice.equals("007028")) 
				&&
			(this.rispostaLettaDallaCache) 
			){
			this.msgDiag.addKeyword(CostantiPdD.KEY_LOCATION, ConnettoreBase.LOCATION_CACHED);
		}
		
		/*
		 * Il messaggio contiene solo i singoli dettagli del soapFault.
		 * es. Risposta applicativa (SOAPFault faultCode[ns0:Server.OpenSPCoopExampleFault] faultActor[OpenSPCoopTrace] faultString[Fault ritornato dalla servlet di trace, esempio di OpenSPCoop]) consegnata al servizio applicativo con codice di trasporto ...
		 */
		if(codice.equals(RICEZIONE_CONTENUTI_APPLICATIVI_CONSEGNA_RISPOSTA_APPLICATIVA_OK_CODICE) || codice.equals(RICEZIONE_CONTENUTI_APPLICATIVI_CONSEGNA_RISPOSTA_APPLICATIVA_KO_CODICE) || codice.equals("001008") || codice.equals("001031") || codice.equals("001033") ){
			buildFaultInfo(log);
			if(this.mFaultRicostruitoIntegrazioneDescrizioneWithoutDetails!=null) {
				String descrizioneSoapFault = " ("+this.mFaultRicostruitoIntegrazioneDescrizioneWithoutDetails+")";
				this.msgDiag.getKeywordLogPersonalizzati().remove(CostantiPdD.KEY_SOAP_FAULT);
				this.msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, descrizioneSoapFault);
			}
		}
		if(codice.equals("004011") || codice.equals("004012") || codice.equals("004014")){
			buildFaultInfo(log);
			if(this.mFaultRicostruitoCooperazioneDescrizioneWithoutDetails!=null){
				String descrizioneSoapFault = " ("+this.mFaultRicostruitoCooperazioneDescrizioneWithoutDetails+")";
				this.msgDiag.getKeywordLogPersonalizzati().remove(CostantiPdD.KEY_SOAP_FAULT);
				this.msgDiag.addKeyword(CostantiPdD.KEY_SOAP_FAULT, descrizioneSoapFault);
			}
		}
		
		if(codice.equals("003024") ){
			buildFaultInfo(log);
			if(this.mFaultRicostruitoCooperazione!=null){
				this.msgDiag.addKeyword(CostantiPdD.KEY_DETAILS_VALIDAZIONE_CONTENUTI,CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_VALIDAZIONE_SOAP_FAULT_PRESENTE);
			}
			else{
				if(this.msgDiag.getKeywordLogPersonalizzati().containsKey(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO)){
					String v = this.msgDiag.getKeywordLogPersonalizzati().get(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO);
					if(Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(v)){
						this.msgDiag.addKeyword(CostantiPdD.KEY_DETAILS_VALIDAZIONE_CONTENUTI,CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_VALIDAZIONE_SOAP_BODY_NON_PRESENTE);
					}
				}
			}
		}
		if(codice.equals("007024") ){
			buildFaultInfo(log);
			if(this.mFaultRicostruitoIntegrazione!=null){
				this.msgDiag.addKeyword(CostantiPdD.KEY_DETAILS_VALIDAZIONE_CONTENUTI,CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_VALIDAZIONE_SOAP_FAULT_PRESENTE);
			}
			else{
				if(this.msgDiag.getKeywordLogPersonalizzati().containsKey(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO)){
					String v = this.msgDiag.getKeywordLogPersonalizzati().get(CostantiPdD.KEY_SCENARIO_COOPERAZIONE_GESTITO);
					if(Costanti.SCENARIO_ONEWAY_INVOCAZIONE_SERVIZIO.equals(v)){
						this.msgDiag.addKeyword(CostantiPdD.KEY_DETAILS_VALIDAZIONE_CONTENUTI,CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_VALIDAZIONE_SOAP_BODY_NON_PRESENTE);
					}
				}
			}
		}
		
		/*
		 * Il messaggi che indica l'utilizzo della funzionalita' di LocalForward richiede il nome della PA
		 * Tale nome non e' conosciuto nel contesto di PortaDelegata delle Transazione.
		 * Comunque non aggiunge una informazione importante, potendo essere recuperata dai dati sul servizio e azione invocata
		 **/
		if(codice.equals(RICEZIONE_CONTENUTI_APPLICATIVI_LOCAL_FORWARD_LOGINFO_CODICE)){
			this.msgDiag.addKeyword(CostantiPdD.KEY_PORTA_APPLICATIVA, "");
		}
		
		// autenticazione dei soggetti su PA
		String credenziali = this.msgDiag.getKeywordLogPersonalizzati().get(CostantiPdD.KEY_CREDENZIALI);
		if(codice.equals(RICEZIONE_BUSTE_AUTENTICAZIONE_IN_CORSO_CODICE) || //ricezioneBuste.autenticazioneInCorso
				codice.equals(RICEZIONE_BUSTE_AUTENTICAZIONE_EFFETTUATA_CODICE) || //ricezioneBuste.autenticazioneEffettuata
				codice.equals(RICEZIONE_BUSTE_AUTENTICAZIONE_FALLITA_CODICE) || //ricezioneBuste.autenticazioneFallita
				codice.equals(RICEZIONE_BUSTE_AUTENTICAZIONE_FALLITA_OPZIONALE_CODICE)  //ricezioneBuste.autenticazioneFallita.opzionale
				) {
			if(credenziali!=null && !"".equals(credenziali)) {
				this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_MITTENTE_MSG, credenziali);
			}
			else{
				this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_MITTENTE_MSG, "");
			}
		}
		else {
			if(credenziali!=null && !"".equals(credenziali)) {
				this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_MITTENTE_MSG, " credenzialiMittente "+credenziali);
			}
			else{
				this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_MITTENTE_MSG, "");
			}
		}
		
		if(codice.equals(RICEZIONE_BUSTE_AUTENTICAZIONE_EFFETTUATA_CODICE)){
			this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_MITTENTE_MSG, ""); // per evitare di visualizzarle anche nei successivi diagnostici
			this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI, "");
		}
		else if(codice.equals("001056")){
			this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_SA_FRUITORE, ""); // per evitare di visualizzarle anche nei successivi diagnostici
		}
		
		// Le credenziali del servizio applicativo non vengono più visualizzate se è stata effettuata l'autenticazione
		// Questo processo avviene dal diagnosticio con codice 001003 in poi sulla porta delegata
		if(codice.equals("001003")){
			String autenticazione = this.msgDiag.getKeywordLogPersonalizzati().get(CostantiPdD.KEY_TIPO_AUTENTICAZIONE);
			if(autenticazione!=null && !"".equals(autenticazione) && !"-".equals(autenticazione) && !"none".equals(autenticazione)) {
				// in caso di autenticazione effettuata questo diagnostico non contiene le credenziali
				this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_SA_FRUITORE, "");
			}
		}
		
		// Le credenziali del soggetto non vengono più visualizzate se è stata effettuata l'autenticazione
		// Questo processo avviene dal diagnosticio con codice 004001 in poi sulla porta applicativa
		if(codice.equals("004001")){
			String autenticazione = this.msgDiag.getKeywordLogPersonalizzati().get(CostantiPdD.KEY_TIPO_AUTENTICAZIONE);
			if(autenticazione!=null && !"".equals(autenticazione) && !"-".equals(autenticazione) && !"none".equals(autenticazione)) {
				// in caso di autenticazione effettuata questo diagnostico non contiene le credenziali
				this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI, "");
				this.msgDiag.addKeyword(CostantiPdD.KEY_CREDENZIALI_MITTENTE_MSG, "");
			}
		}
			
		String codiceConsegnaRichiesta = null;
		String codiceConsegnaRisposta = null;
		if( RICEZIONE_CONTENUTI_APPLICATIVI_CODICE_MODULO.equals(codiceModulo)  // ricezioneContenutiApplicativi
				||
				RICEZIONE_BUSTE_CODICE_MODULO.equals(codiceModulo)  // ricezioneBuste
				
				){
			Object o = this.info.getDato(MappingRicostruzioneDiagnostici.CODICE_TRASPORTO_RISPOSTA).getDato();
			codiceConsegnaRisposta = (o!=null ? (String) o : null );
			this.msgDiag.addKeyword(CostantiPdD.KEY_CODICE_CONSEGNA, codiceConsegnaRisposta);
		}
		else if (INOLTRO_BUSTE_CODICE_MODULO.equals(codiceModulo)  // inoltroBuste
				||
				CONSEGNA_CONTENUTI_APPLICATIVI_CODICE_MODULO.equals(codiceModulo)  // consegnaContenutiApplicativi
				){
			Object o = this.info.getDato(MappingRicostruzioneDiagnostici.CODICE_TRASPORTO_RICHIESTA).getDato();
			codiceConsegnaRichiesta = (o!=null ? (String) o : null );
			this.msgDiag.addKeyword(CostantiPdD.KEY_CODICE_CONSEGNA, codiceConsegnaRichiesta);
			
			String erroreConsegna = "errore di trasporto, codice "+codiceConsegnaRichiesta;
			if(this.mFaultRicostruitoCooperazione!=null || this.mFaultRicostruitoIntegrazione!=null){
				
				boolean faultProtocollo = false;
				if(codice.equals(INOLTRO_BUSTE_INOLTRO_CON_ERRORE_CODICE)){
					try{
						EsitoTransazioneName name = EsitoTransazioneName.convertoTo(EsitiProperties.getInstanceFromProtocolName(log, this.transazioneDTO.getProtocollo()).getEsitoName(this.transazioneDTO.getEsito()));
						if(EsitoTransazioneName.ERRORE_PROTOCOLLO.equals(name)){
							faultProtocollo = true;
						}
					}catch(Exception e){
						log.error("Errore durante la comprensione dell'esito ["+this.transazioneDTO.getEsito()+"]: "+e.getMessage(),e);
					}
				}
				
				if(faultProtocollo){
					
					boolean set = false;
					OpenSPCoop2Message msg = null;
					if(INOLTRO_BUSTE_CODICE_MODULO.equals(codiceModulo)){
						msg = this.mFaultRicostruitoCooperazione;
					}
					else if(CONSEGNA_CONTENUTI_APPLICATIVI_CODICE_MODULO.equals(codiceModulo)){
						msg = this.mFaultRicostruitoIntegrazione;
					}
					if(msg!=null && ServiceBinding.SOAP.equals(msg.getServiceBinding())){
						SOAPFault soapFault = null;
						if(msg.castAsSoap().getSOAPBody()!=null){
							soapFault = msg.castAsSoap().getSOAPBody().getFault();
						}
						if(soapFault!=null && soapFault.getFaultString()!=null){
							if( soapFault.getFaultString().equals(this.protocolFactory.createTraduttore().toString(MessaggiFaultErroreCooperazione.FAULT_STRING_VALIDAZIONE)) ){
								set = true;
								erroreConsegna = soapFault.getFaultString();
								this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_MESSAGGIO_BUSTA_ERRORE, CostantiPdD.TIPO_MESSAGGIO_BUSTA_ERRORE_INTESTAZIONE);
							}
							else if( soapFault.getFaultString().equals(this.protocolFactory.createTraduttore().toString(MessaggiFaultErroreCooperazione.FAULT_STRING_PROCESSAMENTO)) ){
								set = true;
								erroreConsegna = soapFault.getFaultString();
								this.msgDiag.addKeyword(CostantiPdD.KEY_TIPO_MESSAGGIO_BUSTA_ERRORE, CostantiPdD.TIPO_MESSAGGIO_BUSTA_ERRORE_PROCESSAMENTO);
							}
						}
						
						if(set){
							// abbiamo un soap fault. Controllo il detail per i successivi diagnostici
							DettaglioEccezione dettaglioEccezione = XMLUtils.getDettaglioEccezione(log,msg);
							if(dettaglioEccezione!=null){
								this.msgDiag.addKeyword(CostantiPdD.KEY_OPENSPCOOP2_DETAILS, XMLUtils.toString(dettaglioEccezione));
							}
						}
					}
					if(!set){
						if(INOLTRO_BUSTE_CODICE_MODULO.equals(codiceModulo) && this.mFaultRicostruitoCooperazioneDescrizioneWithDetails!=null){
							erroreConsegna = erroreConsegna + " (" +this.mFaultRicostruitoCooperazioneDescrizioneWithDetails+ ")";
						}
						if(CONSEGNA_CONTENUTI_APPLICATIVI_CODICE_MODULO.equals(codiceModulo) && this.mFaultRicostruitoIntegrazioneDescrizioneWithDetails!=null){
							erroreConsegna = erroreConsegna + " (" +this.mFaultRicostruitoIntegrazioneDescrizioneWithDetails+ ")";
						}
					}
				}
				else{
					if(INOLTRO_BUSTE_CODICE_MODULO.equals(codiceModulo) && this.mFaultRicostruitoCooperazioneDescrizioneWithDetails!=null){
						erroreConsegna = erroreConsegna + " (" +this.mFaultRicostruitoCooperazioneDescrizioneWithDetails+ ")";
					}
					if(CONSEGNA_CONTENUTI_APPLICATIVI_CODICE_MODULO.equals(codiceModulo) && this.mFaultRicostruitoIntegrazioneDescrizioneWithDetails!=null){
						erroreConsegna = erroreConsegna + " (" +this.mFaultRicostruitoIntegrazioneDescrizioneWithDetails+ ")";
					}
				}
			}
			this.msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_CONSEGNA, erroreConsegna);
		}
		else{
			this.msgDiag.addKeyword(CostantiPdD.KEY_CODICE_CONSEGNA, null);
		}
		
		if(dynamic){
			DynamicExtendedInfoDiagnosticoType type = DynamicExtendedInfoDiagnosticoType.getEnum(dynamicType);
			switch (type) {
			case NON_RICOSTRUIBILE:
				// nop
				break;
			case POLICY_CONTROLLO_TRAFFICO:
				Map<String, String> map = DynamicExtendedInfoDiagnosticoControlloTraffico.convertToProperties(dynamicValue);
				if(map!=null && map.size()>0){
					this.msgDiag.getKeywordLogPersonalizzati().putAll(map);
				}
				break;
			default:
				break;
			}
		}
	}
	
	
	

	
	// ***************** BUILD FROM DATI SIMULATI ********************
	
	public List<MsgDiagnostico> build(Logger log) throws UtilsException{
		
		List<MsgDiagnostico> msgDiagnosticiNormali = new ArrayList<>();
		if(this.info.getDiagnostici()!=null && !this.info.getDiagnostici().isEmpty()){
			for (InfoDiagnostico infoMsgDiag : this.info.getDiagnostici()) {
				
				MsgDiagnostico m = new MsgDiagnostico();
				
				String codice = infoMsgDiag.getCode();
				String codiceModulo = codice.substring(0, 3);
				
				try{
					this.buildFault(log, codice, codiceModulo);
					this.buildContextForSingleMsgDiagnostico(codice,codiceModulo,false,
							null,null,
							log);
				}catch(Throwable t){
					throw new UtilsException("build context error: "+t.getMessage(),t);
				}
				
				this.setDatiEngine(m, codice, codiceModulo, infoMsgDiag, null);
				
				msgDiagnosticiNormali.add(m);
			}
		}
		
		if(this.info.getDiagnosticiExt()!=null && !this.info.getDiagnosticiExt().isEmpty()){
			List<MsgDiagnostico> msgDiagnosticiCompleted = new ArrayList<>();
			
			List<String> positions = new ArrayList<>();
			Map<String, InfoDiagnostico> mapPositionToInfoDiagnostico = new HashMap<>();
			Map<String, DynamicExtendedInfoDiagnostico> mapPositionToDynamicExtendedInfoDiagnostico = new HashMap<>();
			
			// nota: devo ordinarli per position, poichè vengono serializzati prima i diag ext di un tipo, poi di un altro.
			// esempio prima i CT (controlloTraffico) poi quelli non ricostruibili
			
			for (int i = 0; i < this.info.getDiagnosticiExt().size(); i++) {
				
				InfoDiagnostico infoMsgDiag = this.info.getDiagnosticiExt().get(i);
				DynamicExtendedInfoDiagnostico d = this.info.getDatiExt().get(i);
				
				String keyPosition = null;
				if(d.getDiagnosticPosition()<10){
					keyPosition = "000"+d.getDiagnosticPosition();
				}
				else if(d.getDiagnosticPosition()<100){
					keyPosition = "00"+d.getDiagnosticPosition();
				}
				else if(d.getDiagnosticPosition()<1000){
					keyPosition = "0"+d.getDiagnosticPosition();
				}
				else{
					keyPosition = ""+d.getDiagnosticPosition();
				}
				
				positions.add(keyPosition);
				mapPositionToInfoDiagnostico.put(keyPosition, infoMsgDiag);
				mapPositionToDynamicExtendedInfoDiagnostico.put(keyPosition, d);
				
			}
			
			Collections.sort(positions);
			
			for (int i = 0; i < positions.size(); i++) {
			
				String keyPosition = positions.get(i);
				InfoDiagnostico infoMsgDiag = mapPositionToInfoDiagnostico.remove(keyPosition);
				DynamicExtendedInfoDiagnostico d = mapPositionToDynamicExtendedInfoDiagnostico.remove(keyPosition);
				
				MsgDiagnostico m = new MsgDiagnostico();
				
				String codice = infoMsgDiag.getCode();
				String codiceModulo = codice.substring(0, 3);
				
				try{
					this.buildFault(log, codice, codiceModulo);
					this.buildContextForSingleMsgDiagnostico(codice,codiceModulo,true,
							d.getType().getValue(),d.getValue(),
							log);
				}catch(Throwable t){
					throw new UtilsException("build context error: "+t.getMessage(),t);
				}
				
				this.setDatiEngine(m, codice, codiceModulo, infoMsgDiag, d);
				
				while(msgDiagnosticiCompleted.size()<d.getDiagnosticPosition() && !msgDiagnosticiNormali.isEmpty()){
					msgDiagnosticiCompleted.add(msgDiagnosticiNormali.remove(0));
				}
				
				msgDiagnosticiCompleted.add(m);
			}
			
			while(!msgDiagnosticiNormali.isEmpty()){
				msgDiagnosticiCompleted.add(msgDiagnosticiNormali.remove(0));
			}
			
			return msgDiagnosticiCompleted;
			
		}
		else{
			return msgDiagnosticiNormali;
		}
	}
	
	private void setDatiEngine(MsgDiagnostico msgDiag,String codice, String codiceModulo,
			InfoDiagnostico infoMsgDiag,
			DynamicExtendedInfoDiagnostico d) throws UtilsException{
		
		PropertiesReader pr = MsgDiagnosticiProperties.getMappingCodiceToKeywordMsgDiagnosticiPersonalizzati();
		PropertiesReader prSeverita = MsgDiagnosticiProperties.getLivelliMsgDiagnosticiPersonalizzati();
		
		MsgDiagnosticiProperties msgDiagProp = MsgDiagnosticiProperties.getInstance();
		boolean setSeverita = true;
		if(msgDiagProp.getCodiceDiagnosticoDebugHigh().equals(codice)){
			setSeverita = false;
			msgDiag.setSeverita(LogLevels.SEVERITA_DEBUG_HIGH);
		}
		else if(msgDiagProp.getCodiceDiagnosticoDebugMedium().equals(codice)){
			setSeverita = false;
			msgDiag.setSeverita(LogLevels.SEVERITA_DEBUG_MEDIUM);
		}
		
		String nomeCompletoDiagnostico = pr.getValue(codice);
		
		msgDiag.setCodice(codice);
		
		msgDiag.setGdo(infoMsgDiag.getGdo());
		
		msgDiag.setIdBusta(this.transazioneDTO.getIdMessaggioRichiesta());
		msgDiag.setIdBustaRisposta(this.transazioneDTO.getIdMessaggioRisposta());
		
		msgDiag.setIdFunzione(this.getIdentificativoFunzione(codiceModulo));
		
		IDSoggetto idDominio = new IDSoggetto(this.transazioneDTO.getPddTipoSoggetto(), this.transazioneDTO.getPddNomeSoggetto(), this.transazioneDTO.getPddCodice());
		msgDiag.setIdSoggetto(idDominio);
		
		if(d!=null && DynamicExtendedInfoDiagnosticoType.NON_RICOSTRUIBILE.equals(d.getType())){
			msgDiag.setMessaggio(DynamicExtendedInfoDiagnosticoNonRicostruibileUtils.convertToHumanMessage(d.getValue()));
		}else{
			msgDiag.setMessaggio(this.msgDiag.getMessaggio_replaceKeywords(nomeCompletoDiagnostico));
		}
		
		String idTransazionePresente = msgDiag.getProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE);
		if(idTransazionePresente==null){
			msgDiag.addProperty(CostantiDB.MSG_DIAGNOSTICI_COLUMN_ID_TRANSAZIONE, this.transazioneDTO.getIdTransazione());
		}
		
		msgDiag.setProtocollo(this.transazioneDTO.getProtocollo());
			
		if(setSeverita){
			String sev = (String) prSeverita.get(nomeCompletoDiagnostico);
			int sevI = 0;
			try{
				sevI = Integer.parseInt(sev);
			}catch(Exception e){
				throw new UtilsException("Errore durante il parsing della severità ["+sev+"] per il diagnostico ["+nomeCompletoDiagnostico+"] code ["+codice+"]");
			}
			msgDiag.setSeverita( (sevI) / 10000);
		}
		
	}
	
	
	
	
	
	
	
	
	
	
	// *********** U T I L S **********************

	private String getIdentificativoFunzione(String codice) throws UtilsException{
		PropertiesReader pr = MsgDiagnosticiProperties.getCodiciIdentificativiFunzione();
		Enumeration<?> keys = pr.keys();
		while (keys.hasMoreElements()) {
			String key = (String) keys.nextElement();
			String value = pr.getValue(key);
			/**System.out.println("code["+key+"] name["+value+"]");*/
			if(value.equals(codice)){
				return key;
			}
		}
		/**return null;*/
		// Fix: non devo ritornare null sennò poi la serializzazione va in errore
		return "core";
	}
}